modalità sleep LCD

LCD collegato ad arduino (4dsystem 4.3 pollici TS) , funziona alla grande. Ovviamente quando non lo uso lo devo "mettere in off" non si può lasciare sempre illuminato . Con questa porzione di codice, semplicemente premendo un tasto si attiva un form con contrasto a 0 ( e quindi in pratica spento) ma quando si ritocca il display , toccando il tasto userbutton il display ti rimanda al form 0 dove c'è il menu. Fin qui tutto ok. La mia domanda è : esiste su arduino un qualcosa che possa per esempio "se per 2 minuti non arrivano comandi dalla seriale del lcd mi richiami appunto il form con contrasto 0" ????? considerate che la gestione dei comandi avviene in una funzione dedicata.

  if(Event.reportObject.object == GENIE_OBJ_WINBUTTON) {
      if(Event.reportObject.index == 0) { //sleep button
        genieWriteObject(GENIE_OBJ_FORM, 1, 0); //open screen saver form
        genieWriteContrast(0);
      }
    } else if(Event.reportObject.object == GENIE_OBJ_USERBUTTON) {
      if(Event.reportObject.index == 0) { //wakeup button
        genieWriteObject(GENIE_OBJ_FORM, 0, 0); //open default form
        genieWriteContrast(1);
        wakeup = 1;
      }
    }

grazie !

ema_72: La mia domanda è : esiste su arduino un qualcosa che possa per esempio "se per 2 minuti non arrivano comandi dalla seriale del lcd mi richiami appunto il form con contrasto 0" ????? considerate che la gestione dei comandi avviene in una funzione dedicata.

Lo devi fare tu. Usando millis. Registri il valore di millis, poi inizi la lettura della disponibilità di dati sulla seriale con Serial.available(). Nel frattempo controlli lo scorrere del tempo. Se passa il tempo preimpostato senza che non arrivi un dato sulla seriale, esegui il compito prefissato.

una cosa del genere come la vedi????

unsigned long lastchangestatescreensaver;
byte command1 = 0
byte command2 = 0


if (Serial.available())
{
  byte command1 = Serial.read(); //leggo il primo byte

  lastchangestatescreensaver = millis();

  if (millis() - lastchangestatescreensaver >= (2*60*1000))
  {
    byte command2 = Serial.read();
    lastchangestatescreensaver = millis();
  }
  if (comand1==command2)
    metti sleep lcd
  }

No, così entri nel controllo solo se non ricevi nulla, non mi pareva fosse quello che volevi fare. Io avevo capito che dovevi verificare se per un certo tempo arrivava oppure no qualcosa sulla seriale, quindi millis lo salvi prima del controllo e poi resti in attesa. Usa una var di stato che setti a false prima del controllo. Come controllo usa il while con la condizione che millis-precedente_millis sia inferiore a 20000 ms (i 2 minuti). Dentro al while controlli con Serial.available() se ci sono caratteri nella seriale, se li trovi metti a true la var di stato e dai un break per uscire dal while. Subito dopo il blocco del while controlli la var di stato: se è ancora a false, vuol dire che nel lasso di tempo controllato non è arrivato nulla, altrimenti se la trovi a true vuol dire che sei uscito perché è arrivato qualcosa.

forse mi sono spiegato male...... io voglio mettere in sleep mode se in pratica il display è completamente inutilizzato per tot tempo !! la funzione che dici tu la faccio semplicemente tramite la programmazione visigeni dell'lcd. Quindi mi serve una cosa che senta il competo inutilizzo del lcd, per questo ho confrontato il contenuto della seriale ......

Boh, non vedo differenze tra quello che dici ed il metodo che ti ho illustrato io ;) E' un comune sistema di timeout che uso normalmente. Se al posto della lettura della seriale, ci metti la lettura di un pin (esempio pulsante) e l'utente non lo preme per più di x secondi, esci e poi metti in sleep. Cosa cambia? ;)

il tuo sistema sicuramente merita approfondimento..... :P :P questa sera lo studio meglio

Se hai modo, scaricati il firmware del mio Micrologio (link nella firma) e lì trovi il metodo illustrato che uso per uscire dal menu dell'orologio ed alla fine rimettere in sleep il chip.

dimenticavo una cosa importante..... io lavoro sulla seriale 3 visto che ho arduino mega. E' sufficiente inserire seriale_3 per indicare la seriale numero 3????

Dal reference:

The Arduino Mega has three additional serial ports: Serial1 on pins 19 (RX) and 18 (TX), Serial2 on pins 17 (RX) and 16 (TX), Serial3 on pins 15 (RX) and 14 (TX).

Quindi in base a quella che usi, la indichi con Serial*X*

questa come la vedi??

unsigned long temp;
bool variabile = false
temp = millis()

while(millis()-temp<(1000x60x2))
{
  if(Serial.available()>0)
  {
    (variabile=true);
    break 
  }
}

if (variabile==true)
{
  metti sleep lcd 
}

In questo caso metti in sleep il micro se arrivano dei dati sulla seriale, è giusto? Comunque è come ti dicevo, come vedi non è difficile gestire un evento temporale con un while, perché crei un loop da cui uscire solo in 2 modi, o al verificarsi della condizione stessa del while oppure per un break.

si..mi sono confuso la logica è inversa….. cmq ora provo

ciao…. ho provato il tutto e diciamo ho un problema….. nel senso che la logica funziona ma quando è nel ciclo di while mi si blocca tutto !!! mi rallenta paurosamente anche la seriale !!! mi passa un comando ogni fine di while !!! ma è normale ??? sbaglio qualcosa ??? io ho messo tutto dentro il loop principale !!!ho sbagliato?

Senza vedere il codice è difficile dirlo ;)

certo.... comunque ho deciso di cambiare sistema, in maniera più semplice ..... in parole (eventualmente questa sera posto il codice), la gestione dell'lcd avviene dentro una funzione chiamata genidoevent , dove dentro vengono riconosciuti tutti i comandi . All'inizio di questa funzione metto temp=millis(), e dentro al loop principale metto un semplice contatore millis()-temp>2000 ovvero ogni volta che entro in geniedoevent mi "riavvia il contatore" quando non entro per più di 2 minuti(ovvero non utilizzo l'lcd) mi va in sleep.

Per fare questo, per ovviare al problema millis() e overflow , molto probabilmente utilizzo una tua creazione ;) , il contatore in secondi che vidi qualche tempo fa nel tuo sito.... che mi sembra una funzione molto utile !!!!

Ok, aspetto il codice.

ne ho estrapolato una versione più semplice che accende e spegne un led, e che ovviamente vada in sleep dopo 5 secondi, con il millis() funziona ma vorrei farne un’altra con il tuo contatore in secondi… che ne dici???

#include <genieArduino.h>


// Programma gestione sensori e luci
// by Emanuele
// ver 1.0.9
// per prova accenderemo alcuni led poi sostituiti da relel


int LED10 = 10;           // Assegna alla variabile 10
int LED11 = 11;           // Assegna alla variabile 11
int LED13 = 13;           // Assegna alla variabile 12
int SENSORE18 = 18;           // Assegna alla variabile 5
int SENSORE19 = 19;           // Assegna alla variabile 6
int SENSORE20 = 20;              // Assegna alla variabile 7
int STATOSENSORE18 = 0;
int STATOSENSORE19 = 0;
int STATOSENSORE20 = 0;
int STATOPULSANTELUCI = 0;
int STATOCASE = 0; // variabile per memorizzare pressioni tasti lcd
int SUONOSIRENA = 0;
int CICLOSIRENA = 0;
int STARTALLARM = 0;
int contatore = 0;
int statolcd = 0;
bool sirenaAttivata =0;
unsigned long lastChangeState = 0;
bool suonoSirena();
bool state;
unsigned long temp=0;

void setup() 
{  


  // apriamo il seriale per il display
  genieBegin (GENIE_SERIAL_3, 115200);  //Serial0
  //genieBegin (GENIE_SERIAL_1, 9600);  //Serial1
  //genieBegin (GENIE_SERIAL_2, 9600);  //Serial2
  //genieBegin (GENIE_SERIAL_3, 9600);  //Serial3

  genieAttachEventHandler(myGenieEventHandler);
  // dichiariamo il verso dei I/O

  pinMode(LED10, OUTPUT);
  pinMode(LED11, OUTPUT);
  pinMode(LED13, OUTPUT);
  pinMode(SENSORE18, INPUT);
  pinMode(SENSORE19, INPUT);
  pinMode(SENSORE20, INPUT);

  //Reset the Display 

  pinMode(4, OUTPUT);  //   Reset display su pin4
  digitalWrite(4, 0); // se utilizzate shield di arduino inserire 1
  delay(100);
  digitalWrite(4, 1);  // // se utilizzate shield di arduino inserire 0

  delay (500); //let the display start up
  genieWriteObject(GENIE_OBJ_FORM, 0 , 0);
  delay (500);
  genieWriteContrast(0);
  delay (500);
  genieWriteContrast(1);
  delay (500);



  Serial.begin (9600);

}

void loop()
{

  { 
    genieDoEvents();  //Here the messages are received and queued.
  }
  


  {
    if (millis()-temp>5000)
    {
      (statolcd=0);
      lcd();
    }
  }

}







void myGenieEventHandler(void) // questo void gestisce traffico seriale con LCD
{
  genieFrame Event;
  genieDequeueEvent(&Event);


  temp=millis();
  if(Event.reportObject.cmd == GENIE_REPORT_EVENT) // Se il cmd è riconosciuto nella libreria
  {
    if (Event.reportObject.object == GENIE_OBJ_WINBUTTON)// Se l'oggetto premuto è un 4DBUTTON
    {
      if (Event.reportObject.index == 0x00) // Se l'index dell'oggetto ovvero il numerino finale è 0
      {

        (statolcd=1);
        lcd ();
      }
    }
  }
  {
    if (Event.reportObject.object == GENIE_OBJ_4DBUTTON)// Se l'oggetto premuto è un 4DBUTTON
    {
      if (Event.reportObject.index == 0x00) // Se l'index dell'oggetto ovvero il numerino finale è 0
      {
        {
          if (Event.reportObject.data_lsb == 1)
            digitalWrite(LED13,HIGH);
        }
        {
          if (Event.reportObject.data_lsb == 0)

            digitalWrite(LED13,LOW);
        }
      }
    }   
  }
}

void lcd ()
{
  if (statolcd==0)
  {
    genieWriteObject(GENIE_OBJ_FORM, 1 , 0);
    genieWriteContrast(0);
    (temp=millis());
    
  }
  else if (statolcd=1)
  {
    genieWriteObject(GENIE_OBJ_FORM, 0 , 0);
    genieWriteContrast(1);
   (temp=millis());
  }
}

la versione con la tua libreria , che posso fermare una volta che lcd è in sleep e quindi arduino non continua a mandarmi dati alla seriale impallandomela….

#include <genieArduino.h>
#include <secTimer.h>

// Programma gestione sensori e luci
// by Emanuele
// ver 1.0.9
// per prova accenderemo alcuni led poi sostituiti da relel

secTimer myTimer;
int LED10 = 10;           // Assegna alla variabile 10
int LED11 = 11;           // Assegna alla variabile 11
int LED13 = 13;           // Assegna alla variabile 12
int SENSORE18 = 18;           // Assegna alla variabile 5
int SENSORE19 = 19;           // Assegna alla variabile 6
int SENSORE20 = 20;              // Assegna alla variabile 7
int STATOSENSORE18 = 0;
int STATOSENSORE19 = 0;
int STATOSENSORE20 = 0;
int STATOPULSANTELUCI = 0;
int STATOCASE = 0; // variabile per memorizzare pressioni tasti lcd
int SUONOSIRENA = 0;
int CICLOSIRENA = 0;
int STARTALLARM = 0;
int contatore = 0;
int statolcd = 0;
bool sirenaAttivata =0;
unsigned long lastChangeState = 0;
bool suonoSirena();
bool state;
unsigned long temp=0;
unsigned long seconds=0;

void setup() 
{  
myTimer.startTimer();

  // apriamo il seriale per il display
  genieBegin (GENIE_SERIAL_3, 115200);  //Serial0
  //genieBegin (GENIE_SERIAL_1, 9600);  //Serial1
  //genieBegin (GENIE_SERIAL_2, 9600);  //Serial2
  //genieBegin (GENIE_SERIAL_3, 9600);  //Serial3

  genieAttachEventHandler(myGenieEventHandler);
  // dichiariamo il verso dei I/O

  pinMode(LED10, OUTPUT);
  pinMode(LED11, OUTPUT);
  pinMode(LED13, OUTPUT);
  pinMode(SENSORE18, INPUT);
  pinMode(SENSORE19, INPUT);
  pinMode(SENSORE20, INPUT);

  //Reset the Display 

  pinMode(4, OUTPUT);  //   Reset display su pin4
  digitalWrite(4, 0); // se utilizzate shield di arduino inserire 1
  delay(100);
  digitalWrite(4, 1);  // // se utilizzate shield di arduino inserire 0

  delay (500); //let the display start up
  genieWriteObject(GENIE_OBJ_FORM, 0 , 0);
  delay (500);
  genieWriteContrast(0);
  delay (500);
  genieWriteContrast(1);
  delay (500);



  Serial.begin (9600);

}

void loop()
{

  { 
    genieDoEvents();  //Here the messages are received and queued.
  }
  
  

  
     


 Serial.println(myTimer.readTimer()-seconds);
     
  {
    if (myTimer.readTimer()-seconds>5)
    {
      (statolcd=0);
      lcd();
    }
  }

}







void myGenieEventHandler(void) // questo void gestisce traffico seriale con LCD
{
  genieFrame Event;
  genieDequeueEvent(&Event);


  seconds=myTimer.readTimer();
  if(Event.reportObject.cmd == GENIE_REPORT_EVENT) // Se il cmd è riconosciuto nella libreria
  {
    if (Event.reportObject.object == GENIE_OBJ_WINBUTTON)// Se l'oggetto premuto è un 4DBUTTON
    {
      if (Event.reportObject.index == 0x00) // Se l'index dell'oggetto ovvero il numerino finale è 0
      {

        (statolcd=1);
        myTimer.startTimer();
        lcd ();
      }
    }
  }
  {
    if (Event.reportObject.object == GENIE_OBJ_4DBUTTON)// Se l'oggetto premuto è un 4DBUTTON
    {
      if (Event.reportObject.index == 0x00) // Se l'index dell'oggetto ovvero il numerino finale è 0
      {
        {
          if (Event.reportObject.data_lsb == 1)
            digitalWrite(LED13,HIGH);
        }
        {
          if (Event.reportObject.data_lsb == 0)

            digitalWrite(LED13,LOW);
        }
      }
    }   
  }
}

void lcd ()
{
  if (statolcd==0)
  {
    genieWriteObject(GENIE_OBJ_FORM, 1 , 0);
   // genieWriteContrast(0);
    seconds=myTimer.readTimer();
    myTimer.stopTimer();
    
  }
  else if (statolcd==1)
  {
    genieWriteObject(GENIE_OBJ_FORM, 0 , 0);
    genieWriteContrast(1);
   seconds=myTimer.readTimer();
  }
}