static int const buttonPin = 0; static int const relayPin = 12; // active high static int const ledPin = 13; // active low static uint8_t prevButtonVal; static uint8_t curOutVal; static inline bool isRaisingEdge(uint8_t prevVal, uint8_t curVal) { return prevVal == LOW && curVal == HIGH; } void setup() { pinMode(buttonPin, INPUT); pinMode(ledPin, OUTPUT); pinMode(relayPin, OUTPUT); prevButtonVal = digitalRead(buttonPin); digitalWrite(relayPin, LOW); digitalWrite(ledPin, HIGH); curOutVal = LOW; } void loop() { uint8_t curButtonVal = digitalRead(buttonPin); if (isRaisingEdge(prevButtonVal, curButtonVal)) { curOutVal = curOutVal == HIGH ? LOW : HIGH; digitalWrite(relayPin, curOutVal); digitalWrite(ledPin, curOutVal == HIGH ? LOW : HIGH); } prevButtonVal = curButtonVal; }