// pulse an output if switch changes to low
// https://forum.arduino.cc/t/switching-circuit-using-relays-and-ups-with-arduino/1019626/
// Different color LEDs are used just to show the current relay status.
// Suitable transistors would be used for driving the relay in place of LEDs later .
constexpr uint8_t inputPin {7}; // input 5v from mobile charger for AC presence sensing.
constexpr uint8_t UPSrelay {9}; // UPS output 220v relay for appliances
constexpr uint8_t ONOFFsw {11}; // connected to ups power switch via a relay. (To simulate UPS ON/OFF)
constexpr uint8_t MAINSrelay {10}; // MAINS output relay 220v for appliances
constexpr uint16_t intervalOn {1};
constexpr uint16_t intervalOff {3};
byte previousInputState = HIGH;
void pulseUpdate()
{
uint8_t inputState = digitalRead(inputPin);
if (inputState == LOW && previousInputState == HIGH)
{
Serial.println(F("AC Power OFF")); // inputpin got LOW from 5v charger in case of AC failed.
digitalWrite(MAINSrelay, LOW); // NAINS relay turned off
delay(intervalOff); // simple 3 sec. delay
digitalWrite(ONOFFsw, HIGH); // Power switch of UPS pressed (through a relay) to turn ON the UPS
delay(intervalOn); // Keep pressing power button for 1 sec.
digitalWrite(ONOFFsw, LOW); // Power switch released . Now UPS is turned ON
delay(intervalOff); // simple delay of 3sec. to let the UPS initialize after power ON
digitalWrite(UPSrelay, HIGH); // UPS relay turned ON , now appliances are running on battery power.
previousInputState = inputState;
}
else if (inputState == HIGH && previousInputState == LOW)
{
Serial.println(F("AC Power ON")); // inputpin got high from 5v charger in case of AC restored.
delay(intervalOff); // a simple 3 sec. delay
digitalWrite(UPSrelay, LOW); // UPS relay turned OFF
digitalWrite(ONOFFsw, HIGH); // Power switch of UPS pressed (through a relay) to turn OFF the UPS
delay(intervalOff); // Keep pressing power button for 3 sec. to turn OFF.
digitalWrite(ONOFFsw, LOW); // Power button released . Now UPS is turned OFF
digitalWrite(MAINSrelay, HIGH); // Mains relay turned ON, now appliances are running on Mains power.
previousInputState = inputState;
}
}
void setup() {
Serial.begin(115200);
Serial.println(F("Switch an output based on another pin"));
pinMode(ONOFFsw, OUTPUT);
pinMode(UPSrelay, OUTPUT);
delay(50);
}
void loop() {
pulseUpdate();
}