dwinForumAdmin 发表于 2022-4-22 11:53:05

【开源】COF案例分享:温湿度检测功能的实现

——文档转载自电子发烧友
在通常情况下,要进行温湿度的检测是要借助带有MCU开发板的,因迪文智能屏的独特设计,故可以舍去开发板这一环节,而直接驱动相应的温湿度传感器来进行检测。
1. 温湿度检测
这里所用的温湿度传感器为dht22,它是一款数字式传感器并以单总线的方式进行数据交换,该功能模块如图1所示。
图1 温湿度传感器
除2个电源引脚外,它的另一个引脚既用于输入,又用于输出来使用,该引脚与转接板的连接关系为:DAT--- P1.0
图2 转接板使用引脚
值得指出的是,用于转接板只提供了一组电源引脚,故但使用多个外围器件时需要对电源引脚加以扩展,连接RTC模块与DHT22的方式如图3所示。
   图3 转接板
在DHT22的使用上,需注意以下几个问题。(1)对RTC引脚的定义sbit 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;elsereturn 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;uchar i;DHT22_Rst();if(DHT22_Check()==0){for(i=0;i<5;i++) {buf=DHT22_Read_Byte();}if((buf+buf+buf+buf)==buf){*humi=buf*256+buf;*temp=buf*256+buf;}}elsereturn 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%\r\n",temperature,humidity);delay_ms(1000);}}
经程序的编译,即可生成HEX格式的目标文件,再由专用的格式转换工具处理即可生成BIN格式的下载文件,见图4所示。
    图4 生成BIN文件
在下载后,即可见到图5所示的检测效果,由于DHT22的检测精度比较高,故它的检测值中带有1位小数值。为便于后续的处理,这里是包含小数值一同输出的,故检测的温度值为21.8度,湿度为78.6。
   图5 温湿度检测























MAMI 发表于 2022-7-14 21:46:01

HELLO DEAR COULD YUO SEND PROJECT FILES
info@yurtelektronik.com.tr
页: [1]
查看完整版本: 【开源】COF案例分享:温湿度检测功能的实现