#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
// ESP32 sudah mendukung FreeRTOS secara native
#define DHTPIN 15 // Sesuaikan pin DHT dengan yang tersedia di ESP32
#define DHTTYPE DHT11
const int ldrPin = 34; // Pin digital DO dari LDR
const int relayPin = 2; // Pin relay yang terhubung ke pin GPIO2
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 20, 4);
float humidity = 0;
float temperature = 0;
bool isDark = false;
void TaskLDR(void *pvParameters);
void TaskDHT(void *pvParameters);
void TaskLCD(void *pvParameters);
void TaskTrafficLight(void *pvParameters);
void setup() {
Serial.begin(115200);
// Inisialisasi pin
pinMode(ldrPin, INPUT); // Mengatur pin DO LDR sebagai input
pinMode(relayPin, OUTPUT);
digitalWrite(relayPin, LOW);
// Inisialisasi LCD
lcd.begin(20, 4);
lcd.backlight();
// Inisialisasi sensor DHT
dht.begin();
// Inisialisasi pin output untuk kontrol lampu lalu lintas
pinMode(13, OUTPUT); // Lampu merah lalu lintas
pinMode(12, OUTPUT); // Lampu kuning lalu lintas
pinMode(14, OUTPUT); // Lampu hijau lalu lintas
lcd.setCursor(0, 0);
lcd.print("SMART CITY SYSTEM");
// Membuat tugas-tugas FreeRTOS
xTaskCreate(TaskLDR, "LDR Task", 1024, NULL, 2, NULL);
xTaskCreate(TaskDHT, "DHT Task", 1024, NULL, 1, NULL);
xTaskCreate(TaskLCD, "LCD Task", 1024, NULL, 1, NULL);
xTaskCreate(TaskTrafficLight, "Traffic Light Task", 1024, NULL, 1, NULL);
}
void loop() {
// Tidak ada yang dilakukan di loop, tugas dihandle oleh FreeRTOS
}
// Task untuk membaca sensor LDR
void TaskLDR(void *pvParameters) {
(void) pvParameters;
for (;;) {
isDark = digitalRead(ldrPin) == HIGH; // HIGH jika gelap, LOW jika terang
if (isDark) {
digitalWrite(relayPin, HIGH); // Nyalakan relay (LED on)
Serial.println("Gelap: LED menyala");
} else {
digitalWrite(relayPin, LOW); // Matikan relay (LED off)
Serial.println("Terang: LED mati");
}
vTaskDelay(200 / portTICK_PERIOD_MS);
}
}
// Task untuk membaca sensor DHT
void TaskDHT(void *pvParameters) {
(void) pvParameters;
for (;;) {
temperature = dht.readTemperature();
humidity = dht.readHumidity();
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Gagal membaca sensor DHT!");
} else {
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.print(" C, Humidity: ");
Serial.print(humidity);
Serial.println(" %");
}
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
}
// Task untuk menampilkan data ke LCD
void TaskLCD(void *pvParameters) {
(void) pvParameters;
for (;;) {
lcd.setCursor(0, 1);
if (isDark) {
lcd.print("Gelap: LED on ");
} else {
lcd.print("Terang: LED off ");
}
lcd.setCursor(0, 2);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print(" C ");
lcd.setCursor(0, 3);
lcd.print("Humidity: ");
lcd.print(humidity);
lcd.print(" % ");
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
// Task untuk mengontrol lampu lalu lintas
void TaskTrafficLight(void *pvParameters) {
(void) pvParameters;
for (;;) {
digitalWrite(14, HIGH); // Lampu hijau menyala
Serial.println("Lampu hijau menyala");
vTaskDelay(2000 / portTICK_PERIOD_MS);
digitalWrite(14, LOW);
Serial.println("Lampu hijau mati");
digitalWrite(12, HIGH);
Serial.println("Lampu kuning menyala");
vTaskDelay(600 / portTICK_PERIOD_MS);
digitalWrite(12, LOW);
Serial.println("Lampu kuning mati");
digitalWrite(13, HIGH);
Serial.println("Lampu merah menyala");
vTaskDelay(1800 / portTICK_PERIOD_MS);
digitalWrite(12, HIGH);
Serial.println("Lampu kuning menyala (peralihan)");
vTaskDelay(400 / portTICK_PERIOD_MS);
digitalWrite(13, LOW);
digitalWrite(12, LOW);
Serial.println("Lampu merah mati dan kuning mati");
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}