本系列文章為作者原創(chuàng),未經(jīng)作者書面同意箕昭,不得轉(zhuǎn)載解阅!
溫濕度監(jiān)控儀(溫濕度表)在我們生活中很常見货抄,尤其北方家庭蟹地,冬天比較干燥夺刑,一般都會在家里放一個(gè)溫濕度表分别,如果濕度過低错览,會打開加濕器倾哺,能夠防止過于干燥的環(huán)境給人帶來的不適羞海。溫濕度表一般有以下兩種,一種是電子的院水,一種是機(jī)械的:
今天我們的項(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溫濕度傳感器
引腳說明:
- VCC:供電 3.5V-5.5V DC
- DATA:串行數(shù)據(jù),單總線
- NC:空引腳(無需連線)
- GND:接地酿矢,電源負(fù)極
2.3.2 1602 LCD
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è)引腳惹恃,如下:
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通信狠裹,我們不在本文介紹。
本文主要介紹常用的四線法:
上圖就是四線法的接線方法碰缔,應(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ì)電路圖如下:
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連接上:
然后將UNO連接上電腦,上傳程序:
呵呵谒臼,您做的是不是也成功了朝刊?
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燈和蜂鳴器):
當(dāng)然您也可以做得更漂亮一些孵奶,期待著您的作品疲酌!
如果您喜歡本文,您可以點(diǎn)擊一下下面的喜歡按鈕了袁,您也可以關(guān)注我朗恳,謝謝您的支持!