#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Konfigurasi Pin berdasarkan diagram.json kamu
#define PIN_TRIG 12
#define PIN_ECHO 14
#define PIN_LED_RED 2 // LED Merah untuk deteksi objek
#define PIN_DHT 13 // DHT22
#define DHTTYPE DHT22
// Pin LED RGB
#define RGB_R 27
#define RGB_G 26
#define RGB_B 25
LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT dht(PIN_DHT, DHTTYPE);
// Variabel Kontrol
unsigned long lastMillis = 0;
unsigned long blinkMillis = 0;
bool ledState = false;
const int batasJarak = 100; // Ambang batas deteksi objek (100 cm)
void setup() {
Serial.begin(115200);
// Inisialisasi Pin
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
pinMode(PIN_LED_RED, OUTPUT);
pinMode(RGB_R, OUTPUT);
pinMode(RGB_G, OUTPUT);
pinMode(RGB_B, OUTPUT);
dht.begin();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Sistem Aktif...");
delay(2000);
lcd.clear();
}
void loop() {
unsigned long currentMillis = millis();
// Baca Jarak (Ultrasonik)
digitalWrite(PIN_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
long duration = pulseIn(PIN_ECHO, HIGH);
int distance = duration / 58;
// Baca Suhu (DHT22) setiap 2 detik
static float tC = 0, tF = 0;
if (currentMillis - lastMillis >= 2000) {
lastMillis = currentMillis;
tC = dht.readTemperature();
tF = dht.readTemperature(true);
}
// Logika LED Merah (Deteksi Objek)
if (distance < batasJarak) {
digitalWrite(PIN_LED_RED, HIGH);
} else {
digitalWrite(PIN_LED_RED, LOW);
}
// Logika Kedipan LED RGB (Suhu)
if (currentMillis - blinkMillis >= 500) {
blinkMillis = currentMillis;
ledState = !ledState;
// Matikan semua warna RGB dahulu
digitalWrite(RGB_R, LOW);
digitalWrite(RGB_G, LOW);
digitalWrite(RGB_B, LOW);
if (!isnan(tC)) {
if (tC < 18.0) { // Dingin -> Biru Berkedip
digitalWrite(RGB_B, ledState);
}
else if (tC >= 18.0 && tC <= 30.0) { // Normal -> Hijau Berkedip
digitalWrite(RGB_G, ledState);
}
else { // Panas -> Merah Berkedip
digitalWrite(RGB_R, ledState);
}
}
}
// 5. Update Tampilan LCD
if (!isnan(tC)) {
lcd.setCursor(0, 0);
lcd.print("Suhu:");
lcd.print(tC, 1); lcd.print("C ");
lcd.print(tF, 1); lcd.print("F ");
lcd.setCursor(0, 1);
lcd.print("Distance:");
lcd.print(distance);
lcd.print("cm ");
}
}