通過這篇文章,可以了解到以下內(nèi)容:
- 利用 Arduino 使用 5050全彩 LED 和 DTH11 溫濕度傳感器
- 利用 USB 與 Arduino荠呐,實(shí)現(xiàn)電腦與 Arduino 串口通訊
- 通過發(fā)送特定指令,控制 LED 變色以及獲取溫濕度數(shù)據(jù)
Arduino 與傳感器接線方法
在這個(gè) Arduino 微項(xiàng)目實(shí)踐中怀挠,我們用到的傳感器有兩個(gè):
- DTH11 溫濕度傳感器
- 5050 RGB LED 彩燈
DTH 溫濕度傳感器的使用方法很簡單摄闸,可以參考購買傳感器時(shí)商家提供的資料赢乓,或者參考我的另外一篇文章 《Arduino使用DHT11溫濕度傳感器獲取環(huán)境溫濕度》 來了解 DTH11 的使用。
5050 RGB 彩色 LED 燈峡懈,是一種把彩燈封裝好的一個(gè)彩燈模塊璃饱,模塊上有 4 個(gè)引腳与斤,分別是 GND
R
G
B
肪康,使用時(shí),將模塊上的 GND
與 Arduino 的 GND
相連接撩穿,然后 RGB引腳分別接到 Arduino 的三個(gè)數(shù)字輸出 Pin 引腳磷支,然后在 Arduino 中通過PWM驅(qū)動(dòng)即可。
注意 由于 Frizing 的元件庫中并沒有找到國內(nèi)網(wǎng)上常見的那種 5050 RGB LED 模塊原件食寡,因此找了一個(gè)類似的替代雾狈,在具體實(shí)踐的時(shí)候,應(yīng)根據(jù)自己購買的模塊說明連接使用抵皱。
以下是 Arduino 電路連接示意圖:
我們將 Arduino 的 Pin 9 ~ 11
分別連接 LED 模塊的 G
B
R
引腳善榛,Arduino GND
連接到 GND
模塊上。DHT11模塊 VCC
與 Arduino 5V
相連呻畸,GND
與 Arduino GND
相連移盆,DATA
與 Arduino Pin 2
相連。這樣伤为,我們即完成了 Arduino 電路的連接咒循。注意 實(shí)際實(shí)踐的時(shí)候,需要根據(jù)自己購買的模塊不同響應(yīng)調(diào)整绞愚。
Arduino 代碼編寫
Arduino 程序主要有幾個(gè)難點(diǎn)叙甸,分別是:
- 如何處理 Serial 輸入,識(shí)別不同的命令進(jìn)行處理
- LED 燈控制的技巧
- 獲取溫濕度數(shù)據(jù)
處理 Serial 輸入
使用 Serial 傳輸數(shù)據(jù)位衩,主要用到以下幾個(gè)方法:
下面簡單介紹以下這三個(gè)方法的使用裆蒸。
Serial.read()
用于返回 Serial 中的一個(gè)字節(jié),如果沒有可以返回的數(shù)據(jù)糖驴,則返回 -1
僚祷,我們將會(huì)使用這個(gè)方法來獲取 Serial 中的內(nèi)容哪痰。
Serial.available()
用于檢查 Serial 中剩余的數(shù)據(jù),我們可以通過這個(gè)方法來檢測(cè)是否由數(shù)據(jù)在 Serial 中久妆。
Serial.parseInt()
用于解析 Serial 中的數(shù)值數(shù)據(jù)晌杰,將其轉(zhuǎn)換為 int
,在這個(gè)項(xiàng)目中筷弦,我們將用這個(gè)方法來獲取 LED 燈的顏色參數(shù)值肋演。
接下來,我們面前有兩個(gè)問題需要解決:
- Arduino 要如何判斷我們的命令意圖
- 如何返回程序的返回值
要使得 Arduino 能夠處理 LED 燈變色烂琴,或者返回溫濕度傳感器的測(cè)量數(shù)據(jù)爹殊,首先要給 Arduino 發(fā)出不同的指令,然后 Arduino 通過判斷不同的指令來作出相應(yīng)的處理才能實(shí)現(xiàn)我們想要的結(jié)果奸绷。
因此梗夸,我們可以選擇使用指令的第一個(gè)字母來判別不同的功能,在這個(gè)項(xiàng)目中号醉,我們可以用 L
來表示進(jìn)入 LED 燈控制模式反症,D
表示進(jìn)入溫濕度數(shù)據(jù)讀取模式。除此之外畔派,我們還需要識(shí)別出命令的尾部铅碍,從而結(jié)束一行命令的解析,這里我們用換行 \n
來標(biāo)記一條命令的結(jié)束线椰。
這樣胞谈,我們就基本解決了如何判斷命令意圖的問題,到這一步為止憨愉,我們的程序大致如下:
while(Serial.available() > 0){
char incomeByte = Serial.read();
if (incomeByte == 'L') {
// 進(jìn)入 LED 控制部分
if (Serial.read() == '\n') {
// 命令結(jié)束烦绳,處理
} else {
// 不符合指令輸入要求,返回錯(cuò)誤處理
}
} else if (incomeByte == 'D') {
// 溫濕度數(shù)據(jù)讀取處理
}
}
我們現(xiàn)在已經(jīng)解決了指令的識(shí)別配紫,但還存在一個(gè)問題径密,就是加入輸入的命令既不是 LED 控制,也不是溫濕度數(shù)據(jù)獲取笨蚁,那么理想狀態(tài)下應(yīng)該會(huì)返回一個(gè)錯(cuò)誤值睹晒。我們這里將采取通過判斷 \n
來識(shí)別出指令的尾部,如果沒有成功進(jìn)入 LED 控制或者溫濕度獲取括细,而且 Serial 讀取到指令尾部伪很,那么我們就返回一個(gè)錯(cuò)誤的返回值。程序?qū)嵗缦拢?/p>
while(Serial.available() > 0){
char incomeByte = Serial.read();
if (incomeByte == 'L') {
// 進(jìn)入 LED 控制部分
if (Serial.read() == '\n') {
// 命令結(jié)束奋单,處理
} else {
// 不符合指令輸入要求锉试,返回錯(cuò)誤處理
}
} else if (incomeByte == 'D') {
// 溫濕度數(shù)據(jù)讀取處理
} else if (incomeByte == '\n') {
// 返回錯(cuò)誤
}
}
到這里為止,我們就已經(jīng)完成指令識(shí)別的功能览濒。
LED 燈控制的技巧
我們所使用的 5050 RGB LED 模塊呆盖,通過 PWM 驅(qū)動(dòng)從而實(shí)現(xiàn)變色的拖云,我們可以為 LED 變色編寫一個(gè)方法,輸入三個(gè) 0 ~ 255 的顏色參數(shù)应又,然后實(shí)現(xiàn)變色宙项,方法代碼如下:
boolean setLedColor(int red, int green, int blue)
{
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
return true;
}
這里有一點(diǎn)需要注意,因?yàn)橛脩舻妮斎胛幢厥?0 ~ 255 的數(shù)值株扛,因此我們?cè)谑褂眠@個(gè)變色方法之前尤筐,需要先對(duì)用戶的輸入進(jìn)行過濾,代碼示例如下:
// 獲取 R G B 用戶輸入
int red = Serial.parseInt();
int green = Serial.parseInt();
int blue = Serial.parseInt();
// 過濾用戶輸入
redVal = constrain(red, 0, 255);
greenVal = constrain(green, 0, 255);
blueVal = constrain(blue, 0, 255);
這樣洞就,我們就完成了對(duì) LED 燈的控制部分程序編寫了盆繁。
溫濕度數(shù)據(jù)獲取
溫濕度數(shù)據(jù)獲取也比較簡單,我們首先要檢查溫濕度傳感器是否正常旬蟋,然后再進(jìn)行獲取數(shù)據(jù)油昂,檢查傳感器的示例代碼如下:
int chk = DHT11.read(dth11Pin);
if (chk == DHTLIB_OK) {
// 傳感器正常
} else {
// 傳感器出現(xiàn)問題
}
接下來,我們像控制 LED 變色一樣倾贰,編寫一個(gè)獲取并輸出溫濕度數(shù)據(jù)的方法冕碟,示例代碼如下:
void printHT()
{
Serial.print("Status: 1, Data: {");
Serial.print((float)DHT11.humidity, 2);
Serial.print(',');
Serial.print((float)DHT11.temperature, 2);
Serial.print("}\n");
}
我們這里選擇直接通過 Serial 輸出,其中輸出信息包括 Status: 1 的正確標(biāo)識(shí)躁染,然后 Data 中返回第一個(gè)返回值是濕度鸣哀,第二個(gè)返回值是溫度架忌。
到這里為止吞彤,我們的 Arduino 程序就基本完成了,完整的代碼入下:
/*
File : ComLEDHtSenSer.ino
Date : 2017-9-13
Author : Yan Wong (speculatecat)
Description : The program is a demo for using com serial to control the LED color and get the tempture and humidity form DHT11 senser.
*/
#include <dht11.h>
dht11 DHT11;
// Define RGB pin
const int redPin = 11;
const int bluePin = 10;
const int greenPin = 9;
// Define DTH11 pin
const int dth11Pin = 2;
// Store LED color, default RGB - 255,255,255
int redVal = 255;
int blueVal = 255;
int greenVal = 255;
void printStatus(boolean flag)
{
Serial.print("Status:");
Serial.print(flag);
Serial.print('\n');
}
void printHT()
{
Serial.print("Status: 1, Data: {");
Serial.print((float)DHT11.humidity, 2);
Serial.print(',');
Serial.print((float)DHT11.temperature, 2);
Serial.print("}\n");
}
boolean setLedColor(int red, int green, int blue)
{
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
return true;
}
void setup()
{
// Set Serial port - 9600
Serial.begin(9600);
// Set LED pin model
pinMode(redPin, OUTPUT);
pinMode(bluePin, OUTPUT);
pinMode(greenPin, OUTPUT);
}
void loop()
{
boolean flag = false;
while(Serial.available() > 0){
char incomeByte = Serial.read();
if (incomeByte == 'L') {
// The first byte from serial is 'L', mean enter LED color change model.
int red = Serial.parseInt();
int green = Serial.parseInt();
int blue = Serial.parseInt();
if (Serial.read() == '\n') {
// The end of command is '\n'.
redVal = constrain(red, 0, 255);
greenVal = constrain(green, 0, 255);
blueVal = constrain(blue, 0, 255);
if (setLedColor(redVal, greenVal, blueVal)) {
flag = true;
printStatus(flag);
}
} else {
printStatus(flag);
}
} else if (incomeByte == 'D') {
// Get humidity and temperature from dht11.
int chk = DHT11.read(dth11Pin);
if (chk == DHTLIB_OK) {
printHT();
} else {
printStatus(false);
}
} else if (incomeByte == '\n') {
// Error command, return false.
printStatus(flag);
}
}
}
接下來叹放,我們將程序編譯好上傳到 Arduino 即可饰恕。
項(xiàng)目演示
Arduino 和各個(gè)模塊正確連接,并上傳好 Arduino 程序后井仰,我們就可以通過串口監(jiān)視器來與 Arduino 進(jìn)行通信埋嵌。以下是串口監(jiān)視器的部分通信截圖:
可以看到,如果我們輸入預(yù)設(shè)沒有的指令俱恶,會(huì)返回 Status: 0
的錯(cuò)誤信息雹嗦,如果發(fā)送更改 LED 顏色的指令,可以看到 Status: 1
成功的返回值合是,發(fā)送溫濕度數(shù)據(jù)獲取的指令了罪,可以看到溫濕度數(shù)據(jù)的返回。
下面是我的 Arduino 與各個(gè)模塊的連接以及運(yùn)行時(shí)的照片聪全,可供參考:
小結(jié)
到此為止泊藕,我們這個(gè)微項(xiàng)目實(shí)踐已經(jīng)完成。我們隨后還可以在這個(gè)基礎(chǔ)上难礼,改造成通過藍(lán)牙控制和獲取數(shù)據(jù)娃圆,或者添加程序玫锋,使得 LED 等可以根據(jù)環(huán)境的不同溫濕度來呈現(xiàn)不同的顏色。
如果你對(duì)這個(gè)微項(xiàng)目實(shí)踐有疑問讼呢,可以在本文回復(fù)撩鹿,我會(huì)盡力回答。
如果你覺得這篇文章對(duì)你有幫助悦屏,歡迎點(diǎn)擊喜歡收藏三痰,或者關(guān)注我。