#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Button pins
const int buttonUpPin = 2;
const int buttonDownPin = 3;
// BCD output pins
const int bcdPins[4] = {4, 5, 6, 7};
// Variable to store the current number
int currentNumber = 0;
void setup() {
// Initialize OLED display
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
for(;;); // Don't proceed, loop forever
}
display.clearDisplay();
display.setTextSize(5);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
// Initialize button pins
pinMode(buttonUpPin, INPUT_PULLUP);
pinMode(buttonDownPin, INPUT_PULLUP);
// Initialize BCD output pins
for (int i = 0; i < 4; i++) {
pinMode(bcdPins[i], OUTPUT);
}
updateDisplay();
}
void loop() {
if (!digitalRead(buttonUpPin)) {
currentNumber++;
if (currentNumber > 9) currentNumber = 0;
updateDisplay();
delay(200); // Debounce delay
}
if (!digitalRead(buttonDownPin)) {
currentNumber--;
if (currentNumber < 0) currentNumber = 9;
updateDisplay();
delay(200); // Debounce delay
}
}
void updateDisplay() {
display.clearDisplay();
display.setCursor(0,0);
display.print(currentNumber);
display.display();
// Update BCD output
for (int i = 0; i < 4; i++) {
if (currentNumber & (1 << i)) {
digitalWrite(bcdPins[i], LOW); // Representing GND
} else {
digitalWrite(bcdPins[i], HIGH); // Representing not connected (n/c)
}
}
}