1回答

1收藏

【赚周年币】技术贴 基于Arduino Uno开发板的温湿度检测

#线上活动 #线上活动 1889 人阅读 | 1 人回复 | 2016-12-20

先前在社区申请到一块Arduino Uno开发板,计划做一个温湿度控制器,主要由DHT11温湿度传感器、IIC接口OLED屏、光隔继电器、按键等组成。
    进过一定时间的资料收集和测试,现已实现温湿度的检测。开始检查到的温湿度值一直不变当误了许多的时间,后来才发现问题出在传感器模块上,根本就不能工作,测了一下上拉电阻才有1K,后来自己用元件焊了个传感器模块,问题就解决了,其线路如图1所示。

1 DHT11温湿度传感器模块线路及用法

由于采用的OLED屏IIC接口,所有同常规的SPI接口有一定的差别。此外,使用示例的SSD1306程序也没能奏效,或许SSD1306的12864屏与0.96’的双色屏有区别,有待解决或自己重新写一个驱程。现将已有的成果分享分享,已实现的效果如如2所示。该程序相对于普通的程序输出的数据值更多样化,一个温度就有3种表现方式,且有露点值得输出。


图2 温湿度检测结果

至于所用的程序嘛,如下:
  1. //摄氏温度度转化为华氏温度
  2. double Fahrenheit(double celsius)
  3. {
  4.         return 1.8 * celsius + 32;
  5. }
  6.    
  7. //摄氏温度转化为开氏温度
  8. double Kelvin(double celsius)
  9. {
  10.         return celsius + 273.15;
  11. }     

  12. // 露点(点在此温度时,空气饱和并产生露珠)
  13. // 参考: http://wahiduddin.net/calc/density_algorithms.htm
  14. double dewPoint(double celsius, double humidity)
  15. {
  16.         double A0= 373.15/(273.15 + celsius);
  17.         double SUM = -7.90298 * (A0-1);
  18.         SUM += 5.02808 * log10(A0);
  19.         SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
  20.         SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
  21.         SUM += log10(1013.246);
  22.         double VP = pow(10, SUM-3) * humidity;
  23.         double T = log(VP/0.61078);   // temp var
  24.         return (241.88 * T) / (17.558-T);
  25. }

  26. // 快速计算露点,速度是5倍dewPoint()
  27. // 参考: http://en.wikipedia.org/wiki/Dew_point
  28. double dewPointFast(double celsius, double humidity)
  29. {
  30.         double a = 17.271;
  31.         double b = 237.7;
  32.         double temp = (a * celsius) / (b + celsius) + log(humidity/100);
  33.         double Td = (b * temp) / (a - temp);
  34.         return Td;
  35. }

  36. #include <dht11.h>
  37. dht11 DHT11;
  38. #define DHT11PIN 2
  39. void setup()
  40. {
  41.   Serial.begin(9600);
  42.   Serial.println("DHT11 TEST PROGRAM ");
  43.   Serial.print("LIBRARY VERSION: ");
  44.   Serial.println(DHT11LIB_VERSION);
  45.   Serial.println();
  46. }

  47. void loop()
  48. {
  49.   Serial.println("\n");

  50.   int chk = DHT11.read(DHT11PIN);

  51.   Serial.print("Read sensor: ");
  52.   switch (chk)
  53.   {
  54.     case DHTLIB_OK:
  55.                 Serial.println("OK");
  56.                 break;
  57.     case DHTLIB_ERROR_CHECKSUM:
  58.                 Serial.println("Checksum error");
  59.                 break;
  60.     case DHTLIB_ERROR_TIMEOUT:
  61.                 Serial.println("Time out error");
  62.                 break;
  63.     default:
  64.                 Serial.println("Unknown error");
  65.                 break;
  66.   }

  67.   Serial.print("Humidity (%): ");
  68.   Serial.println((float)DHT11.humidity, 2);

  69.   Serial.print("Temperature (oC): ");
  70.   Serial.println((float)DHT11.temperature, 2);

  71.   Serial.print("Temperature (oF): ");
  72.   Serial.println(Fahrenheit(DHT11.temperature), 2);

  73.   Serial.print("Temperature (K): ");
  74.   Serial.println(Kelvin(DHT11.temperature), 2);

  75.   Serial.print("Dew Point (oC): ");
  76.   Serial.println(dewPoint(DHT11.temperature, DHT11.humidity));

  77.   Serial.print("Dew PointFast (oC): ");
  78.   Serial.println(dewPointFast(DHT11.temperature, DHT11.humidity));

  79.   delay(2000);
  80. }
复制代码
后续的任务则是实现OLED屏显示数据,并配置按键来设置控制值以控制继电器的开合动作。

分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

沙发

jackten

发表于 2016-12-20 17:51:14 | 只看该作者

                                
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条