Ardino Template Menu



Semplificare Progetti Complessi con un Menu di Test su Arduino


Quando ci si approccia a progetti Arduino complessi, come leggere sensori multipli, attivare procedure diverse o gestire molteplici output, scrivere uno sketch in modo lineare (flat) può diventare rapidamente complicato. La complessità aumenta man mano che aggiungiamo nuove funzioni, sensori o attuatori. C'è il rischio di perdersi nei dettagli, fare errori difficili da diagnosticare e dover risolvere un problema enorme tutto in una volta. Ma c'è una soluzione: dividere il progetto in piccoli sottoproblemi e testarli singolarmente.

Ho sviluppato uno sketch template che segue proprio questa filosofia. Lo scopo è di rendere più facile il debug e il collaudo dei singoli componenti del progetto, evitando di affrontare subito il problema nella sua totalità. Il funzionamento è semplice: digitando la parola chiave "Menu" sul monitor seriale, si accede a un menù interattivo che permette di testare singolarmente le varie parti dello sketch.
Vantaggi del Menu di Test

Semplificazione del Debug:

Separare il progetto in blocchi più piccoli ti permette di concentrarti su una funzione alla volta. Ad esempio, puoi digitare "1" per testare se il sensore di temperatura funziona correttamente, senza preoccuparti del resto del codice.

Modularità:

Ogni parte del progetto viene testata e collaudata indipendentemente. Se un singolo modulo funziona, sai che quel componente è affidabile quando lo integri nel progetto finale.

Risparmio di Tempo:

Diagnosticare un problema in uno sketch complesso può essere una sfida. Con un menu interattivo, puoi isolare rapidamente dove si trova il malfunzionamento, evitando di sprecare ore a cercare il bug nel codice completo.

Maggiore Comprensione del Progetto:

Questo approccio ti aiuta a capire meglio il comportamento di ogni parte del tuo progetto, poiché ogni modulo funziona in modo isolato.

Esempio di Funzionamento



Una volta lanciato lo sketch, digiti "Menu" nel monitor seriale, e si apre una lista di comandi disponibili. Ad esempio:

Comando 1: Testa se il sensore di temperatura restituisce i valori corretti.
Comando 2: Controlla se le soglie di tre diverse temperature attivano correttamente tre relè.
Comando 3: Verifica il funzionamento di un sensore di umidità, e così via.

Ogni funzione può essere testata e ottimizzata prima di integrarla nel progetto principale. In questo modo, quando arriverai alla soluzione finale, non ti troverai ad affrontare un unico grande problema, ma un insieme di piccoli problemi già risolti.
Conclusione

Questo metodo ti permette di sviluppare progetti complessi in modo più efficiente e organizzato. Testare ogni singola parte ti offre sicurezza e controllo, rendendo molto più semplice l'integrazione finale. Se lavori su progetti Arduino complessi, ti consiglio di adottare questo approccio modulare per semplificare il debugging e ridurre gli errori.




/*
Template MENU for Arduino by Luciano Pautasso
Questo software è freeware ed e' rilasciato secondo le regole "MIT license"
Si richiede non venga cancellata la frase "Template MENU for Arduino by Luciano Pautasso"
*/

String Versione = "Template_Menu";
String inputString = "";         // a String to hold incoming data
bool stringComplete = false;  // whether the string is complete
bool ExitFromMenu = false;
char Cestino;

// constants won't change. Used here to set a pin number:
const int ledPin =  LED_BUILTIN;// the number of the LED pin

// Variables will change:
int ledState = LOW;             // ledState used to set the LED

// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0;        // will store last time LED was updated

// constants won't change:
const long interval = 1000;           // interval at which to blink (milliseconds)

//--******************************************************************************************

void setup() {
   // set the digital pin as output:
   pinMode(ledPin, OUTPUT);
    
  //start serial connection
  Serial.begin(9600); // terminale
  Serial.println();
  Serial.println("scrivi Menu per entrare nel menu di config.");
  Serial.print("Versione ");Serial.println(Versione);
  Serial.println();
}

//--******************************************************************************************

void(* resetFunc) (void) = 0; //declare reset function @ address 0

//-------------------------------------------

void loop() {

  //--------------------------------------
  // GESTIONE DEL BLINK A 1 SECONDO, PER DIMOSTRARE CHE IL LOOP è ATTIVO
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
    Serial.print(".");
  }
  //--------------------------------------
  // print the string when a newline arrives:
  if (stringComplete) {
    inputString.trim();
    Serial.println(inputString);
    //parse commands
    if ( (inputString.substring(0, 4) ) == "Menu" ) {
      Menu();
    }
    // clear the string:
    inputString = "";
    stringComplete = false;
  }
}

//*******************************************************

/*
  SerialEvent occurs whenever a new data comes in the hardware serial RX. This
  routine is run between each time loop() runs, so using delay inside loop can
  delay response. Multiple bytes of data may be available.
*/
void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag so the main loop can
    // do something about it:
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}

//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//stampa lalista dei comandi disponbili
void TypeMenuList(void){
    Serial.println();
    Serial.println("|************************|");
    Serial.println("|  ʘ‿ʘ   Menù   (◡_◡)   |");
      Serial.print("|  Ver. ");Serial.println(Versione);
    Serial.println("|************************|");
    Serial.println("  0 Reset");
    Serial.println("  1 Azione  1");
    Serial.println("  2 Azione  2");
    Serial.println("  3 Azione  3");
    Serial.println("  4 Azione  4");
    Serial.println("  5 Azione  5");
    Serial.println("  6 Azione  6");
    Serial.println("  7 Azione  7");
    Serial.println("  8 Azione  8");
    Serial.println("  9 Azione  9");
    Serial.println(" 10 Azione 10");
    Serial.println(" 99 Torna al loop senza reset");
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

void Menu() {

  //resta nel menu fino a che premi 0
  while (!ExitFromMenu) {

    TypeMenuList();

    //svuoto il buffer
    while (Serial.available()) {
      Cestino = Serial.read();
    }

    Serial.println(" ");

    // qui ciclo attesa e blink led fino a che non c'è un carattere sulla seriale
    while (!Serial.available()) {
      
      //--------------------------------------
      // GESTIONE DEL BLINK VELOCE, PER DIMOSTRARE CHE IL MENU è IN ATTESA COMANDI
      unsigned long currentMillis = millis();
      if (currentMillis - previousMillis >= interval/4) {
        // save the last time you blinked the LED
        previousMillis = currentMillis;

        // if the LED is off turn it on and vice-versa:
        if (ledState == LOW) {
          ledState = HIGH;
        } else {
          ledState = LOW;
        }

        // set the LED with the ledState of the variable:
        digitalWrite(ledPin, ledState);
    }     
   }

   // arrivato un carattere
   int CmdMenu = Serial.parseInt();
   Serial.print("ricevuto CmdMenu ");Serial.println(CmdMenu);

   //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

   //processa il comndo ricevuto 
	switch (CmdMenu){

      //-------------------------------------------------
      case 0:
        Serial.println("reset tra 1 sec");
        delay(1000);               // wait for a second
        resetFunc();  //call reset

        delay(100);
        Serial.println("Il reset non ha funzionato");
      break;
      //-------------------------------------------------
      case 1:
        Azione1();
      break;
      //-------------------------------------------------
      case 2:
        Azione2();
      break;
      //-------------------------------------------------
      case 3:
        Azione3();
      break;
      //-------------------------------------------------
      case 4:
        Azione4();
      break;
      //-------------------------------------------------
      case 5:
        Azione5();
      break;
      //-------------------------------------------------
      case 6:
        Azione6();
      break;
      //-------------------------------------------------
      case 7:
        Azione7();
      break;
      //-------------------------------------------------
      case 8:
        Azione8();
      break;
      //-------------------------------------------------
      case 9:
        Azione9();
      break;
      //-------------------------------------------------
      case 10:
        Azione10();
      break;
      //-------------------------------------------------
      case 99:
        Azione99();
      break;
      //-------------------------------------------------
      default:
        Serial.println("Comando non valido. Riprova!");
    } //Serial.available
  } // ExitFromMenu
} // Menu

//*******************************************************

//--------------------------------------------------------------------------
void Azione1(){
  Serial.println("E' stata scelta l'azione n. 1");
  //qui inserisci le tue linee di programma
  //qui inserisci le tue linee di programma  
  delay(2000);
  Serial.println("File azione , torno al menu'");
  delay(2000);
  
}
//--------------------------------------------------------------------------
void Azione2(){
  Serial.println("E' stata scelta l'azione n. 2");
  //qui inserisci le tue linee di programma
  //qui inserisci le tue linee di programma
  delay(2000);
  Serial.println("File azione , torno al menu'");
  delay(2000);
}
//--------------------------------------------------------------------------
void Azione3(){
  Serial.println("E' stata scelta l'azione n. 3");
  //qui inserisci le tue linee di programma
  //qui inserisci le tue linee di programma
  delay(2000);
  Serial.println("File azione , torno al menu'");
  delay(2000);
}
//--------------------------------------------------------------------------
void Azione4(){
  Serial.println("E' stata scelta l'azione n. 4");
  //qui inserisci le tue linee di programma
  //qui inserisci le tue linee di programma
  delay(2000);
  Serial.println("File azione , torno al menu'");
  delay(2000);
}
//--------------------------------------------------------------------------
void Azione5(){
  Serial.println("E' stata scelta l'azione n. 5");
  //qui inserisci le tue linee di programma
  //qui inserisci le tue linee di programma
  delay(2000);
  Serial.println("File azione , torno al menu'");
  delay(2000);
}
//--------------------------------------------------------------------------
void Azione6(){
  Serial.println("E' stata scelta l'azione n. 6");
  //qui inserisci le tue linee di programma
  //qui inserisci le tue linee di programma
  delay(2000);
  Serial.println("File azione , torno al menu'");
  delay(2000);
}
//--------------------------------------------------------------------------
void Azione7(){
  Serial.println("E' stata scelta l'azione n. 7");
  //qui inserisci le tue linee di programma
  //qui inserisci le tue linee di programma
  delay(2000);
  Serial.println("File azione , torno al menu'");
  delay(2000);
}
//--------------------------------------------------------------------------
void Azione8(){
  Serial.println("E' stata scelta l'azione n. 8");
  //qui inserisci le tue linee di programma
  //qui inserisci le tue linee di programma
  delay(2000);
  Serial.println("File azione , torno al menu'");
  delay(2000);
}
//--------------------------------------------------------------------------
void Azione9(){
  Serial.println("E' stata scelta l'azione n. 9");
  //qui inserisci le tue linee di programma
  //qui inserisci le tue linee di programma
  delay(2000);
  Serial.println("File azione , torno al menu'");
  delay(2000); 
}
//--------------------------------------------------------------------------
void Azione10(){
  Serial.println("E' stata scelta l'azione n. 10");
  //qui inserisci le tue linee di programma
  //qui inserisci le tue linee di programma
  delay(2000);
  Serial.println("File azione , torno al menu'");
  delay(2000);  
}
//--------------------------------------------------------------------------
void Azione99(){
  Serial.println("E' stata scelta l'azione n. 99");
  delay(2000);
  Serial.println("torno al loop'");
  delay(2000);
  ExitFromMenu = true;  
}
//--------------------------------------------------------------------------




L.Pautasso (contatti: lpautas gmail) & I.A.



I banner pubblicitari contenuti in questa pagina sono noiosi, ma ci consentono di pagare le spese del server. Se clicchi su uno di essi, contribuirai anche tu al mantenimento del sito. GRAZIE



Cerca 


Categorie Articoli

Ultimi articoli

OPTA-FINDER-ARDUINO-COMPATIBLE   APRI 

whatsapp-alarm-repeater   APRI 

Arduino_Template_Menu_Eng   APRI 

Arduino_Template_Menu   APRI 

Power-Supply-with-Current-Control   APRI 

Vantaggi_Alimentatori-Controllo_Corrente   APRI 

Camping-La-Secca-Moneglia   APRI 

Safety-Relays   APRI 

Rele-di-sicurezza   APRI 

Internal-or-External-Watchdog   APRI 

Watchdog-interno-o-esterno   APRI 

Ripetitore-di-allarme-su-Whatsapp   APRI 

Bufala-in-crosta   APRI 

Home-Automation-ESPeriment   APRI 

ESPerimento-Domotica   APRI 

Arduino-measures-liquid-level   APRI 

Arduino-misura-livello-liquidi   APRI 

finder   APRI 

LORA-english-version   APRI 

Pluviometro-LORA   APRI 

Pillole_di_Promessi_Sposi   APRI 

LORA   APRI 

promessisposi-riscrittura   APRI 

Arduino_crashes   APRI 

Arduino_si_blocca   APRI 

Arduino_e_Trenino   APRI 

millis_no_overflow   APRI 

millis   APRI 

Arduino_millis_no_Overflow   APRI 

millis   APRI