#include <Stepper.h>
#include "WaterLevelSensor.h"
// Stepper
int stepsPerRevolution = 100;
int stepCount = 0;
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
// LDR (Photoresistor)
#define LDR_PIN 2
// DHT22
#include "DHT.h"
#define DHTPIN 3
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// LCD
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Manual
#define SLIDE_SWITCH_PIN 4
#define MANUAL_ON_PIN 5
#define MANUAL_OFF_PIN 6
#define LED_PIN 7
// Water Level Sensor
WaterLevelSensor waterLevelSensor(A0);
// Servo
#include <Servo.h>
#define pinServo 12
Servo myservo;
// Ultrasonic
#define TRIG_PIN A1
#define ECHO_PIN A2
void setup() {
myStepper.setSpeed(20);
Serial.begin(9600);
pinMode(LDR_PIN, INPUT);
dht.begin();
lcd.init();
lcd.backlight();
lcd.clear();
pinMode(SLIDE_SWITCH_PIN, INPUT_PULLUP);
pinMode(MANUAL_ON_PIN, INPUT_PULLUP);
pinMode(MANUAL_OFF_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
waterLevelSensor.begin();
myservo.attach(pinServo);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
}
void pushJemuran(int distance) {
if (distance > 30) {
myStepper.step(stepsPerRevolution);
stepCount += stepsPerRevolution;
}
}
void pullJemuran() {
if (stepCount > 0) {
myStepper.step(-stepsPerRevolution);
stepCount -= stepsPerRevolution;
}
}
float readDistanceCM() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
int duration = pulseIn(ECHO_PIN, HIGH);
return duration * 0.034 / 2;
}
void loop() {
bool isAutomatic = digitalRead(SLIDE_SWITCH_PIN) == LOW;
digitalWrite(LED_PIN, isAutomatic ? HIGH : LOW);
int waterLevel = waterLevelSensor.readLevel();
float distance = readDistanceCM();
if(isAutomatic) {
if (digitalRead(LDR_PIN) == LOW) {
lcd.setCursor(12, 1);
lcd.print("Terang");
} else {
lcd.setCursor(12, 1);
lcd.print("Gelap ");
}
if (waterLevel > 0){
lcd.setCursor(0, 3);
lcd.print("Ya ");
myservo.write(90);
delay(100);
myservo.write(0);
delay(100);
} else {
lcd.setCursor(0, 3);
lcd.print("Tidak");
}
float humidity = dht.readHumidity();
float suhu = dht.readTemperature();
lcd.setCursor(0, 0);
lcd.print("Suhu ");
lcd.setCursor(12, 0);
lcd.print("Cahaya");
lcd.setCursor(0, 2);
lcd.print("Hujan");
lcd.setCursor(12, 2);
lcd.print("Humidity");
lcd.setCursor(0, 1);
lcd.print(suhu);
lcd.setCursor(6, 1);
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(12,3);
lcd.print(humidity);
lcd.setCursor(17,3);
lcd.print("%");
if ((digitalRead(LDR_PIN) == LOW) && suhu > 25 && waterLevel == 0 && humidity < 60) {
pushJemuran(distance);
}
else {
pullJemuran();
}
} else {
lcd.setCursor(0, 0);
lcd.print("Mode Manual ");
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 2);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print(" ");
if (digitalRead(MANUAL_ON_PIN) == LOW) {
pushJemuran(distance);
pushJemuran(distance);
}
if (digitalRead(MANUAL_OFF_PIN) == LOW) {
pullJemuran();
pullJemuran();
}
}
}