ESP8266 NodeMCU小白手把手入門(實操篇)以土壤濕度和DHT感測器為例講解讀取感測器的值
物聯網使得現實世界中的實體和數字世界比以往任何時候都更緊密地聯繫在一起。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只有一個模擬引腳,只能同時獲取一個輸出模擬訊號的感測器的值,這是它的局限性。