物聯網使得現實世界中的實體和數字世界比以往任何時候都更緊密地聯系在一起。NodeMCU作為其中的一個重要設備,作用之一就是與傳感器相連以實現萬物互聯通訊。這篇關於NodeMCU的實操篇以土壤濕度傳感器和DHT傳感器為例,詳細介紹了如何使用ESP8266獲取傳感器的值及相應的示例代碼。之所以選擇這兩個傳感器作為示例進行講解,是因為土壤傳感器輸出值的信號引腳輸出模擬信號,而DHT傳感器的信號引腳輸出數字信號,在使用過程中也需要引入庫(也可以不使用庫,代碼相對復雜)。當你理解了這篇文章后,NodeMCU與其它大多數傳感器的通信也就迎刃而解了。
一、實驗所需設備及環境
二、連線方式和示例代碼
三、延伸拓展及注意事項
一、實驗所需設備及環境
(一)NodeMCU ESP8266
首先你需要了解ESP8266 NodeMCU是什么及其該設備的基本操作環境,如果你沒有接觸過的話,請先查看NodeMCU小白手把手入門。最好選擇ESP-12E型號,關於各個不同型號的NodeMCU的區別看解惑篇的第一部分。
在NodeMCU的引腳圖中包含一些GPIO(通用輸入輸出 general purpose Input Output)引腳,通過它們,可以實現NodeMCU與傳感器的通信。GPIO是集成電路的一種數字引腳,可作為接口設備的輸入或輸出。 如果我們想要控制LED亮度,電機狀態等,那么我們需要將其配置為輸出。反正,如果我們想要讀取開關的狀態,傳感器數據等,那么我們就要把GPIO配置為輸入。 很明顯,在本教程中,我們需要配置GPIO為輸入,注意在代碼中,如需配置GPIO為輸入,相關代碼pinMode(GPIO, INPUT)可寫可不寫,如配置GPIO為輸出,則把必須使用pinMode(GPIO, OUTPUT)說明。
NodeMCU ESP8266的引腳圖(圖源:lastminuteengineers.com)
(二)土壤傳感器YL-69
土壤傳感器用於獲取土壤濕度參數,即土壤中的水分百分比。常見的土壤傳感器分為兩類,電阻型和電容型土壤濕度傳感器。它們的原理大同小異,都是用於測量土壤中水分的體積含量,並以傳感器輸入GPIO(0-1024)的電壓值表示水分的多少,電壓值越小,表明水分多,土壤越濕;電壓值越大,表明導電性不好,土壤越干。詳細的關於土壤傳感器的知識請查看如何用樹莓派獲取土壤傳感器的值中的土壤傳感器部分。在本教程中,使用任一土壤傳感器即可,價格低廉。
(三)DHT11傳感器
用於獲取空氣中的溫度和濕度數據。詳細的關於DHT11的知識請查看如何用樹莓派獲取DHT傳感器的值。
(四)Arduino IDE
二、連線方式和示例代碼
在Arduino IDE中進行如下設置:開發板:NodeMCU 1.0(ESP-12E Module);上傳速度:115200(與代碼一致);端口:板子所連端口
(一)土壤傳感器與NodeMCU的通信
(1)連線方式
(2) 示例代碼:
#define soilPin A0 //存儲中間值 int soilValue; //定義土壤濕度 int soilMoisture; void setup() { Serial.begin(115200); //這句代碼寫不寫都可 //pinMode(soilPin, INPUT); } void loop() { //讀取土壤傳感器上的電壓值 soilValue = analogRead(soilPin); //把電壓值按照[0,1023]映射到[100,0] soilMoisture = map(soilValue,0,1023,100,0); //每隔一秒輸出一次值 delay(1000); Serial.print("soilMositure: "); Serial.print(soilMoisture); Serial.println("%"); }
(3)輸出結果
(二)DHT11與NodeMCU的通信
(1)連線方式
(2)下載庫。打開庫管理器,搜索DHT,下載DHT sensor libraray。
(3)代碼實現
#include "DHT.h" #define DHTPIN D4 // Digital pin connected to the DHT sensor #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 //#define DHTTYPE DHT21 // DHT 21 (AM2301) // Connect pin 1 (on the left) of the sensor to +5V // NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1 // to 3.3V instead of 5V! // Connect pin 2 of the sensor to whatever your DHTPIN is // Connect pin 4 (on the right) of the sensor to GROUND // Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor // Initialize DHT sensor. // Note that older versions of this library took an optional third parameter to // tweak the timings for faster processors. This parameter is no longer needed // as the current DHT reading algorithm adjusts itself to work on faster procs. DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(115200); dht.begin(); } void loop() { // Wait a few seconds between measurements. delay(1000); // Reading temperature or humidity takes about 250 milliseconds! // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) float h = dht.readHumidity(); // Read temperature as Celsius (the default) float t = dht.readTemperature(); //如果溫度濕度有一個為空,則輸出“獲=獲取值失敗” if (isnan(h) || isnan(t)) { Serial.println(F("Failed to read from DHT sensor!")); return; } //輸出溫度 Serial.print(t); Serial.print("℃"); Serial.print(","); //輸出濕度 Serial.print(h); Serial.println("%"); }
(4)輸出結果
三、延伸拓展及注意事項
所有應用於NodeMCU的代碼可以直接用於Arduino,更改相應的參數和引腳名稱即可。
NodeMCU只有一個模擬引腳,只能同時獲取一個輸出模擬信號的傳感器的值,這是它的局限性。