AMP-001 Arduino微項(xiàng)目實(shí)踐 - 串口LED溫濕度控制

AMP-001.jpg

通過這篇文章,可以了解到以下內(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 電路連接示意圖:

5050lED_DHT11.jpg

我們將 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)視器的部分通信截圖:

Arduino Serial Output.jpg

可以看到,如果我們輸入預(yù)設(shè)沒有的指令俱恶,會(huì)返回 Status: 0 的錯(cuò)誤信息雹嗦,如果發(fā)送更改 LED 顏色的指令,可以看到 Status: 1 成功的返回值合是,發(fā)送溫濕度數(shù)據(jù)獲取的指令了罪,可以看到溫濕度數(shù)據(jù)的返回。

下面是我的 Arduino 與各個(gè)模塊的連接以及運(yùn)行時(shí)的照片聪全,可供參考:

Amp-001 Demo.JPG

小結(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)注我。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末窜管,一起剝皮案震驚了整個(gè)濱河市散劫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌幕帆,老刑警劉巖获搏,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異失乾,居然都是意外死亡常熙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門碱茁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裸卫,“玉大人,你說我怎么就攤上這事纽竣∧够撸” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵蜓氨,是天一觀的道長聋袋。 經(jīng)常有香客問我,道長穴吹,這世上最難降的妖魔是什么幽勒? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮港令,結(jié)果婚禮上啥容,老公的妹妹穿的比我還像新娘。我一直安慰自己顷霹,他們只是感情好咪惠,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泼返,像睡著了一般硝逢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天渠鸽,我揣著相機(jī)與錄音叫乌,去河邊找鬼。 笑死徽缚,一個(gè)胖子當(dāng)著我的面吹牛憨奸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凿试,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼排宰,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了那婉?” 一聲冷哼從身側(cè)響起板甘,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎详炬,沒想到半個(gè)月后盐类,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡呛谜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年在跳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隐岛。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡猫妙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出聚凹,到底是詐尸還是另有隱情割坠,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布元践,位于F島的核電站韭脊,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏单旁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一饥伊、第九天 我趴在偏房一處隱蔽的房頂上張望象浑。 院中可真熱鬧,春花似錦琅豆、人聲如沸愉豺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚪拦。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間驰贷,已是汗流浹背盛嘿。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留括袒,地道東北人次兆。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像锹锰,于是被迫代替她去往敵國和親芥炭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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