Temperature Sensor DHT11, PubClient, WifiManager, MQTT Dengan ESP8266 NodeMCU v3

DHT11 adalah satu sensor yang mana kita boleh mendapatkan bacaan humidity ( kelembapan ) & temperature ( suhu ) di dalam sesuatu kawasan. DHT11 yang juga dikenali sebagai temperature sensor module boleh digunakan dengan Raspberry Pi dan ESP8266.

Sensor module ini menjadi pilihan ramai kerana faktor ia-nya murah dan banyak sumber rujukan code cara untuk menjadikannya berfungsi seperti yang kita mahukan.

Jadi dalam blog ini aku nak kongsikan code yang aku guna untuk menjadikan ES8266 aku boleh di-setup melalui Wifi, connect ke available Wifi dan terus hantar data kepada MQTT server. Proses setup boleh dibuat dengan menggunakan handphone jadi sekiranya kita alihkan ESP8266 ke tempat yang mempunyai SSID Wifi yang lain kita cuma perlu setup semula melalui handphone tak perlu upload code yang baru.

// git@github.com:armadadigital/esp8266dhtwifimqtt.git
// Date: 20200206

#include <FS.h>
#include <ESP8266WiFi.h>  
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
#include <PubSubClient.h>
#include "DHTesp.h"

DHTesp dht;
unsigned long previousMillis = 0;    // will store last time DHT
unsigned long lastSend;
const long interval = 10000;
const char* mqtt_server = "<letakhostnamemqttserverdisini>"; // contoh = mqtt_server = "example.com";
WiFiClient espClient;
PubSubClient client(espClient);

void setup(){
  Serial.begin(74880);
  Serial.println();
  
  WiFiManager wifiManager;
  wifiManager.setBreakAfterConfig(true);
  wifiManager.resetSettings();

  if (!wifiManager.autoConnect("Setup Mode", "password")) {
    Serial.println("failed to connect, we should reset as see if it connects");
    delay(3000);
    ESP.reset();
    delay(5000);
  }

  // kalau dah connect to wifi
  Serial.println("connected.");
  Serial.println("local ip as details.");
  Serial.println(WiFi.localIP());
  dht.setup(14, DHTesp::DHT11); // GPIO14
  lastSend = 0;
  client.setServer(mqtt_server, 1883);
  sendTemperatureData();
}

void sendTemperatureData(){
  delay(1500);
  float humidity = dht.getHumidity();
  float temperature = dht.getTemperature();
  char humid[10];
  char temp[10];
  dtostrf(humidity, 6, 2, humid);
  dtostrf(temperature, 6, 2, temp);

  Serial.print("Status: ");
  Serial.print(dht.getStatusString());
  Serial.print("\t");
  Serial.print("Humidity (%): ");
  Serial.print(humidity, 1);
  Serial.print("\t");
  Serial.print("Temperature (C): ");
  Serial.print(temperature, 1);
  Serial.print("\t");
  Serial.println();
  
  client.publish("/home/room/tempvalue", temp);
  client.publish("/home/room/humidvalue", humid);
  
}

void loop(){
    if ( !client.connected() ) {
      reconnect();
    }

    if ( millis() - lastSend > 1000 ) {
      sendTemperatureData();
      lastSend = millis();
    }
  
}

void reconnect() {
  // Loop until we're reconnected
  Serial.println("In reconnect...");
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect("esp8266_02_temperature")) {
      Serial.println("connected");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
}

Code aku upload dalam github.

https://github.com/armadadigital/esp8266dhtwifimqtt

Leave a Comment