/*
Rotary Encoder volume control example
Usage: rotate the knob to control the value,
click the knob to change between volume/bass/treble.
https://wokwi.com/arduino/projects/304919215794553409
Released under the MIT license.
Copyright (C) 2021, Uri Shaked.
*/
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Fonts/FreeSansBold9pt7b.h>
#include <Fonts/Picopixel.h>
#include <EEPROM.h>
// Direcciones de memoria en la EEPROM para almacenar las variables
#define ADDR_presMax1 0
#define ADDR_presMin1 (ADDR_presMax1 + sizeof(float))
#define ADDR_presMax2 (ADDR_presMin1 + sizeof(float))
#define ADDR_presMin2 (ADDR_presMax2 + sizeof(float))
#define ENCODER_CLK 2
#define ENCODER_DT 3
#define ENCODER_SW 4
//uint8_t presMax = 4;
//uint8_t presMin = 2;
float presMax1;
float presMin1;
float presMax2;
float presMin2;
int grabar;
typedef enum {
SET_BOMBA1_pmax,
SET_BOMBA1_pmin,
SET_BOMBA2_pmax,
SET_BOMBA2_pmin,
GrabarPresiones,
} Mode;
Mode mode = SET_BOMBA1_pmax;
Adafruit_SSD1306 display(128, 64, &Wire, -1);
void saveVariablesToEEPROM() {
EEPROM.put(ADDR_presMax1, presMax1);
EEPROM.put(ADDR_presMin1, presMin1);
EEPROM.put(ADDR_presMax2, presMax2);
EEPROM.put(ADDR_presMin2, presMin2);
EEPROM.commit(); // Guardar los cambios en la EEPROM
}
void loadVariablesFromEEPROM() {
EEPROM.get(ADDR_presMax1, presMax1);
EEPROM.get(ADDR_presMin1, presMin1);
EEPROM.get(ADDR_presMax2, presMax2);
EEPROM.get(ADDR_presMin2, presMin2);
Serial.print("Var1: ");
Serial.println(presMax1);
Serial.print("Var2: ");
Serial.println(presMin1);
Serial.print("Var3: ");
Serial.println(presMax2);
Serial.print("Var4: ");
Serial.println(presMin2);
}
// Llama a esta función para guardar las variables en la EEPROM
// saveVariablesToEEPROM();
void nextMode() {
switch (mode) {
case SET_BOMBA1_pmax:
mode = SET_BOMBA1_pmin;
break;
case SET_BOMBA1_pmin:
mode = SET_BOMBA2_pmax;
break;
case SET_BOMBA2_pmax:
mode = SET_BOMBA2_pmin;
break;
case SET_BOMBA2_pmin:
mode = GrabarPresiones;
break;
case GrabarPresiones:
mode = SET_BOMBA1_pmax;
break;
}
}
void updateValue(int delta) {
switch (mode) {
case SET_BOMBA1_pmax:
presMax1 = constrain(presMax1 + delta, 0, 10);
break;
case SET_BOMBA1_pmin:
presMin1 = constrain(presMin1 + delta, 0, 10);
break;
case SET_BOMBA2_pmax:
presMax2 = constrain(presMax2 + delta, 0, 10);
break;
case SET_BOMBA2_pmin:
presMin2 = constrain(presMin2 + delta, 0, 10);
break;
case GrabarPresiones:
grabar = grabar + delta;
break;
}
}
void updateDisplay() {
display.clearDisplay();
display.setFont();
display.setTextColor(1);
display.setCursor(10, 4);
display.print("B1 P_MAX ");
display.print(presMax1);
display.print(" bar");
// display.fillRect(11, 13, presMax, 7, WHITE);
if (mode == SET_BOMBA1_pmax) {
display.setCursor(1, 4);
display.print(">");
}
display.setCursor(10, 16);
display.print("B1 P_MIN ");
display.print(presMin1);
display.print(" bar");
//display.fillRect(11, 33, presMin, 7, WHITE);
if (mode == SET_BOMBA1_pmin) {
display.setCursor(1, 16);
display.print(">");
}
//display.display();
// display.clearDisplay();
// display.setFont();
// display.setTextColor(1);
display.setCursor(10, 28);
display.print("B2 P_MAX ");
display.print(presMax2);
display.print(" bar");
//display.fillRect(11, 13, presMax, 7, WHITE);
if (mode == SET_BOMBA2_pmax) {
display.setCursor(1, 28);
display.print(">");
}
display.setCursor(10, 40);
display.print("B2 P_MIN ");
display.print(presMin2);
display.print(" bar");
// display.fillRect(11, 33, presMin, 7, WHITE);
if (mode == SET_BOMBA2_pmin) {
display.setCursor(1, 40);
display.print(">");
}
display.setCursor(10, 52);
display.print("Grabar? = +5 clic");
if (mode == GrabarPresiones) {
display.setCursor(1, 52);
display.print(">");
display.setCursor(120, 52);
display.print(grabar);
if (grabar >= 5){
display.setCursor(10, 52);
display.clearDisplay();
display.print("Grabando");
grabar = 0;
}
}
display.display();
}
void setup() {
Serial.begin(9600);
EEPROM.begin(512); // Inicializar la EEPROM con tamaño máximo de 512 bytes
loadVariablesFromEEPROM(); // Cargar variables desde la EEPROM
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
pinMode(ENCODER_CLK, INPUT);
pinMode(ENCODER_DT, INPUT);
pinMode(ENCODER_SW, INPUT_PULLUP);
updateDisplay();
}
long int modeLastChanged = 0;
int prevClk = HIGH;
void loop() {
if (digitalRead(ENCODER_SW) == LOW && millis() - modeLastChanged > 300) {
modeLastChanged = millis();
nextMode();
updateDisplay();
}
int clk = digitalRead(ENCODER_CLK);
if (clk != prevClk && clk == LOW) {
int dt = digitalRead(ENCODER_DT);
int delta = dt == HIGH ? 1 : -1;
updateValue(delta);
updateDisplay();
}
prevClk = clk;
}