高级会员
- 积分
- 514
- 金钱
- 514
- 注册时间
- 2017-5-21
- 在线时间
- 82 小时
|
本帖最后由 Anyint 于 2019-8-4 13:55 编辑
近几日有一个项目要用到温湿度传感器,网上查阅一大堆代码,发现有些代码使用的时候有一下几个问题:
1. 读取温湿度数据的时候,要再SHT30_Read()后加delay_ms()
2. 初始化sht30后,直接调用读取数据的函数,读出的数据都是0或者是乱的数据,要过一段时间后,才能读出数据,仿佛传感器初始化一直没完成或者寄存器的值有问题,这个不得而知,反正代码上有问题,有缺陷。
以上两个问题一直困扰我好几天,在主函数里调用的时候,时好时坏,而上面的小问题依然没有解决。但是为了产品的稳定性,一定要解决掉上面的问题。
记得买模块的时候,店家是给了一个SHT30的压缩包,包里的文件都是一些参考文档,没有现成封装好的.c/.h文件,尤其是给STM32F103ZET6这块芯片的代码没有说明白,然后痛下决心要把包里关于SHT30的官方说明文档吃透,由于它是PDF文档,脑壳疼不能直接copy代码,在网上找了一个在线PDF转WORD的网站进行转格式,最后将转好的word里的代码一步一步copy自己的项目中进行SHT30外设驱动代码的封装工作。
封装好,看似这份代码很舒服(大佬的代码,满满的英文注释),然后参考它的main的写法,将SHT30初始化函数和SHT30读取温度函数写好,再加入USART1串口初始化,最后在while中写上printf的代码,这样就可以在串口调试助手上查看温湿度数据。
需要的设备:STM32F103ZET6精英开发板、一根USB线接到开发板的串口1、SHT30模块
接线要求:官方代码的I2C接口是接在开发板的PB13、PB14
1. PB13->SCL
2. PB14->SDA
注:除了这两根线,还有RESET、ALERT这两根线,目前不知道它有啥用,而且模块也就四根线(VCC\GND\SDA\SCL),所以就不管这两根线,这部分代码可以屏蔽。
移植的时候报错处理:(1)将system.h和system.c的void SystemInit(void)声明和定义都给屏蔽掉,因为它与系统的SystemInit函数冲突!
代码调试过程中的问题:
1. 出现读取serialNumber的时候,error返回1,说是模块没有返回应答信息。这个时候我怀疑是时序问题,首先查的是delay函数准不准的问题,一般原子的那个delay.h里的delay_us()还是准的,毕竟是滴答时钟的信号过来的,将官方代码的system.c文件里的DelayMicroSeconds函数体里的内容换成delay_us(nbrOfUs),并在system.c中包入delay.h头文件;这个时候在此调试发现数据能读出,时序正常了。
2. 时序对了,error还是返回0,考虑器件接触不良的问题。当时我真的觉得这代码要炸了,想砸了那个SHT30模块,这个让我日日夜夜都惆怅的模块呀,然后我就把SHT30拔出来,摸了一下它,吹了一下它,然后在给它接回去。奇迹发生了,串口调试助手里,突然serialNumber读出,error返回0,表示成功,温湿度数据也传上来了!!!!激动++++++
代码优势:(经过一系列的调试,代码终于稳定,且封装也差不多了)
1. 隔多久读取一次数据随意(它吃的消),读取的时间极短(从开始读取到结束读取,ms级没问题)。好歹I2C的传输速度也挺快的,SHT30这个模块也还不错,读个数据还要delay放中断里那不是要出事,关键它加了delay也不稳定。
2. 官方代码,比较稳定3. 端口随意改,模拟I2C,v1.0版本:它是寄存器操作代码pb14\pb13,改起来不是很方便 v2.0版本:个人把i2c部分改成库函数,端口随意改
调用办法:
1. 导入那个SHT3x的文件夹至工程目录下的HARDWARE文件夹下,主函数包入sht3x.h、system.h
2. mian函数中定义2个变量
ft temperature; // temperature [°C]
ft humidity; // relative humidity [%RH]
再插入初始化代码SHT3X_Init(0x44);//0x44为I2C器件地址,根据实际情况来改
delay_ms(50); //wait 50ms after power on//加入一个50ms延时,等待稳定数据,只需调用一次,后面读取数据不用了。
3. SHT3X_GetTempAndHumi(&temperature, &humidity, REPEATAB_HIGH, MODE_CLKSTRETCH, 50);//!!!!!!!!这行代码的最后一个参数timeout超时设置为50,读取一次数据要15ms,timeout设置成10,读取一次数据要1~2ms
printf("temperature=%.1f℃\thumidity=%.1f%%RH\terror=%d\r\n",(float)temperature,(float)humidity,(u8)error);
该代码可以放入while(1){........}中,或者放在另外的中断服务函数TIMX_IRQHandler中都可以。
- /*
- * 文件名称:main
- * 作 者:Anyint
- * 版 本:v1.0
- * 说 明:工程模板
- * 修改记录:2019/07/19 建立模板
- */
- #include "stm32f10x.h"
- #include "delay.h"
- #include "usart.h"
- #include "sht3x.h"
- #include "system.h"
- /*
- * 函数名称:mian
- * 函数功能:主函数,程序入口函数
- * 入口参数:void
- * 出口参数:int
- * 备 注:
- */
- int main(void)
- {
- ft temperature; // temperature [°C]
- ft humidity; // relative humidity [%RH]
- etError error; // error code
- delay_init();
- uart_init(9600);
- SHT3X_Init(0x44);
- delay_ms(50);
-
- while(1)
- {
- SHT3X_GetTempAndHumi(&temperature, &humidity, REPEATAB_HIGH, MODE_CLKSTRETCH, 50);
- printf("temperature=%.1f℃\thumidity=%.1f%%RH\terror=%d\r\n",(float)temperature,(float)humidity,(u8)error);
- }
- }
复制代码
sht3x template(v2.0).rar
(4.89 MB, 下载次数: 7663)
|
|