NodeMCU 16x2 i2c dht11
NodeMCU 16x2 i2c dht11
// sda pin d2
// scl pin d1
// dht11 pin d4
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
// Definisi untuk DHT11
#define DHT_PIN 2 // GPIO2 (D4 pada NodeMCU)
#define DHT_TYPE DHT11
DHT dht(DHT_PIN, DHT_TYPE);
// Variabel LCD - ganti dengan alamat I2C yang terbaca
LiquidCrystal_I2C lcd(0x27, 16, 2); // Ganti 0x27 dengan alamat yang terbaca
// Variabel sensor
float temperature = 0;
float humidity = 0;
unsigned long previousMillis = 0;
const long interval = 2000; // Update setiap 2 detik
// Simbol custom degree
byte degreeSymbol[8] = {
B00110,
B01001,
B01001,
B00110,
B00000,
B00000,
B00000,
B00000
};
void setup() {
Serial.begin(115200);
Serial.println("Starting DHT11 with LCD System...");
// Inisialisasi LCD
lcd.init();
lcd.backlight();
lcd.createChar(0, degreeSymbol); // Buat custom character degree
// Inisialisasi DHT11
dht.begin();
// Tampilkan splash screen
displaySplashScreen();
Serial.println("System Ready");
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
// Baca data dari sensor DHT11
readDHT();
// Update display LCD
updateDisplay();
}
}
void readDHT() {
// Baca temperatur dalam Celsius
float newTemp = dht.readTemperature();
// Baca kelembaban
float newHumidity = dht.readHumidity();
// Cek jika pembacaan gagal
if (isnan(newTemp) || isnan(newHumidity)) {
Serial.println("Failed to read from DHT sensor!");
// Tampilkan error di LCD
displayError();
return;
}
temperature = newTemp;
humidity = newHumidity;
// Tampilkan data di Serial Monitor
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.print(" °C, Humidity: ");
Serial.print(humidity);
Serial.println(" %");
}
void displaySplashScreen() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("DHT11 MONITOR");
lcd.setCursor(0, 1);
lcd.print("Initializing...");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("NodeMCU + LCD");
lcd.setCursor(0, 1);
lcd.print("DHT11 Sensor");
delay(2000);
}
void updateDisplay() {
lcd.clear();
// Baris 1: Temperature
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature, 1); // 1 digit desimal
lcd.write(0); // Tampilkan simbol degree
lcd.print("C");
// Baris 2: Humidity
lcd.setCursor(0, 1);
lcd.print("Humid: ");
lcd.print(humidity, 1); // 1 digit desimal
lcd.print("%");
}
void displayError() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sensor Error!");
lcd.setCursor(0, 1);
lcd.print("Check DHT11");
}
// Fungsi alternatif dengan tampilan yang lebih rapat
void updateDisplayCompact() {
lcd.clear();
// Baris 1
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(temperature, 1);
lcd.write(0);
lcd.print("C");
// Baris 2
lcd.setCursor(0, 1);
lcd.print("H:");
lcd.print(humidity, 1);
lcd.print("%");
// Tambahkan status di sebelah kanan
lcd.setCursor(11, 0);
lcd.print("DHT11");
lcd.setCursor(11, 1);
lcd.print("OK");
}
// Fungsi untuk membaca sensor dengan retry
bool readDHTWithRetry() {
int retryCount = 0;
const int maxRetries = 3;
while (retryCount < maxRetries) {
float newTemp = dht.readTemperature();
float newHumidity = dht.readHumidity();
if (!isnan(newTemp) && !isnan(newHumidity)) {
temperature = newTemp;
humidity = newHumidity;
return true;
}
retryCount++;
delay(500);
}
return false; // Gagal setelah retry
}