#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>
int botA = 35;
int botB = 33;
int bot_enc = 34;
int pulsador = 18;
int t_1 = 0;
int t_refresco = 3000;
const int timeThreshold = 100;
long timeCounter = 0;
const int maxSteps = 255;
volatile int ISRCounter = 0;
int counter = 0;
bool IsCW = true;
Adafruit_SH1106G display = Adafruit_SH1106G(128, 64, &Wire);
#define Nivel_C1 10
#define Hora_C1 8
#define Minuto_C1 0
#define Nivel_C2 10
#define Hora_C2 14
#define Minuto_C2 0
#define Nivel_C3 10
#define Hora_C3 20
#define Minuto_C3 0
void setup() {
pinMode(botA, INPUT);
pinMode(botB, INPUT);
pinMode(bot_enc, INPUT_PULLUP);
pinMode(pulsador, INPUT_PULLUP);
Serial.begin(115200);
Serial.println("AFM Virtual");
attachInterrupt(digitalPinToInterrupt(botA), doEncode, CHANGE);
display.begin(0x3C, true);
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SH110X_WHITE, SH110X_BLACK);
display.setCursor(28, 10);
display.print("AFM_V2");
display.setTextSize(1);
display.setCursor(18, 40);
display.print("Made in Varillas");
display.display();
delay(3000);
display.clearDisplay();
display.setTextSize(1);
display.setCursor(90, 0);
display.print("19:54");
display.setCursor(0, 20);
display.print("Comida 1 - ");
if (Hora_C1 < 10){
display.print("0");
display.print(Hora_C1);
}else{display.print(Hora_C1);}
display.print(":");
if (Minuto_C1 < 10){
display.print("0");
display.print(Minuto_C1);
}else{display.print(Minuto_C1);}
display.print(" - ");
display.print(Nivel_C1);
display.setCursor(0, 35);
display.print("Comida 2 - ");
if (Hora_C2 < 10){
display.print("0");
display.print(Hora_C2);
}else{display.print(Hora_C2);}
display.print(":");
if (Minuto_C2 < 10){
display.print("0");
display.print(Minuto_C2);
}else{display.print(Minuto_C2);}
display.print(" - ");
display.print(Nivel_C2);
display.setCursor(0, 50);
display.print("Comida 3 - ");
if (Hora_C3 < 10){
display.print("0");
display.print(Hora_C3);
}else{display.print(Hora_C3);}
display.print(":");
if (Minuto_C3 < 10){
display.print("0");
display.print(Minuto_C3);
}else{display.print(Minuto_C3);}
display.print(" - ");
display.print(Nivel_C3);
display.display();
}
void loop() {
if (counter != ISRCounter)
{
counter = ISRCounter;
}
if (digitalRead(pulsador) == LOW){
t_1 = millis();
display.clearDisplay();
display.setTextSize(2);
display.setCursor(10, 25);
display.print(counter);
display.display();
}
if ((millis() - t_1 > t_refresco)&&(millis() - t_1 < t_refresco + 200)){
actualizar_lcd();
}
delay(10); // this speeds up the simulation
}
void actualizar_lcd(){
display.clearDisplay();
display.setTextSize(1);
display.setCursor(90, 0);
display.print("19:54");
display.setCursor(0, 20);
display.print("Comida 1 - ");
if (Hora_C1 < 10){
display.print("0");
display.print(Hora_C1);
}else{display.print(Hora_C1);}
display.print(":");
if (Minuto_C1 < 10){
display.print("0");
display.print(Minuto_C1);
}else{display.print(Minuto_C1);}
display.print(" - ");
display.print(Nivel_C1);
display.setCursor(0, 35);
display.print("Comida 2 - ");
if (Hora_C2 < 10){
display.print("0");
display.print(Hora_C2);
}else{display.print(Hora_C2);}
display.print(":");
if (Minuto_C2 < 10){
display.print("0");
display.print(Minuto_C2);
}else{display.print(Minuto_C2);}
display.print(" - ");
display.print(Nivel_C2);
display.setCursor(0, 50);
display.print("Comida 3 - ");
if (Hora_C3 < 10){
display.print("0");
display.print(Hora_C3);
}else{display.print(Hora_C3);}
display.print(":");
if (Minuto_C3 < 10){
display.print("0");
display.print(Minuto_C3);
}else{display.print(Minuto_C3);}
display.print(" - ");
display.print(Nivel_C3);
display.display();
}
void doEncode()
{
if (millis() > timeCounter + timeThreshold)
{
if (digitalRead(botA) == digitalRead(botB))
{
IsCW = true;
if (ISRCounter + 1 <= maxSteps) ISRCounter++;
}
else
{
IsCW = false;
if (ISRCounter - 1 >= 0) ISRCounter--;
}
timeCounter = millis();
}
}