#include <Arduino.h>
#include <ESP32Servo.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
// ------------------- Konfigurasi Pin -------------------
#define PIN_MQ2 34 // Input analog dari sensor MQ2
#define PIN_DHT 27 // Input data dari sensor DHT22
#define PIN_SERVO 18 // Output PWM untuk servo
// ------------------- Konstanta Sensor -------------------
#define DHTTYPE DHT22
#define THRESHOLD_SMOKE 2000 // ppm ambang buka ventilasi
// ------------------- Objek Library -------------------
DHT dht(PIN_DHT, DHTTYPE);
Servo servoVentilasi;
LiquidCrystal_I2C lcd(0x27, 16, 2);
// ------------------- Variabel Global -------------------
float suhu = 0;
float kelembapan = 0;
float asapADC = 0;
float asapPPM = 0;
int sudutServo = 0;
String statusVentilasi = "CLOSE";
// ------------------- TASK: Pembacaan Sensor -------------------
void TaskBacaSensor(void *pvParameters) {
while (true) {
asapADC = analogRead(PIN_MQ2);
asapPPM = (asapADC / 4095.0) * 10000.0; // Konversi ke ppm (linear aproksimasi)
suhu = dht.readTemperature();
kelembapan = dht.readHumidity();
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
}
// ------------------- TASK: Kontrol Ventilasi -------------------
void TaskKontrolVentilasi(void *pvParameters) {
while (true) {
if (asapPPM > THRESHOLD_SMOKE) {
sudutServo = 90;
statusVentilasi = "OPEN";
} else {
sudutServo = 0;
statusVentilasi = "CLOSE";
}
servoVentilasi.write(sudutServo);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
// ------------------- TASK: Tampilkan Data di LCD -------------------
void TaskLCD(void *pvParameters) {
while (true) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(suhu, 1);
lcd.print("C ");
lcd.print("H:");
lcd.print(kelembapan, 0);
lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("Smoke:");
lcd.print(asapPPM, 0);
lcd.print("ppm");
lcd.setCursor(13, 1);
lcd.print(statusVentilasi == "OPEN" ? "O" : "C");
vTaskDelay(1500 / portTICK_PERIOD_MS);
}
}
// ------------------- SETUP -------------------
void setup() {
Serial.begin(115200);
dht.begin();
lcd.init();
lcd.backlight();
servoVentilasi.attach(PIN_SERVO, 500, 2400);
lcd.setCursor(0, 0);
lcd.print("Smart Ventilation");
lcd.setCursor(0, 1);
lcd.print("Init system...");
delay(2000);
lcd.clear();
// Buat Task RTOS
xTaskCreatePinnedToCore(TaskBacaSensor, "Sensor", 2048, NULL, 1, NULL, 1);
xTaskCreatePinnedToCore(TaskKontrolVentilasi, "Ventilasi", 2048, NULL, 1, NULL, 1);
xTaskCreatePinnedToCore(TaskLCD, "LCD", 2048, NULL, 1, NULL, 1);
}
// ------------------- LOOP -------------------
void loop() {
// Kosong - semua dijalankan oleh FreeRTOS
}
ESP32 Smart Ventilator RTOS-based
Project UTS Embedded System OS Prodi Resiskom AKPRIND University