This circuit is designed to control a DC motor using an Arduino UNO based on input from a rain sensor. The circuit also includes a solar panel for power supply, a diode for protection, and an MG90S servo motor. The L298N motor driver is used to drive the DC motor. The Arduino UNO reads the rain sensor data and controls the motor to either open or close a cover based on the presence of rain.
RAIN SENSOR
L298N DC Motor Driver
DC Motor
12V Battery
Solar Panel
Diode
Arduino UNO
MG90S
// Pin setup
#define RAIN_SENSOR_PIN 2 // Pin DO dari sensor hujan terhubung ke D2 pada Arduino
#define MOTOR_IN1 6 // Pin IN1 dari motor driver terhubung ke D6 pada Arduino
#define MOTOR_IN2 7 // Pin IN2 dari motor driver terhubung ke D7 pada Arduino
#define MOTOR_IN3 8 // Pin IN3 dari motor driver terhubung ke D8 pada Arduino
#define MOTOR_IN4 9 // Pin IN4 dari motor driver terhubung ke D9 pada Arduino
// Pin lainnya
#define ENA_PIN 5 // Pin ENA (kecepatan motor) terhubung ke pin 5 pada Arduino
// Ambang batas sensor hujan
#define RAIN_THRESHOLD 500 // Nilai sensor hujan untuk deteksi hujan
// Variabel kontrol waktu
unsigned long previousMillis = 0;
const long interval = 3000; // Durasi motor berputar selama 3 detik
bool motorRunning = false;
void setup() {
// Inisialisasi pin sensor hujan
pinMode(RAIN_SENSOR_PIN, INPUT);
// Inisialisasi pin motor driver
pinMode(MOTOR_IN1, OUTPUT);
pinMode(MOTOR_IN2, OUTPUT);
pinMode(MOTOR_IN3, OUTPUT);
pinMode(MOTOR_IN4, OUTPUT);
pinMode(ENA_PIN, OUTPUT);
// Mulai komunikasi serial
Serial.begin(9600);
}
void loop() {
// Membaca nilai dari sensor hujan (DO)
int rainValue = digitalRead(RAIN_SENSOR_PIN);
Serial.print("Rain Sensor Value: ");
Serial.println(rainValue);
// Cek apakah sensor hujan mendeteksi hujan atau tidak
if (rainValue == LOW) { // Sensor hujan aktif (deteksi hujan jika nilai LOW)
// Hujan terdeteksi, menutup kain
Serial.println("Hujan terdeteksi! Menutup kain...");
closeCover(); // Menarik kain (motor maju)
} else {
// Tidak ada hujan, membuka kain
Serial.println("Tidak ada hujan. Membuka kain...");
openCover(); // Menggulung kain (motor mundur)
}
// Waktu non-blok menggunakan millis()
unsigned long currentMillis = millis();
if (motorRunning && (currentMillis - previousMillis >= interval)) {
previousMillis = currentMillis;
stopMotor(); // Hentikan motor setelah waktu yang ditentukan
motorRunning = false;
}
}
// Fungsi untuk menarik kain (motor maju)
void closeCover() {
digitalWrite(MOTOR_IN1, HIGH); // Motor maju
digitalWrite(MOTOR_IN2, LOW);
digitalWrite(MOTOR_IN3, HIGH); // Motor maju (untuk motor kedua jika ada)
digitalWrite(MOTOR_IN4, LOW);
analogWrite(ENA_PIN, 200); // Kecepatan motor (200 dari 255)
motorRunning = true;
previousMillis = millis(); // Reset timer
}
// Fungsi untuk menggulung kain (motor mundur)
void openCover() {
digitalWrite(MOTOR_IN1, LOW); // Motor mundur
digitalWrite(MOTOR_IN2, HIGH);
digitalWrite(MOTOR_IN3, LOW); // Motor mundur (untuk motor kedua jika ada)
digitalWrite(MOTOR_IN4, HIGH);
analogWrite(ENA_PIN, 200); // Kecepatan motor (200 dari 255)
motorRunning = true;
previousMillis = millis(); // Reset timer
}
// Fungsi untuk menghentikan motor
void stopMotor() {
digitalWrite(MOTOR_IN1, LOW);
digitalWrite(M