gitee开源地址https://gitee.com/sijiwendu/mm32\_-f5270\_smart\_home-m.git
上一次完成DHT11开发文章https://aijishu.com/a/1060000000346566
下面将开始本次文章旅行
前言:简易智能家居需要实现的功能有:读取环境的温湿度情况,将温湿度数据实时显示在OLED上,并通过数据报文上送到服务器和PC后端,可通过PC软件、微信小程序、OLED屏幕读取到温湿度数据
一、移植0.96寸OLED
如下图所示,该OLED屏使用的是iic通信,如果使用硬件iic可以获得更好的刷新,如果使用软件iic可以不受管脚限制,本次为了方便各位移植,所以使用软件iic,更换不同引脚只需要在oled.h文件修改即可。
如果想使用硬件iic,mm32f5270也提供了不少引脚,处了PB6/PB7为uart1外,其他均可使用,如下图所示
本次OLED驱动文件移植于STM32上的工程,使用了sys的库,在仿写位带操作时,发现操作无法实现,最后使用了 GPIO\_SetBits、GPIO\_ClearBits函数代替,对于下面这段位带操作的代码,等待大神解决。
二、在OLED上显示实时温湿度
完成了OLED的移植,接下来就该在OLED上显示温湿度了,由于本程序比较简单,就放在main上的while,建议各位可以使用ui文件管理,while只执行调度。
本次的显示逻辑为,判断是否有读回DHT11数据,读回则调用OLED驱动函数显示,如下代码段
while (1)
{
if (dht11_read_data(buffer) == 0) /*采集到温湿度信息*/
{
hum = buffer[0] + buffer[1] / 10.0; /*读出湿度信息*/
temp1 = buffer[2] + buffer[3] / 10.0; /*读出温度信息*/
OLED_ShowString(0,0,"hum:",16); /*将湿度信息显示到OLED上*/
OLED_ShowNum(80,0,(u8)hum,2,16);
OLED_ShowString(0,16,"temp:",16); /*将温度信息显示到OLED上*/
OLED_ShowNum(80,16,(u8)temp1,2,16);
com_init(temp1,hum); /*上报温湿度数据*/
}
delay_ms(500);
}
三、上传数据报文
由于后边的微信小程序、服务器、PC软件我打算使用我其它项目的程序,所以在报文方面对之前项目进行了个兼容。整个架构大致如下图所示:
报文结构为一个15字节的数据,第1字节代表上线,第2字节代表开机,第6、7字节代表温度,第8、9字节代表湿度,其它字节在本项目中不涉及,通过一个com函数完成打包,通过uart1发送到ESP8266和PC端,ESP8266通过MQTT发布主题到服务器,微信小程序通过MQTT协议订阅该主题数据获取到设备信息。
最后效果如下:
OLED:
微信小程序如图:
PC端:
四、总结
写在最后:本次项目大致相当于把我的一个其他项目削减功能后后移植到mm32f5270上,难度大倒不是很大,MindSDK已经将大多数寄存器封装成库,实践需要操作寄存器的就只有一个延时和一个位带操作,如果将这个项目跑在实时操作系统上,基本不用在操作寄存器了,这个开发结构我基本理解为底层寄存器->MindSDK->应用程序(实时操作系统),对于实时操作系统来说由于我还没尝试,所以不清楚MindSDK的情况,对于裸机开发,MindSDK能满足大部分开发需求,但有部分以及习惯于STM32上的开发习惯需要被改变,如没有一个delay库和一个sys等stm的常用库。希望能有大佬完整封装出一些第三方库来。
由于篇幅原因,很多细节无法写出,源码已在开头开源,望各位斧正。
接下来的一些个人安排:可能有时间或者经历会封装下我自己用的delay库,有机会研究下位带操作为啥没成功以及跟着其他大佬在这块板上移植操作系统,体验下满运算的mm32。