#define RAIN_ANALOG 34
#define RAIN_DIGITAL 35
#define STEP_PIN 23 // Pin STEP untuk motor jendela
#define DIR_PIN 22 // Pin DIR untuk motor jendela
#define GORDEN_STEP_PIN 21 // Pin STEP untuk motor gorden
#define GORDEN_DIR_PIN 20 // Pin DIR untuk motor gorden
#define BUTTON_PIN 4 // Tombol untuk mengembalikan motor jendela ke posisi awal
#define MANUAL_BUTTON_PIN 5 // Tombol untuk membuka jendela secara manual
#define GORDEN_CONTROL_PIN 2 // Tombol untuk mengontrol motor gorden
const int stepsPerRevolution = 200; // Jumlah langkah untuk satu putaran penuh
const int maxSteps = 1000; // Jumlah langkah maksimum untuk motor jendela
int currentSteps = 0; // Jumlah langkah yang telah ditempuh oleh motor jendela
bool motorRunning = false; // Status motor jendela sedang berjalan
bool isRaining = false; // Status hujan
const int gordenMaxSteps = 1000; // Jumlah langkah maksimum untuk motor gorden
int gordenCurrentSteps = 0; // Jumlah langkah yang telah ditempuh oleh motor gorden
bool gordenDirectionCW = false; // Arah motor gorden, false = CCW, true = CW
bool gordenMotorRunning = false; // Status motor gorden sedang berjalan
void setup() {
pinMode(RAIN_ANALOG, INPUT);
pinMode(RAIN_DIGITAL, INPUT);
pinMode(STEP_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
pinMode(GORDEN_STEP_PIN, OUTPUT);
pinMode(GORDEN_DIR_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP); // Tombol untuk reset posisi motor jendela
pinMode(MANUAL_BUTTON_PIN, INPUT_PULLUP); // Tombol untuk membuka jendela manual
pinMode(GORDEN_CONTROL_PIN, INPUT_PULLUP); // Tombol untuk mengontrol motor gorden
digitalWrite(DIR_PIN, LOW); // Default arah motor jendela ke CCW
digitalWrite(GORDEN_DIR_PIN, LOW); // Default arah motor gorden ke CCW
analogReadResolution(10);
Serial.begin(9600);
}
void loop() {
// Membaca sensor hujan hanya jika perlu
bool rainDetected = digitalRead(RAIN_DIGITAL);
if (rainDetected != isRaining) {
isRaining = rainDetected;
if (isRaining) {
Serial.println("It's raining!");
} else {
Serial.println("The rain has stopped.");
}
}
// Jalankan motor untuk menutup jendela jika hujan terdeteksi dan belum mencapai langkah maksimum
if (isRaining && !motorRunning && currentSteps < maxSteps) {
Serial.println("Starting motor to close window...");
motorRunning = true;
rotateMotor(STEP_PIN, DIR_PIN, LOW, maxSteps - currentSteps); // Menutup jendela ke CCW
currentSteps = maxSteps; // Set langkah saat ini ke maksimum
motorRunning = false; // Motor selesai berjalan
Serial.println("Window closed.");
}
// Mengembalikan posisi motor jendela ke awal jika tombol ditekan, hanya jika hujan sudah berhenti
if (digitalRead(BUTTON_PIN) == LOW) {
if (isRaining) {
Serial.println("Cannot open window, rain detected. Please wait until the rain stops.");
} else {
Serial.println("Returning motor to the start position...");
rotateMotor(STEP_PIN, DIR_PIN, HIGH, currentSteps); // Membuka jendela ke CW (arah balik)
currentSteps = 0; // Reset langkah ke 0
Serial.println("Motor is at the start position.");
}
}
// Membuka jendela secara manual jika tombol 2 ditekan, hanya jika tidak hujan
if (digitalRead(MANUAL_BUTTON_PIN) == LOW && !isRaining) {
Serial.println("Opening window manually...");
rotateMotor(STEP_PIN, DIR_PIN, LOW, maxSteps - currentSteps); // Putar motor untuk membuka jendela ke CCW
currentSteps = maxSteps; // Update langkah ke posisi maksimal
Serial.println("Window opened manually.");
}
// Kontrol motor gorden dengan tombol 3
if (digitalRead(GORDEN_CONTROL_PIN) == LOW && !gordenMotorRunning) {
Serial.println("Gorden control button pressed.");
gordenMotorRunning = true;
// Tentukan arah motor berdasarkan langkah saat ini
if (gordenCurrentSteps < gordenMaxSteps) {
// Buka gorden ke CCW
rotateMotor(GORDEN_STEP_PIN, GORDEN_DIR_PIN, LOW, gordenMaxSteps - gordenCurrentSteps);
gordenCurrentSteps = gordenMaxSteps;
gordenDirectionCW = true; // Ubah arah ke CW setelah selesai
Serial.println("Gorden opened.");
} else {
// Tutup gorden ke CW
rotateMotor(GORDEN_STEP_PIN, GORDEN_DIR_PIN, HIGH, gordenCurrentSteps);
gordenCurrentSteps = 0;
gordenDirectionCW = false; // Ubah arah ke CCW setelah selesai
Serial.println("Gorden closed.");
}
gordenMotorRunning = false;
}
delay(100); // Delay untuk pembacaan sensor
}
// Fungsi untuk memutar motor dengan langkah tertentu
void rotateMotor(int stepPin, int dirPin, int direction, int steps) {
digitalWrite(dirPin, direction); // Set arah motor (HIGH = CW, LOW = CCW)
for (int i = 0; i < steps; i++) {
digitalWrite(stepPin, HIGH);
delayMicroseconds(1000); // Sesuaikan kecepatan motor
digitalWrite(stepPin, LOW);
delayMicroseconds(1000);
}
}