第九章 家庭數(shù)字溫濕度監(jiān)控儀(溫濕度傳感器DHT11+1602 LCD)(Arduino邊做邊學(xué):從點(diǎn)亮Led到物聯(lián)網(wǎng))

本系列文章為作者原創(chuàng),未經(jīng)作者書面同意箕昭,不得轉(zhuǎn)載解阅!

溫濕度監(jiān)控儀(溫濕度表)在我們生活中很常見货抄,尤其北方家庭蟹地,冬天比較干燥夺刑,一般都會在家里放一個(gè)溫濕度表分别,如果濕度過低错览,會打開加濕器倾哺,能夠防止過于干燥的環(huán)境給人帶來的不適羞海。溫濕度表一般有以下兩種,一種是電子的院水,一種是機(jī)械的:


001.png
002.png

今天我們的項(xiàng)目就是制作一個(gè)溫濕度監(jiān)控儀螟蝙!


我們要制作的溫濕度監(jiān)控儀當(dāng)然是電子式的胰默,通過溫濕度傳感器獲取環(huán)境溫濕度數(shù)據(jù)牵署,然后在一塊液晶屏上實(shí)時(shí)顯示出來奴迅。

1 本章您將學(xué)到

在這個(gè)項(xiàng)目中爽柒,您將學(xué)到的:

  • 學(xué)會使用溫濕度傳感器
  • 學(xué)習(xí)使用1602液晶顯示屏
  • 學(xué)習(xí)使用庫文件和定義對象

2 工具和組件

2.1 工具列表

本項(xiàng)目不需要額外的工具。

2.2 元器件列表

元器件 型號 數(shù)量 備注
主控板 arduino Uno 1
溫濕度傳感器 DHT11 1
液晶屏 1602 LCD 1
電阻 4K歐姆 4
面包板 1
杜邦線 若個(gè)
數(shù)據(jù)線 Uno數(shù)據(jù)線 1

2.3 工具和元器件介紹

2.3 工具和元器件介紹

2.3.1 DHT11溫濕度傳感器

dht11.png

引腳說明:

  • VCC:供電 3.5V-5.5V DC
  • DATA:串行數(shù)據(jù),單總線
  • NC:空引腳(無需連線)
  • GND:接地酿矢,電源負(fù)極

2.3.2 1602 LCD

1602.png

1602字符型液晶,是一種專門用來顯示字母策肝、數(shù)字隐绵、符號等的點(diǎn)陣型液晶模塊依许,能夠同時(shí)顯示16x02即32個(gè)字符膘婶。

它由若干個(gè)5X7或者5X11等點(diǎn)陣字符位組成,每個(gè)點(diǎn)陣字符位都可以顯示一個(gè)字符竣付,每位之間有一個(gè)點(diǎn)距的間隔诡延,每行之間也有間隔,起到了字符間距和行間距的作用古胆。

1602 LCD分為兩種:帶背光和不帶背光肆良,帶背光的要后一些,引腳多2個(gè)逸绎,為16個(gè)引腳惹恃,如下:


1602_01.png

2.3.2.1 引腳說明

1602 LCD通常有14條引腳或16條引腳,14與16引腳的差別在于16條引腳多了背光電源線VCC(15腳)和地線GND(16腳)棺牧,其它引腳與14腳的LCD完全一樣,如下:

引腳 符號 功能說明
1 VSS 一般接地
2 VDD 接電源(+5V)
3 V0 液晶顯示器對比度調(diào)整端,接正電源時(shí)對比度最弱,接地電源時(shí)對比度最高(對比度過高時(shí)會產(chǎn)生“鬼影”,使用時(shí)可以通過一個(gè)10K的電位器調(diào)整對比度)
4 RS RS為寄存器選擇,高電平1時(shí)選擇數(shù)據(jù)寄存器、低電平0時(shí)選擇指令寄存器
5 R/W R/W為讀寫信號線,高電平(1)時(shí)進(jìn)行讀操作,低電平(0)時(shí)進(jìn)行寫操作
6 E E(或EN)端為使能(enable)端金顿,寫操作時(shí),下降沿使能筒狠;讀操作時(shí)灶伊,E高電平有效
7 DB0 低4位三態(tài)碾牌、 雙向數(shù)據(jù)總線 0位(最低位)
8 DB1 高4位三態(tài)、 雙向數(shù)據(jù)總線 1位
9 DB2 高4位三態(tài)、 雙向數(shù)據(jù)總線 2位
10 DB3 高4位三態(tài)、 雙向數(shù)據(jù)總線 3位
11 DB4 高4位三態(tài)、 雙向數(shù)據(jù)總線 4位
12 DB5 高4位三態(tài)脖卖、 雙向數(shù)據(jù)總線 5位
13 DB6 高4位三態(tài)、 雙向數(shù)據(jù)總線 6位
14 DB7 高4位三態(tài)垒迂、 雙向數(shù)據(jù)總線 7位(busy flag)
15 BLA 背光電源正極
16 BLK 背光電源負(fù)極

2.3.2.2 與Arduino的連接

1602 LCD與Arduino的直接相連有兩種接線方式:四線法和八線法欢揖。顧名思義,四線法就是只需要連接8個(gè)數(shù)據(jù)引腳中的四個(gè)即可,八線法則需要全部連接。

您也許會問着裹,既然連接4個(gè)引腳即可,為什么還要費(fèi)勁巴拉的連八個(gè)郁季?八線法有什么用呢?當(dāng)然有用,用處就是數(shù)據(jù)的傳輸速度會快一些虐拓,給你的感覺就是顯示器刷新速度會快一些诗茎,當(dāng)然這個(gè)速度差異我沒有測試過尿招,這個(gè)還要取決于您的肉眼是否是火眼金睛缆瓣。

另外,1602 LCD與Arduino還有一種間接的連接方式呼奢,就是用一塊I2C的轉(zhuǎn)接板,這種方式Arduino需要的引腳更少岖妄,這部分涉及到Arduino的I2C通信狠裹,我們不在本文介紹。

本文主要介紹常用的四線法:


1602_02.png

上圖就是四線法的接線方法碰缔,應(yīng)該很清晰了腌且,注意V0與GND之間有一個(gè)調(diào)節(jié)液晶對比度的4K歐姆的電阻,也可以用一個(gè)滑動(dòng)變阻器代替什黑,這樣調(diào)節(jié)對比度更加方便森爽。

3 電路設(shè)計(jì)

3.1 電路圖

根據(jù)我們的項(xiàng)目需求徽职,設(shè)計(jì)電路圖如下:


0006.png

3.2 電路原理

這個(gè)電路圖其實(shí)比較簡單,就是將1602 LCD和DHT11跟UNO連接上类早,這兩個(gè)模塊的連線方法第二節(jié)已經(jīng)詳細(xì)介紹了栈顷,這里就不再贅述逆日。

這個(gè)電路圖唯一需要注意的是圖中V0/VL引腳連接的電阻。

V0/VL引腳為液晶顯示器對比度調(diào)整端口萄凤,推薦使用一個(gè)10K的電位器來調(diào)整對比度室抽。在這個(gè)項(xiàng)目中,選擇了4k電阻靡努,在通過電腦USB給UNO供電的情況下坪圾,液晶顯示對比度比較理想晓折,不過在用12V電源供電的情況下,液晶顯示對比度偏低兽泄,所以您在設(shè)計(jì)還需要注意漓概,如果需要采用獨(dú)立電源供電,需要對電阻進(jìn)行重新選擇病梢。

4 程序設(shè)計(jì)

4.1 類庫介紹

4.1.1 dht11.h庫介紹

4.1.1.1 dht11.h庫的下載

首先說明一下胃珍,Arduino上DHT11的庫有好幾個(gè),使用起來大同小異蜓陌,本項(xiàng)目中使用的是dht11.h(還有DHT.h觅彰,稍微有點(diǎn)不同),dht11.h的下載地址:github鏈接钮热。
下載下來后填抬,在Arduino IDE中,點(diǎn)擊項(xiàng)目->加載庫->添加一個(gè).zip庫霉旗,選擇下載好的dht11-master.zip文件即可痴奏。

4.1.1.1 dht11.h庫的介紹

我們來看一下這個(gè)庫的頭文件,cpp文件這里就不過多介紹了厌秒,對于庫读拆,我們主要是弄明白怎么使用就OK。
我們還是先看代碼:

// 
//    FILE: dht11.h
// VERSION: 0.4.1
// PURPOSE: DHT11 Temperature & Humidity Sensor library for Arduino
// LICENSE: GPL v3 (http://www.gnu.org/licenses/gpl.html)
//
// DATASHEET: http://www.micro4you.com/files/sensor/DHT11.pdf
//
//     URL: http://playground.arduino.cc/Main/DHT11Lib
//
// HISTORY:
// George Hadjikyriacou - Original version
// see dht.cpp file
// 

#ifndef dht11_h
#define dht11_h

#if defined(ARDUINO) && (ARDUINO >= 100)
#include <Arduino.h>
#else
#include <WProgram.h>
#endif

#define DHT11LIB_VERSION "0.4.1"

#define DHTLIB_OK               0
#define DHTLIB_ERROR_CHECKSUM   -1
#define DHTLIB_ERROR_TIMEOUT    -2

class dht11
{
public:
    int read(int pin);
    int humidity;
    int temperature;
};
#endif
//
// END OF FILE
//

其實(shí)這個(gè)頭文件非常簡單(這也是為什么我采用這個(gè)庫的原因鸵闪,簡單易學(xué)):

  • 申明了一個(gè)類:dht11
  • 申明了一個(gè)方法:read(int pin)檐晕,讀取傳感器數(shù)據(jù)
  • 聲明了兩個(gè)變量:humidity和temperature,分別是濕度值和溫度值

注意:dht11.h這個(gè)庫溫濕度數(shù)據(jù)都采用的整型變量蚌讼,對于精度要求高的項(xiàng)目不適合辟灰,而且只能支持dht11型溫濕度傳感器,如果項(xiàng)目采用的是dht22傳感器或者要求更高精度數(shù)據(jù)篡石,可以使用dht.h這個(gè)庫芥喇。

結(jié)合后面的主程序,對于這個(gè)庫的使用凰萨,我想您一看就明白了继控!

4.1.2 LiquidCrystal.h庫介紹

4.1.2.1 LiquidCrystal.h庫的下載

LiquidCrystal庫是Arduino IDE自帶的,一般無需安裝胖眷,如果您的IDE版本過低或者沒有找到這個(gè)庫武通,可以在Arduino IDE中, 項(xiàng)目->加載庫->管理庫中搜索LiquidCrystal,然后點(diǎn)擊安裝即可珊搀。

4.1.2.1 LiquidCrystal.h庫的介紹

我們還是看看它的頭文件吧:

#ifndef LiquidCrystal_h
#define LiquidCrystal_h

#include <inttypes.h>
#include "Print.h"

// commands
#define LCD_CLEARDISPLAY 0x01
#define LCD_RETURNHOME 0x02
#define LCD_ENTRYMODESET 0x04
#define LCD_DISPLAYCONTROL 0x08
#define LCD_CURSORSHIFT 0x10
#define LCD_FUNCTIONSET 0x20
#define LCD_SETCGRAMADDR 0x40
#define LCD_SETDDRAMADDR 0x80

// flags for display entry mode
#define LCD_ENTRYRIGHT 0x00
#define LCD_ENTRYLEFT 0x02
#define LCD_ENTRYSHIFTINCREMENT 0x01
#define LCD_ENTRYSHIFTDECREMENT 0x00

// flags for display on/off control
#define LCD_DISPLAYON 0x04
#define LCD_DISPLAYOFF 0x00
#define LCD_CURSORON 0x02
#define LCD_CURSOROFF 0x00
#define LCD_BLINKON 0x01
#define LCD_BLINKOFF 0x00

// flags for display/cursor shift
#define LCD_DISPLAYMOVE 0x08
#define LCD_CURSORMOVE 0x00
#define LCD_MOVERIGHT 0x04
#define LCD_MOVELEFT 0x00

// flags for function set
#define LCD_8BITMODE 0x10
#define LCD_4BITMODE 0x00
#define LCD_2LINE 0x08
#define LCD_1LINE 0x00
#define LCD_5x10DOTS 0x04
#define LCD_5x8DOTS 0x00

class LiquidCrystal : public Print {
public:
  LiquidCrystal(uint8_t rs, uint8_t enable,
        uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
        uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7);
  LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable,
        uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
        uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7);
  LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable,
        uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3);
  LiquidCrystal(uint8_t rs, uint8_t enable,
        uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3);

  void init(uint8_t fourbitmode, uint8_t rs, uint8_t rw, uint8_t enable,
        uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
        uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7);
    
  void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS);

  void clear();
  void home();

  void noDisplay();
  void display();
  void noBlink();
  void blink();
  void noCursor();
  void cursor();
  void scrollDisplayLeft();
  void scrollDisplayRight();
  void leftToRight();
  void rightToLeft();
  void autoscroll();
  void noAutoscroll();

  void setRowOffsets(int row1, int row2, int row3, int row4);
  void createChar(uint8_t, uint8_t[]);
  void setCursor(uint8_t, uint8_t); 
  virtual size_t write(uint8_t);
  void command(uint8_t);
  
  using Print::write;
private:
  void send(uint8_t, uint8_t);
  void write4bits(uint8_t);
  void write8bits(uint8_t);
  void pulseEnable();

  uint8_t _rs_pin; // LOW: command.  HIGH: character.
  uint8_t _rw_pin; // LOW: write to LCD.  HIGH: read from LCD.
  uint8_t _enable_pin; // activated by a HIGH pulse.
  uint8_t _data_pins[8];

  uint8_t _displayfunction;
  uint8_t _displaycontrol;
  uint8_t _displaymode;

  uint8_t _initialized;

  uint8_t _numlines;
  uint8_t _row_offsets[4];
};

#endif

這個(gè)頭文件比上面那個(gè)dht11.h要豐富多了冶忱,它聲明的方法很多,限于篇幅我不一一介紹境析,這部分類容會放在附錄中詳細(xì)介紹囚枪,本文主要介紹一下我們在主程序中將要用到的兩個(gè)方法以及其構(gòu)造方法:

  • LiquidCrystal():構(gòu)造方法派诬,用于聲明1602 LCD對象時(shí)對其引腳連接進(jìn)行初始化,我們看到這個(gè)函數(shù)能夠根據(jù)不同的參數(shù)(接線方式)進(jìn)行重載
  • setCursor():設(shè)定液晶的光標(biāo)位置眶拉,即開始顯示字符的位置
  • print():輸出字符串到LCD

4.2 主程序設(shè)計(jì)

/*
 *名稱:環(huán)境溫濕度監(jiān)控儀
 *功能:
 *作者:YXK
 *時(shí)間:2018.6.4 
 */
 
#include <LiquidCrystal.h>
#include <dht11.h>
#define DHT11PIN 4;  //定義溫濕度傳感器DHT11的引腳連接
LiquidCrystal myLcd(12,11,10,9,8,7,6); //聲明一個(gè)1602 LCD對象
dht11 myDHT;   //聲明一個(gè)DHT11對象

int temp = 0;  //初始化溫度變量
int humi = 0;  //初始化濕度變量

void setup(){
  myLcd.begin(16,2);
}

void loop(){
  myDHT.read(DHT11PIN);               //讀取傳感器數(shù)據(jù)
  temp = myDHT.temperature;    //將讀取的溫度數(shù)據(jù)賦值給temp變量
  humi = myDHT.humidity;       //將讀取的濕度數(shù)據(jù)賦值給humi變量
    
  myLcd.setCursor(0, 0);    //將1602 LCD光標(biāo)移動(dòng)到第一行第一列
  myLcd.print(String("TEMP: ") + String(String(temp) + String(" C")));  //顯示溫度
  myLcd.setCursor(0, 1);    //將1602 LCD光標(biāo)移動(dòng)到第二行第一列
  myLcd.print(String("HUMI: ") + String(String(humi) + String(" %")));  //顯示濕度

  delay(60000);   //延遲1分鐘千埃,即每分鐘更新一次
}

這個(gè)程序就不再解釋了憔儿,我想程序中的注釋已經(jīng)非常清楚了忆植!

4 安裝調(diào)試

下面我們根據(jù)電路圖將兩個(gè)模塊跟UNO連接上:

003.jpg

然后將UNO連接上電腦,上傳程序:


002.jpg

呵呵谒臼,您做的是不是也成功了朝刊?

5 總結(jié)擴(kuò)展

上面我們做的這個(gè)溫濕度監(jiān)控儀還是比較簡陋的,擺在家里也不是很美觀蜈缤,您可以把它看成是一個(gè)產(chǎn)品的驗(yàn)證原型拾氓。

如果您想做一臺能夠放在家里使用的溫濕度監(jiān)控儀,當(dāng)然也是可以的底哥,您可以在上面的基礎(chǔ)上增加一個(gè)亞克力的盒子咙鞍,然后添加一個(gè)9V電池盒進(jìn)行供電,再將上面的面包板換成一個(gè)小一些的趾徽,將布線稍微整理一下续滋,然后就基本上是這個(gè)樣子的(這個(gè)案例來自于鏈接,圖片中的作品還增加了LED燈和蜂鳴器):

005.png

當(dāng)然您也可以做得更漂亮一些孵奶,期待著您的作品疲酌!

如果您喜歡本文,您可以點(diǎn)擊一下下面的喜歡按鈕了袁,您也可以關(guān)注我朗恳,謝謝您的支持!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末载绿,一起剝皮案震驚了整個(gè)濱河市粥诫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌崭庸,老刑警劉巖怀浆,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異冀自,居然都是意外死亡揉稚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門熬粗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搀玖,“玉大人,你說我怎么就攤上這事驻呐」嘧纾” “怎么了芳来?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長猜拾。 經(jīng)常有香客問我即舌,道長,這世上最難降的妖魔是什么挎袜? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任顽聂,我火速辦了婚禮,結(jié)果婚禮上盯仪,老公的妹妹穿的比我還像新娘紊搪。我一直安慰自己,他們只是感情好全景,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布耀石。 她就那樣靜靜地躺著,像睡著了一般爸黄。 火紅的嫁衣襯著肌膚如雪滞伟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天炕贵,我揣著相機(jī)與錄音梆奈,去河邊找鬼。 笑死鲁驶,一個(gè)胖子當(dāng)著我的面吹牛鉴裹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播钥弯,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼径荔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了脆霎?” 一聲冷哼從身側(cè)響起总处,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎睛蛛,沒想到半個(gè)月后鹦马,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡忆肾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年荸频,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片客冈。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡旭从,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情和悦,我是刑警寧澤退疫,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站鸽素,受9級特大地震影響褒繁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜馍忽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一棒坏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舵匾,春花似錦俊抵、人聲如沸谁不。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刹帕。三九已至吵血,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間偷溺,已是汗流浹背蹋辅。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挫掏,地道東北人侦另。 一個(gè)月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像尉共,于是被迫代替她去往敵國和親褒傅。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容