本帖最后由 jennyzhaojie 于 2022-4-2 09:52 编辑
在通常情况下,要进行温湿度的检测是要借助带有MCU 开发板的,因迪文智能屏的独特设计,故可以舍去开发板这一环节,而直接驱动相应的温湿度传感器来进行检测。 4. 温湿度检测 这里所用的温湿度传感器为DHT22,它是一款数字式传感器并以单总线的方式进行数据交换,该功能模块如图1所示。
图1 温湿度传感器 除2个 电源引脚外,它的另一个引脚既用于输入,又用于输出来使用,该引脚与转接板的连接关系为: DAT--- P1.0
图2 转接板使用引脚 值得指出的是,用于转接板只提供了一组电源引脚,故但使用多个外围器件时需要对电源引脚加以扩展,连接RTC模块与DHT22的方式如图3所示。
图3 转接板 DHT22的单总线工作模式比较特殊,人家I2C接口还有个时钟引脚来配合数据的收发,现在单总线倒好,简直就一条线就全解决了。因此,它在时序上也较之I2C的要求更严格。 在DHT22的使用上,需注意以下几个问题。 1)对RTC引脚的定义 ***it DAT =P1^0; 2)对DHT22的初始化 DHT22的初始化函数为:
- uchar DHT22_Init(void)
- {
- DHT22_IO_OUT();
- DHT22_Rst();
- return DHT22_Check();
- }
复制代码
3)DHT22的位读取 位读取的函数如下:
- uchar DHT22_Read_Bit(void)
- {
- uchar retry=0;
- while(DAT&&retry<100)
- {
- retry++;
- delay_us(1);
- }
- retry=0;
- while(!DAT&&retry<100)
- {
- retry++;
- delay_us(1);
- }
- delay_us(40);
- if(DAT)
- return 1;
- else
- return 0;
- }
复制代码
从还函数,可以看到DHT22对实现的应该要求,它并非是靠时钟信号来拾取数据的状态,而是依照时序的长短来区分数据的状态。 4)DHT22的字节读取 字节读取的函数是依赖位读取函数来完成一个字节的8位信号读取,其函数为:
- uchar DHT22_Read_Byte(void)
- {
- uchar i,dat;
- dat=0;
- for (i=0;i<8;i++)
- {
- dat<<=1;
- dat|=DHT22_Read_Bit();
- }
- return dat;
- }
复制代码
5)温湿度的读取 温湿度的值被封装在5个字节数据中,其中第1、2字节是存放温度值,第3、4字节是存放湿度值,第5字节则是校验码。 温湿度的读取函数为:
- uchar DHT22_Read_Data(uint *temp,uint *humi)
- {
- uchar buf[5];
- uchar i;
- DHT22_Rst();
- if(DHT22_Check()==0)
- {
- for(i=0;i<5;i++)
- {
- buf[i]=DHT22_Read_Byte();
- }
- if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
- {
- *humi=buf[0]*256+buf[1];
- *temp=buf[2]*256+buf[3];
- }
- }
- else
- return 1;
- return 0;
- }
复制代码
6)测试主程序 测试主程序为:
- void main(void)
- {
- uint temperature;
- uint humidity;
- InitCPU();
- Starttimer(1,500);
- delay_ms(500);
- DHT22_Init();
- while(1)
- {
- DHT22_Read_Data(&temperature,&humidity);
- printf("t=%dC,h=%d%rn",temperature,humidity);
- delay_ms(1000);
- }
- }
复制代码
经程序的编译,即可生成HEX格式的目标文件,再由专用的格式转换工具处理即可生成BIN格式的下载文件,见图4所示。
图4 生成BIN文件 在下载后,即可见到图5所示的检测效果,由于DHT22的检测精度比较高,故它的检测值中带有1位小数值。为便于后续的处理,这里是包含小数值一同输出的,故检测的温度值为21.8度,湿度为78.6。 |