#define rainSensor A0
#define openEndstop 2
#define closeEndstop 3
#define manualButton 4
#define RPWM 5
#define LPWM 6
#define REN 8
#define LEN 9
#define threshold 512
unsigned long time_now = 0;
int rainReading = 0;
bool rainStatus = false, buttonOverride = false, buttonPressed = false;
void motorOpen(int speed) {
analogWrite(RPWM, speed);
analogWrite(LPWM, 0);
}
void motorClose(int speed) {
analogWrite(RPWM, 0);
analogWrite(LPWM, speed);
}
void motorStop() {
analogWrite(RPWM, 0);
analogWrite(LPWM, 0);
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(rainSensor, INPUT);
pinMode(openEndstop, INPUT_PULLUP);
pinMode(closeEndstop, INPUT_PULLUP);
pinMode(manualButton, INPUT_PULLUP);
pinMode(RPWM, OUTPUT);
pinMode(LPWM, OUTPUT);
pinMode(REN, OUTPUT);
pinMode(LEN, OUTPUT);
digitalWrite(REN, HIGH);
digitalWrite(LEN, HIGH);
}
void loop() {
// put your main code here, to run repeatedly:
// read rain sensor
if (millis() - time_now > 100) {
time_now = millis();
rainReading = digitalRead(rainSensor) == LOW;
if (rainReading) {
rainStatus = true;
Serial.println("Raining");
} else {
rainStatus = false;
Serial.println("No raining");
}
}
buttonOverride = digitalRead(manualButton) == LOW; // Active low button
if (buttonOverride) {
buttonPressed = true;
}
// Rain detected, retract cloth hanger if not fully retracted
if (rainStatus) {
if (digitalRead(closeEndstop) == HIGH) { // Check if retract limit is not reached
motorClose(255);
} else {
motorStop(); // Stop motor when fully retracted
}
} else if (!rainStatus && buttonPressed) {
if (digitalRead(openEndstop) == HIGH && buttonPressed == true) {
motorOpen(255);
} else {
motorStop();
buttonPressed = false;
}
}
// No action needed, stop the motor
else {
motorStop();
}
}