#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
int yCursor = 0;
int btnIzquierda = 9;
int btnCentro = 10;
int btnDerecha = 11;
bool isInMainMenu = true;
bool lastTickBtnDerechaStatus;
bool lastTickBtnIzquierdaStatus;
bool lastTickBtnCentroStatus;
int velocidadMotor = 50;
int temperaturaHotend = 200;
class Menu{
public:
Menu(){
}
virtual void MostrarInformacion(){
Serial.println("Placeholder!");
}
virtual void OnBtnIzquierda(){
Serial.println("Btn Izquierda!");
}
virtual void OnBtnDerecha(){
Serial.println("Btn Derecha!");
}
virtual void OnBtnCentro(){
Serial.println("Btn Centro!");
}
void ChangeMenu(Menu variable, Menu newValue){
variable = newValue;
}
};
Menu *test;
class MenuTemperatura : public Menu{
public:
MenuTemperatura(): Menu(){
}
void MostrarInformacion() override {
isInMainMenu = false;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("<-Menu principal");
lcd.setCursor(1, 1);
lcd.print("Temperatura:" + String(temperaturaHotend));
/* lcd.setCursor(1, 3);
lcd.print("+ < ----- > -");*/
}
void OnBtnIzquierda() override{
temperaturaHotend++;
}
void OnBtnDerecha() override{
temperaturaHotend--;
}
void OnBtnCentro() override{
Serial.println("Btn Centro");
}
};
class MenuMotores : public Menu{
public:
MenuMotores(): Menu(){
}
void MostrarInformacion() override {
isInMainMenu = false;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("<-Menu principal");
lcd.setCursor(1, 1);
lcd.print("Velocidad:" + String(velocidadMotor));
/* lcd.setCursor(1, 3);
lcd.print("+ < ----- > -");*/
}
void OnBtnIzquierda() override{
velocidadMotor++;
}
void OnBtnDerecha() override{
velocidadMotor--;
}
void OnBtnCentro() override{
Serial.println("Btn Centro");
}
};
class MenuPrincipal : public Menu{
public:
MenuPrincipal(): Menu(){
}
void MostrarInformacion() override {
isInMainMenu = true;
lcd.clear();
lcd.setCursor(0, yCursor);
lcd.print(">");
lcd.setCursor(1, 0);
lcd.print("Velocidad");
lcd.setCursor(1, 1);
lcd.print("Temperatura");
/* lcd.setCursor(2, 2);
lcd.print("Velocidad:" + String(velocidadMotor) + "RPM");
lcd.setCursor(2, 3);
lcd.print("Temperatura:" + String(temperaturaHotend));*/
}
void OnBtnIzquierda() override{
yCursor = 1;
}
void OnBtnDerecha() override{
yCursor = 0;
}
void OnBtnCentro() override{
if(yCursor == 0) {
test = new MenuMotores();
}
else{
test = new MenuTemperatura();
}
test -> MostrarInformacion();
}
};
void setup() {
Serial.begin(9600);
pinMode(btnIzquierda, INPUT);
pinMode(btnDerecha, INPUT);
pinMode(btnCentro, INPUT);
// put your setup code here, to run once:
lcd.init();
lcd.backlight();
test = new MenuPrincipal();
test->MostrarInformacion();
}
void loop() {
// put your main code here, to run repeatedly:
if(!lastTickBtnIzquierdaStatus && digitalRead(btnIzquierda) == HIGH){
test -> OnBtnIzquierda();
test -> MostrarInformacion();
}
if(!lastTickBtnDerechaStatus && digitalRead(btnDerecha) == HIGH){
test -> OnBtnDerecha();
test -> MostrarInformacion();
}
if(!lastTickBtnCentroStatus && digitalRead(btnCentro) == HIGH){
if(!isInMainMenu){
test = new MenuPrincipal();
test -> MostrarInformacion();
}
else {
test -> OnBtnCentro();
test -> MostrarInformacion();
}
}
lastTickBtnIzquierdaStatus = digitalRead(btnIzquierda);
lastTickBtnDerechaStatus = digitalRead(btnDerecha);
lastTickBtnCentroStatus = digitalRead(btnCentro);
}