#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <EEPROM.h>
#define POT 34
#define LED 25
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
const int SW1=19, SW2=18, SW3=5;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
int ID = 978;
int address = 0;
int adcValue = 0;
int convertValue = 0;
char tempText[100];
unsigned long last500ms = 0;
bool toggle = true;
bool switchAddress = true;
void setup() {
Serial.begin(115200);
EEPROM_Start();
PWM_Start();
OLED_Start();
pinMode(SW1, INPUT_PULLUP);
pinMode(SW2, INPUT_PULLUP);
pinMode(SW3, INPUT_PULLUP);
}
void loop() {
ButtonControl();
OLEDDisplay();
}
void EEPROM_Start(){
if(!EEPROM.begin(1000)){
Serial.println("EEPROM not working\n Restarting...");
delay(1000); ESP.restart();
}
Serial.println("Success init EEPROM");
EEPROM.write(0, 0);
EEPROM.commit();
EEPROM.write(ID, 0);
EEPROM.commit();
Serial.println("Write EEPROM Complete");
}
void PWM_Start(){
ledcSetup(0, 5000, 10); //channel, freq, resolution
ledcAttachPin(LED, 0);
adcValue = EEPROM.read(address);
convertValue = map(adcValue, 0, 4095, 0, 255);
ledcWrite(0, convertValue);
Serial.printf("LEDValue = %03d\n", convertValue);
}
void OLED_Start(){
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)){
Serial.println(F("SSD1306 allocation failed"));
}
else{
Serial.println(F("SSD1306 allocation success"));
}
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.display();
}
void LED_LightSetting(){
adcValue = EEPROM.read(address);
ledcWrite(0, adcValue);
}
void OLEDDisplay(){
if(millis() - last500ms >= 500){
last500ms = millis();
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0,0);
if(switchAddress == true){
address = 0;
LED_LightSetting();
if(toggle == true){
sprintf(tempText, "EEPROM ADC:%04d", analogRead(POT));
display.print(tempText);
display.setCursor(0, 20);
sprintf(tempText,"Address:%04d(0x%03X)", 0, 0);
display.print(tempText);
display.setCursor(0, 40);
sprintf(tempText,"Data:%03d", EEPROM.read(0));
display.print(tempText);
display.display();
}else{
sprintf(tempText, "EEPROM ADC %04d", analogRead(POT));
display.print(tempText);
display.setCursor(0, 20);
sprintf(tempText,"Address %04d(0x%03X)", 0, 0);
display.print(tempText);
display.setCursor(0, 40);
sprintf(tempText,"Data %03d", EEPROM.read(0));
display.print(tempText);
display.display();
}
toggle = !toggle;
}
else{
address = ID;
LED_LightSetting();
if(toggle == true){
sprintf(tempText, "EEPROM ADC:%04d", analogRead(POT));
display.print(tempText);
display.setCursor(0, 20);
sprintf(tempText,"Address:%04d(0x%03X)", ID, ID);
display.print(tempText);
display.setCursor(0, 40);
sprintf(tempText,"Data:%03d", EEPROM.read(ID));
display.print(tempText);
display.display();
}else{
sprintf(tempText, "EEPROM ADC %04d", analogRead(POT));
display.print(tempText);
display.setCursor(0, 20);
sprintf(tempText,"Address %04d(0x%03X)", ID, ID);
display.print(tempText);
display.setCursor(0, 40);
sprintf(tempText,"Data %03d", EEPROM.read(ID));
display.print(tempText);
display.display();
}
toggle = !toggle;
}
}
}
void ButtonControl(){
if(digitalRead(SW1)==LOW){
switchAddress = true;
}
if(digitalRead(SW2)==LOW){
switchAddress = false;
}
if(digitalRead(SW3)==LOW){
adcValue = analogRead(POT);
convertValue = map(adcValue, 0, 4095, 0, 255);
Serial.printf("Value Change to %03d\n", convertValue);
if(switchAddress==true){
EEPROM.write(0, convertValue);
EEPROM.commit();
}else{
EEPROM.write(ID, convertValue);
EEPROM.commit();
}
}
}