Strano Comportamento durante Emulazione VT100 con ArduinoUno

Salve a tutti,
sto portando avanti il mio progetto per la realizzazione di un irrigatore aumtomatico.
Sto scrivendo il software per la gestione dell'irrigatore tramite seriale e l'emulazione del VT100.
Come interfaccia pc uso PuTTY, e mi trovo molto bene. Ieri stavo portando avanti i vari menù, quando Arduino ha iniziato una serie strana di comportamenti.
Via via che aggiungevo menù e funzioni ha iniziato a non rispondere più in maniera sensata...la cosa strana è che non faccio operazioni strane ma sto solo legendo una stringa da seriale e in base al valore della stringa (per ora solo di un carattere) plotto un tipo diverso di menù.
Sotto riporto gli sheet interessati. Noterete che nello sheet principale per ora c'è solo la chiamata alla seriale.
Ho diviso il programma in sheets diversi, perchè per me è più leggibile.

Main:

void setup() {                
// Turn the Serial Protocol ON
  Serial.begin(19200);
  delay(2000);
  header();
  mainMenu();
//  Serial.print(statoCOM); //Debug
}

void loop() {

   Seriale();
   

}

Define:

//*************************************************
//                                                *
//                DEFINE                          *
//                                                *
//*************************************************


//piedinatura
int statoCOM = 0;
int cosLIGHTpin00 = A0; // pin lettura sensore luce
int cosUMIDTpin00 = A1; // pin lettura sensore di umidità 00
int cosUMIDTpin01 = A2; // pin lettura sensore di umidità 01
int cosUMIDTpin02 = A3; // pin lettura sensore di umidità 02
int cosUMIDTpin03 = A4; // pin lettura sensore di umidità 03
int cosUMIDTpin04 = A5; // pin lettura sensore di umidità 04
int cosRELEpin00  = 2 ; // pin azionamento relè 00 
int cosRELEpin01  = 3 ; // pin azionamento relè 01
int cosRELEpin02  = 4 ; // pin azionamento relè 02
int cosRELEpin03  = 5 ; // pin azionamento relè 03
int cosRELEpin04  = 6 ; // pin azionamento relè 04
int cosPROTpin00  = 7 ; // pin ingresso protezione
int cosRGENpin00  = 8 ; // pin azionamento Relè generale
int cosSLEDpin00  = 9 ; // pin Led Segnalazione
int statoRele00 = 0; // 
int statoRele01 = 0; // 
int statoRele02 = 0; // 
int statoRele03 = 0; // 
int statoRele04 = 0; // 
int testRele00  = 0; // 
int testRele01  = 0; // 
int testRele02  = 0; // 
int testRele03  = 0; // 
int testRele04  = 0; //
int timeRele00  = 0; // 
int timeRele01  = 0; // 
int timeRele02  = 0; // 
int timeRele03  = 0; // 
int timeRele04  = 0; //

//variabili per Comunicazione Seriale

int lettura;    //contiene il valore di PWM letto dalla seriale
unsigned long tempMillis; //serve per il timeout sulla ricezione del valore di PWM
byte caratteri; //contiene il numero di caratteri ricevuti
byte tempChar; //contiene il carattere letto

Seconda parte del messaggio...
Menu01:

void mainMenu(){

        Serial.println ("                                                                               ");
        Serial.println ("                                                                               ");
        Serial.println ("                                                                               ");  
        Serial.println ("1.- Visualizza stato Irrigatore                                                ");
        Serial.println ("2.- Impostazione Elettrovalvole                                                ");
        Serial.println ("3.- Impostazione Tempi Irrigazione                                             ");
        Serial.println ("                                                                               ");
        Serial.println ("                                                                               ");
        Serial.println ("                                                                               "); 
        Serial.println ("                                                                               ");
        Serial.println ("                                                                               ");
        Serial.println ("                                                                               "); 
        Serial.println ("                                                                               "); 
        Serial.println ("                                                                               ");         
        Serial.println ("*******************************************************************************");
      //  Serial.println ("*******************************************************************************");
       
        }
void menu1(){

        Serial.println (" Stato Irrigatore                                                              ");
        Serial.println ("                                                                               ");
        Serial.println ("                                                                               ");  
        Serial.println ("                                                                               ");
        Serial.println ("                                                                               ");
        Serial.println ("                                                                               ");
        Serial.println ("                                                                               ");
        Serial.println ("                                                                               ");
        Serial.println ("                                                                               "); 
        Serial.println ("                                                                               ");
        Serial.println ("                                                                               ");
        Serial.println ("                                                                               "); 
        Serial.println ("                                                                               "); 
        Serial.println ("                                                                               ");         

     
}
void menu2(){

        Serial.println (" Impostazione Elettrovalvole                                                   ");
        Serial.println ("                                                                               ");
        Serial.print   (" a) Elettrv. N°1   ");  Serial.println(testRele00); // Fare Nuovo Stato per settaggio Elettrovalvole
        Serial.print   (" b) Elettrv. N°2   ");  Serial.println(testRele01);
        Serial.print   (" c) Elettrv. N°3   ");  Serial.println(testRele02);
        Serial.print   (" d) Elettrv. N°4   ");  Serial.println(testRele03);
        Serial.print   (" e) Elettrv. N°5   ");  Serial.println(testRele04);
        Serial.println ("                                                                               ");
        Serial.println ("                                                                               "); 
        Serial.println ("                                                                               ");
        Serial.println ("                                                                               ");
        Serial.println (" ==> Premere S per settare le Elettrovalvole <==                               "); // Fare Nuovo Stato per settaggio Elettrovalvole
        Serial.println ("                                                                               "); 
        Serial.println ("                                                                               ");         

    
}
void menu3(){

        Serial.println (" Impostazione Tempi Irrigazione                                                ");
        Serial.println ("                                                                               ");
        Serial.print   (" a) Elettrv. N°1 minuti irrigazione   ");  Serial.println(timeRele00); // Fare Nuovo Stato per settaggio Elettrovalvole
        Serial.print   (" b) Elettrv. N°2 minuti irrigazione   ");  Serial.println(timeRele01);
        Serial.print   (" c) Elettrv. N°3 minuti irrigazione   ");  Serial.println(timeRele02);
        Serial.print   (" d) Elettrv. N°4 minuti irrigazione   ");  Serial.println(timeRele03);
        Serial.print   (" e) Elettrv. N°5 minuti irrigazione   ");  Serial.println(timeRele04);
        Serial.println ("                                                                               ");
        Serial.println ("                                                                               ");
        Serial.println ("                                                                               ");
        Serial.println ("                                                                               ");
        Serial.println ("                                                                               ");
        Serial.println ("                                                                               "); 
        Serial.println ("                                                                               ");
        Serial.println ("                                                                               ");
        Serial.println (" ==> Premere S per settare le Elettrovalvole <==                               ");  
        Serial.println ("                                                                               "); 
        Serial.println ("                                                                               ");         

       
}  


void header(){
        Serial.write(27)  ;
        Serial.write("[2J")  ; 
        Serial.println ("********************************************************************************");
        Serial.println ("*								  	       *");
        Serial.println ("*	   							               *");
        Serial.println ("*              AUTOMATIC SPRINKLER by xxxxxxxxxxxxxxx Rev.1.00               *");
        Serial.println ("*								               *");
        Serial.println ("*								               *");
        Serial.println ("********************************************************************************");
       }
void footer(){
        Serial.println ("** 4.- Main Menu **************************************************************");
       }

Terza parte del messaggio... Ho dovuto dividere il messaggio in più parti perchè eccedeva la lunghezza massima, non me ne vogliate!
Menu02:

void menu21(){
 
        Serial.println (" Impostazione Elettrovalvole                                                   ");
        Serial.println ("                                                                               ");
        Serial.print   (" digita aX per settare Elettrv. N°1 Stato Attuale "); Serial.println(testRele00);
        Serial.print   (" digita bX per settare Elettrv. N°2 Stato Attuale "); Serial.println(testRele01);
        Serial.print   (" digita cX per settare Elettrv. N°3 Stato Attuale "); Serial.println(testRele02);
        Serial.print   (" digita dX per settare Elettrv. N°4 Stato Attuale "); Serial.println(testRele03);
        Serial.print   (" digita eX per settare Elettrv. N°5 Stato Attuale "); Serial.println(testRele04);
        Serial.println ("                                                                               ");
        Serial.println ("                                                                               "); 
        Serial.println ("  X può assumere soltanto 0 (OFF) 1 (ON)                                       ");
        Serial.println ("                                                                               ");
        Serial.println ("  r = reset tutte le elettrovalvole                                            "); 
        Serial.println ("                                                                               "); 
        Serial.println ("                                                                               ");         
}

void menu31(){
 
        Serial.println (" Impostazione Elettrovalvole                                                   ");
        Serial.println ("                                                                               ");
        Serial.print   (" digita aXX per settare Tempo Elettrv. N°1    Stato Attuale "); Serial.println(timeRele00);
        Serial.print   (" digita bXX per settare Tempo Elettrv. N°2    Stato Attuale "); Serial.println(timeRele01);
        Serial.print   (" digita cXX per settare Tempo Elettrv. N°3    Stato Attuale "); Serial.println(timeRele02);
        Serial.print   (" digita dXX per settare Tempo Elettrv. N°4    Stato Attuale "); Serial.println(timeRele03);
        Serial.print   (" digita eXX per settare Tempo Elettrv. N°5    Stato Attuale "); Serial.println(timeRele04);
        Serial.println ("                                                                               ");
        Serial.println ("                                                                               "); 
        Serial.println ("  XX può assumere valori tra 00 (0 min) 60 (60 min)                            ");
        Serial.println ("                                                                               ");
        Serial.println ("  r = reset tempi tutte le elettrovalvole                                      "); 
        Serial.println ("                                                                               "); 
        Serial.println ("                                                                               ");         
}

Seriale:

void Seriale(){

if (Serial.available()) //se la seriale è disponibile...
   {
     byte command = Serial.read(); //leggo il primo byte.
     
     switch (statoCOM) {
       case 0: //stato iniziale
         if (command == '1') { //se il valore è uguale a  1
           statoCOM = 1;
           //int a = Serial.read();
           header();
           menu1();
           footer();
           Serial.println(statoCOM);
           }
   else if (command == '2') { // se il valore è uguale a 2
           statoCOM = 2;
           //int a = Serial.read();
           header();
           menu2();
           footer();
           Serial.println(statoCOM);
           }
   else if (command == '3') { // se il valore è uguale a 3
           statoCOM = 3;
           //int a = Serial.read();
           header();
           menu3();
           footer();
           Serial.println(statoCOM);
           }
       break;
   case 1: //stato 1      
       if (command == '4') { // se il valore è uguale a 4
           statoCOM = 0;
           //int a = Serial.read();
           header();
           mainMenu();
           Serial.println(statoCOM);
           }
     
      break;

      case 2: //stato 2      
       if (command == '4') { // se il valore è uguale a 4
           statoCOM = 0;
          // int a = Serial.read();
           header();
           mainMenu(); 
        //   Serial.print(statoCOM);
           }
   else if (command == 'S' || command == 's') {
           statoCOM = 21;
           //int a = Serial.read();
           header();
          // menu21();
           footer();
           Serial.println(statoCOM);
          }
     break; 

 case 3: //stato 3      
       if (command == '4') { // se il valore è uguale a 4
           statoCOM = 0;
          // int a = Serial.read();
           header();
           mainMenu(); 
        //   Serial.print(statoCOM);
           }
   else if (command == 'S' || command == 's') {
           statoCOM = 31;
           //int a = Serial.read();
           header();
           //menu31();
           footer();
           Serial.print(statoCOM);
          }
     break;   
     
       }
       }
       }

Ho già scritto la parte di CASE per la gestione dei menu contenuti nello sheet MENU02 e ieri funzionavano...
per il momento li tengo commentati... ma lo strano è che basta siano presenti il menu21() o menu31() senza nessuna chiamata a loro che la seriale impazzisce ( o meglio il programma non va) e non capisco perchè... Dove sto sbagliando?!
Help me!!!
Alex

Scusa ma perché non hai allegato il codice come ZIP al primo post? :cold_sweat:

leo72:
Scusa ma perché non hai allegato il codice come ZIP al primo post? :cold_sweat:

Credevo che magari uno se lo doveva scompattare aprire...e infine rinunciasse... non mi sembrava giusto dover far anche lavorare qualcuno per aiutarmi... :blush:

Lodevole :wink:
Però così non si capisce nulla perché il codice è diviso in 5 pezzi XD

leo72:
Lodevole :wink:
Però così non si capisce nulla perché il codice è diviso in 5 pezzi XD

Rimedio subito...
in allegato il file .rar

TESTSERIALE02.rar (2.38 KB)

in allegato le impostazioni per PuTTY

ImpostazioniPuTTY00.PNG

ImpostazioniPuTTY01.PNG

Hai semplicemente saturato la memoria RAM dell'Arduino. :wink: :wink:
Leggi questo articolo.

leo72:
Hai semplicemente saturato la memoria RAM dell'Arduino. :wink: :wink:
Leggi questo articolo.

WTF!!! e mo come faccio?! da cosa l'hai capito!? come si evita tale caso?!
Mo me lo leggo...ma credo già di aver bisogno di un piccolo aiutino Leo....

Usa la funzione F() integrata nell'Arduino, nell'articolo è spiegato come e perché usarla. Con quella risolvi tutti i problemi :wink:

leo72:
Usa la funzione F() integrata nell'Arduino, nell'articolo è spiegato come e perché usarla. Con quella risolvi tutti i problemi :wink:

Stavo per scrivere la stessa cosa..mi hai battuto!!! Grazie per "L'ENNESIMO UTILISSIMO" articolo....oh tu guru dell'arduino...
:wink:

anche questo articolo è da salvare e stampare!!!!

Grazie Leo.... "IT WORKS"
:slight_smile: :slight_smile: :slight_smile: :slight_smile: :slight_smile:

Ottimo. :wink:

Raga...
ho praticamente finito la prima rev. del mio "annaffiatoio" automatico :smiley: ...
è iniziata la fase di testing su banco con emulazione degli ingressi e controllo delle uscite...
non è passato neanche un millisecondo che ho trovato subito un "big problema"... se le uscite delle elettrovalvole (se dei pin sono in on) quando avvio il monitor seriale, aprendo PuTTY o simili... le uscite si spengono per un pò! :fearful: :fearful: :fearful: :fearful: :fearful: :fearful: :fearful: :fearful: :fearful:

Avete idea di come aggiarare questo problema?!
Lo fa solo all'inizio, dopo posso tranquillamente scorrere tra i menu e tutto va alla grande!

IRRIGATORE03.rar (6.85 KB)

alexsgv:
"big problema"... se le uscite delle elettrovalvole (se dei pin sono in on) quando avvio il monitor seriale, aprendo PuTTY o simili... le uscite si spengono per un pò! :fearful: :fearful: :fearful: :fearful: :fearful: :fearful: :fearful: :fearful: :fearful:

Mi sembra più che normale ... come pensi faccia l'IDE a caricare il tuo programma ? Apre la porta, Arduino fa RESET e il bootloader controlla se vuoi caricare un programma, se si lo carica e poi lo mette in esecuzione, se no, parte l'ultimo programma caricato ...

Quindi ... ogni volta che apri la comunicazione seriale, c'è un RESET ! E' così da progetto !

Se cerchi in giro, ci sono varie discussioni su come eliminare la cosa ... comunque QUESTA è nel playground.

Guglielmo

P.S. Se avessi fatto una piccola ricerca con Google ... avresti già risolto il tuo dubbio ... ]:smiley: