#define BLYNK_USE_OLD_VERSION
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>
// Pin definisi
#define RELAY_PIN 13 // Pin relay untuk stop kontak AC
#define DHT_PIN 15 // Pin data untuk sensor DHT22
#define DHT_TYPE DHT22 // Tipe sensor DHT
#define RAIN_ANALOG 33 // Pin analog sensor hujan
#define RAIN_DIGITAL 32 // Pin digital sensor hujan
#define STEPPER1_PIN1 25 // Pin stepper motor 1 (jendela)
#define STEPPER1_PIN2 26
#define STEPPER2_PIN1 27 // Pin stepper motor 2 (gorden)
#define STEPPER2_PIN2 14
// Konfigurasi Blynk
char auth[] = "8kN0Di4Fl_vm3SbbGxUToF48v9NAahw0"; // Token Blynk Legacy
char ssid[] = "Wokwi-GUEST"; // Nama WiFi
char pass[] = ""; // Password WiFi
DHT dht(DHT_PIN, DHT_TYPE);
// Variabel untuk timer dengan millis
unsigned long lastDHTReadMillis = 0;
const unsigned long dhtInterval = 2000; // 2 detik interval
// Jumlah langkah per putaran penuh (untuk motor stepper 1.8° per langkah)
#define STEPS_PER_REVOLUTION 200 // Sesuaikan dengan motor Anda
void setup() {
Serial.begin(9600);
dht.begin();
// Konfigurasi pin
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
pinMode(RAIN_ANALOG, INPUT);
pinMode(RAIN_DIGITAL, INPUT);
pinMode(STEPPER1_PIN1, OUTPUT);
pinMode(STEPPER1_PIN2, OUTPUT);
pinMode(STEPPER2_PIN1, OUTPUT);
pinMode(STEPPER2_PIN2, OUTPUT);
// Inisialisasi Blynk
Blynk.begin(auth, ssid, pass, "iot.serangkota.go.id", 8080);
Serial.println("Blynk terhubung.");
}
void loop() {
Blynk.run();
// Pemantauan sensor hujan
monitorRainSensor();
// Timer untuk pembacaan dan pengiriman data DHT
unsigned long currentMillis = millis();
if (currentMillis - lastDHTReadMillis >= dhtInterval) {
lastDHTReadMillis = currentMillis;
sendTemperatureAndHumidity();
}
}
// Kontrol relay (Virtual Pin V1)
BLYNK_WRITE(V1) {
int state = param.asInt();
digitalWrite(RELAY_PIN, state);
if (state == 1) {
controlStepper1Rotations(0); // Menutup jendela (0 putaran)
controlStepper2Rotations(0); // Menutup gorden (0 putaran)
Serial.println("Relay ON, Jendela & Gorden Ditutup.");
} else {
Serial.println("Relay OFF.");
}
}
// Kontrol jendela (Virtual Pin V2) untuk jumlah putaran tertentu
BLYNK_WRITE(V2) {
int rotations = param.asInt(); // Mengambil jumlah putaran dari Blynk
controlStepper1Rotations(rotations);
Serial.printf("Jendela: %d Putaran\n", rotations);
}
// Kontrol gorden (Virtual Pin V3) untuk jumlah putaran tertentu
BLYNK_WRITE(V3) {
int rotations = param.asInt(); // Mengambil jumlah putaran dari Blynk
controlStepper2Rotations(rotations);
Serial.printf("Gorden: %d Putaran\n", rotations);
}
// Pemantauan sensor hujan
void monitorRainSensor() {
int rainAnalog = analogRead(RAIN_ANALOG);
bool isRaining = digitalRead(RAIN_DIGITAL);
Serial.printf("Rain Analog: %d\n", rainAnalog);
if (isRaining) {
controlStepper1Rotations(0); // Tutup jendela jika hujan (0 putaran)
Serial.println("Hujan terdeteksi! Jendela Ditutup.");
}
}
// Mengirim data suhu dan kelembapan
void sendTemperatureAndHumidity() {
float temp = dht.readTemperature();
float hum = dht.readHumidity();
if (!isnan(temp) && !isnan(hum)) {
Blynk.virtualWrite(V4, temp); // Virtual Pin V4 untuk suhu
Blynk.virtualWrite(V5, hum); // Virtual Pin V5 untuk kelembapan
Serial.printf("Suhu: %.1f°C, Kelembapan: %.1f%%\n", temp, hum);
} else {
Serial.println("Gagal membaca data DHT22.");
}
}
// Kontrol stepper motor 1 (jendela) dengan jumlah putaran
void controlStepper1Rotations(int rotations) {
int steps = rotations * STEPS_PER_REVOLUTION;
for (int i = 0; i < steps; i++) {
digitalWrite(STEPPER1_PIN1, HIGH);
digitalWrite(STEPPER1_PIN2, LOW);
delay(10); // Delay untuk langkah motor
digitalWrite(STEPPER1_PIN1, LOW);
digitalWrite(STEPPER1_PIN2, HIGH);
delay(10); // Delay untuk langkah motor
}
Serial.println("Stepper Motor 1: Operasi selesai.");
}
// Kontrol stepper motor 2 (gorden) dengan jumlah putaran
void controlStepper2Rotations(int rotations) {
int steps = rotations * STEPS_PER_REVOLUTION;
for (int i = 0; i < steps; i++) {
digitalWrite(STEPPER2_PIN1, HIGH);
digitalWrite(STEPPER2_PIN2, LOW);
delay(10); // Delay untuk langkah motor
digitalWrite(STEPPER2_PIN1, LOW);
digitalWrite(STEPPER2_PIN2, HIGH);
delay(10); // Delay untuk langkah motor
}
Serial.println("Stepper Motor 2: Operasi selesai.");
}