任务描述
通过编程实现温湿度数据的读取,在节点模块的液晶屏幕上进行显示,当用手接触温湿度传感器时,获取值会产生实时变化。
知识引入
温湿度传感器在生活中应用广泛,常用于温室大棚的检测,仓库、智能家居中的监控,工厂里机器工作的温湿度监控等。现在大多数市面上的温度传感器可检测的范围大概是-20℃到+200℃。湿度传感器根据工艺和材料略有不同。
温度传感器是指能感受温度并转换成可用输出信号的传感器。按测量方式可分为接触式和非接触式两大类,按照传感器材料及电子元件特性分为热电阻和热电偶两类。
常见的湿度传感器有碳膜湿度传感器,金属氧化物陶瓷式湿度传感器,电解质湿度传感器(氯化锂湿敏电阻),高分子湿度传感器(高分子湿敏电阻),高分子湿度传感器(高分子湿敏电容(流行)),红外湿度传感器,微波湿度传感器,超声波湿度传感器等。
//*文 件 名: main.c #include "WZ01_BR13_A_V1.0.h" #include "DHT11.h" #include "Uart3.h" /*-源码分析----------------- 以上三个头文件功能描述如下: WZ01_BR13_A_V1.0.h:设备厂家单片机定义的头文件; DHT11.h:读取DHT11温湿度传感器的数据的头文件; Uart3.h:串口3收发以及端口的映射的头文件。 ------------------*/ ulong System1MsCnt = 0; //系统1ms计数器 ulong SystemSecond = 0; void Timer0Init() //*功能描述: 定时器0初始化函数 { AUXR |= 0x80; //定时器0为1T模式 // AUXR &= 0x7f; //定时器0为12T模式 TMOD = 0x00; //设置定时器为模式0(16位自动重装载) TL0 = T1MS; //初始化计时值 TH0 = T1MS >> 8; TR0 = 1; //定时器0开始计时 ET0 = 1; //使能定时器0中断 EA = 1; } void Timer0_ISR() interrupt 1 using 1 //*功能描述: 定时器0中断服务函数(启动后每1MS进入一次) { static uint counter0=0; counter0++; System1MsCnt++; if(System1MsCnt%1000==0) { // BUZZER = !BUZZER;//可根据功能自定义代码。 } } void main(void) //*功能描述: 主函数 { uint i=0; uint value=0; uint temp16=0; uchar buff[20]={0}; //定义字符数组存储串口发送字符串 uint temp = 0; //定义整型变量存储温度值 uint humi = 0; //定义整型变量存储湿度值 BUZZER_INIT(); Timer0Init(); //定时器0初始化 Uart1Init(); //串口1初始化 Uart3Init(); //串口3初始化 OledInit(); //节点底板led屏初始化 OledClear(); OledDispString(1,1," DHT11温湿度 "); //在OLED液晶显示屏上的第一行第一列的位置显示“DHT11温湿度”文字信息 /*源码分析------------------ 以上OledDispString()函数功能如下: 1.OledDispString(uchar page,uchar column,uchar *text):以OLED液晶显示屏上的第page行、column列的位置开始,显示*text文字信息;注意,中文字符为双字节,所以当要显示含有中文字符的信息,应占2行。 如有第一行“当前温湿度”、第二行“温度25,湿度30”两行字符显示,对应代码如下: OledDispString(1,1," 当前温湿度 "); OledDispString(3,1,"温度25,湿度30"); ------------------*/ while(1) { temp16 = DHT11(); //获取温湿度 temp = temp16>>8; humi = temp16&0x00FF; /*源码分析------------------ 以上三行代码功能分析如下: 1.temp16 :通过DHT11()函数获取16位温湿度值,高八位存放温度值,低八位存放湿度值,参见第三章DHT11数字湿温度传感器数据格式; 2.temp16>>8:右移八位,只保留高八位,获取温度值; 3.temp16&0x00FF:通过按位与运算,只保留低八位,获取湿度值。 ------------------*/ sprintf(buff,"温度:%d 湿度:%d",temp,humi); OledClearHalf(2); OledDispString(3,1,buff); sprintf(buff,"#var 1 %d\r",temp); Send3String(buff); /*源码分析------------------ 以上两行代码功能分析如下: 1.sprintf(buff,"#var 1 %d\r",temp):把temp温度变量值代入前面第二个参数字符串中的“%d”位置,存储到buff字符数组中。例如temp=25;那么buff字符数组中最后存储的是”#var 1 25\r”字符串,是向物联网网关发送信息的数据格式,此字符串格式含义在上位机开发中会详细叙述。 2.Send3String(buff):通过串口3向网关发送buff字符数组中的信息。 ------------------*/ DelayMs(100); //延时100毫秒 sprintf(buff,"#var 2 %d\r",humi); Send3String(buff); DelayMs(1000); } } |