Archivi tag: errori

Errori comuni nell’uso di Arduino – utilizzo dell’operatore ++

Nella “Lezione 2 – Corso di Elettronica Creativa con Arduino Sensor Kit” ho promesso che avrei fornito alcuni esempi pratici sull’utilizzo dell’operatore “++” come prefisso e come suffisso nell’incremento di una variabile. Durante la correzione delle esercitazioni dei miei studenti noto che la posizione del “++” crea qualche confusione, quindi ho pensato di inserire questa spiegazione nella sezione “Errori comuni nell’uso di Arduino”.

Esempio 1: “++variabile” (incremento come prefisso)

Questo sketch dimostra come il valore della variabile viene incrementato prima di essere stampato sulla Serial Monitor.

// Prof. Maffucci Michele
// utilizzo del ++ come prefisso

void setup() {
  Serial.begin(9600);  // Avvia la comunicazione seriale a 9600 bps
}

void loop() {
  int conteggio = 0;
  Serial.println("Incremento come prefisso:");
  for(int i = 0; i < 5; i++) {
    Serial.print("Valore attuale di conteggio: ");
    Serial.println(++conteggio);  // Stampa il valore di conteggio dopo essere stato incrementato
    delay(1000);                  // Attendi un secondo tra ogni iterazione
  }
  Serial.println("Fine del ciclo");
  while(true);  // Termina il loop per evitare ulteriori incrementi
}

Nell’Esempio 1, vedrete che i valori stampati iniziano da 1 e arrivano fino a 5, perché l’incremento avviene prima della stampa del valore di conteggio.

Esempio 2: “variabile++” (Incremento come suffisso)

Questo sketch illustra come il valore della variabile sia stampato prima di essere incrementato.

// Prof. Maffucci Michele
// utilizzo del ++ come suffisso

void setup() {
  Serial.begin(9600);  // Avvia la comunicazione seriale a 9600 bps
}

void loop() {
  int conteggio = 0;
  Serial.println("Incremento come suffisso:");
  for(int i = 0; i < 5; i++) {
    Serial.print("Valore attuale di conteggio: ");
    Serial.println(conteggio++);  // Stampa il valore corrente di conteggio, poi lo incrementa
    delay(1000);                  // Attendi un secondo tra ogni iterazione
  }
  Serial.println("Fine del ciclo");
  while(true);  // Termina il loop per evitare ulteriori incrementi
}

Nell’Esempio 2, i valori stampati iniziano da 0 e arrivano a 4, poiché l’incremento avviene dopo la stampa del valore.

Esempio 3: alternanza tra incremento come prefisso e suffisso

L’esempio che segue utilizza un contatore che aumenta ogni secondo e un messaggio che mostra sulla Serial Monitor il valore del contatore prima e dopo l’incremento, alternando tra incremento come prefisso e suffisso.

// Prof. Maffucci Michele
// utilizzo del ++ come suffisso

int contatore = 0;
bool usaPrefisso = true;  // Flag per alternare tra incremento prefisso e suffisso

void setup() {
  Serial.begin(9600);  // Inizia la comunicazione seriale a 9600 bps
}

void loop() {
  Serial.println("Inizio del ciclo");
  if (usaPrefisso) {
    Serial.print("Incremento come prefisso - Valore prima dell'incremento: ");
    Serial.println(contatore);
    Serial.print("Valore dopo l'incremento: ");
    Serial.println(++contatore);  // Incremento prima della stampa
  } else {
    Serial.print("Incremento come suffisso - Valore prima dell'incremento: ");
    Serial.println(contatore);
    Serial.print("Valore dopo l'incremento: ");
    Serial.println(contatore++);  // Stampa prima dell'incremento
  }

// Alterna tra prefisso e suffisso
  usaPrefisso = !usaPrefisso;

Serial.println("Fine del ciclo\n");
  delay(2000);  // Attendere 2 secondi prima del prossimo ciclo
}

Si noti che nel loop() a ogni iterazione, si decide se usare l’incremento come prefisso o come suffisso, basandosi sul valore del flag “usaPrefisso”. Dopo ogni ciclo, il metodo di incremento viene alternato in questo modo vengono mostrati come i due metodi di incremento influenzano il valore della variabile contatore il cui valore viene stampato sulla Serial Monitor.

Buon Coding a tutti 🙂

Errori comuni nell’uso di Arduino – inserire void davanti alla funzione chiamata

Ho rilevato che alcune volte alcuni allievi nella chiamata di una funzione inseriscono il tipo restituito dalla funzione davanti alla funzione chiamata, ciò può essere fatto solamente nella dichiarazione del prototipo di funzione.
Il prototipo di una funzione costituisce una dichiarazione della funzione e fornisce al compilatore le informazioni indispensabili per gestire la funzione.
Nella definizione di una funzione, viene indicato anche ciò che deve fare la funzione quando viene invocata, specificato nel corpo della funzione.

Lo sketch che segue non chiama la funzione miSentoFortunato()

void setup() {
  Serial.begin(9600);
}

void loop() {

  // inserendo void nella chiamata di funzione
  // NON verrà chiamata la funzione miSentoFortunato() 
  void miSentoFortunato();
}

void miSentoFortunato() {
  Serial.println("Oggi mi sento fortunato :-)");
}

Attenzione che in fase di compilazione e trasferimento non verrà restituito nessuno errore da parte del compilatore quindi l’individuazione dell’errore in un codice più esteso potrebbe essere di difficile individuazione.

Codice corretto

void setup() {
  Serial.begin(9600);
}

void loop() {

  // eliminando void nella chiamata di funzione
  // verrà chiamata la funzione miSentoFortunato() 
  miSentoFortunato();
}

void miSentoFortunato() {
  Serial.println("Oggi mi sento fortunato :-)");
}

Esercizio 1

Perché il codice che segue non restituisce errore?

void setup() {
  Serial.begin(9600);
}
void loop() {
  void miSentoFortunato();
}

Esercizio 2

Perché il codice che segue non restituisce errore?

void setup() {
  Serial.begin(9600);
}
void loop() {
  // :-)
}
void miSentoFortunato();

Esercizio 3

Perché il codice che segue restituisce errore?

void setup() {
  Serial.begin(9600);
}
void loop() {

  void miSentoFortunato() {
  // :-)
  }
}

Per i miei allievi: il primo che risponde correttamente vince una scheda Arduino (non è uno scherzo) 😉

Errori comuni nell’uso di Arduino – inizializzazione di più variabili

La tentazione di risparmiare linee di codice è sempre in agguato e tentare di inizializzare più variabili su una sola riga è forte, però alcune volte ciò che intendiamo fare non corrisponde a ciò che correttamente intende il compilatore.

Con la scrittura:

int x, y, z = 67;

non viene assegnato il valore 67 ad ogni singola variabile, ma solamente la variabile z viene inizializzata a 67.

L’errore quindi non risiede nella scrittura, il compilatore non restituirà errore, ma nel modo in cui il programmatore intende l’assegnamento credendo che tutte le variabili vengano inizializzate a 67.

La scrittura

int x = 67, y = 67, z = 67;

permette l’assegnamento del valore 67 ad ogni singola variabile. Si ricordi di separare ogni assegnamento da una virgola, ciò accade solo e soltanto se si indicano tipo e assegnamento su stessa linea.

Per l’assegnamento di valori diversi scriveremo:

int x = 99, y = 3, z = 67;

Io in genere preferisco una scrittura di questo tipo:

int x = 99;
int y = 3;
int z = 67;

che permette di visualizzare meglio le variabili utilizzate, non favorisce fraintendimenti nell’assegnamento e permette inoltre di scrivere chiaramente un commento a lato di ogni assegnamento.

Esercizio (semplice semplice 🙂 ) per i miei studenti:

Realizzare uno sketch che dimostra quanto esposto in questo post.

Buon Coding 🙂

Errori comuni nell’uso di Arduino – dimenticare il punto e virgola dopo il return

Errore:

if (contatore < 60)
    return    // manca il punto e virgola
contatore = contatore + 1;

Il codice sopra viene compilato come se fosse:

if (contatore < 60)
return contatore = contatore + 1;

Si ricorda che dopo un return incondizionato il codice che segue non verrà mai eseguito.

Ad esempio:

contatore = contatore + 1;
return contatore;
contatore = 10; // questa linea di codice non verrà mai eseguita

Esercizio (semplice semplice 🙂 ) per i miei studenti di terza:

Realizzare due sketch che accettano un input numerico intero da tastiera (sulla Serial Monitor) che dimostrano le due situazioni esposte nella spiegazione precedente.

Errori comuni nell’uso di Arduino: nome istruzioni non corretto, terminazione istruzione, parentesi non chiuse

Gli errori più frequenti sono:

  • errori nella scrittura del nome delle istruzioni;
  • punto e virgola alla fine di un’istruzione;
  • mancanza delle parentesi graffa di apertura o chiusura di un gruppo di istruzioni;
  • uso scorretto delle parentesi.

Uno qualsiasi dei problemi indicati sopra, come avete notato a lezione, interromperà la compilazione del programma segnalandovi l’errore nell’area di status al fondo della finestra di programmazione.

Prendo come esempio il codice utilizzato questa mattina in laboratorio su cui ho aggiunto io gli errori che ho rilevato nelle scorse lezioni e questa mattina:

Codice non corretto

  • Riga 8: manca ;
  • Riga 16: uso scorretto delle parentesi graffe { } da sostituire con parentesi tonde ( )
  • Riga 19: errore nel nome dell’istruzione: digitalwrite() invece di digitalWrite()
  • Riga 21: manca parentesi } di chiusura della funzione loop()

Codice corretto

Ognuno di questi errori impedirà la compilazione del vostro programma.
So che all’inizio può essere frustrante cercare gli errori nel codice ed imparare la sintassi di programmazione, ma si tratta di un piccolo scoglio iniziale superato il quale sarete in grado di realizzare progetti sempre più complessi ed interessanti.

All’inizio copiate il codice che ho sviluppato per le lezioni, modificatelo e miglioratelo in questo modo in poco tempo riuscirete a migliorare.

Ricordo inoltre che è buona regola utilizzare le funzioni “Formattazione Automatica” che consente di indentare (far rientrare) il codice in modo da evidenziare meglio la struttura del programma migliorando la leggibilità e mettendo quindi in evidenza la struttura logica del vostro sketch.

Nel caso di dubbi sull’uso di istruzioni e sintassi, utilizzate il comando “Cerca nella Guida”, sarà sufficiente evidenziare nel codice l’istruzione di cui volete informazioni, nell’esempio che segue “digitalWrite” e dal menù “Aiuto > Cerca nella guida” vi verrà mostrato la pagina della guida che fa riferimento all’istruzione cercata.


Compito per i miei studenti:

Leggere gli articoli che seguono in riferimento agli errori comuni nell’uso di Arduino

Messaggio per i miei allivi:

non si diventa Maker facendo un blink con Arduino…
studio e sperimentazione un po’ al giorno tutti i giorni.

P.S.
se non è tuo interesse diventare Maker allora sostiuisci la frase: “non si diventa maker facendo un blink con Arduino…” con la frase “non si ottiene la sufficienza sapendo fare solo un blink con Arduino…”

😉