#include "Arduino.h"
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <EEPROM.h> // Include the EEPROM library
// Debugging flag
#define DEBUG_ENABLED false
// OLED display dimensions
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// Initialize OLED display
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Variable to be adjusted
uint16_t valuex = 1000;
// Button pins
#define BUTTON_UP A0
#define BUTTON_DOWN A1
// Button state variables
bool lastUpState = HIGH;
bool lastDownState = HIGH;
// Button debounce time
#define DEBOUNCE_DELAY 50
unsigned long lastDebounceTimeUp = 0;
unsigned long lastDebounceTimeDown = 0;
const int CH1 = 2;
const int CH2 = 3;
const int CH3 = 4;
const int CH4 = 5;
// EEPROM address for storing valuex
#define EEPROM_ADDR 0
unsigned long previousMillis = 0; // Store the last time the step was performed
int step = 0; // Track which step to perform
int currentPattern = 0;
int totalPatterns = 6;
void setup() {
if (DEBUG_ENABLED) {
Serial.begin(9600);
Serial.println("Setup started...");
}
// Set up buttons as input with pull-up resistors
pinMode(BUTTON_UP, INPUT_PULLUP);
pinMode(BUTTON_DOWN, INPUT_PULLUP);
// Initialize the display
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
if (DEBUG_ENABLED) {
Serial.println("Display initialization failed!");
}
while (true); // Loop forever if the display fails to initialize
}
display.clearDisplay();
display.display();
if (DEBUG_ENABLED) {
Serial.println("Setup complete. Ready to adjust valuex.");
}
// Initial display
showValue();
pinMode(CH1, OUTPUT);
pinMode(CH2, OUTPUT);
pinMode(CH3, OUTPUT);
pinMode(CH4, OUTPUT);
// Read value from EEPROM on startup using EEPROM.get()
EEPROM.get(EEPROM_ADDR, valuex);
// If valuex is invalid (0xFFFF or -1), initialize it
if (valuex == 0xFFFF || valuex == -1) {
valuex = 1000; // Set a default value
saveValueToEEPROM(); // Save the default value to EEPROM
}
if (DEBUG_ENABLED) {
Serial.print("Read valuex from EEPROM: ");
Serial.println(valuex);
}
showValue();
}
void loop() {
chkbtns();
rly();
}
void rly() {
unsigned long currentMillis = millis(); // Get the current time
// Check if it's time for the next step
if (currentMillis - previousMillis >= valuex) {
previousMillis = currentMillis; // Save the last time this step was executed
// Perform the steps based on the current step index
switch (step) {
case 0:
currentPattern = 1;
showValue();
digitalWrite(CH1, HIGH);
digitalWrite(CH2, LOW);
digitalWrite(CH3, LOW);
digitalWrite(CH4, LOW);
break;
case 1:
currentPattern = 2;
showValue();
digitalWrite(CH1, LOW);
digitalWrite(CH2, HIGH);
digitalWrite(CH3, LOW);
digitalWrite(CH4, LOW);
break;
case 2:
currentPattern = 3;
showValue();
digitalWrite(CH1, LOW);
digitalWrite(CH2, LOW);
digitalWrite(CH3, HIGH);
digitalWrite(CH4, LOW);
break;
case 3:
currentPattern = 4;
showValue();
digitalWrite(CH1, LOW);
digitalWrite(CH2, LOW);
digitalWrite(CH3, LOW);
digitalWrite(CH4, HIGH);
break;
case 4:
currentPattern = 5;
showValue();
digitalWrite(CH1, HIGH);
digitalWrite(CH2, LOW);
digitalWrite(CH3, LOW);
digitalWrite(CH4, LOW);
break;
case 5:
currentPattern = 6;
showValue();
digitalWrite(CH1, LOW);
digitalWrite(CH2, HIGH);
digitalWrite(CH3, LOW);
digitalWrite(CH4, LOW);
break;
}
// Move to the next step (loop back to 0 after the last step)
step++;
if (step > totalPatterns) {
step = 0; // Reset to step 0 after completing the cycle
currentPattern = 1;
showValue();
}
}
}
void showValue() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(35, 3);
display.print("Harsha PCB");
display.setCursor(40, 15);
display.print("Patterns");
display.setCursor(50, 27);
display.print(currentPattern);
display.print("/");
display.print(totalPatterns); // Total patterns
display.setTextSize(2); // Large text
display.setCursor(50, 40); // Set cursor to center
display.print(valuex / 1000);
display.display();
if (DEBUG_ENABLED) {
Serial.print("Displayed valuex: ");
Serial.println(valuex);
}
}
void chkbtns() {
// Check the UP button
bool upState = digitalRead(BUTTON_UP);
if (upState != lastUpState) {
if (millis() - lastDebounceTimeUp > DEBOUNCE_DELAY) {
if (upState == LOW) { // Button pressed
if (valuex < 60000) {
valuex = valuex + 1000;
if (DEBUG_ENABLED) {
Serial.print("Increased valuex: ");
Serial.println(valuex);
}
showValue();
saveValueToEEPROM();
}
}
lastDebounceTimeUp = millis();
}
}
lastUpState = upState;
// Check the DOWN button
bool downState = digitalRead(BUTTON_DOWN);
if (downState != lastDownState) {
if (millis() - lastDebounceTimeDown > DEBOUNCE_DELAY) {
if (downState == LOW) { // Button pressed
if (valuex > 1000) {
valuex = valuex - 1000;
if (DEBUG_ENABLED) {
Serial.print("Decreased valuex: ");
Serial.println(valuex);
}
showValue();
saveValueToEEPROM();
}
}
lastDebounceTimeDown = millis();
}
}
lastDownState = downState;
}
void saveValueToEEPROM() {
// Save the value to EEPROM using EEPROM.put() for integer types
EEPROM.put(EEPROM_ADDR, valuex);
if (DEBUG_ENABLED) {
Serial.print("Saved valuex to EEPROM: ");
Serial.println(valuex);
}
}