/*
Wokwi | questions
Pushbutton - Active-high
Pinger - February 26, 2026 8:10 PM
Is it possible to use pushbutton within Wokwi in active-high connection?
https://wokwi.com/projects/457055234569218049
*/
#include <Servo.h>
const int LED_PINS[] = {9, 8};
const int SENSE_PINS[] = {12, 11};
const int SERVO_PIN = 7;
const unsigned long FLASH_TIME = 500; // flash rate
const unsigned long SERVO_TIME = 50; // servo speed
bool ledState = false;
bool isEastTriggered = false;
bool isWestTriggered = false;
bool isDown = false;
int pos = 0;
int senseState[] = {LOW, LOW};
int oldSenseState[] = {LOW, LOW};
unsigned long flashLastTime = 0;
unsigned long servoLastTime = 0;
Servo servo;
// function returns which button was pressed, or 0 if none
int checkSensors() {
int sensorTriggered = 0;
for (int i = 0; i < 2; i++) {
senseState[i] = digitalRead(SENSE_PINS[i]); // check each button
if (senseState[i] != oldSenseState[i]) { // if it changed
oldSenseState[i] = senseState[i]; // remember state for next time
if (senseState[i] == HIGH) { // was just pressed
sensorTriggered = i + 1;
}
delay(20); // debounce
}
}
return sensorTriggered;
}
void flashWarning(bool enable) {
if (enable) {
if (millis() - flashLastTime >= FLASH_TIME) {
flashLastTime = millis();
ledState = !ledState;
}
digitalWrite(LED_PINS[0], ledState);
digitalWrite(LED_PINS[1], !ledState);
} else {
digitalWrite(LED_PINS[0], LOW);
digitalWrite(LED_PINS[1], LOW);
}
}
void lowerGate() {
if (!isDown) {
if (millis() - servoLastTime >= SERVO_TIME) {
servoLastTime = millis();
pos ++;
//Serial.println(pos);
servo.write(pos);
if (pos == 180) isDown = true;
}
}
}
void raiseGate() {
if (isDown) {
flashWarning(true);
if (millis() - servoLastTime >= SERVO_TIME) {
servoLastTime = millis();
pos --;
//Serial.println(pos);
servo.write(pos);
if (pos == 90) {
isDown = false;
flashWarning(false);
isEastTriggered = false;
isWestTriggered = false;
}
}
}
}
void setup() {
Serial.begin(115200);
for (int i = 0; i < 2; i++) {
pinMode(LED_PINS[i], OUTPUT);
pinMode(SENSE_PINS[i], INPUT);
}
servo.attach(SERVO_PIN);
servo.write(90);
Serial.println("Ready!\n");
}
void loop() {
int senseNum = checkSensors();
if (senseNum ) {
if (senseNum == 1 && !isEastTriggered) {
isEastTriggered = true;
Serial.println("East triggered");
if (isEastTriggered && isWestTriggered && isDown) {
pos = 180;
Serial.println("Raise gate\n");
} else {
pos = 90;
Serial.println("Lower gate");
}
} else if (senseNum == 2 && !isWestTriggered) {
isWestTriggered = true;
Serial.println("West triggered");
if (isEastTriggered && isWestTriggered && isDown) {
pos = 180;
Serial.println("Raise gate\n");
} else {
pos = 90;
Serial.println("Lower gate");
}
}
}
if (isEastTriggered || isWestTriggered) {
flashWarning(true);
lowerGate();
}
if (isEastTriggered && isWestTriggered) {
raiseGate();
}
}
East
West