数码之家

 找回密码
 立即注册
搜索
查看: 2691|回复: 9

[Arduino] esp8266-01s+DHT11传感器有误差怎么修正?

[复制链接]
发表于 2022-1-26 16:11:53 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
温度高5度,湿度低15%,误差有点大,有知道怎么修正误差吗?


  1. #define BLINKER_WIFI
  2. #define BLINKER_MIOT_SENSOR
  3. #define BLINKER_DUEROS_SENSOR
  4. #define BLINKER_ALIGENIE_SENSOR
  5. #define BLINKER_PRINT Serial

  6. #include <Blinker.h>
  7. #include <DHT.h>

  8. #include <ESP8266WiFi.h>    //WIFI库,配网必需

  9. int count = 0;     //时间计数
  10. bool WIFI_Status = true;   //WIFI状态标志位

  11. char auth[] = " "; // Blinker APP中添加设备时生成的Secret Key

  12. /* 微信智能配网 */
  13. void smartConfig()
  14. {
  15.   WiFi.mode(WIFI_STA);//设置STA模式
  16.   Serial.println("\r\nWait for Smartconfig...");//打印log信息
  17.   WiFi.beginSmartConfig();//开始SmartConfig,等待手机端发出用户名和密码
  18.   while(1)
  19.   {
  20.     Serial.println("...");
  21.     digitalWrite(LED_BUILTIN,HIGH);//指示灯闪烁
  22.     delay(5000);
  23.     digitalWrite(LED_BUILTIN,LOW);//指示灯闪烁
  24.     delay(5000);
  25.     if(WiFi.smartConfigDone())//配网成功,接收到SSID和密码
  26.     {
  27.       Serial.println("SmartConfig Success");
  28.       Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
  29.       Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
  30.       break;      
  31.     }
  32.   }  
  33. }

  34. /*连接网络*/
  35. void blinkerConnect()
  36. {
  37.   Serial.println("\r\n正在连接WIFI...");

  38.     while(WiFi.status()!=WL_CONNECTED)//判断是否连接WIFI成功
  39.     {
  40.       if(WIFI_Status)
  41.       {
  42.           Serial.print(".");
  43.           digitalWrite(LED_BUILTIN, HIGH);  
  44.           delay(500);                       
  45.           digitalWrite(LED_BUILTIN, LOW);   
  46.           delay(500);                 
  47.           count++;
  48.           if(count>=8)//8s
  49.           {
  50.               WIFI_Status = false;
  51.               Serial.println("WiFi连接失败,请用手机进行配网");
  52.           }        
  53.         }
  54.         else
  55.         {
  56.           smartConfig();  //微信智能配网
  57.         }
  58.     }

  59.     Serial.println("连接成功");  
  60.     Serial.print("IP:");
  61.     Serial.println(WiFi.localIP());
  62. }

  63. BlinkerNumber HUMI("humi");
  64. BlinkerNumber TEMP("temp");

  65. #define DHTPIN 2

  66. #define DHTTYPE DHT11   // DHT 11
  67. //#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
  68. //#define DHTTYPE DHT21   // DHT 21 (AM2301)

  69. DHT dht(DHTPIN, DHTTYPE);

  70. uint32_t read_time = 0;

  71. float humi_read, temp_read;

  72. void heartbeat()
  73. {
  74.     HUMI.print(humi_read);
  75.     TEMP.print(temp_read);
  76. }

  77. void dataStorage()
  78. {
  79.     Blinker.dataStorage("temp", temp_read);
  80.     Blinker.dataStorage("humi", humi_read);
  81. }

  82. void miotQuery(int32_t queryCode)
  83. {
  84.     BLINKER_LOG("MIOT Query codes: ", queryCode);

  85.     switch (queryCode)
  86.     {
  87.         case BLINKER_CMD_QUERY_ALL_NUMBER :
  88.             BLINKER_LOG("MIOT Query All");
  89.             BlinkerMIOT.temp(temp_read);
  90.             BlinkerMIOT.humi(humi_read);
  91.             BlinkerMIOT.print();
  92.             break;
  93.         default :
  94.             BlinkerMIOT.temp(20);
  95.             BlinkerMIOT.humi(20);
  96.             BlinkerMIOT.print();
  97.             break;
  98.     }
  99. }

  100. void duerQuery(int32_t queryCode)
  101. {
  102.     BLINKER_LOG("DuerOS Query codes: ", queryCode);

  103.     switch (queryCode)
  104.     {
  105.         case BLINKER_CMD_QUERY_HUMI_NUMBER :
  106.             BLINKER_LOG("DuerOS Query HUMI");
  107.             BlinkerDuerOS.humi(humi_read);
  108.             BlinkerDuerOS.print();
  109.             break;
  110.         case BLINKER_CMD_QUERY_TEMP_NUMBER :
  111.             BLINKER_LOG("DuerOS Query TEMP");
  112.             BlinkerDuerOS.temp(temp_read);
  113.             BlinkerDuerOS.print();
  114.             break;
  115.         default :
  116.             BlinkerDuerOS.temp(20);
  117.             BlinkerDuerOS.humi(20);
  118.             BlinkerDuerOS.print();
  119.             break;
  120.     }
  121. }

  122. void aligenieQuery(int32_t queryCode)
  123. {
  124.     BLINKER_LOG("AliGenie Query codes: ", queryCode);

  125.     switch (queryCode)
  126.     {
  127.         case BLINKER_CMD_QUERY_ALL_NUMBER :
  128.             BLINKER_LOG("AliGenie Query All");
  129.             BlinkerAliGenie.temp(temp_read);
  130.             BlinkerAliGenie.humi(humi_read);
  131.             BlinkerAliGenie.print();
  132.             break;
  133.         default :
  134.             BlinkerAliGenie.temp(20);
  135.             BlinkerAliGenie.humi(20);
  136.             BlinkerAliGenie.print();
  137.             break;
  138.     }
  139. }

  140. void dataRead(const String & data)
  141. {
  142.     BLINKER_LOG("Blinker readString: ", data);

  143.     Blinker.vibrate();
  144.    
  145.     uint32_t BlinkerTime = millis();
  146.    
  147.     Blinker.print("millis", BlinkerTime);
  148. }

  149. void setup()
  150. {
  151.     Serial.begin(115200);
  152.     BLINKER_DEBUG.stream(Serial);

  153.     pinMode(LED_BUILTIN, OUTPUT);
  154.     digitalWrite(LED_BUILTIN, LOW);

  155.     //网络连接
  156.     blinkerConnect();
  157.   
  158.     // 初始化blinker
  159.     Blinker.begin(auth,WiFi.SSID().c_str(),WiFi.psk().c_str()); //根据配网得到的WIFI信息和设备秘钥,连接到Blinker云   
  160.     Blinker.attachData(dataRead);
  161.     Blinker.attachHeartbeat(heartbeat);
  162.     Blinker.attachDataStorage(dataStorage);
  163.     BlinkerMIOT.attachQuery(miotQuery);
  164.     BlinkerDuerOS.attachQuery(duerQuery);
  165.     BlinkerAliGenie.attachQuery(aligenieQuery);
  166.     Blinker.setTimezone(8.0);   
  167.     dht.begin();
  168. }

  169. void loop()
  170. {
  171.     Blinker.run();

  172.     if (read_time == 0 || (millis() - read_time) >= 2000)
  173.     {
  174.         read_time = millis();

  175.         float h = dht.readHumidity();
  176.         float t = dht.readTemperature();        

  177.         if (isnan(h) || isnan(t)) {
  178.             BLINKER_LOG("温度传感器未连接!");
  179.             return;
  180.         }

  181.         float hic = dht.computeHeatIndex(t, h, false);

  182.         humi_read = h;
  183.         temp_read = t;

  184.         BLINKER_LOG("Humidity: ", h, " %");
  185.         BLINKER_LOG("Temperature: ", t, " °C");
  186.         BLINKER_LOG("Heat index: ", hic, " °C");
  187.     }
  188. }
复制代码


发表于 2022-1-26 17:27:39 | 显示全部楼层
DHT11 本来就是玩具,但是温度应该基本准的,湿度不靠谱。DHT22 AHT20贵点的稍好些,也好不了太多。业余用多买几种自己测试挑选吧;做产品不会这里问吧。
回复 支持 反对

使用道具 举报

发表于 2022-1-27 08:35:22 | 显示全部楼层
多测几个点的对比数据,然后在代码中修正温度。正如楼上所说的,本身DHT11的误差就比较大,只适合要求不高的应用。
回复 支持 反对

使用道具 举报

发表于 2022-1-28 10:58:50 | 显示全部楼层
float h = dht.readHumidity()+15;
        float t = dht.readTemperature()-5;   
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-1-30 09:20:49 | 显示全部楼层
kindzhon 发表于 2022-1-28 10:58
float h = dht.readHumidity()+15;
        float t = dht.readTemperature()-5;

可以了,谢谢!
回复 支持 反对

使用道具 举报

发表于 2022-1-30 13:37:12 来自手机浏览器 | 显示全部楼层
我用的AHT-25,i2c协议的很方便
加上bmp280、1750和pm2.5模块,做了温度湿度气压光强空气质量检测仪,只要4个io,通过8266接了ha
回复 支持 反对

使用道具 举报

发表于 2022-1-30 15:05:56 | 显示全部楼层
kindzhon 发表于 2022-1-28 10:58
float h = dht.readHumidity()+15;
        float t = dht.readTemperature()-5;

我用了两个HTU21D,一个感觉靠谱,另一个就很没谱我就是用你这个方法修正的,虽然看着显示数据回归了,但心里却总是不信任了,不知道有啥靠谱的温湿度传感器可以推荐的弄来玩玩。
回复 支持 反对

使用道具 举报

发表于 2022-2-7 14:49:36 | 显示全部楼层
慕名而来 发表于 2022-1-30 15:05
我用了两个HTU21D,一个感觉靠谱,另一个就很没谱我就是用你这个方法修正的,虽然看着显示数据回归了,但 ...

SHT30,31靠谱,就是贵,而且小。
回复 支持 反对

使用道具 举报

发表于 2022-9-9 17:08:07 | 显示全部楼层
kpj001 发表于 2022-1-26 17:27
DHT11 本来就是玩具,但是温度应该基本准的,湿度不靠谱。DHT22 AHT20贵点的稍好些,也好不了太多。业余用 ...

高手,做产品的话用什么 ?  多谢。
回复 支持 反对

使用道具 举报

发表于 2022-9-10 01:31:44 | 显示全部楼层
除了器件本身的精度外,传感器还要远离热源,芯片、wifi模块、显示屏……
Sensirion(瑞士盛思锐)建议这样设计


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-13 10:21 , Processed in 0.327601 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表