/*
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 = 250; // flash rate
const unsigned long SERVO_TIME = 50; // servo speed
bool ledState = false;
bool isEastTriggered = false;
bool isWestTriggered = false;
bool isDone = true;
bool isDown = false;
int pos = 0;
//int increment = 1;
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] == 1) { // was just pressed
sensorTriggered = i + 1;
if (sensorTriggered == 1) {
Serial.print("East");
}
if (sensorTriggered == 2) {
Serial.print("West");
}
Serial.println(" triggered");
}
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 (!isDone) {
if (millis() - servoLastTime >= SERVO_TIME) {
servoLastTime = millis();
pos ++;
//Serial.println(pos);
servo.write(pos);
if (pos == 180) {
isDone = true;
isDown = true;
}
}
}
}
void raiseGate() {
if (!isDone) {
flashWarning(true);
if (millis() - servoLastTime >= SERVO_TIME) {
servoLastTime = millis();
pos --;
//Serial.println(pos);
servo.write(pos);
if (pos == 90) {
isDone = true;
isDown = false;
flashWarning(false);
}
}
}
}
/*
void moveGate(int stop, int increment) {
//int increment = isUp ? 1 : -1;
//int endPos = isUp ? 180 : 90;
//pos = start;
if (!isDone) {
if (millis() - servoLastTime >= SERVO_TIME) {
servoLastTime = millis();
pos += increment;
Serial.println(pos);
servo.write(pos);
if (pos == stop) isDone = true;
}
}
//return isDone;
}
*/
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 && isDone) {
isDone = false;
if (senseNum == 1 && !isWestTriggered && !isDown) {
isEastTriggered = true;
//isDone = false;
Serial.println("Lowering gate");
pos = 90;
} else if (senseNum == 2 && !isEastTriggered && !isDown) {
isWestTriggered = true;
//isDone = false;
Serial.println("Lowering gate");
pos = 90;
} else {
//flashWarning(false);
isEastTriggered = false;
isWestTriggered = false;
//isDone = false;
Serial.println("Raising gate");
pos = 180;
}
}
if (isEastTriggered || isWestTriggered) {
flashWarning(true);
lowerGate();
} else {
//flashWarning(false);
raiseGate();
}
}
East
West