我手头有一个维特智能的SHT30温湿度传感器,具体如下:
这个版本的SHT30,不仅支持I2C通讯,还支持UART通讯,能够设置周期性自动上报数据,非常好用。
关于该SHT30的具体信息,可以查看: SHT30产品说明书
按照说明书设置好以后,先在电脑上,使用串口工具连接,能够收到如下信息:
收到如上的数据,说明SHT30设置好了,可以连接到灵动微电子MM32 EVB-L0136 开发板使用了。
先看开发板的手册和原理图:
选择使用uart2,GPIO对应PA2、PA3。
因为这个SHT30使用的是自动上报模式,所以只需要将SHT30的TX,连接到开发板的PA3-RX即可:
因为使用的周期性自动上报模式,所以从SHT30读取数据,使用中断模式更好,有数据了,才自动更新。没数据的时候,也不用去读取处理。
串口中断数据读取的例子,官方提供了例程,具体可见:evb-l0130_armgcc/driver_examples/uart/uart_rx_interrupt
将uart_rx_interrupt的实例,与我之前分享的SLCD的实例相结合,这样可以读取到温湿度信息,并在SLCD上面呈现。
SLCD实例的文章请访问:【灵动微电子 L0136 温控器/遥控器应用】SLCD屏显示完整实例_技术创意与DIY-面包板社区 (eet-china.com)
SCLD实例的代码请访问:灵动微电子MM32 EVB-L0136 开发板SLCD屏显示完整实例: 灵动微电子MM32 EVB-L0136 开发板SLCD屏显示完整实例 (gitee.com)
两者合并以后,完成具体功能的代码,也提交到了上述代码库中,但是分支为sht30_uart,具体问网址为:https://gitee.com/honestqiao/MM32_SLCD_ADVANCE/tree/sht30_uart/
为了能够较好的显示浮点数,SLCD显示部分的调用,也做了更新:
除去通用的引脚定义等,主要逻辑代码,位于main.c中。
其中:
1. UART定义:
其中定义使用UART2,与SHR30通讯的波特率为9600
2. UART设置和中断启用部分:
其中有设置接收中断回调
3. UART2接收数据中断回调:
实际上调用下一步的代码处理。
4. 中断回调实际数据处理:
最开始,我想直接用sscanf来处理,不过需要调用浮点数的库,会让固件增大不少,想了下,自己写了一个简单的解析。
因为收到的数据,格式为:
Temp:23.82,Hum:53.64\r\n
所以,只需要在检测到\n的时候,进行闪烁提取即可。代码中再检测到\n后,就调用get_data(),其代码具体如下:
其逻辑,就是把字符串中的两个浮点数字部分作为字符串提取出来,在使用strtod()转换为浮点数。
经过上述的处理,我们就能够及时读取到温湿度的数据,并保存到了temperature、humidity两个变量中了。
5. SLCD显示处理:
因为数据的获取和转换,都是在中断中进行处理的,所以这个地方,只需要把温湿度信息,给显示到SLCD上即可。
调用LCD_DisplayFLoat1()在大数字区域,显示温度信息,调用LCD_DisplayFLoat2()在小数字区域,显示湿度信息,小微数位为1位。
然后调用LCD_DisplayUnit(4, 1);来显示温度符号℃。
就这样,一个使用SLCD呈现SHT30温湿度传感器信息的小应用,就完成了。
实际测试的效果如下:
测试过程如下:
1. 准备了一根小铁棍,放在室外一会降温过。
2. 待屏幕读数稳定后,将小铁棍放在SHT30传感器上,可见有明显的温度降低
3. 然后,将小铁棍用火烤一会儿,再放到SHT30上,可见有明显的温度上升。
4. 最后将小铁棍拿开,温度逐渐恢复到室温
在测试过程中,有那么几下,小铁棍放上去,下面红光一闪,还以为短路烧了,实际上是SHT30的通讯指示灯在闪烁。