查看: 58|回复: 1

【R78/G15 开发板测评】串口打印 DHT11 温湿度传感器、DS18B20 ...

[复制链接]

2

主题

2

帖子

280

积分

中级会员

Rank: 3Rank: 3

积分
280
发表于 7 天前 | 显示全部楼层 |阅读模式
本帖最后由 无垠的广袤 于 2024-11-14 20:30 编辑

【R78/G15 开发板测评】串口打印 DHT11 温湿度传感器、DS18B20 温度传感器数据,LabVIEW 上位机绘制演化曲线

主要介绍了 R78/G15 开发板基于 Arduino IDE 环境串口打印温湿度传感器 DHT11 和温度传感器 DS18B20 传感器的数据,并通过LabVIEW上位机绘制演化曲线。

DHT11

DHT11 数字温湿度传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。

简介

DHT11 内置一个电阻式感湿元件和一个 NTC 测温元件,DHT11 为 4 针单排引脚封装,采用单线制串行接口,只需加适当的上拉电阻,信号传输距离可达20米以上。




DHT11 工作参数:

- 湿度测量范围:20~90%RH
- 湿度测量精度:±5%RH
- 温度测量范围:0~50℃
- 温度测量精度:±2℃
- 工作电压:DC 3.3V/5V

DHT11 采用**单总线**协议,也就是使用一根 DATA 线进行数据的收发。DHT11 的 DATA 线一次通讯时间 4ms 左右,数据分整数部分、小数部分和校验位,具体为: 8bit 湿度整数数据 + 8bit 湿度小数数据 + 8bit 温度整数数据 + 8bit 温度小数数据 + 8bit 校验位。

时序图



DHT11 的 DATA 传输一次完整的数据为 40bit,按照高位在前,低位在后的顺序传输。

数据格式为:8bit 湿度整数数据 + 8bit 湿度小数数据 + 8bit 温度整数数据 + 8bit 温度小数数据 + 8bit 校验位,一共 5 字节(40bit)数据。

代码

由于直接调用 `DHT11.h` 库函数出错,因此需要自己编写 DHT11 驱动函数
  1. int dhPin = 4;  // 温湿度信号接脚连入 Pin 4
  2. byte dat[5];   // 存放湿度2byte, 温度 2 byte, checksum 1 byte
  3. byte readData() {  // 每次读取 8 bits  ( one byte)
  4.   byte data = 0 ; // 初始化数据,不然可能出错
  5.   for (int i = 0; i < 8; i++) {
  6.     if (digitalRead(dhPin) == LOW) {  // 一开始要 LOW 才表示要传过来
  7.       while (digitalRead(dhPin) == LOW); //等待 50us;
  8.       // 现在已经变成 HIGH 了
  9.       delayMicroseconds(30); //判断高电平持续时间,以判定资料是‘0’还是‘1’;
  10.       if (digitalRead(dhPin) == HIGH) // 持续了 30 us 以上就是 1
  11.         data |= (1 << (7 - i)); //高位在前,低位元在后;
  12.       while (digitalRead(dhPin) == HIGH); // 等待下一bit的接收;
  13.     }
  14.   }
  15.   return data;
  16. }
  17. void start_test()
  18. {  // 每次要与 DHT11 沟通
  19.   digitalWrite(dhPin, LOW); //拉低到 LOW,发送表示要开始沟通的信号;
  20.   delay(30); //延时要大于 18ms,以便 DHT11 能检测到开始信号;我们用30ms
  21.   digitalWrite(dhPin, HIGH);  // 拉高HIGH, 让 DHT11 拉低到 LOW 告诉我们要传送
  22.   delayMicroseconds(40);  // 给40us等待 DHT11 响应;
  23.   pinMode(dhPin, INPUT); // 改为输入 mode 准备 digitalRead( )
  24.   while (digitalRead(dhPin) == HIGH);  // 必须等到 LOW
  25.   delayMicroseconds(80); //DHT11 发出响应,会拉低 80us;所以至少等80us
  26.   while (digitalRead(dhPin) == LOW); // 继续等到变 HIGH
  27.   delayMicroseconds(80); //DHT11 会拉高到HIGH 80us 后开始发送数据;
  28.   for (int i = 0; i < 5; i++) dat[i] = readData(); //接收温湿度资料,校验位元;
  29.   pinMode(dhPin, OUTPUT); // 改为 Output mode, 准备拉高HIGH
  30.   digitalWrite(dhPin, HIGH); //发送完一次资料后释放bus,等待下一次开始信号;
  31. }
  32. void setup(  ) {
  33.   Serial.begin(9600);
  34.   Serial.println("begin!");
  35.   pinMode(dhPin, OUTPUT);
  36. }
  37. void loop(  ) {
  38.   start_test( );
  39.   Serial.print("Current humdity = ");
  40.   Serial.print(dat[0], DEC); //显示湿度的整数部分;
  41.   Serial.print('.');
  42.   Serial.print(dat[1], DEC); //显示湿度的小数位;
  43.   Serial.println(" %");
  44.   Serial.print("Current temperature = ");
  45.   Serial.print(dat[2], DEC); //显示温度的整数部分;
  46.   Serial.print('.');
  47.   Serial.print(dat[3], DEC); //显示温度的小数位;
  48.   Serial.println(" C");
  49.   delay(1985);
  50. }
复制代码



参考:https://www.cnblogs.com/54programer/p/15829233.html

效果

硬件连接

电路



实物连线



串口打印





DS18B20

DS18B20 数字温度计是 DALLAS 公司生产的 1-Wire 单总线器件,具有线路简单、体积小的特点。

简介



特点:

- 独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
- 测温范围 -55℃~+125℃,固有测温误差 1℃。
- 支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,实现多点测温,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定。
- 工作电源: 3.0~5.5V/DC (可以数据线寄生电源)
- 在使用中不需要任何外围元件
- 测量结果以9~12位数字量方式串行传送

电路

模块



电路



时序图



代码

这里同样是库函数无法正常加载,因此不使用库函数驱动 DS18B20

  1. int DS18B20DQ = 4;
  2. void setup() {
  3.   // put your setup code here, to run once:
  4.   Serial.begin(115200);
  5. }
  6. void loop() {
  7.   float t;
  8.   t= Ds18b20GetTemp();
  9.   Serial.print("The temperature is :");
  10.   Serial.println(t);
  11.   delay(2000);
  12. }
  13. void Ds18b20Rst(void)
  14. {
  15.      pinMode(DS18B20DQ,OUTPUT);
  16.      digitalWrite(DS18B20DQ,LOW);
  17.      delayMicroseconds(750);//主机发送复位脉冲480us-960us
  18.      digitalWrite(DS18B20DQ,HIGH);
  19.      delayMicroseconds(15);//18b20等待15-60us  
  20. }
  21. /*等待18b20响应
  22. * 返回1:未检测到18b20
  23. * 返回0:存在
  24. */
  25. byte Ds18b20Check()
  26. {
  27.    byte retry=0;
  28.    pinMode(DS18B20DQ,INPUT);
  29.    while(digitalRead(DS18B20DQ)&&retry<200)
  30.        {   retry++;
  31.            delayMicroseconds(1);
  32.          }
  33.    if(retry>=200)return 1;
  34.    else retry=0;
  35.    while(!digitalRead(DS18B20DQ)&&retry<240)
  36.    {
  37.        retry++;
  38.        delayMicroseconds(1);
  39.     }
  40.     if(retry>240)return 1;
  41.     return 0;   
  42.   }
  43. /*从18b20读取一个位
  44. * 返回值1/0
  45. */
  46. byte Ds18b20ReadBit(void)
  47. {
  48.      byte data;
  49.      pinMode(DS18B20DQ,OUTPUT);
  50.      digitalWrite(DS18B20DQ,LOW);
  51.      delayMicroseconds(2);
  52.      digitalWrite(DS18B20DQ,HIGH);
  53.      pinMode(DS18B20DQ,INPUT);
  54.      delayMicroseconds(12);
  55.      if(digitalRead(DS18B20DQ))data=1;
  56.      else data=0;
  57.      delayMicroseconds(50);
  58.      return data;
  59.   }
  60. /*从18b20读取一个字节
  61. * 返回值:读到的数据
  62. */
  63. byte Ds18b20ReadByte(void)
  64. {
  65.     byte i,j,dat;
  66.     dat=0;
  67.     for(i=1;i<=8;i++)
  68.     {
  69.         j=Ds18b20ReadBit();
  70.         dat=(j<<7)|(dat>>1);//低位在前
  71.       }
  72.     return dat;
  73.   }
  74. /*写一个字节到Ds18b20
  75. * dat:要写入的字节
  76. */
  77. void Ds18b20WriteByte(byte dat)
  78. {
  79.    byte i;
  80.    byte temp;
  81.    pinMode(DS18B20DQ,OUTPUT);
  82.    for(i=1;i<=8;i++)
  83.    {
  84.       temp=dat&0x01;
  85.       dat=dat>>1;
  86.       if (temp)//write 1
  87.       {
  88.           digitalWrite(DS18B20DQ,LOW);
  89.           delayMicroseconds(2);
  90.           digitalWrite(DS18B20DQ,HIGH);
  91.           delayMicroseconds(60);
  92.         }
  93.        else
  94.        {
  95.           digitalWrite(DS18B20DQ,LOW);
  96.           delayMicroseconds(60);
  97.           digitalWrite(DS18B20DQ,HIGH);
  98.           delayMicroseconds(2);
  99.         }
  100.     }
  101.   }

  102. /*开始温度转换
  103. *
  104. */
  105. void Ds18b20Start(void)
  106. {
  107.    Ds18b20Rst();
  108.    Ds18b20Check();
  109.    Ds18b20WriteByte(0XCC);
  110.    Ds18b20WriteByte(0X44);
  111. }
  112. /*从Ds18b20得到温度值
  113. * 精度0.1c
  114. * 返回值:温度值(-550-1250)
  115. */
  116. float Ds18b20GetTemp()
  117. {
  118.    byte temp;
  119.    byte TH=0,TL=0;
  120.    short tem;
  121.    float t;
  122.    Ds18b20Start();
  123.    Ds18b20Rst();
  124.    Ds18b20Check();
  125.    Ds18b20WriteByte(0XCC);//skip rom
  126.    Ds18b20WriteByte(0XBE);//read,start form the 0 byte,LSB forst
  127.    TL=Ds18b20ReadByte();//LSB
  128.    TH=Ds18b20ReadByte();//MSB
  129.    //Serial.println(TH);
  130.    //Serial.println(TL);
  131.    if(TH>7)
  132.    {
  133.        TH=~TH;
  134.        TL=~TL;
  135.        temp=0;//the temperature is negative
  136.     }
  137.     else temp=1;// the temperature is positive
  138.     tem=TH;//高八位
  139.     tem<<=8;
  140.     tem+=TL;//低八位
  141.     t=((float)tem*0.0625);
  142.     if(temp)return t;
  143.     else return -t;
  144.   }
复制代码




效果

硬件连接



串口打印效果



LabVIEW

结合 LabVIEW 上位机可实现远程监控

流程图



代码改进

  1. int DS18B20DQ = 4;
  2. byte comdata[3]={0};      //定义数组数据,存放串口命令数据
  3. void setup() {
  4.   // put your setup code here, to run once:
  5.   Serial.begin(115200);
  6. }

  7. void loop()
  8. {
  9.   while (Serial.available() > 0)   //不断检测串口是否有数据
  10.    {
  11.       receive_data();            //接受串口数据
  12.       test_do_data();            //测试数据是否正确并更新数据
  13.    }
  14. }
  15.   void receive_data(void)      
  16. {
  17.   int i ;
  18.   for(i=0;i<3;i++)
  19.   {
  20.     comdata[i] = Serial.read();
  21.     //延时一会,让串口缓存准备好下一个字节,不延时可能会导致数据丢失,
  22.     delay(2);
  23.   }
  24. }

  25. void test_do_data(void) // 测试并执行命令
  26. {
  27.   if(comdata[0] == 0x55) //0x55和0xAA均为判断是否为有效命令
  28.   {
  29.     if(comdata[1] == 0xAA)
  30.     {
  31.       if(comdata[2] == 0xFF)
  32.       {
  33.         // 读取温度值
  34.         float t;
  35.         t= Ds18b20GetTemp();
  36.         Serial.println(t);
  37.       }
  38.     }
  39.   }
  40. }
复制代码


DHT11



DS18B20



温度动态采集展示

详见:https://blog.csdn.net/qq_36654593/article/details/143654532




回复

使用道具 举报

1

主题

14

帖子

120

积分

注册会员

Rank: 2

积分
120
发表于 6 天前 | 显示全部楼层

这个IDE貌似就可以直接绘制曲线把?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

用户排行榜

RA助手

主题: 116帖子:134精华:0

RA_Lance

主题: 93帖子:136精华:9

lugl

主题: 52帖子:150精华:1

xujiwei263

主题: 18帖子:86精华:0

Juggernaut

主题: 12帖子:118精华:0

books咦

主题: 11帖子:11精华:2
快速回复 返回顶部 返回列表