#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
// ===== DHT22 =====
#define DHTPIN 15
#define DHTTYPE DHT22
// ===== HC-SR04 =====
#define TRIG_PIN 5
#define ECHO_PIN 18
// ===== LED =====
#define LED_HIJAU 25
#define LED_KUNING 26
#define LED_MERAH 27
// ===== RGB LED SUHU =====
#define RGB1_R 32
#define RGB1_G 33
#define RGB1_B 4
// ===== RGB LED AIR =====
#define RGB2_R 19
#define RGB2_G 23
#define RGB2_B 13
// ===== SERVO =====
#define SERVO1_PIN 14
#define SERVO2_PIN 12
#define SERVO_FREQ 50
#define SERVO_MIN 500 // microsecond
#define SERVO_MAX 2400 // microsecond
LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT dht(DHTPIN, DHTTYPE);
// fungsi gerak servo tanpa library
void setServo(int pin, int angle) {
int pulse = map(angle, 0, 180, SERVO_MIN, SERVO_MAX);
ledcWrite(pin, pulse);
}
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LED_HIJAU, OUTPUT);
pinMode(LED_KUNING, OUTPUT);
pinMode(LED_MERAH, OUTPUT);
pinMode(RGB1_R, OUTPUT);
pinMode(RGB1_G, OUTPUT);
pinMode(RGB1_B, OUTPUT);
pinMode(RGB2_R, OUTPUT);
pinMode(RGB2_G, OUTPUT);
pinMode(RGB2_B, OUTPUT);
// ===== PWM SERVO (API BARU WOKWI) =====
ledcAttach(SERVO1_PIN, SERVO_FREQ, 16);
ledcAttach(SERVO2_PIN, SERVO_FREQ, 16);
setServo(SERVO1_PIN, 0);
setServo(SERVO2_PIN, 0);
lcd.init();
lcd.backlight();
dht.begin();
}
void loop() {
// ===== HC-SR04 =====
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH, 30000);
float jarak = duration > 0 ? duration * 0.034 / 2 : 999;
// ===== DHT22 =====
float suhu = dht.readTemperature();
float kelembaban = dht.readHumidity();
// ===== LCD =====
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(suhu);
lcd.print("C H:");
lcd.print(kelembaban);
lcd.setCursor(0, 1);
lcd.print("Air:");
lcd.print(jarak);
lcd.print("cm");
// ===== LED & RGB AIR =====
digitalWrite(LED_HIJAU, LOW);
digitalWrite(LED_KUNING, LOW);
digitalWrite(LED_MERAH, LOW);
digitalWrite(RGB2_R, LOW);
digitalWrite(RGB2_G, LOW);
digitalWrite(RGB2_B, LOW);
if (jarak <= 5) {
digitalWrite(LED_MERAH, HIGH);
digitalWrite(RGB2_R, HIGH);
} else if (jarak <= 15) {
digitalWrite(LED_KUNING, HIGH);
digitalWrite(RGB2_B, HIGH);
} else {
digitalWrite(LED_HIJAU, HIGH);
digitalWrite(RGB2_G, HIGH);
}
// ===== SUHU, RGB SUHU & SERVO =====
digitalWrite(RGB1_R, LOW);
digitalWrite(RGB1_G, LOW);
digitalWrite(RGB1_B, LOW);
if (suhu > 30) {
setServo(SERVO1_PIN, 90);
setServo(SERVO2_PIN, 90);
digitalWrite(RGB1_R, HIGH);
} else {
setServo(SERVO1_PIN, 0);
setServo(SERVO2_PIN, 0);
digitalWrite(RGB1_G, HIGH);
}
// ===== SERIAL =====
Serial.print("Jarak dengan air : ");
Serial.print(jarak);
Serial.println(" cm");
Serial.print("Suhu : ");
Serial.print(suhu);
Serial.println(" C");
Serial.print("Kelembaban : ");
Serial.print(kelembaban);
Serial.println(" %");
Serial.println("-------------------");
delay(2000);
}