Ciao,
sto facendo un po' di test con uno schermino che mi è appena arrivato e che voglio aggiungere al mio primo progetto.
Lo sto usando per visualizzare un menu e relative informazioni.
Ho diviso lo schermo in due, il lato sinistro mostra determinati valori, mentre il destro mostra il menu.
La navigazione tra le voci del menu avviene alzando o abbassando la leva del thumb joystick
Il problema che mi si presenta è che funziona tutto ma quando arrivo a selezionare l'ultima voce del menu, tutto quello che ho impostato nel lato sinistro scompare.. sulle altre posizioni del menu sembra funzionare tutto correttamente.
Il codice (in cui sono presenti anche parti che dovrò implementare dopo) è:
#include <WString.h>
#include <SPI.h>
#include <Ethernet.h>
#include <EEPROM.h>
#include <U8glib.h>
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // Settings per mio Oled
//////////////////////////PIN///////////////////////////////////////
// Pin RGB
#define BLUE 5
#define GREEN 6
#define RED 7
//Pin Joystick
const int buttonPin = 2;
const int X_pin = 0; // Pin asse X
const int Y_pin = 1; // Pin asse Y
////////////////////////// VARIABILI /////////////////////////////////////
//Button variables
//int currentMode=0; //Imposta il Mode di avvio (0 Red 1 Green 2 Blue)
//int buttonState=1;
//int lastButtonState=1;
//int buttonSave=1;
//int lastButtonSave=1;
//Joystick axys
int xValue = 0;
int x = 0;
int y = 0;
// RGB variables
int redValue;
int greenValue;
int blueValue;
int fadePercentage=90; //valore in percentuale che esprime quanto dovrò ridurre le luci in modalità PLAY/RESUME
//Variabili per gestione salvataggio
int saveRed=EEPROM.read(0); //Leggo i valori salvati dalla funzione saveMode() nella EEPROM - Ogni indirizzo (0,1,2) contiene 8 bit (numero Max 256) quindi ne uso uno per ogni colore
int saveGreen=EEPROM.read(1);
int saveBlue=EEPROM.read(2);
int saveRedLow=255-((255-saveRed)-(((255-saveRed)*fadePercentage)/100)); //in base al colore scelto e salvato creo della variabili a "bassa intensità" per il PLAY/RESUME mode
int saveGreenLow=255-((255-saveGreen)-(((255-saveGreen)*fadePercentage)/100));
int saveBlueLow=255-((255-saveBlue)-(((255-saveBlue)*fadePercentage)/100));
//Variabili navigazione Joystick
int sali=0;
int scendi=0;
uint8_t menu_redraw_required = 0;
#define MENU_ITEMS 5
const char *menu_strings[MENU_ITEMS]={"Mode 1","Mode 2","Mode 3","Automatic","Settings" }; //Imposto le voci del menu
int menu_current=0;
/////////////////////////////////SETUP///////////////////////////////////////
void setup() {
// flip screen, if required
// u8g.setRot180();
Serial.begin(9600);
pinMode(buttonPin, INPUT_PULLUP); //Pulsante Joystick
menu_redraw_required =1;
pinMode(8, OUTPUT); // ????
}
////////////////////// SCHERMO LATO SX /////////////////////////////////////
void drawLeft(){ //Disegno la parte Sx dello schermo
int xSx=16; //posizione asse X di riferimento per il riquadro R G B e il suo contenuto
//int ySx=0; //usate inizialmente ora disabilitate
//int xDx=128;
//int yDx=64;
//int startPos=13;
int lineHeight=12; //valore altezza linea considerando che sto usando un font con altezza 8px
if (menu_redraw_required !=0){
u8g.drawFrame(0,0,128,64);
u8g.drawFrame(xSx-4,14,43,(lineHeight*3)+2);
u8g.drawLine(64,0,64,64);
u8g.setFont(u8g_font_helvR08);
u8g.drawStr(8, 2, "RGB Value");
u8g.drawStr(xSx, 4+lineHeight, "R:");
u8g.drawStr(xSx, 4+(lineHeight*2), "G:");
u8g.drawStr(xSx, 4+(lineHeight*3), "B:");
u8g.setPrintPos( xSx+15, 4+lineHeight);
u8g.print(redValue); //inserisco le variabili red green e blue Value
u8g.setPrintPos( xSx+15, 4+(lineHeight*2));
u8g.print(greenValue);
u8g.setPrintPos( xSx+15, 4+(lineHeight*3));
u8g.print(blueValue);
}
}
//////////////////////// SCHERMO CARICO MENU ////////////////////////////////////////
void drawMenu() { //Disegno il menu
uint8_t i, h;
u8g_uint_t w, d;
u8g.setFontRefHeightText(); //fonte modificata da https://github.com/olikraus/u8glib/wiki/tmenu
u8g.setFontPosTop();
h = u8g.getFontAscent()-u8g.getFontDescent();
w = 64;
for ( i=0;i<MENU_ITEMS;i++){
d=(128-u8g.getStrWidth(menu_strings[i]))-16;
u8g.setDefaultForegroundColor();
if (i==menu_current){
u8g.drawBox(64,i*h+1,w,h);
u8g.setDefaultBackgroundColor();
}
u8g.drawStr(d,i*h,menu_strings[i]);
}
}
/////////////////////// SCHERMO POSIZIONE MENU ///////////////////////////////////
void update_menu(){ //Aggiorno la posizione nel menu quando alzo/abbasso la leva del Joystick
if (scendi==1){
delay(300);
menu_current++;
if (menu_current>=MENU_ITEMS)
menu_current=0;
scendi=0;
menu_redraw_required =1;
}
else if (sali==1){
delay(300);
if (menu_current==0)
menu_current = MENU_ITEMS;
menu_current--;
sali=0;
menu_redraw_required =1;
}
}
//////////////////////// NAVIGAZIONE JOYSTICK /////////////////////////////////////
void joystickNavigation(){ //Imposto i valori sali/scendi del menu alzando o abbassando il Joystick
if(digitalRead(buttonPin)==HIGH){
if (analogRead(X_pin)==1023){
scendi=1;
Serial.println("Scendi");
}
else if (analogRead(X_pin)==0){
sali=1;
Serial.println("Sali");
}
}
}
//////////////////////////////MAIN LOOP //////////////////////////////////////////////
void loop() {
if (menu_redraw_required !=0){
// picture loop
u8g.firstPage(); //Carico l'UI
do {
drawMenu();
drawLeft();
} while( u8g.nextPage() );
menu_redraw_required = 0;
}
update_menu(); //carico la funzione per muovere graficamente il menu
joystickNavigation(); //carico la navigazione del menu tramite Joystick
if (digitalRead(buttonPin)==LOW){ //Se viene premuta la leva Joystick rilevo su quale voce sono ed eseguo la Modalità
switch (menu_current){ // Tutte le varie modalità ed effetti
case 0:
redValue=0;
greenValue=255;
blueValue=255;
analogWrite (RED,redValue);
analogWrite (GREEN,greenValue);
analogWrite (BLUE,blueValue);
Serial.println("Mode 1 - Full Red");
break;
case 1:
redValue=255;
greenValue=0;
blueValue=255;
analogWrite (RED,redValue);
analogWrite (GREEN,greenValue);
analogWrite (BLUE,blueValue);
Serial.println("Mode 2 - Full Green");
break;
case 2:
redValue=255;
greenValue=255;
blueValue=0;
analogWrite (RED,redValue);
analogWrite (GREEN,greenValue);
analogWrite (BLUE,blueValue);
Serial.println("Mode 3 - Full Blue");
break;
case 3:
//saveQuestion();
//saveMode();
Serial.println("Automatic Mode");
Serial.println(menu_current);
break;
//EEPROM.update(0,saveRed); //Aggiorno i valori salvati dalla funzione saveMode() nella EEPROM - Ogni indirizzo (0,1,2) contiene 8 bit (numero Max 256) quindi ne uso uno per ogni colore
//EEPROM.update(1,saveGreen);
//EEPROM.update(2,saveBlue);
break;
case 4:
Serial.println("Settings Mode");
Serial.println(menu_current);
break;
}
}
}
Foto menu:
Foto quando arrivo all'ultima voce:
Abbiate pietà, sono alle primissime armi!
