2019年6月21日 星期五

[IOT] 更省電的方式使用DHT11溫濕度模組

瀏覽數
參考: https://tinyurl.com/yxbs55m2
參考: 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();
}

PS:
在偵測完溫濕度後,若偵測成功,NodeMCU內建LED燈會閃一下10毫秒 (這是方便判斷DHT11偵測溫濕度有沒有成功)。

沒有留言: