參考: https://tinyurl.com/y4c3cl8d
最近在玩 IOT 物聯網,使用 NodeMCU v2 WIFI (CP2102) + DHT11溫濕度模組,並使用 Arduino IDE 程式開發及燒錄 + 手機監控 Blynk APP 開發。
參考購買網址:
NodeMCU v2 (CP2102) => https://tinyurl.com/y2uang6z
DHT11溫濕度模組 => https://tinyurl.com/yyb6a2xb
一般DHT11溫濕度模組,連接腳位有三個,連接方式如下:
VCC: 電源,連接到 NodeMCU 的 3.3V
DATA: 資料傳輸,連接到 NodeMCU 的 D1~D4 (其中一個)
GND: 接地,連接到 NodeMCU 的 GND
然後我設定每30秒偵測一次溫濕度,實作是OK。於是放在家裡客廳測試,並監控家裡客廳的溫濕度,測試的結果很穩定也很正常。
但是因為我買的是有紅色電源燈的DHT11溫濕度模組(當初應該買沒有電源燈的),所以運作的時候DHT11的紅色電源燈會一直點亮著,到了晚上那顆紅色點源燈特別醒目。
於是思考如何不讓那顆紅色電源燈一直亮著,可是程式無法控制 DHT11 電源燈不亮 (因為它是電源指示燈)。於是想說因為每30秒偵測一次,如果只要在偵測的當下給DHT11電源就好,其他時間就不要給電源,這樣一來也可能比較省電吧。
思考後,將 DHT11溫濕度模組,連接腳位連接方式改變如下:
VCC: 電源,連接到 NodeMCU 的 D1(GPIO5)
DATA: 資料傳輸,連接到 NodeMCU 的 D2(GPIO4)
GND: 接地,連接到 NodeMCU 的 GND
然後重新調整程式,在每30秒要偵測溫濕度時,將D1設定為HIGHT (提供DHT11電源),然後暫停約2.5秒(這是用測試出的結果,時間太短會偵測不到溫濕度),然後開始讀取溫濕度,讀取到溫濕度後,將D1設定為LOW (停用DHT11電源)。
上述方式調整後,每隔30秒開始偵測時,DHT11紅色電源燈只會點亮2.5秒,之後就會熄滅。如此DHT11紅色電源燈就不會一直點亮著,而且此方法應該比較省電。
程式碼如下:
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <WiFiManager.h>
#include <EEPROM.h>
#include <DHT.h>
BlynkTimer timer;
char auth[] = "a9e0xxxxxxxxxxxxxxxxxxxxxxxxe1ae"; //blynk token
#define DHTPOWERPIN 5 //DHT11電源接於GPIO05(D1)
#define DHTPIN 4 //DHT11接於GPIO04(D2)
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
int Sensor_loop_sec = 30; //溫濕度幾秒偵測一次
float tadj = -0.5; //溫度校正 虛擬腳位V3
float hadj = 5; //濕度校正 虛擬腳位V4
void sendSensor() //讀取溫濕度並存到Blynk虛擬腳位
{
digitalWrite(DHTPOWERPIN, HIGH); //DHT11電源開啟
delay(2500);
float h = dht.readHumidity();
float t = dht.readTemperature(); // or dht.readTemperature(true) for Fahrenheit
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
digitalWrite(LED_BUILTIN, HIGH); //NodeMCU內建LED燈關閉
digitalWrite(DHTPOWERPIN, LOW); //DHT11電源關閉
return;
}
Blynk.virtualWrite(V1, t + tadj); //將溫度寫入虛擬腳位V1
Blynk.virtualWrite(V2, h + hadj); //將濕度寫入虛擬腳位V2
digitalWrite(LED_BUILTIN, LOW); //NodeMCU內建LED燈點亮
delay(10);
digitalWrite(LED_BUILTIN, HIGH); //NodeMCU內建LED燈關閉
digitalWrite(DHTPOWERPIN, LOW); //DHT11電源關閉
}
BLYNK_CONNECTED() { //called when connected to the server
Blynk.syncAll();
}
BLYNK_WRITE(V3) { //虛擬腳位V3(溫度校正) APP寫入NodeMCU事件處理函數
tadj = param.asFloat();
}
BLYNK_WRITE(V4) { //虛擬腳位V4(濕度校正) APP寫入NodeMCU事件處理函數
hadj = param.asFloat();
}
void setup()
{
// Debug console
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
pinMode(DHTPOWERPIN, OUTPUT);
EEPROM.begin(512);
WiFiManager wifiManager;
wifiManager.autoConnect("NodeMCU");
//if you get here you have connected to the WiFi
Serial.println("connected...yeey :)");
Blynk.begin(auth, WiFi.SSID().c_str(), WiFi.psk().c_str());
Blynk.begin(auth, ssid, pass);
Blynk.virtualWrite(V3, tadj);
Blynk.virtualWrite(V4, hadj);
dht.begin();
// Setup a function to be called every second
timer.setInterval(Sensor_loop_sec*1000L, sendSensor);
}
void loop()
{
Blynk.run();
timer.run();
}
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <WiFiManager.h>
#include <EEPROM.h>
#include <DHT.h>
BlynkTimer timer;
char auth[] = "a9e0xxxxxxxxxxxxxxxxxxxxxxxxe1ae"; //blynk token
#define DHTPOWERPIN 5 //DHT11電源接於GPIO05(D1)
#define DHTPIN 4 //DHT11接於GPIO04(D2)
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
int Sensor_loop_sec = 30; //溫濕度幾秒偵測一次
float tadj = -0.5; //溫度校正 虛擬腳位V3
float hadj = 5; //濕度校正 虛擬腳位V4
void sendSensor() //讀取溫濕度並存到Blynk虛擬腳位
{
digitalWrite(DHTPOWERPIN, HIGH); //DHT11電源開啟
delay(2500);
float h = dht.readHumidity();
float t = dht.readTemperature(); // or dht.readTemperature(true) for Fahrenheit
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
digitalWrite(LED_BUILTIN, HIGH); //NodeMCU內建LED燈關閉
digitalWrite(DHTPOWERPIN, LOW); //DHT11電源關閉
return;
}
Blynk.virtualWrite(V1, t + tadj); //將溫度寫入虛擬腳位V1
Blynk.virtualWrite(V2, h + hadj); //將濕度寫入虛擬腳位V2
digitalWrite(LED_BUILTIN, LOW); //NodeMCU內建LED燈點亮
delay(10);
digitalWrite(LED_BUILTIN, HIGH); //NodeMCU內建LED燈關閉
digitalWrite(DHTPOWERPIN, LOW); //DHT11電源關閉
}
BLYNK_CONNECTED() { //called when connected to the server
Blynk.syncAll();
}
BLYNK_WRITE(V3) { //虛擬腳位V3(溫度校正) APP寫入NodeMCU事件處理函數
tadj = param.asFloat();
}
BLYNK_WRITE(V4) { //虛擬腳位V4(濕度校正) APP寫入NodeMCU事件處理函數
hadj = param.asFloat();
}
void setup()
{
// Debug console
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
pinMode(DHTPOWERPIN, OUTPUT);
EEPROM.begin(512);
WiFiManager wifiManager;
wifiManager.autoConnect("NodeMCU");
//if you get here you have connected to the WiFi
Serial.println("connected...yeey :)");
Blynk.begin(auth, WiFi.SSID().c_str(), WiFi.psk().c_str());
Blynk.begin(auth, ssid, pass);
Blynk.virtualWrite(V3, tadj);
Blynk.virtualWrite(V4, hadj);
dht.begin();
// Setup a function to be called every second
timer.setInterval(Sensor_loop_sec*1000L, sendSensor);
}
void loop()
{
Blynk.run();
timer.run();
}
PS:
在偵測完溫濕度後,若偵測成功,NodeMCU內建LED燈會閃一下10毫秒 (這是方便判斷DHT11偵測溫濕度有沒有成功)。
沒有留言:
張貼留言