#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h> //http://adafruit.github.io/Adafruit-GFX-Library/html/class_adafruit___g_f_x.html
#include <Adafruit_SSD1306.h> //https://adafruit.github.io/Adafruit_SSD1306/html/class_adafruit___s_s_d1306.html
#include "menu.h"
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#include <map>
#include <string>
using std::string;
void displayMenu(string options[4],string selected,std::map<string, int>& menu1,bool confirmed){
//Seleccionar campo
if(confirmed){
std::map<string, int>::iterator it = menu1.begin();
while(it->second == 0){
++it;
}
it->second=0;
menu1[selected]=1;
}
display.clearDisplay();
//Posiciones iniciales (2,2) para permitir encuadrados
int startX = 2;
int startY = 2;
String Header="Menu 1";
int16_t x1, y1; // (no se) The boundary X coordinate, returned by function
uint16_t w, h; // The boundary width, returned by function
// Selected text
display.setFont();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(startX-2, startY);
display.print(Header);
string Option1=options[1-1]; //Shows Option 1
display.getTextBounds(Header,startX,startY,&x1,&y1,&w,&h); //Calcula el tamaño del texto en pixeles
display.setTextSize(1);
display.setTextColor(WHITE);
startY=startY+h+3;
display.setCursor(startX, startY);
display.print(Option1.c_str());
//Cuadrado Tick lateral
display.getTextBounds(Option1.c_str(),startX,startY,&x1,&y1,&w,&h);
display.drawRect(w+4, y1-1, h+1, h+1, WHITE); //4 bloques a la derecha, a la misma altura que el texto, de tamaño (altura texto)*(altura texto)
if(menu1[Option1]==1){
display.setCursor(w+6, y1-1);
display.print("x");
}
if(selected==Option1){ //Dibujamos cuadrado si está seleccionada
display.getTextBounds(Option1.c_str(),startX,startY,&x1,&y1,&w,&h);
display.drawRect(x1-2, y1-2, w+2, h+3, WHITE);
}
string Option2=options[2-1];
display.getTextBounds(Option1.c_str(),startX,startY,&x1,&y1,&w,&h);
display.setTextSize(1);
display.setTextColor(WHITE);
startY=startY+h+3;
display.setCursor(startX, startY);
display.print(Option2.c_str());
//Cuadrado Tick lateral
display.getTextBounds(Option2.c_str(),startX,startY,&x1,&y1,&w,&h);
display.drawRect(w+4, y1-1, h+1, h+1, WHITE); //4 bloques a la derecha, a la misma altura que el texto, de tamaño (altura texto)*(altura texto)
if(menu1[Option2]==1){
display.setCursor(w+6, y1-1);
display.print("x");
}
if(selected==Option2){
display.getTextBounds(Option2.c_str(),startX,startY,&x1,&y1,&w,&h);
display.drawRect(x1-2, y1-2, w+3, h+3, WHITE);
}
string Option3=options[3-1];
display.getTextBounds(Option2.c_str(),startX,startY,&x1,&y1,&w,&h);
display.setTextSize(1);
display.setTextColor(WHITE);
startY=startY+h+3;
display.setCursor(startX, startY);
display.print(Option3.c_str());
//Cuadrado Tick lateral
display.getTextBounds(Option3.c_str(),startX,startY,&x1,&y1,&w,&h);
display.drawRect(w+4, y1-1, h+1, h+1, WHITE); //4 bloques a la derecha, a la misma altura que el texto, de tamaño (altura texto)*(altura texto)
if(menu1[Option3]==1){
display.setCursor(w+6, y1-1);
display.print("x");
}
if(selected==Option3){
display.getTextBounds(Option3.c_str(),startX,startY,&x1,&y1,&w,&h);
display.drawRect(x1-2, y1-2, w+3, h+3, WHITE);
}
string Option4=options[4-1];
display.getTextBounds(Option3.c_str(),startX,startY,&x1,&y1,&w,&h);
display.setTextSize(1);
display.setTextColor(WHITE);
startY=startY+h+3;
display.setCursor(startX, startY);
display.print(Option4.c_str());
//Cuadrado Tick lateral
display.getTextBounds(Option4.c_str(),startX,startY,&x1,&y1,&w,&h);
display.drawRect(w+4, y1-1, h+1, h+1, WHITE); //4 bloques a la derecha, a la misma altura que el texto, de tamaño (altura texto)*(altura texto)
if(menu1[Option4]==1){
display.setCursor(w+6, y1-1);
display.print("x");
}
if(selected==Option4){
display.getTextBounds(Option4.c_str(),startX,startY,&x1,&y1,&w,&h);
display.drawRect(x1-2, y1-2, w+3, h+3, WHITE);
}
display.display();
}
void showButton2(){
display.clearDisplay();
//Posiciones iniciales (2,2) para permitir encuadrados
int startX = 2;
int startY = 2;
// Selected text
display.setFont();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(startX-2, startY);
display.print("boton2");
display.display();
}
const int LEDPIN = 19;
const int PushButton1=15;
const int PushButton2=2;
int selected=1;
bool unpress1=true; //Para detectar si hemos levantado el botón1
bool unpress2=true; //Para detectar si hemos levantado el botón2
string menu1Options[4]={"allwaysON","buttonPress","duringDay","custom"};
std::map<string, int> menu1;
void setup() {
Serial.begin(115200);
pinMode(LEDPIN, OUTPUT);
pinMode(PushButton1, INPUT);
pinMode(PushButton2, INPUT);
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
//Opciones del menu1
menu1["allwaysON"]=0;
menu1["buttonPress"]=1;
menu1["duringDay"]=0;
menu1["custom"]=0; //0=off, 60=1:00, 90=1:30, 1440=24:00,
}
void loop() {
int Push_button_state1 = digitalRead(PushButton1);
int Push_button_state2 = digitalRead(PushButton2);
if ( Push_button_state1 == HIGH && Push_button_state2==LOW){ //Al pulsar el botón1
digitalWrite(LEDPIN, HIGH); //Encendemos led
if(unpress1==true){ //Si habíamos dejado de pulsar el botón1
unpress1=false; //Indicamos que lo estamos pulsando
selected+=1; //Aumentamos el puntero del menú
if(selected>4){
selected=1;
}
}
displayMenu(menu1Options,menu1Options[selected-1], menu1,false);
}else if(Push_button_state1 == LOW && Push_button_state2==LOW){ //Al no pulsar el botón1
digitalWrite(LEDPIN, LOW); //Apagamos el led
if(unpress1==false){ //Si estábamos pulsandolo
unpress1=true; //Indicamos que ya no lo estamos pulsando
}
}
if ( Push_button_state2 == HIGH && Push_button_state1==LOW){ //Al pulsar el botón2
// showButton2();
if(unpress2==true){ //Si habíamos dejado de pulsar el botón1
unpress2=false; //Indicamos que lo estamos pulsando
displayMenu(menu1Options,menu1Options[selected-1],menu1,true);
}
}else if(Push_button_state2 == LOW && Push_button_state1==LOW){ //Al no pulsar el botón2
if(unpress2==false){ //Si estábamos pulsandolo
unpress2=true; //Indicamos que ya no lo estamos pulsando
}
}
}