首页 > 其他分享 >Arduino读取DHT11,DHT22,SHTC3温湿度数据

Arduino读取DHT11,DHT22,SHTC3温湿度数据

时间:2023-05-18 15:32:45浏览次数:48  
标签:Wire Arduino 温湿度 SHTC3 串口 print Serial RH


本文章讲解使用NodeMcu开发板读取DHT11、DHT22、SHTC3这三个温湿度传感器的数据并发送至串口。各传感器我都写了使用第三方库和不用第三方库的例程。

ESP8266开发环境搭建教程:https://blog.zeruns.tech/archives/526.html

文中所用到传感器购买地址在文章最下面。

DHT11

DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度湿度±5%RH, 温度±2℃,量程湿度20-90%RH, 温度050℃。**精度不高,但价格低廉。**DHT11使用单总线通信。供电电压3.35V。

Arduino读取DHT11,DHT22,SHTC3温湿度数据_串口通信

使用DHT库

使用DHT sensor library库(需自己安装,安装教程在上面的ESP8266开发环境搭建教程中)来直接读取DHT11的数据。

#include <DHT.h>        //调用DHT库

DHT dht(D1,DHT11);      //设置Data引脚所接IO口和传感器类型

void setup(){ //初始化函数,只在程序开始时运行一次
  Serial.begin(115200);   //设置串口波特率
  dht.begin();             
}
//https://blog.zeruns.tech
void loop() {
  delay(1000);                  //延时1000毫秒
  float RH = dht.readHumidity();   //读取湿度数据
  float T = dht.readTemperature();//读取温度数据
  Serial.print("Humidity:");  //向串口打印 Humidity:
  Serial.print(RH);           //向串口打印湿度数据
  Serial.print("%");
  Serial.print("  Temperature:");
  Serial.print(T);            //向串口打印温度数据
  Serial.println("C"); 
  Serial.println("https://blog.zeruns.tech");
}

不使用库

通过阅读DHT11的数据手册自己编写程序读取数据。

DHT11数据手册:http://go.zeruns.tech/G

#define data D1   //DHT11的Data引脚(2Pin)接到NodeMcu开发板的D1引脚

unsigned char i;  //无符号8位整型变量
float RH,T;       //单精度浮点数(32位长度)
byte RH_H,RH_L,T_H,T_L,sum,check;  //字节变量,二进制数

void setup() {    //初始化函数,只在程序开始时运行一次
  Serial.begin(115200);   //设置串口波特率
}

void loop() {     //循环函数,运行完初始化函数后不断循环运行这个函数
  delay(1000);    //延时1000毫秒
  DHT11();        //获取温湿度数据
  Serial.print("Humidity:");  //向串口打印 Humidity:
  Serial.print(RH);           //向串口打印湿度数据
  Serial.print("%");
  Serial.print("  Temperature:");
  Serial.print(T);            //向串口打印温度数据
  Serial.println("C"); 
  Serial.println("https://blog.zeruns.tech");
}

void DHT11()
{
  RH_H=0,RH_L=0,T_H=0,T_L=0,sum=0,check=0;
  pinMode(data,OUTPUT);   //设置IO口为输出模式
  digitalWrite(data,1);   //设置IO口输出高电平
  delay(10);              //延时10毫秒
  digitalWrite(data,0);   //设置IO口输出低电平
  delay(25);              //延时25毫秒
  digitalWrite(data,1);   //设置IO口输出高电平
  pinMode(data,INPUT);    //设置IO口为输入模式
  delayMicroseconds(30);  //延时30微秒
  if(!digitalRead(data))  //判断IO口输入电平是否低电平
  {//https://blog.zeruns.tech
    while(!digitalRead(data));  //一直循环至输入为高电平
    while(digitalRead(data));   //一直循环至输入为低电平
    for(i=0;i<8;i++)            //循环执行8次
    {   
      while(!digitalRead(data));//一直循环至输入为高电平   
      delayMicroseconds(28);    //延时28微秒
      if(digitalRead(data)){    //判断IO口输入电平是否高电平
        bitWrite(RH_H, 7-i, 1); //在二进制变量RH_H的第7-i位(从右数起)写入1     
        while(digitalRead(data));
      }
    }
    for(i=0;i<8;i++)
    {
      while(!digitalRead(data));
      delayMicroseconds(28);
      if(digitalRead(data)){
        bitWrite(RH_L, 7-i, 1);
        while(digitalRead(data));
      }
    }
    for(i=0;i<8;i++)
    {
      while(!digitalRead(data));
      delayMicroseconds(28);
      if(digitalRead(data)){      
        bitWrite(T_H, 7-i, 1);
        while(digitalRead(data));
      }
    }
    for(i=0;i<8;i++)
    {
      while(!digitalRead(data));
      delayMicroseconds(28);
      if(digitalRead(data)){      
        bitWrite(T_L, 7-i, 1);
        while(digitalRead(data));
      }
    }
    for(i=0;i<8;i++)
    {
      while(!digitalRead(data));
      delayMicroseconds(28);
      if(digitalRead(data)){      
        bitWrite(check, 7-i, 1);
        while(digitalRead(data));
      }
    }
   }
  sum=RH_H + RH_L + T_H + T_L;
  byte sum_temp=0;
  //读取sum的末8位写入sum_temp
  for(i=0;i<8;i++){
    bitWrite(sum_temp,i,bitRead(sum,i)); 
  }//https://blog.zeruns.tech
  if(check==sum_temp){  //校验数据
    RH=RH_H+float(RH_L)/10;
    T=T_H+float(T_L)/10;
  }
}

效果图

Arduino读取DHT11,DHT22,SHTC3温湿度数据_arduino_02

DHT22(AM2302)

DHT22(AM2302)是一款有已校准数字信号输出的温湿度传感器。 其精度湿度±2%RH, 温度±0.5℃,量程湿度0-100%RH, 温度-4080℃,分辨率都为0.1。**精度较高,且价格不贵。**DHT22使用单总线通信。供电电压3.35V。

Arduino读取DHT11,DHT22,SHTC3温湿度数据_串口_03

使用DHT库

使用DHT sensor library库来直接读取DHT22的数据。

#include <DHT.h>        //调用DHT库

DHT dht(D1,DHT22);      //设置Data引脚所接IO口和传感器类型

void setup(){ //初始化函数,只在程序开始时运行一次
  Serial.begin(115200);   //设置串口波特率
  dht.begin();             
}
//https://blog.zeruns.tech
void loop() {
  delay(1000);                  //延时1000毫秒
  float RH = dht.readHumidity();   //读取湿度数据
  float T = dht.readTemperature();//读取温度数据
  Serial.print("Humidity:");  //向串口打印 Humidity:
  Serial.print(RH);           //向串口打印湿度数据
  Serial.print("%");
  Serial.print("  Temperature:");
  Serial.print(T);            //向串口打印温度数据
  Serial.println("C"); 
  Serial.println("https://blog.zeruns.tech");
}

不使用库

通过阅读DHT22的数据手册自己编写程序读取数据。

DHT22数据手册:http://go.zeruns.tech/H

#define data D1   //DHT22的Data引脚(2Pin)接到NodeMcu开发板的D1引脚

unsigned char i;  //无符号8位整型变量
float RH,T;       //单精度浮点数(32位长度)
byte RH_H,RH_L,T_H,T_L,sum,check;  //字节变量,二进制数

void setup() {    //初始化函数,只在程序开始时运行一次
  Serial.begin(115200);   //设置串口波特率
}

void loop() {     //循环函数,运行完初始化函数后不断循环运行这个函数
  delay(1000);    //延时1000毫秒
  DHT11();        //获取温湿度数据
  Serial.print("Humidity:");  //向串口打印 Humidity:
  Serial.print(RH);           //向串口打印湿度数据
  Serial.print("%");
  Serial.print("  Temperature:");
  Serial.print(T);            //向串口打印温度数据
  Serial.println("C"); 
  Serial.println("https://blog.zeruns.tech");
}

void DHT11()
{
  RH_H=0,RH_L=0,T_H=0,T_L=0,sum=0,check=0;
  pinMode(data,OUTPUT);   //设置IO口为输出模式
  digitalWrite(data,1);   //设置IO口输出高电平
  delay(10);              //延时10毫秒
  digitalWrite(data,0);   //设置IO口输出低电平
  delay(25);              //延时25毫秒
  digitalWrite(data,1);   //设置IO口输出高电平
  pinMode(data,INPUT);    //设置IO口为输入模式
  delayMicroseconds(30);  //延时30微秒
  if(!digitalRead(data))  //判断IO口输入电平是否低电平
  {//https://blog.zeruns.tech
    while(!digitalRead(data));  //一直循环至输入为高电平
    while(digitalRead(data));   //一直循环至输入为低电平
    for(i=0;i<8;i++)            //循环执行8次
    {   
      while(!digitalRead(data));//一直循环至输入为高电平   
      delayMicroseconds(28);    //延时28微秒
      if(digitalRead(data)){    //判断IO口输入电平是否高电平
        bitWrite(RH_H, 7-i, 1); //在二进制变量RH_H的第7-i位(从右数起)写入1     
        while(digitalRead(data));
      }
    }
    for(i=0;i<8;i++)
    {
      while(!digitalRead(data));
      delayMicroseconds(28);
      if(digitalRead(data)){
        bitWrite(RH_L, 7-i, 1);
        while(digitalRead(data));
      }
    }
    for(i=0;i<8;i++)
    {
      while(!digitalRead(data));
      delayMicroseconds(28);
      if(digitalRead(data)){      
        bitWrite(T_H, 7-i, 1);
        while(digitalRead(data));
      }
    }
    for(i=0;i<8;i++)
    {
      while(!digitalRead(data));
      delayMicroseconds(28);
      if(digitalRead(data)){      
        bitWrite(T_L, 7-i, 1);
        while(digitalRead(data));
      }
    }
    for(i=0;i<8;i++)
    {
      while(!digitalRead(data));
      delayMicroseconds(28);
      if(digitalRead(data)){      
        bitWrite(check, 7-i, 1);
        while(digitalRead(data));
      }
    }
   }
  sum=RH_H + RH_L + T_H + T_L;
  byte sum_temp=0;
  //读取sum的末8位写入sum_temp
  for(i=0;i<8;i++){
    bitWrite(sum_temp,i,bitRead(sum,i)); 
  }//https://blog.zeruns.tech
  if(check==sum_temp){
    if(bitRead(RH_H,7)==1){ //判断温度是否零下
      T=-(float(T_H<<8)+float(T_L))/10;
    }else{
      T=(float(T_H<<8)+float(T_L))/10;
    }
    RH=(float(RH_H<<8)+float(RH_L))/10;
  }  
}

效果图

Arduino读取DHT11,DHT22,SHTC3温湿度数据_串口通信_04

SHTC3

SHTC3是一款有已校准数字信号输出的温湿度传感器。 其精度湿度±2%RH, 温度±0.2℃,量程湿度0-100%RH, 温度-40125℃,分辨率都为0.01。**精度高,且价格也较便宜,但资料太少了。**SHTC3使用I2C(IIC)通信。供电电压1.623.6V。

SHTC3数据手册:http://go.zeruns.tech/I

Arduino读取DHT11,DHT22,SHTC3温湿度数据_arduino_05

使用Wire(I2C)库

使用Wire库来与SHTC3通信读取数据。

/* https://blog.zeruns.tech
 * 连接方式
 * SHTC3    开发板
 * SCL      SCL(NodeMcu开发板是D1)
 * SDA      SDA(NodeMcu开发板是D2)
 */
#include <Wire.h>

#define SHTC3_ADDRESS 0x70  //定义SHTC3的I2C器件地址为0x70
float T,RH;

void setup() {    //初始化函数,只在程序开始时运行一次
  Serial.begin(115200);   //设置串口波特率
  Wire.begin();   //初始化为I2C主机
}

void loop() {     //循环函数,运行完初始化函数后不断循环运行这个函数
  delay(1000);    //延时1000毫秒
  SHTC3();        //获取温湿度数据
  Serial.print("Humidity:");  //向串口打印 Humidity:
  Serial.print(RH);           //向串口打印湿度数据
  Serial.print("%");
  Serial.print("  Temperature:");
  Serial.print(T);            //向串口打印温度数据
  Serial.println("C"); 
  Serial.println("https://blog.zeruns.tech");
}

void SHTC3(){   //获取温湿度数据
  Wire.beginTransmission(SHTC3_ADDRESS); //根据地址0x70,开始向I2C的从机进行传输。
  Wire.write(byte(0xE0));       //发送写入指令
  Wire.endTransmission();       //停止向从机传输
  Wire.beginTransmission(SHTC3_ADDRESS);
  Wire.write(byte(0x35));       //发送唤醒指令的高位部分
  Wire.write(byte(0x17));       //发送唤醒指令的低位部分
  Wire.endTransmission();
  delayMicroseconds(300);       //延时300微秒
  Wire.beginTransmission(SHTC3_ADDRESS);
  Wire.write(byte(0xE0));
  Wire.endTransmission();
  Wire.beginTransmission(SHTC3_ADDRESS);
  Wire.write(byte(0x7C));       //发送采集指令的高位部分
  Wire.write(byte(0xA2));       //发送采集指令的低位部分
  Wire.endTransmission();
  Wire.beginTransmission(SHTC3_ADDRESS);
  Wire.write(byte(0xE1));       //发送读取指令
  Wire.endTransmission();
  Wire.requestFrom(SHTC3_ADDRESS,6);     //向从机请求数据
  uint16_t T_temp,RH_temp,T_CRC,RH_CRC;
  if (2 <= Wire.available()) {
    T_temp = Wire.read();     //接收温度高位数据
    T_temp = T_temp << 8;     //左移8位
    T_temp |= Wire.read();    //左移8位后的温度高位数据与接收到的温度低位数据进行按位或运算
    T_CRC = Wire.read();      //接收CRC校验码
    if(SHTC3_CRC_CHECK(T_temp,T_CRC)){  //校验数据
      T =float(T_temp) * 175 / 65536 - 45;  //计算出温度
    }
  }//https://blog.zeruns.tech
  if (2 <= Wire.available()) {
    RH_temp = Wire.read();     //接收湿度高位数据
    RH_temp = RH_temp << 8;     //左移8位
    RH_temp |= Wire.read();    //左移8位后的湿度高位数据与接收到的湿度低位数据进行按位或运算
    RH_CRC = Wire.read();
    if(SHTC3_CRC_CHECK(RH_temp,RH_CRC)){
      RH =float(RH_temp) * 100 / 65536;
    }
  }
}
//https://blog.zeruns.tech
uint8_t SHTC3_CRC_CHECK(uint16_t DAT,uint8_t CRC_DAT) //SHTC3的CRC校验
{
    uint8_t i,t,temp;
    uint8_t CRC_BYTE;  
    CRC_BYTE = 0xFF;  
    temp = (DAT>>8) & 0xFF;        
    for(t = 0;t < 2;t ++)
    {
        CRC_BYTE ^= temp;
        for(i = 0;i < 8;i ++)
        {
            if(CRC_BYTE & 0x80)
            {
                CRC_BYTE <<= 1;                
                CRC_BYTE ^= 0x31;    
            }else{
                CRC_BYTE <<= 1;    
            }
        }        
        if(t == 0)
        {
            temp = DAT & 0xFF; 
        }
    }//https://blog.zeruns.tech    
    if(CRC_BYTE == CRC_DAT)
    {
        temp = 1;    
    }else{
        temp = 0;    
    }   
    return temp;
}

使用SHTC3库

先安装SparkFun SHTC3库。

/* https://blog.zeruns.tech
 * 连接方式
 * SHTC3    开发板
 * SCL      SCL(NodeMcu开发板是D1)
 * SDA      SDA(NodeMcu开发板是D2)
 */

#include <SparkFun_SHTC3.h>

SHTC3 mySHTC3;

void setup(){ //初始化函数,只在程序开始时运行一次
  Serial.begin(115200);   //设置串口波特率
  while(Serial == false){};   //等待串行连接启动
  Wire.begin();           //初始化Wire(IIC)库
  unsigned char i=0;
  errorDecoder(mySHTC3.begin());// To start the sensor you must call "begin()", the default settings use Wire (default Arduino I2C port)
}
//https://blog.zeruns.tech
void loop() {
  float RH,T;
  delay(1000);                  //延时1000毫秒
  SHTC3_Status_TypeDef result = mySHTC3.update();
  if(mySHTC3.lastStatus == SHTC3_Status_Nominal)   //判断SHTC3状态是否正常
  {
    RH = mySHTC3.toPercent();   //读取湿度数据                       
    T = mySHTC3.toDegC();       //读取温度数据                    
  }else{
    Serial.print("Update failed, error: ");
    errorDecoder(mySHTC3.lastStatus); //输出错误原因
    Serial.println();
  }
  Serial.print("Humidity:");  //向串口打印 Humidity:
  Serial.print(RH);           //向串口打印湿度数据
  Serial.print("%");
  Serial.print("  Temperature:");
  Serial.print(T);            //向串口打印温度数据
  Serial.println("C"); 
  Serial.println("https://blog.zeruns.tech");
}

void errorDecoder(SHTC3_Status_TypeDef message) // The errorDecoder function prints "SHTC3_Status_TypeDef" resultsin a human-friendly way
{
  switch(message)
  {
    case SHTC3_Status_Nominal : Serial.print("Nominal"); break;
    case SHTC3_Status_Error : Serial.print("Error"); break;
    case SHTC3_Status_CRC_Fail : Serial.print("CRC Fail"); break;
    default : Serial.print("Unknown return code"); break;
  }
}

效果图

Arduino读取DHT11,DHT22,SHTC3温湿度数据_串口通信_06


标签:Wire,Arduino,温湿度,SHTC3,串口,print,Serial,RH
From: https://blog.51cto.com/zeruns/6303956

相关文章

  • arduino篇
    arduino硬件开发认识arduinoarduino开发环境和IDE安装arduino开发板介绍数电基础LED闪烁实验Helloworld实验控制LED灯有源蜂鸣器实验电位器实验PWM调光实验无源蜂鸣器实验光控LED实验一位共阴数码管实验四位共阴数码管实验累加器实验步进电机驱动实验温度传感器LM35实验液晶LCD实......
  • 档案馆库房内环境温湿度的控制与解决方案
    ​ 目录一、智慧档案馆建设目的二、智慧档案馆集成度三、智慧档案馆架构3.1库房环境监测3.2库房安防监控四、智慧档案馆功能简介4.1档案室一体化控制管理系统建设方案4.2温湿度检测建设方案4.3恒温控制建设方案4.4烟雾感应检测系统4.5安防系统建设方案4.6漏水报警监......
  • STM32+HAL库+SHT30温湿度传感器模块I2C通讯数字型
    模块与接线SHT30模块与引脚SCL-------PA4SCL--------PA5实现步骤:  1、IIC地址 0x45(板子上有)  2、启动温湿度测量写入0x2c0x06  3、延时10ms,等待测量结束  4、读测量值,发读指令,延时1ms,接收测量结果。  5、采样值转换为温度值、湿度值程序代......
  • 怎么样才能正确的选择一款机房用的温湿度传感器呢?
    ​ 目前市场上出现了多种以太网温湿度传感器,也可称为IP温湿度传感器,鱼龙混杂,良莠不齐,好像有了RJ45网络接口是以太网温湿度传感器,单看宣传页技术指标参数,好像都差不多,给工程师带来选择上的困惑,到底该选择哪种类型的传感器呢??笔者根据实际测试,现场了解等方面总结了以下几点来进行选......
  • 档案馆库房环境温湿度一体化建设平台之10款八防硬件设备详细介绍
    档案八防十防常用的十款设备序号名称1温湿度传感器2空气质量云测仪3恒湿净化一体机4健康防护一体机5综合智能触摸一体化区域控制器6空调红外学习控制模块7漏水检测控制器及感应线8数字烟雾传感器9......
  • arduino 之 json 再测试(key是否存在)
    1.使用containsKey():Stringdo_back(Stringjson){StaticJsonDocument<200>sjdoc;deserializeJson(sjdoc,json);Stringval=sjdoc["hlf"].as<String>();Serial.print("val:");Serial.println(val);Serial.print("sjdoc.contai......
  • VScode环境下配置arduino
    一、前期配置下载安装arduinoIDE下载链接。在VScode中安装Arduino插件。二、配置VScode配置Arduino设置,贴一下我现在能用的settings(2023.05.01):{"arduino.path":"D:\\software\\Arduino","arduino.commandPath":"arduino_debug.exe","......
  • Arduino入门必备基础知识(基础认证考前总结)
    最近开始准备考取Arduino的官方认证,但之前没有系统地学习,因此打算好好整理一下,一方面当作考试复习,另一方面给想学习Arduino的朋友们一些帮助在学习之前,建议大家先在Arduino中文社区看一下使用教程,里面有很多答疑帖,还有很多干货,值得一看:https://www.arduino.cn/thread-1066......
  • STM32单片机软件模拟I2C读取AM2320温湿度传感器数据
    STM32单片机使用软件模拟IIC读取AM2320温湿度传感器的数据并显示在0.96寸OLED屏上。我用的单片机是STM32F103C8T6,程序用的是ST标准库写的。STM32使用硬件I2C读取SHTC3温湿度传感器:https://blog.zeruns.tech/archives/692.htmlSTM32单片机读取AHT10温湿度传感器数据:https://blog.ze......
  • 树莓派Python读取DHT11温湿度数据
    树莓派4使用Python通过GPIO从DHT11温湿度传感器读取数据原文地址:https://blog.zeruns.tech/archives/625.html介绍DHT11是一款有已校准数字信号输出的温湿度传感器。其精度湿度±5%RH,温度±2℃,量程湿度20-90%RH,温度0~50℃。精度不高,但价格低廉。DHT11使用单总线通信。供电电......