arduino mega lcd e leOS2

Buongiorno ragazzi, ho realizzato un programma che mi permette di attivare un carico inserendo un codice da tastiera. Dopo aver attivato il carico, parte un timer, quando l'utente ha finito preme un tasto e il timer insieme alla data vengono salvati in una SD. Data e ora li ottengo tramite RTC1307, mentre per il timer uso la libreria leOS2. Il tutto è visualizzato su un display LCD20x4, ora il mio problema è che dopo un po' che il tutto funziona il display si impalla e non mostra più nulla. Se invece leggo i dati dalla seriale il progetto funziona all'infinito. Credo che il problema sia relativo al PWM che per qualche motivo salta. Qualcuno ha mai usato leOS2?

Ragazzi vi posto la parte in cui resta quando si avvia il timer.

void loop() {

  num = -2;
  char keypressed = myKeypad.getKey();
  boolean flag = 1;
  boolean band = false;
  getDateDs1307();
  //myOS.restartTask(getDateDs1307);

  if (keypressed != NO_KEY) {
    pass[i] = keypressed;
    lcd.setCursor(0,1);
    lcd.print("Codice: ");
    lcd.setCursor(8+i,1);
    lcd.print(pass[i]);
    i++;
  }

  if( i>3){
    if(pass[0] == '7' && pass[1] == '2' && pass[2] == '6' && pass[3] == '4'){
      flag = 0;
      num = 0;
      i = 0;
      lcd.clear();
    }
    if(pass[0] == '5' && pass[1] == '8' && pass[2] == '4' && pass[3] == '3'){
      flag = 0;
      num = 1;
      i = 0;
      lcd.clear();
    }
    if(pass[0] == '8' && pass[1] == '3' && pass[2] == 'A' && pass[3] == '6'){
      flag = 0;
      num = 2;
      i = 0;
      lcd.clear();
    }
    if(pass[0] == 'B' && pass[1] == '8' && pass[2] == '9' && pass[3] == '4'){
      flag = 0;
      num = 3;
      i = 0;
      lcd.clear();
    }
    if(pass[0] == '5' && pass[1] == '7' && pass[2] == 'C' && pass[3] == '9'){
      flag = 0;
      num = 4;
      i = 0;
      lcd.clear();
    }
    if(pass[0] == '3' && pass[1] == '6' && pass[2] == '7' && pass[3] == 'D'){
      flag = 0;
      num = 5;
      i = 0;
      lcd.clear();
    }
    if(pass[0] == '2' && pass[1] == '5' && pass[2] == '0' && pass[3] == '7'){
      flag = 0;
      num = 6;
      i = 0;
      lcd.clear();
    }
    if(pass[0] == '3' && pass[1] == '7' && pass[2] == '9' && pass[3] == 'A'){
      flag = 0;
      num = 7;
      i = 0;
      lcd.clear();
    }
    if(pass[0] == '7' && pass[1] == '5' && pass[2] == '3' && pass[3] == 'C'){
      flag = 0;
      num = 8;
      i = 0;
      lcd.clear();
    }
    if(pass[0] == '8' && pass[1] == '6' && pass[2] == 'A' && pass[3] == 'B'){
      flag = 0;
      num = 9;
      i = 0;
      lcd.clear();
    }
    //Password Franco
    if(pass[0] == 'D' && pass[1] == '7' && pass[2] == 'A' && pass[3] == '6'){
      flag = 0;
      num = 50;
      i = 0;
      posizione = 0;
    }
    if(flag == 1) {
      lcd.setCursor(0,2);
      lcd.print("Riprova");
      delay(1000);
      lcd.setCursor(8,1);
      lcd.print("           ");
      lcd.setCursor(0,2);
      lcd.print("                    ");
      num = -1;
      i = 0;
    }
  }

  while(num > -1){

    //Riazzero la password
    pass[0] = 0;
    pass[1] = 0;
    pass[2] = 0;
    pass[3] = 0;

    keypressed = myKeypad.getKey();
    if(num < 20 && num > -1){
      lcd.setCursor(0,0);
      lcd.print("Accesso effettuato! ");
      lcd.setCursor(0,1);
      lcd.print("Utente ");
      lcd.print(num + 1);
      lcd.print("            ");
      myOS.restartTask(updateRTC);
      lcd.setCursor(0,3);
      lcd.print("      ");
      lcd.print("'D' per uscire");
      if (keypressed != NO_KEY)
      {
        Serial.print(keypressed);
        pass_nuova = keypressed;
      }

      delay(500);

      if(pass_nuova == 'D'){
        myOS.pauseTask(updateRTC);
        lcd.setCursor(0,1);
        lcd.print("                    ");
        lcd.setCursor(0,2);
        lcd.print("                    ");
        lcd.setCursor(0,3);
        lcd.print("                    ");
        delay(500);
        lcd.clear();
        //Creo i file

        switch(num){
        case 0:
          int user0;
          int old0;
          // open the file. note that only one file can be open at a time
          // so you have to close this one before opening another.
          myFile = SD.open("utente1.txt", FILE_WRITE); 
          old0 = myFile.size();

          // if the file opened okay, write to it:
          if (myFile) {
            myFile.print("Data: ");
            myFile.print(dayOfMonth, DEC);
            myFile.print("/");
            myFile.print(month, DEC);
            myFile.print("/");
            myFile.print(year,DEC);
            myFile.print("    ");
            myFile.print("Tempo: ");
            myFile.print(_hours, DEC);
            myFile.print(":");
            myFile.print(_minutes, DEC);
            myFile.print(":");
            myFile.print(_seconds, DEC);
            myFile.println("       ");
            user0 = myFile.size();
            // close the file:
            myFile.close();
          } 
          else {
            // if the file didn't open, print an error:
            Serial.println("error opening test.txt");
          }
          if(user0 > old0){
            lcd.setCursor(0,1);
            lcd.print("OK, salvato");
            delay(150);
          } 
          else {
            lcd.setCursor(0,1);
            lcd.print("Errore salvataggio! ");
            lcd.setCursor(0,2);
            lcd.print("Tempo: ");
            lcd.print(_hours, DEC);
            lcd.print(":");
            lcd.print(_minutes, DEC);
            lcd.print(":");
            lcd.print(_seconds, DEC);
            delay(10000);
          }
          delay(500);
          break;

        case 1:
          int user1;
          int old1;
          // open the file. note that only one file can be open at a time
          // so you have to close this one before opening another.
          myFile = SD.open("utente2.txt", FILE_WRITE); 
          old1=myFile.size();

          // if the file opened okay, write to it:
          if (myFile) {
            myFile.print("Data: ");
            myFile.print(dayOfMonth, DEC);
            myFile.print("/");
            myFile.print(month, DEC);
            myFile.print("/");
            myFile.print(year,DEC);
            myFile.print("    ");
            myFile.print("Tempo: ");
            myFile.print(_hours, DEC);
            myFile.print(":");
            myFile.print(_minutes, DEC);
            myFile.print(":");
            myFile.print(_seconds, DEC);
            myFile.println(" ");
            user1 = myFile.size();
            // close the file:
            myFile.close();
          } 
          else {
            // if the file didn't open, print an error:
            Serial.println("error opening test.txt");
          }
          if(user1 > old1){
            lcd.setCursor(0,1);
            lcd.print("OK, salvato");
            delay(150);
          } 
          else {
            lcd.setCursor(0,1);
            lcd.print("Errore salvataggio! ");
            lcd.setCursor(0,2);
            lcd.print("Tempo: ");
            lcd.print(_hours, DEC);
            lcd.print(":");
            lcd.print(_minutes, DEC);
            lcd.print(":");
            lcd.print(_seconds, DEC);
            delay(10000);
          }
          delay(500);
          break;

//Lo fa per tutti gli altri utenti, essendo uguale lo ometto


        keypressed = 0;
        pass_nuova = 0;
        //Riazzero il timer
        _seconds = 0;
        _minutes = 0;
        _hours = 0;
        lcd.setCursor(0,1);
        lcd.print("                    ");
        lcd.setCursor(0,2);
        lcd.print("                    ");
        num = -2;
        myOS.reset();
      }
    }

Ho evitato di scrivere le parti che si ripetono per tutti gli utenti.

  1. usa la macroF() nei print di testo fisso: esempio myFile.print(F(“testo”)); e lcd.print(F(“testo”));
  2. dacci lo sketch completo.

Ciao Uwe

Ecco lo sketck completo, l'ho postato nel forum a questo indirizzo.

A cosa serve avere il topic qui e lo sketch di la su un cross post? (vietato dal regolamento)
Se non ti hanno risposto gli italiani, hai meno possibilità che ti rispondano sull’internazionale, che tra l’altro (prima di scrivere) leggono i tuoi post in archivio e vedono che sei italiano, ti rispediscono a casa senza passare dal via :slight_smile:

In realtà ho questo problema da una mese, e ho pubblicato la domanda due volte su quello internazionale (facendo passare 15 giorni) senza ricevere risposta.
Quindi ho pensato di pubblicarlo in questa sezione dove ho ricevuto qualche risposta.

Per quanto riguarda il codice allegato invece, semplicemente qui non riesco ad allegarlo, o meglio non ci sta proprio l'opzione sotto per farlo.

Detto questo, qualcuno può aiutarmi con il mio problema?

Grazie