Skip to content

Instantly share code, notes, and snippets.

@wilyJ80
Created May 30, 2025 01:16
Show Gist options
  • Save wilyJ80/31a061a609eba22c85a31580a14334d2 to your computer and use it in GitHub Desktop.
Save wilyJ80/31a061a609eba22c85a31580a14334d2 to your computer and use it in GitHub Desktop.
OOP button with states
#define RED_PIN 2
#define YELLOW_PIN 3
#define BUTTON_PIN 4
struct Sketch {
int status;
int cur;
int prev;
void (*resetPins)(struct Sketch *self);
void (*rotateState)(struct Sketch *self);
void (*listenButtonPress)(struct Sketch *self);
};
void listenButtonPress(struct Sketch *self) {
self->cur = digitalRead(BUTTON_PIN);
// last reading was a button press, current is a release
// (we want to light up on release for better UX)
// this check is needed because all readings happen blazingly fast
if (self->prev == LOW && self->cur == HIGH) {
self->rotateState(self);
delay(200); // debounce, blocking TODO: millis
}
self->prev = self->cur;
}
void resetPins(struct Sketch *self) {
digitalWrite(RED_PIN, LOW);
digitalWrite(YELLOW_PIN, LOW);
}
void rotateState(struct Sketch *self) {
if (self->status == 0) digitalWrite(YELLOW_PIN, HIGH);
else if (self->status == 1) {
digitalWrite(YELLOW_PIN, LOW);
digitalWrite(RED_PIN, HIGH);
} else if (self->status == 2) {
digitalWrite(YELLOW_PIN, LOW);
digitalWrite(RED_PIN, LOW);
}
self->status++; // increment
self->status = self->status % 3; // rotate (state range 0 - 2)
}
struct Sketch createSketch(void) {
struct Sketch sk = {
.status = 2,
.cur = HIGH,
.prev = HIGH,
.resetPins = resetPins,
.rotateState = rotateState,
.listenButtonPress = listenButtonPress
};
return sk;
}
void setup() {
pinMode(RED_PIN, OUTPUT);
pinMode(YELLOW_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
static struct Sketch sk = createSketch();
sk.resetPins(&sk);
}
void loop() {
static struct Sketch sk = createSketch();
sk.listenButtonPress(&sk);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment