#define BLYNK_TEMPLATE_ID "TMPL6h_rt1T8z"
#define BLYNK_TEMPLATE_NAME "AMALI 4"
#define BLYNK_AUTH_TOKEN "xp8mUElg7TfHTrxWB8GvcT1QNXtv7-Jn"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <TM1637Display.h>
#include <Preferences.h> // For saving data to flash memory
// Pin Definitions
#define CLK 13
#define DIO 14
#define BUZZER 12
TM1637Display display(CLK, DIO);
Preferences preferences;
BlynkTimer timer;
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
int queueNumber = 0;
int buzzerTimerID;
// ---------- SMART UPDATES ----------
void notifyChange() {
// 1. Update Physical Display
display.showNumberDec(queueNumber);
// 2. Update Blynk Dashboard
Blynk.virtualWrite(V0, queueNumber);
Blynk.virtualWrite(V3, String(queueNumber));
// 3. Save to Flash Memory (Persistent)
preferences.putInt("num", queueNumber);
// 4. Non-blocking Buzzer
digitalWrite(BUZZER, HIGH);
timer.setTimeout(150L, []() {
digitalWrite(BUZZER, LOW);
});
Serial.printf("Queue Updated: %d\n", queueNumber);
}
// ---------- BLYNK HANDLERS ----------
BLYNK_WRITE(V1) { // Increment Button
if (param.asInt() == 1) {
queueNumber++;
notifyChange();
}
}
BLYNK_WRITE(V2) { // Decrement Button
if (param.asInt() == 1 && queueNumber > 0) {
queueNumber--;
notifyChange();
}
}
BLYNK_WRITE(V3) { // Manual Input
queueNumber = param.asInt();
notifyChange();
}
BLYNK_WRITE(V4) { // Reset Button (New!)
if (param.asInt() == 1) {
queueNumber = 0;
notifyChange();
}
}
void setup() {
Serial.begin(115200);
pinMode(BUZZER, OUTPUT);
display.setBrightness(0x0f);
// Load saved number from memory
preferences.begin("queue-app", false);
queueNumber = preferences.getInt("num", 0);
display.showNumberDec(queueNumber);
Blynk.begin(auth, ssid, pass);
// Sync Blynk dashboard on startup
Blynk.virtualWrite(V0, queueNumber);
Blynk.virtualWrite(V3, String(queueNumber));
}
void loop() {
Blynk.run();
timer.run(); // Keeps the non-blocking buzzer working
}Loading
esp32-s3-devkitc-1
esp32-s3-devkitc-1