电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
STM32MP157 Mini开发板评测 读取DHT11温湿度
分 享
扫描二维码分享
STM32MP157 Mini开发板评测 读取DHT11温湿度
shell
dht11
linux
艾克
关注
发布时间: 2021-11-05
丨
阅读: 1028
DHT11这个温湿度传感器很常见,学过单片机的同学想必都玩过。通常我们拿到手里的都是经过标校的。这是一种典型的单总线数字信号器件。我们随便搜索一下,就能看到很多示例教程。比如百度,除了图片,还有详细参数,应用代码。 一般我们拿到的参数是下面这样的: ![](https://cf02.ickimg.com/bbsimages/202110/ec017357a541437220ecc9aaccbb63e8.png) 来看一段经典的51单片机读取DHT11代码: ```c //@@****************************************************************// // DHT11使用范例 //单片机 : AT89S52 或 STC89C52RC // 功能 :串口发送温湿度数据 波特率 9600 //硬件连接: P2.0口为通讯口连接DHT11,DHT11的电源和地连接单片机的电源和地,单片机串口加MAX232连接电脑 #include
#include
// typedef unsigned char U8; /@@* defined for unsigned 8-bits integer variable 无符号8位整型变量 */ typedef signed char S8; /@@* defined for signed 8-bits integer variable 有符号8位整型变量 */ typedef unsigned int U16; /@@* defined for unsigned 16-bits integer variable 无符号16位整型变量 */ typedef signed int S16; /@@* defined for signed 16-bits integer variable 有符号16位整型变量 */ typedef unsigned long U32; /@@* defined for unsigned 32-bits integer variable 无符号32位整型变量 */ typedef signed long S32; /@@* defined for signed 32-bits integer variable 有符号32位整型变量 */ typedef float F32; /@@* single precision floating point variable (32bits) 单精度浮点数(32位长度) */ typedef double F64; /@@* double precision floating point variable (64bits) 双精度浮点数(64位长度) */ // #define uchar unsigned char #define uint unsigned int #define Data_0_time 4 //--------------- --------------------// //----------------IO口定义区--------------------// //-------------- --------------------------// sbit P2_0 = P2^0 ;//DATA sbit P2_1 = P2^1 ; sbit P2_2 = P2^2 ; sbit P2_3 = P2^3 ; //--------- ------------------------------------// //----------------定义区--------------------// //--------------------- -----------------------// U8 U8FLAG,k; U8 U8count,U8temp; U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata; U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp; U8 U8comdata; U8 outdata[5]; //定义发送的字节数 U8 indata[5]; U8 count, count_r=0; U8 str[5]={"RS232"}; U16 U16temp1,U16temp2; SendData(U8 *a) { outdata[0] = a[0]; outdata[1] = a[1]; outdata[2] = a[2]; outdata[3] = a[3]; outdata[4] = a[4]; count = 1; SBUF=outdata[0]; } void Delay(U16 j) { U8 i; for(;j>0;j--) { for(i=0;i<27;i++); } } void Delay_10us(void) { U8 i; i--; i--; i--; i--; i--; i--; } void COM(void) { U8 i; for(i=0;i<8;i++) { U8FLAG=2; //---------------------- P2_1=0 ; //T P2_1=1 ; //T //---------------------- while((!P2_0)&&U8FLAG++); Delay_10us(); Delay_10us(); // Delay_10us(); U8temp=0; if(P2_0)U8temp=1; U8FLAG=2; while((P2_0)&&U8FLAG++); //---------------------- P2_1=0 ; //T P2_1=1 ; //T //---------------------- //超时则跳出for循环 if(U8FLAG==1)break; //判断数据位是0还是1 // 如果高电平高过预定0高电平值则数据位为 1 U8comdata<<=1; U8comdata|=U8temp; //0 }//rof } //------------ -------------------- //-----湿度读取子程序 ------------ //---------------------- ---------- //----以下变量均为全局变量-------- //----温度高8位== U8T_data_H------ //----温度低8位== U8T_data_L------ //----湿度高8位== U8RH_data_H----- //----湿度低8位== U8RH_data_L----- //----校验 8位 == U8checkdata----- //----调用相关子程序如下---------- //---- Delay();, Delay_10us();COM(); //--------------------- ----------- void RH(void) { //主机拉低18ms P2_0=0; Delay(180); P2_0=1; //总线由上拉电阻拉高 主机延时20us Delay_10us(); Delay_10us(); Delay_10us(); Delay_10us(); //主机设为输入 判断从机响应信号 P2_0=1; //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行 if(!P2_0) //T ! { U8FLAG=2; //判断从机是否发出 80us 的低电平响应信号是否结束 while((!P2_0)&&U8FLAG++); U8FLAG=2; //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态 while((P2_0)&&U8FLAG++); //数据接收状态 COM(); U8RH_data_H_temp=U8comdata; COM(); U8RH_data_L_temp=U8comdata; COM(); U8T_data_H_temp=U8comdata; COM(); U8T_data_L_temp=U8comdata; COM(); U8checkdata_temp=U8comdata; P2_0=1; //数据校验 U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp); if(U8temp==U8checkdata_temp) { U8RH_data_H=U8RH_data_H_temp; U8RH_data_L=U8RH_data_L_temp; U8T_data_H=U8T_data_H_temp; U8T_data_L=U8T_data_L_temp; U8checkdata=U8checkdata_temp; }//fi }//fi } //--------------------------------------- //main()功能描述: AT89C51 11.0592MHz 串口发 //送温湿度数据,波特率 9600 //---------------------------------------------- void main() { U8 i,j; //uchar str[6]={"RS232"}; /@@* 系统初始化 */ TMOD = 0x20; //定时器T1使用工作方式2 TH1 = 253; // 设置初值 TL1 = 253; TR1 = 1; // 开始计时 SCON = 0x50; //工作方式1,波特率9600bps,允许接收 ES = 1; EA = 1; // 打开所以中断 TI = 0; RI = 0; SendData(str) ; //发送到串口 Delay(1); //延时100US(12M晶振) while(1) { //------------------------ //调用温湿度读取子程序 RH(); //串口显示程序 //-------------------------- str[0]=U8RH_data_H; str[1]=U8RH_data_L; str[2]=U8T_data_H; str[3]=U8T_data_L; str[4]=U8checkdata; SendData(str) ; //发送到串口 //读取模块数据周期不易小于 2S Delay(20000); }//elihw }// main void RSINTR() interrupt 4 using 2 { U8 InPut3; if(TI==1) //发送中断 { TI=0; if(count!=5) //发送完5位数据 { SBUF= outdata[count]; count++; } } if(RI==1) //接收中断 { InPut3=SBUF; indata[count_r]=InPut3; count_r++; RI=0; if (count_r==5)//接收完4位数据 { //数据接收完毕处理。 count_r=0; str[0]=indata[0]; str[1]=indata[1]; str[2]=indata[2]; str[3]=indata[3]; str[4]=indata[4]; P0=0; } } } ``` 但是以上不是重点,老王手里毕竟是闪着红色心跳灯的ATK-STM32MP157开发板。所以来看下如何在这块板子上读取DHT11的温湿度数据。 阅读了开发板对应的硬件手册,发现了很大的惊喜,厂家已经将DHT11和DS18B20的驱动程序编译进内核了,并且设备树中也做了配置。 ![](https://cf02.ickimg.com/bbsimages/202110/3a9f7132b7c3b510d4fa544a7d00b7e8.png) 不过厂家明确做了提示,就是上电后驱动加载的可能是DHT11,也可能是DS18B20,因为使用的是同一个引脚。保险起见,重新做一次卸载加载操作: ```shell //统统卸载 rmmod ds18b20 rmmod dht11 安装dht11驱动 modprobe dht11 ``` 到这里我们就可以直接读取DHT11的数值了,读取命令如下: ```shell cat /sys/class/misc/dht11/value 读到的结果是个拼接在一起的字符串 root@ATK-MP157:/home/user# cat /sys/class/misc/dht11/value 3227 ``` 以上操作仍然可以写在shell脚本中,自动读取数据。比前一次读取ADC的代码要更少些。主要使用${var:}模式获取子字符串,语法就是 ${var:start:len} ```shell #!/bin/bash echo "dht11 test" get_dht11_value(){ dht11_value=`cat /sys/class/misc/dht11/value` echo "--temp:"${dht11_value:0:2} "%RH" "--hum:"${dht11_value:2:2} "℃" } while(true) do get_dht11_value sleep 1 done ``` ![](https://cf02.ickimg.com/bbsimages/202110/b42ac15d125f0f08569ecfb5acf502ea.png) 获取了温湿度数据,就可以和WEB端结合以图形化的方式展示出来了。
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
艾克
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交