#include <Wire.h>
#include <U8g2lib.h>
#include <Encoder.h>
#define IGNITION_PIN 2
#define BUZZER_PIN 3
#define OUTPUT1_PIN 4
#define OUTPUT2_PIN 5
#define ENCODER_PIN_A 6
#define ENCODER_PIN_B 7
#define ENCODER_BUTTON_PIN 8
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);
Encoder encoder(ENCODER_PIN_A, ENCODER_PIN_B);
bool ignitionState = false;
bool timerRunning = false;
bool systemShutdown = false;
unsigned long timerStart = 0;
unsigned long timerDuration = 0;
unsigned long beepInterval = 0;
bool beepOn = false;
int timeSet = 120; // Default time set to 120 seconds
void setup() {
pinMode(IGNITION_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(OUTPUT1_PIN, OUTPUT);
pinMode(OUTPUT2_PIN, OUTPUT);
pinMode(ENCODER_BUTTON_PIN, INPUT_PULLUP); // Use internal pull-up resistor
digitalWrite(OUTPUT1_PIN, LOW);
digitalWrite(OUTPUT2_PIN, LOW);
Serial.begin(9600); // Start serial for debugging
u8g2.begin();
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_ncenB08_tr);
// Initial display update
displayMain();
}
void loop() {
ignitionState = digitalRead(IGNITION_PIN);
if (ignitionState && systemShutdown) {
// Ignition turned on, reset system
systemShutdown = false;
timerRunning = false;
displayMain();
}
if (!ignitionState && !timerRunning && !systemShutdown) {
// Ignition turned off, start timer
timerRunning = true;
timerStart = millis();
timerDuration = timeSet * 1000;
beepInterval = millis();
displayCountdown();
}
if (timerRunning) {
unsigned long elapsed = millis() - timerStart;
if (elapsed < timerDuration) {
// Update display with countdown timer
displayCountdown();
// Handle beeping pattern
if (millis() - beepInterval > 1000) { // Beep every 1 second
beepInterval = millis();
tone(BUZZER_PIN, 1000, 100); // Beep for 100ms
}
} else {
// Timer ended
timerRunning = false;
systemShutdown = true;
tone(BUZZER_PIN, 1000, 2000); // Beep for 2 seconds
delay(2000);
digitalWrite(OUTPUT1_PIN, LOW);
digitalWrite(OUTPUT2_PIN, LOW);
// Clear display to indicate shutdown
u8g2.clearBuffer();
u8g2.sendBuffer();
}
}
// Handle encoder input for menu navigation
if (digitalRead(ENCODER_BUTTON_PIN) == LOW && !timerRunning) {
// Button pressed, enter menu
Serial.println("Encoder button pressed");
displayMenu();
}
}
void displayMain() {
u8g2.clearBuffer();
char buffer[20];
// Display set time
sprintf(buffer, "Time Set: %d sec", timeSet);
u8g2.drawStr(0, 20, buffer);
u8g2.sendBuffer();
}
void displayCountdown() {
u8g2.clearBuffer();
char buffer[20];
// Display countdown timer and bar graph
unsigned long elapsed = millis() - timerStart;
unsigned long remaining = (timerDuration - elapsed) / 1000;
sprintf(buffer, "Time Left: %lu sec", remaining);
u8g2.drawStr(0, 20, buffer);
// Draw bar graph
int barWidth = (128 * elapsed) / timerDuration;
u8g2.drawFrame(0, 30, 128, 10);
u8g2.drawBox(0, 30, barWidth, 10);
u8g2.sendBuffer();
}
void displayMenu() {
u8g2.clearBuffer();
u8g2.drawStr(0, 20, "Set Time:");
char buffer[20];
sprintf(buffer, "%d sec", timeSet);
u8g2.drawStr(0, 40, buffer);
u8g2.sendBuffer();
// Adjust time set using encoder
long encoderPos = encoder.read();
timeSet += encoderPos / 4; // Adjust based on encoder steps
if (timeSet < 1) timeSet = 1;
if (timeSet > 300) timeSet = 300;
encoder.write(0); // Reset encoder position
}