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
Categorie Articoli
Corso-di-elettrotecnica-ed-elettronica-3-volumi
Libro-tutto-sull-audio---inglese
Libro-ELETTRONICA-FONDAMENTALE
Dove-acquistare-abbigliamento-risparmiando
Come-vedere-le-partite-sullo-smartphone
Come-difendersi-dagli-allegati-pericolosi-nelle-email
KEEPASS-un-posto-sicuro-per-le-nostre-PASSWORD
I-3-trend-estivi-del-2020-scopri-i-tagli-che-ti-stanno-meglio
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