实例9:读取温湿度传感器数据

【实验说明】
使用温湿度传感器DHT11完成温湿度数据的读取,实现一个简易的实时气象站。
【材料准备】
DHT11、面包板、UNO板、面包线连接线
【马上行动】

1.硬件连接

【请勿拆除OLED屏幕,一会还会用到!】
DHT11:

  • VCC:电源正极(接5V电源)
  • GND:电源负极(接地)
  • OUT:传感器数据输出,接Arduino 8脚

7.感受环境:传感器与气象站 - 图1
DHT11传感器

参考资料:温湿度传感器

DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它包括一个电阻式感湿元件和一个 NTC 测温元件。每个 DHT11 传 感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在 OTP 内存中,传感器内部在检测信号的处理过程中要调用这些校准系数,用户 无需重新校准。单线制串行接口,使系统集成变得简易快捷。超小的体积、 极低的功耗,信号传输距离可达 20 米以上。
DHT11数字温湿度传感器价格低廉,但是精度不高。此外,还有DHT22等高精度数字温湿度传感器。


2.拓展库下载与安装

7.感受环境:传感器与气象站 - 图2
dht11.zip(2 KB) 校内下载链接:http://192.168.80.131:8889/wl/?id=pOkjvjPS1mH3IOl8nblAM6W41R6vsSU4
除了Arduino库管理程序提供的一系列库外,我们也可以通过增加.ZIP库的方式轻松添加库函数

3.编译示例程序

  1. /**********************************************************************
  2. DHT11温湿度传感器的数据读取
  3. -----------------------------------------------------------------------
  4. 修订历史/Revision History
  5. 日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description
  6. 2021/03/30 金陵中学 1.0 金陵中学Arduino选修课使用
  7. -----------------------------------------------------------------------
  8. */
  9. #include <dht11.h>
  10. #define DHT11PIN 8
  11. dht11 DHT11;
  12. void setup(){
  13. Serial.begin(9600);
  14. }
  15. void loop(){
  16. Serial.println();
  17. int chk = DHT11.read(DHT11PIN);
  18. float h = (float)DHT11.humidity;
  19. float t = (float)DHT11.temperature;
  20. Serial.print("Humidity (%): ");
  21. Serial.print(t, 1);//1代表1位小数,2代表2位小数,以此类推
  22. Serial.print(" Temperature (C): ");
  23. Serial.print(h, 1);
  24. delay(500);
  25. }

练习(OLED气象站)

如果通过原有的OLED屏幕实现数据的输出呢?
7.感受环境:传感器与气象站 - 图3
以下实例代码请勿复制,如果实在想不到怎么完成,再逐行核对,确保理解。

  1. /**********************************************************************
  2. 练习:Arduino自动气象站
  3. -----------------------------------------------------------------------
  4. 修订历史/Revision History
  5. 日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description
  6. 2021/04/12 金陵中学 1.0 金陵中学Arduino选修课使用
  7. -----------------------------------------------------------------------
  8. */
  9. #include <dht11.h>
  10. #include <Wire.h>
  11. #include <Adafruit_GFX.h>
  12. #include <Adafruit_SSD1306.h>
  13. #define DHT11PIN 8
  14. dht11 DHT11;
  15. #define OLED_RESET 4
  16. Adafruit_SSD1306 display(128, 64, &Wire, OLED_RESET);
  17. void setup() {
  18. display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  19. display.setTextColor(WHITE);//开像素点发光
  20. }
  21. void loop() {
  22. int chk = DHT11.read(DHT11PIN);
  23. float h = (float)DHT11.humidity;
  24. float t = (float)DHT11.temperature;
  25. display.clearDisplay();//清屏
  26. display.setTextSize(1); //设置字体大小
  27. display.setCursor(7, 0);//设置显示位置
  28. display.println("JinLing High School");//输出字符
  29. display.setCursor(7, 15);//设置显示位置
  30. display.println("Temperature(%):");//输出字符
  31. display.setCursor(100, 15);//设置显示位置
  32. display.print(t,1);//显示温度
  33. display.setCursor(7, 45);//设置显示位置
  34. display.println("Humidity(%):");//输出字符
  35. display.setCursor(100, 45);//设置显示位置
  36. display.print(h,1);//显示温度
  37. display.display();//开显示
  38. delay(100);
  39. }

实例10:通过灯的亮灭表示土壤湿度

【实验说明】
使用土壤湿度传感器完成土壤湿度数据的读取
【材料准备】
土壤湿度传感器、电压比较器电路板、面包板、UNO板、面包线连接线、杜邦线
【马上行动】

1.硬件连接

  • 土壤湿度传感器的两根线直连电压比较器电路板
  • 电压比较器电路板输出:
    • VCC:电源正极(接UNO板的5V)
    • GND:电源负极(接地)
    • AO:模拟数据输出,接Arduino A0脚
    • DO:数字数据输出,暂不接

7.感受环境:传感器与气象站 - 图4

2.编译示例程序

实例程序可以根据土壤湿度传感器的检测值控制板载LED灯的亮灭。

  1. /**********************************************************************
  2. 土壤温湿度传感器的数据读取
  3. -----------------------------------------------------------------------
  4. 修订历史/Revision History
  5. 日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description
  6. 2021/03/30 金陵中学 1.0 金陵中学Arduino选修课使用
  7. -----------------------------------------------------------------------
  8. */
  9. #define LEDpin 13
  10. void setup(){
  11. pinMode(LEDpin,OUTPUT);
  12. }
  13. void loop(){
  14. int humidtyRaw = analogRead(A0);
  15. int humidtyReal = map(humidtyRaw,1023,0,0,100);//map函数,将数值映射到1-100
  16. if(humidtyReal > 30)//这里的阈值设为30,可以自行修改
  17. {
  18. digitalWrite(LEDpin,HIGH);
  19. }else{
  20. digitalWrite(LEDpin,LOW);
  21. }
  22. }

实例程序中运用了map函数和一个选择结构,需要注意的是这里选择的阈值为30,也可以根据实验的情况对该值进行修改。请思考一下,如果想便捷地调整阈值大小,可以怎么做呢?

参考资料:Map函数

如果要将数字从一个范围映射到另一个范围,则可以使用 Arduino 中的 map() 函数。例如,如果要映射范围从 1-1000 到 1-100的数字,则可以使用 map() 函数轻松地做到这一点。
该函数将类型为 int 的五个变量作为输入参数。

  1. 第一个参数是要转换其范围的变量。
  2. 第二个参数是变量范围的原始最小值。
  3. 第三个参数是变量范围的原始最大值。
  4. 第四个参数是变量新范围的最小值。
  5. 第五个参数是变量新范围的最大值。

例如,让我们将模拟值映射到 6 位。参考下面的代码。

  1. void loop() {
  2. int myValue = analogRead(A0);
  3. myValue = map(myVal,0,1023,0,100);
  4. }

在上面的代码中,我们使用 analogRead() 函数从模拟引脚 A0 读取数据。analogRead() 函数返回的值范围是 0 到 1023。我们正在将该值的范围转换为 0-100,这是新的范围。你可以根据给定的值更改新范围。请注意,此函数仅适用于整数值。如果要映射分数,请不要使用此函数,而必须创建自己的转换函数。

练习(自动水泵)

练习目标1:外接一个水泵,根据土壤湿度,不仅控制LED灯的亮灭,同时让水泵的工作与否与之联动,请你思考,程序应当如何设计。
练习目标2:外接一个电位器,根据电位器的值调整水泵开关的阈值,请先设计程序。

以下实例程序仅能实现练习目标1的部分功能,仅供参考。

  1. /**********************************************************************
  2. 根据土壤温湿度传感器的数据控制水泵
  3. -----------------------------------------------------------------------
  4. 修订历史/Revision History
  5. 日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description
  6. 2021/03/30 金陵中学 1.0 金陵中学Arduino选修课使用
  7. -----------------------------------------------------------------------
  8. */
  9. #define waterPump 9
  10. void setup(){
  11. pinMode(waterPump,OUTPUT);
  12. }
  13. void loop(){
  14. int humidtyRaw = analogRead(A0);
  15. int humidtyReal = map(humidtyRaw,1023,0,0,100);
  16. if(humidtyReal > 30)
  17. {
  18. digitalWrite(waterPump,HIGH);
  19. }else{
  20. digitalWrite(waterPump,LOW);
  21. }
  22. }