查看: 21428|回复: 20

[基础教程] Arduino教程中级 项目九 实时温湿度检测器

[复制链接]
项目九 实时温湿度检测器

本系列教程为DF创客社区版权所有,配套硬件套件新版Arduino中级套件

想不想做个实时温湿度检测器,走到哪儿,测到哪儿!只需要一个DHT11温湿度传感器就能做到,再外加个1602的显示屏,实时查看数据。等你之后玩Arduino够溜的时候,还可以往控制器上加网络模板,这样数据不仅能实时显示,还能放到网上,或者通过微博发布出去,是不是很心动了呢?那就先做个最简单的,本地实时显示数据~

所需材料

l  1×  DHT11温湿度传感器
                              
image001.jpg

l  1×  I2C LCD1602液晶模块
image002.jpg

硬件连接

image003.jpg

     DHT11温湿度传感器 → 数字口4
     LCD GND → GND
     LCD VCC → 5V
     LCD SDA → SDA
     LCD SCL → SCL
     A0,A1,A2全部插上跳冒

输入代码
下载代码之前,把库“dht11”和“LiquidCrystal_I2C”放入Arduino IDE的libraries中,不知道如何加载库的小伙伴可以先看下项目十二 遥控器一节,有详细说明过程。

image004.jpg

image005.jpg

样例代码9-1:

//项目九 - 实时温湿度检测器
#include <dht11.h>         
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20,16,2);  //设置LCD的地址为0x20,可以设置2行,每行16个字符
dht11 DHT;
#define DHT11_PIN 4
void setup(){
  lcd.init();                 // LCD初始化设置
lcd.backlight();           // 打开LCD背光
Serial.begin(9600);       // 设置串口波特率9600
  //串口输出”Type, status, Humidity(%), Temperature(C)”
  Serial.println("Type,\tstatus,\tHumidity(%),\tTemperature(C)");
lcd.print("Humidity(%): ");   //LCD屏显示” Humidity(%):”
lcd.setCursor(0, 1);            //光标移到第2行,第一个字符
lcd.print("Temp(C): ");        //LCD屏显示”Temp(C):”
}
void loop(){
  int chk;     //chk用于存储DHT11传感器的数据
Serial.print("DHT11, \t");   
  //读取DHT11传感器的数据
  chk = DHT.read(DHT11_PIN);   
  switch(chk){   
    caseDHTLIB_OK:  
               Serial.print("OK,\t");
               break;
    caseDHTLIB_ERROR_CHECKSUM:
               Serial.print("Checksum error,\t");
               break;
    caseDHTLIB_ERROR_TIMEOUT:
               Serial.print("Time out error,\t");
               break;
    default:
               Serial.print("Unknown error,\t");
               break;
  }
//串口显示温湿度值
Serial.print(DHT.humidity,1);
Serial.print(",\t");
  Serial.println(DHT.temperature,1);
  //LCD显示温湿度值
lcd.setCursor(12, 0);
lcd.print(DHT.humidity,1);
lcd.setCursor(8, 1);
lcd.print(DHT.temperature,1);
delay(1000);
}
   
下载完代码后,不仅可以从LCD屏上显示当前的温湿度,还可以从串口中看到值。

代码回顾

首先,把用到的库声明一下:
#include <dht11.h>   
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
dht11.h和LiquidCrystal_I2C的库,我们事先已经加载过库了,那么Wire.h的库为什么不需要加载呢?因为我们下载的Arduino IDE本身自带这个库。不信的话,你可以同样找到libraries文件夹,Wire.h库会在里面。
有了现有的库,所以只需要在程序的一开始声明一下这个LCD:
LiquidCrystal_I2C lcd(0x20,16,2);
0x20:I2C地址
由屏后面的A0~A1决定,具体不同的地址可以查看链接:http://wiki.dfrobot.com.cn/index.php/(SKU:DFR0063)IIC_LCD1602_display_module_%E5%85%BC%E5%AE%B9Gadgeteer
16:每行16个字符
2: 共2行

代码中LiquidCrystal_I2C涉及函数说明
  
lcd.init()
  
LCD初始化
lcd.backlight()
打开LCD背光灯
lcd.print()
LCD显示
lcd.setCursor()
设置LCD光标停留位置
注:更多用法可见LiquidCrystal_I2C/examples中样例代码。

switch…case语句
   “switch”可以理解为是“开关”,多选择开关。与if语句相似之处在于switch…case也用于判断,又与if不同点在于它能判断多种情况。
switch(var){
       case 1:
           //var=1,做点什么事
          break //跳出switch语句
      case 2
           //var=2,做点什么事
           break
      default
           //如果没有一种情况是匹配的,运行default
           //default可有可无,视情况而定
}

注意几点:
1.   case后面是冒号,不是分号。
2.   关键字break用于退出switch语句,通常每条case语句都以break结尾。如果没有break语句,switch语句将会一直执行接下来的语句(一直向下)直到遇见一个break,或者switch语句结尾。
注:如果对switch…case语句用法还有不懂的,可以查看下Arduino IDE中的examples/05.Control/switchCase相关资料。

※ 在之后的Arduino学习之旅中,不管你遇到奇奇怪怪的问题,都希望你与我们交流,欢迎登陆我们的DFRobot创客社区!

Lesson9_1.rar

19.51 KB, 下载次数: 337, 下载积分: 创造力 -1

本帖被以下淘专辑推荐:

  • · |主题: 32, 订阅: 1

congzlwag  见习技师

发表于 2016-1-30 18:59:29

本帖最后由 congzlwag 于 2016-1-30 19:05 编辑

我照搬库文件和代码,结果却是 “Humidity”只显示了个‘H’、"Temperature"只显示了个‘T’,数据也只显示第一位。为啥?会是我的Wire库的问题么?用的IDE是Arduino 1.6.7.
wp_20160130_19_02_09_pro.jpg
回复 支持 1 反对 0

使用道具 举报

joevcheung  学徒

发表于 2017-5-13 17:16:08

z1033969032 发表于 2016-5-21 19:05
温度和湿度为什么一直显示0呀

那在新的IDE里面怎么改呢?
回复 支持 1 反对 0

使用道具 举报

j229544844  学徒

发表于 2016-11-29 17:34:01

为什么我编译程序时出现  
exit status 1
为开发板 Arduino/Genuino Uno 编译时出错。   这个   请教一下
回复 支持 1 反对 0

使用道具 举报

hnyzcj  超级版主

发表于 2016-1-27 18:19:41

狂发教程
回复 支持 反对

使用道具 举报

大连林海  初级技神

发表于 2016-1-27 22:55:16

这个等俺学习一下
回复 支持 反对

使用道具 举报

Jane  管理员
 楼主|

发表于 2016-2-2 15:35:42

congzlwag 发表于 2016-1-30 18:59
我照搬库文件和代码,结果却是 “Humidity”只显示了个‘H’、"Temperature"只显示了个‘T’,数据也只显示 ...

直接LCD屏的样例代码,显示正常吗?
回复 支持 反对

使用道具 举报

congzlwag  见习技师

发表于 2016-2-3 18:38:10

本帖最后由 congzlwag 于 2016-2-3 20:42 编辑
Jane 发表于 2016-2-2 15:35
直接LCD屏的样例代码,显示正常吗?

已查明是IDE的问题,之前一直在用1.6.7,换成1.0.6就正常了。谢谢!
wp_20160202_15_19_06_pro.jpg
回复 支持 反对

使用道具 举报

z1033969032  见习技师

发表于 2016-5-21 18:40:52

为什么温度和湿度一直为0呢
回复 支持 反对

使用道具 举报

z1033969032  见习技师

发表于 2016-5-21 19:05:56

congzlwag 发表于 2016-2-3 18:38
已查明是IDE的问题,之前一直在用1.6.7,换成1.0.6就正常了。谢谢!

温度和湿度为什么一直显示0呀
回复 支持 反对

使用道具 举报

jiashe2011  见习技师

发表于 2017-2-21 23:54:39

学习了!!!!
回复 支持 反对

使用道具 举报

Jane  管理员
 楼主|

发表于 2017-3-24 23:26:01


期待有分享哦~
回复 支持 反对

使用道具 举报

萧宸轩  见习技师

发表于 2017-5-31 15:55:06

为什么温度和湿度在串口显示一直是0 ,而且显示屏上没有显示啊?
回复 支持 反对

使用道具 举报

6995417  学徒

发表于 2017-9-20 09:17:17

我如图连线了 ,但是一连接控制板就断电了。请大神们指教一下,谢谢!
回复 支持 反对

使用道具 举报

Wallard  学徒

发表于 2017-12-19 10:00:09

为什么LCD什么都没有显示啊,是不是跳冒的问题,啥是跳冒啊
回复 支持 反对

使用道具 举报

Jane  管理员
 楼主|

发表于 2017-12-28 14:57:40

萧宸轩 发表于 2017-5-31 15:55
为什么温度和湿度在串口显示一直是0 ,而且显示屏上没有显示啊?

显示器的i2c地址看一下对不对。

http://wiki.dfrobot.com.cn/index.php/(SKU:DFR0063)IIC_LCD1602_display_module_%E5%85%BC%E5%AE%B9Gadgeteer
回复 支持 反对

使用道具 举报

Jane  管理员
 楼主|

发表于 2017-12-28 14:58:21

Wallard 发表于 2017-12-19 10:00
为什么LCD什么都没有显示啊,是不是跳冒的问题,啥是跳冒啊

是不是I2C地址不对。
http://wiki.dfrobot.com.cn/index.php/(SKU:DFR0063)IIC_LCD1602_display_module_%E5%85%BC%E5%AE%B9Gadgeteer
回复 支持 反对

使用道具 举报

zzynb  学徒

发表于 2018-2-8 15:48:39

congzlwag 发表于 2016-1-30 18:59
我照搬库文件和代码,结果却是 “Humidity”只显示了个‘H’、"Temperature"只显示了个‘T’,数据也只显示 ...

我和你的情况一样呢?用的 Arduino ide 1.8.5 还有别的办法解决吗?
回复 支持 反对

使用道具 举报

liaowei  学徒

发表于 2018-2-27 14:28:57

zzynb 发表于 2018-2-8 15:48
我和你的情况一样呢?用的 Arduino ide 1.8.5 还有别的办法解决吗?

我也遇到同样的问题了,用的也是Arduino ide 1.8.5。
回复 支持 反对

使用道具 举报

Mystic  学徒

发表于 2018-7-11 21:27:47

congzlwag 发表于 2016-1-30 18:59
我照搬库文件和代码,结果却是 “Humidity”只显示了个‘H’、"Temperature"只显示了个‘T’,数据也只显示 ...

我用的IDE 1.8.4版本   和你的情况一样
回复 支持 反对

使用道具 举报

zhouyu77642017  学徒

发表于 2018-8-9 08:59:31

我的编译有问题:Arduino:1.7.8 (Windows 7), 板:"Arduino Uno"

构建选项已变更,全部重新构建

使用库 Wire 在文件夹: E:\arduino\朗译电子arduino套件资料\原版arduino驱动安装方法及软件\arduino-1.7.8\arduino-1.7.8\hardware\arduino\avr\libraries\Wire



E:\arduino\朗译电子arduino套件资料\原版arduino驱动安装方法及软件\arduino-1.7.8\arduino-1.7.8/hardware/tools/avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10708 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR -IE:\arduino\朗译电子arduino套件资料\原版arduino驱动安装方法及软件\arduino-1.7.8\arduino-1.7.8\hardware\arduino\avr\cores\arduino -IE:\arduino\朗译电子arduino套件资料\原版arduino驱动安装方法及软件\arduino-1.7.8\arduino-1.7.8\hardware\arduino\avr\variants\standard -IE:\arduino\朗译电子arduino套件资料\原版arduino驱动安装方法及软件\arduino-1.7.8\arduino-1.7.8\hardware\arduino\avr\libraries\Wire C:\Users\ADMINI~1\AppData\Local\Temp\build2568614031449157192.tmp\Lesson9_1.cpp -o C:\Users\ADMINI~1\AppData\Local\Temp\build2568614031449157192.tmp\Lesson9_1.cpp.o

Lesson9_1.ino:4:22: fatal error: dht11.h: No such file or directory

compilation terminated.

编译有误。
回复 支持 反对

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
wifi气象站

硬件清单

btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2019 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail