//https://randomnerdtutorials.com/guide-for-oled-display-with-arduino/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define BUZZER_PIN 8 // 🛎️ connect buzzer here!
float speed = 0.0;
float fineSpeed = 0.0;
bool accelerating = true;
bool blinkState = false;
unsigned long lastBlinkTime = 0;
const int blinkInterval = 100; // 100ms blinking
void setup() {
Serial.begin(9600);
randomSeed(analogRead(A0));
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.clearDisplay();
pinMode(BUZZER_PIN, OUTPUT); // Setup buzzer pin
digitalWrite(BUZZER_PIN, LOW); // Make sure it's OFF at start
}
void loop() {
// Update speed
if (accelerating) {
speed += random(23, 38) * 0.01;
if (speed >= 35.0) {
accelerating = false;
}
} else {
speed -= random(15, 115) * 0.1;
if (speed <= 0.0) {
speed = 0.0;
accelerating = true;
}
}
fineSpeed = speed * 100;
// Blinking and Buzzer Logic
if (speed >= 33.0) {
unsigned long currentMillis = millis();
if (currentMillis - lastBlinkTime >= blinkInterval) {
blinkState = !blinkState;
display.invertDisplay(blinkState);
lastBlinkTime = currentMillis;
// Beep when blinking ON
if (blinkState) {
digitalWrite(BUZZER_PIN, HIGH); // BEEP
} else {
digitalWrite(BUZZER_PIN, LOW); // silent
}
}
} else {
display.invertDisplay(false);
digitalWrite(BUZZER_PIN, LOW); // make sure buzzer is off
blinkState = false;
}
// Draw Speedometer
display.clearDisplay();
display.fillCircle(64, 32, 60, WHITE);
display.fillCircle(64, 32, 57, BLACK);
display.fillCircle(64, 32, 55, WHITE);
display.fillCircle(64, 32, 50, BLACK);
// Fine Speed
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(85, 38);
int fineSpeedDisplay = ((int)fineSpeed) % 100;
if (fineSpeedDisplay < 10) {
display.print("0");
}
display.println(fineSpeedDisplay);
// Main Speed
display.setTextSize(5);
display.setCursor(26, 16);
int displaySpeed = (int)speed;
if (displaySpeed < 10) {
display.print("0");
}
display.println(displaySpeed);
display.display();
delay(30);
}