#define BLYNK_TEMPLATE_ID "TMPL66jMOriNy"
#define BLYNK_TEMPLATE_NAME "Project IoT Sederhana 2"
#define BLYNK_AUTH_TOKEN "i2jHR9ypD2J_X3sg6FGUf_J5hTiKoLfz"
#include <WiFi.h>
#include <DHT.h>
#include <BlynkSimpleEsp32.h>
#include <LiquidCrystal_I2C.h>
// Blynk Auth Token
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// DHT Sensor settings
#define DHT_PIN 15
#define DHTTYPE DHT22
DHT dhtSensor(DHT_PIN, DHTTYPE);
// LCD settings
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Relay and Buzzer settings
#define RELAY_PIN 2
#define BUZZER_PIN 4
// Fuzzy Logic Parameters
float temperature, humidity;
int fanStatus = 0, heatStatus = 0;
// Blynk timer
BlynkTimer timer;
// Fuzzy logic functions
float fuzzyTemperature(float temp) {
if (temp <= 30.0) return 1.0; // Very Cold (suhu lebih rendah dari 30°C)
if (temp >= 32.0 && temp <= 34.0) return 0.5; // Ideal (suhu antara 32°C hingga 34°C)
if (temp >= 36.0) return 1.0; // Too Hot (suhu lebih dari 36°C)
return 0.0; // Default
}
float fuzzyHumidity(float hum) {
if (hum <= 40.0) return 1.0; // Very Dry (kelembaban di bawah 40%)
if (hum >= 50.0 && hum <= 60.0) return 0.5; // Ideal (kelembaban antara 50% hingga 60%)
if (hum >= 70.0) return 1.0; // Too Wet (kelembaban di atas 70%)
return 0.0; // Default
}
void bacaSensor() {
temperature = dhtSensor.readTemperature();
humidity = dhtSensor.readHumidity();
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Print sensor data to Serial Monitor
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" °C");
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println(" %");
// Apply fuzzy logic
float tempFuzzy = fuzzyTemperature(temperature);
float humFuzzy = fuzzyHumidity(humidity);
if (tempFuzzy == 1.0 || humFuzzy == 1.0) {
digitalWrite(BUZZER_PIN, HIGH); // Activate buzzer
tone(BUZZER_PIN, 1000); // Buzzer frequency 1000 Hz
heatStatus = 1; // Turn on heater relay
fanStatus = 0; // Turn off fan if applicable
Blynk.virtualWrite(V4, "ALARM: Unsafe Condition!"); // Send alert to Blynk app
Serial.println("ALARM: Unsafe conditions detected!");
} else if (tempFuzzy == 0.5 && humFuzzy == 0.5) {
heatStatus = 0; // Turn off heater
fanStatus = 1; // Turn on fan
digitalWrite(BUZZER_PIN, LOW); // Turn off buzzer
noTone(BUZZER_PIN); // Stop buzzer sound
Blynk.virtualWrite(V4, "Ideal Condition"); // Send ideal condition message to Blynk
Serial.println("Conditions are ideal.");
}
// Update relay and devices
digitalWrite(RELAY_PIN, heatStatus);
// Display data on LCD
lcd.setCursor(0, 0);
lcd.print("Temp: " + String(temperature, 1) + "C ");
lcd.setCursor(0, 1);
lcd.print("Hum: " + String(humidity, 1) + "% ");
// Send data to Blynk
Blynk.virtualWrite(V3, temperature);
Blynk.virtualWrite(V2, humidity);
}
void setup() {
Serial.begin(115200);
Serial.println("Egg Incubator System with Fuzzy Logic");
lcd.init();
lcd.backlight();
pinMode(RELAY_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
digitalWrite(BUZZER_PIN, LOW);
dhtSensor.begin();
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Blynk.begin(auth, ssid, pass);
timer.setInterval(2000L, bacaSensor); // Call sensor reading function every 2 seconds
}
void loop() {
Blynk.run();
timer.run();
}