Archivi categoria: arduino

Arduino – istruzione “do…while”: eseguire almeno una volta, poi verificare

Pubblicherò alcuni approfondimenti che serviranno per lo svolgimento di futuri esercizi che svolgeremo in classe e che sicuramente potranno essere di aiuto per risolvere l’attività di educazione civica: “dirimere i conflitti con il pensiero computazionale”.

Gli approfondimenti saranno su:

  1. istruzione do…while
  2. istruzione while
  3. lettura caratteri da serial monitor (che affronteremo anche in questa lezione)
  4. loop infiniti con for, while, do while

Alla fine troverete esercizi da svolgere, se riuscirò pubblicherò su queste pagine la soluzione, altrimenti lo faremo direttamente in classe.

do…while

L’istruzione do…while è utile quando un blocco di codice deve essere eseguito almeno una volta prima di verificare una condizione. È ideale per interazioni utente-centriche (es. chiedere conferma), letture che vanno fatte comunque almeno una volta (prima misura da sensore), o cicli in cui la condizione si conosce solo dopo aver eseguito un passo (validazione di input).

Spiegazione

Sintassi

do {
  // corpo: eseguito almeno una volta
} while (condizione);
  • Il controllo è a fine ciclo: se condizione è vera, il ciclo ripete; se è falsa, esce.
  • Evita pre-inizializzazioni “finte” solo per entrare nel ciclo.

Esempio 01: conferma utente da Serial (Y/N)

// Prof. Maffucci Michele
// data: 26.10.2025
// Esempio 01 - Ripasso uso dell'istruzione do...while

// Chiede conferma almeno una volta; normalizza input
void setup() {
  Serial.begin(9600);  // inizializza la Serial Monitor
  Serial.println("Conferma operazione? (y/n)");
}
void loop() {
  bool confermato = false;
  char scelta;
  do {
    if (Serial.available()) {
      scelta = Serial.read();
      if (scelta >= 'A' && scelta <= 'Z') {
        scelta = scelta - 'A' + 'a';
      }
      confermato = (scelta == 'y' || scelta == 'n');
    }
  } while (!confermato);

  Serial.print("Hai scelto: ");
  Serial.println(scelta == 'y' ? "SI" : "NO");
  while (true) {}  // fine dimostrazione
}

A cosa serve inserire: “while (true) {}” alla fine dell’esempio?

Evita che il codice prosegua oltre la dimostrazione e che il loop() ricominci, quindi è possibile effettuare un solo inserimento.

Se si commenta while (true) {} è possibile continuare ad inserire “y” o “n”

Come rendiamo case-insensitive (indifferente a maiuscole/minuscole) l’input

if (scelta >= 'A' && scelta <= 'Z') {
  scelta = scelta - 'A' + 'a';
}

Controllo dell’intervallo: scelta >= 'A' && scelta <= 'Z'

  • Verifica se il carattere è una lettera maiuscola ASCII tra A e Z.

Conversione in minuscolo: scelta = scelta - 'A' + 'a';

  • Trasforma quella maiuscola nella corrispondente minuscola.

Perché si usa: “- ‘A’ + ‘a’”

Come indicato anche nelle mie slide: “Alfabeto Arduino”, nel set ASCII, le lettere maiuscole e minuscole sono “a blocchi” distanziati da una differenza costante (32 in decimale).

  • ‘A’ ha codice 65, ‘a’ ha codice 97;
  • qualsiasi lettera: 'C' - 'A' = 2 (offset dentro il blocco maiuscole);
  • sommando questo offset a 'a': 2 + 'a' = 'c'.

Quindi:

  • Esempio concreto:
    scelta = 'C' - 'A' + 'a' che sostituendo i codici ASCII otteniamo 67 – 65 + 97 = 99 che è il codice ASCII di ‘c’.

Scriverlo con ‘A’ e ‘a’ (invece di 65 e 97) è più leggibile e non vi fa ricordare numeri.

Quanto è utile

  • rendere i comandi indifferenti al minuscolo o maiuscolo: l’utente può digitare Y o y e il programma li tratta allo stesso modo;
  • Evitare duplicazioni: non servono due rami separati per maiuscolo/minuscolo.

Limiti

  • funziona per le lettere A-Z dell’ASCII standard;
  • non gestisce caratteri accentati né Unicode (Arduino classico usa byte ASCII);
  • lascia invariati numeri e simboli (non entrano nell’if).

Vedremo in successive lezioni l’uso di altri strumenti per la gestione di stringhe inserite sulla Serial Monitor.

Esempio 02: prima lettura sensore, poi ripeti finché entro soglia

Per simulare un sensore in questo esempio viene utilizzato un trimmer collegato sul reoforo centrale ad A0 ed i due reofori laterali uno a GND e l’altro a Vcc.

// Prof. Maffucci Michele
// data: 26.10.2025
// Esempio 02 - Ripasso uso dell'istruzione do...while
// LED su pin 13: lampeggia finché la lettura NON è entro la fascia [450..550]

void setup() {
  Serial.begin(9600);  // inizializza la Serial Monitor
  pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
  int valore;
  do {
    valore = analogRead(A0);  // lettura comunque almeno una volta
    Serial.print("Valore: ");
    Serial.println(valore);
    digitalWrite(LED_BUILTIN, HIGH);
    delay(100);
    digitalWrite(LED_BUILTIN, LOW);
    delay(100);
  } while (valore < 450 || valore > 550);  // ripeti finché fuori dalla fascia
  Serial.println("Valore entro soglia: ok");
  // ripete una sola volta l'analisi (non ripete il loop()), se desiderate ripetere eliminare il ciclo infinito
  while (true) {}
}

Esempio 03: menu: mostra almeno una volta, poi ripeti finché la scelta risulta non valida

// Prof. Maffucci Michele
// data: 26.10.2025
// Esempio 03 - Ripasso uso dell'istruzione do...while
// Mostra un piccolo menu e accetta comandi 'a' 'b' 'x'; richiede almeno un giro

void setup() {
  Serial.begin(9600);
}
void loop() {
  char cmd = 0;
  do {
    Serial.println("Menu: a=avvia  b=blocca  x=uscita");
    while (!Serial.available()) {}
    cmd = Serial.read();
  } while (cmd != 'a' && cmd != 'b' && cmd != 'x');

  Serial.print("Comando accettato: ");
  Serial.println(cmd);
  // ripete una sola volta l'analisi (non ripete il loop()), se desiderate ripetere eliminare il ciclo infinito
  while (true) {}
}

In questo caso se commentate while (true) {} potete effettuare nuovi inserimenti ma potrebbe accadere qualcosa di molto simile a ciò che è indicato nell’immagine che segue

Quello che vedete non è un bug misterioso 🙂 è il buffer seriale + newline, ma cosa vuol dire?

Quando togliamo while (true) {}, il loop() ricomincia da capo.

Consideriamo la parte di codice dell’esempio:

do {
  Serial.println("Menu: a=avvia  b=blocca  x=uscita");
  while (!Serial.available()) {}
  cmd = Serial.read();                 // <-- legge SOLO il primo byte
} while (cmd!='a' && cmd!='b' && cmd!='x');

la Serial Monitor di Arduino (a seconda dell’impostazione “Line ending”) invia anche \n e/o \r oltre alla lettera che digitate.
Poiché leggete un solo carattere (cmd = Serial.read()) e non svuotate il buffer, restano in coda \r e/o \n.

Al giro successivo del do...while (o al restart del loop()), Serial.available() è già > 0 (ci sono dei newline in coda) quindi:

  • il menu viene stampato subito;
  • viene letto il carattere successivo (che è \n o \r, quindi non valido);
  • la condizione del do...while fallisce e viene ristampato il menu.

Risultato: la stringa compare più volte di fila.

2 modi per risolvere il problema della ripetizione

01. Leggere il primo carattere utile, saltando CR/LF

Viene ignorato esplicitamente \r e \n:

char leggiCharPulito() {
  while (true) {
    while (!Serial.available()) {}
    char c = Serial.read();
    if (c == '\r' || c == '\n') continue;         // salta newline
    if (c >= 'A' && c <= 'Z') c = c - 'A' + 'a';  // normalizza
    while (Serial.available())
      Serial.read();  // svuota residui
    return c;
  }
}

// uso:
do {
  Serial.println("Menu: a=avvia  b=blocca  x=uscita");
  cmd = leggiCharPulito();
} while (cmd != 'a' && cmd != 'b' && cmd != 'x');

02. Impostare il Serial Monitor su “No line ending”

Soluzione molto più semplice che prevede di impostare nel menù a tendina del Serial Monitor (in basso a destra), la selezione di Nessun fine riga (in inglese: No line ending).
Così non verranno inviati \r o \n e il problema dei “doppioni” si elimina.

Proposta di esercizi

Esercizio 01 –  Attendi pulsante

  • Consegna: attendere che un pulsante su D2 venga premuto; durante l’attesa far lampeggiare il LED integrato.
  • Vincoli: usare while come attesa in ingresso (while(digitalRead(…)==HIGH)).
  • Extra: al termine, stampare “OK” e fermarsi.

Esercizio 02 – Svuota buffer seriale

  • Consegna: quando l’utente invia testo, fare echo e svuotare tutti i caratteri residui.
  • Vincoli: usare while(Serial.available()>0).
  • Extra: contare quanti byte sono stati letti e mostrarli.

Esercizio 03 – Timer regressivo

  • Consegna: da un valore t letto da Serial (es. 5..20), eseguire un countdown finché t>0.
  • Vincoli: usare while(t>0) con t– e stampa del tempo.
  • Extra: beep finale + messaggio “Decollo!”.

Dirimere i conflitti con il pensiero computazionale – educazione civica – diagramma di flusso e pseudocodice – lezione 02

Dal problema definito passiamo alla modellazione del processo: un diagramma di flusso rende visibile il percorso di mediazione (controllo sicurezza > turni > parafrasi > opzioni > decisione/mediatore). Poi tradurremo nella prossima lezione lo pseudocodice scritto in un linguaggio comprensibile (con nomi di variabili e commenti in italiano), in uno sketch Arduino.

Contenuto dell’attività

Obiettivi

  • Costruire un diagramma di flusso corretto (start/end, bivi, ciclo).
  • Scrivere pseudocodice coerente e leggibile.

Durata: 60–75 minuti
Materiali: fogli A3, pennarelli, template di blocchi; in alternativa editor con Mermaid.

Diagramma di flusso (Mermaid)

graph TD
    A([Start]) --> B{E' sicuro parlare}
    B -- No --> C[Time-out 2 minuti e chiama adulto]
    C --> B
    B -- Si --> D[Definisci il problema in una frase]
    D --> E[Turni di parola: A 60s, B 60s]
    E --> F{Parafrasi reciproca corretta}
    F -- No --> E
    F -- Si --> G[Genera almeno 2 opzioni di soluzione]
    G --> H{Accordo su una opzione}
    H -- Si --> I[Piano di azione: chi fa cosa entro quando]
    I --> J[Impegno reciproco]
    J --> K[Verifica dopo 24 ore]
    K --> L([End])
    H -- No --> M[Chiedi mediatore o rinvia confronto]
    M --> B

Diagramma di flusso

Pseudocodice

INIZIO
  mostra "Benvenuto: risoluzione conflitto (Base)"
  RIPETI
    chiedi "E' sicuro parlare? (y/n)"
    se risposta = 'n' allora
       mostra "Time-out breve"
       attendi breve tempo
    altrimenti esci dal ciclo
  FINO A quando è sicuro parlare

  mostra "Definisci il problema in UNA frase"
  attendi conferma

  RIPETI
     mostra "Turno A (60s simulati) → invio"
     attendi conferma
     mostra "Turno B (60s simulati) → invio"
     attendi conferma
     chiedi "Parafrasi reciproca corretta? (y/n)"
  FINO A quando risposta = 'y'

  numeroOpzioni = 0
  RIPETI
     chiedi "Aggiungi opzione? (a = aggiungi, f = fine)"
     se 'a' allora numeroOpzioni = numeroOpzioni + 1
  FINO A quando comando = 'f' e numeroOpzioni >= 2

  chiedi "C'e' accordo su una opzione? (y/n)"
  se 'y' allora
      mostra "Piano d'azione e verifica a 24h"
      FINE
  altrimenti
      mostra "Mediatore o rinvio"
      vai a controllo sicurezza
FINE

Nella prossima lezione si passerà dallo pseudocodice allo sketch Arduino.

Buon Coding a tutti, ma soprattutto che la pace sia con voi 🙂

Dirimere i conflitti con il pensiero computazionale – educazione civica – Definizione del problema – lezione 01

La violenza, dai conflitti globali alla violenza verbale quotidiana, nasce spesso dal non-ascolto e dalla prevaricazione. Nel laboratorio di sistemi elettronici trasformiamo i principi di convivenza civile in processi chiari: condizioni, regole, passi verificabili. Il lavoro in gruppo e la scrittura dell’algoritmo favoriscono la riflessione e il senso di giustizia che nasce dal confronto tra pari, non dall’imposizione. In un’epoca di bombardamento continuo di notizie che rischia di normalizzare la violenza e di farci sentire impotenti, progettare insieme percorsi di dialogo è un dovere civico oltre che un’attività didattica.

Contenuto dell’attività

Obiettivi

  • Distinguere fatti da interpretazioni in un conflitto.
  • Formulare il problema in una frase chiara.
  • Definire regole minime di dialogo e condizioni di sicurezza.

Durata: 60–75 minuti
Materiali: scheda cartacea o digitale (tabella), post-it, pennarelli.

Fasi

  1. Rompighiaccio (5 minuti)
    • Brainstorm: dove incontriamo conflitti (classe, chat, famiglia, social, ambiente)?
    • Raccogli su post-it parole chiave (ascolto, rispetto, tempi, diritti, minoranze).
  2. Fatti vs interpretazioni (15 minuti)
    • Consegna una scheda con due colonne:
      • Colonna A: FATTI (osservabili, verificabili).
      • Colonna B: INTERPRETAZIONI (opinioni, giudizi, attribuzioni di intenzioni).
    • Ogni gruppo (3–4 studenti) compila la tabella su un caso realistico proposto da te.
  3. Regole minime del confronto (10 minuti)
      • Stabilire 4 regole operative: niente insulti, parlo di me non accuso te, no interruzioni, tempi uguali.
        • Cosa si intende per: “parlo di me non accuso te”
          • Esempio 01: “Io mi sento confuso quando parliamo tutti insieme, perché non capisco. Ti chiedo di alzare la mano.”
          • Esempio 02: “Io mi innervosisco quando vengo interrotto, perché perdo l’idea. Ti chiedo di farmi finire.”
      • Decidere la condizione di sicurezza: se non è un buon momento, si prevede un time-out.
  4. Definizione del problema (15 minuti)
    • Ogni gruppo formula 1 “frase problema” chiara e neutra (max 20 parole).
    • Esempio: “Nel gruppo di laboratorio c’è disaccordo sulla divisione dei compiti e sui tempi di consegna”.
  5. Condivisione e feedback (10 minuti)
    • Ogni gruppo legge la frase. Feedback degli altri: è chiara? è neutra? evita accuse?

Lista elementi per la valutazione formativa

  • Chiarezza della frase problema.
  • Distinzione corretta fatti/interpretazioni.
  • Qualità delle regole proposte.
  • Partecipazione e rispetto dei turni.
  • Sintesi finale.

Buon lavoro 🙂

Dirimere i conflitti con il pensiero computazionale – educazione civica – presentazione

Esercitazione di Educazione Civica nelle ore di Laboratorio di Sistemi Elettronici

Desidero condividere la scheda di lavoro del percorso di educazione civica che avvierò oggi con i miei studenti. Come sapete, l’educazione civica è affidata a tutti i docenti del consiglio di classe e viene insegnata con un approccio trasversale e interdisciplinare. Per quanto mi riguarda, condurrò le prime tre ore di lezione a partire da oggi, integrandole con i contenuti della disciplina che insegno: Laboratorio di Sistemi Elettronici.

Condivido la scheda così come l’ho progettata nei giorni scorsi: modificatela e adattatela liberamente dove ritenete opportuno. Vi ringrazio fin d’ora se vorrete darmi un riscontro sia sulla validità della proposta sia sull’eventuale sperimentazione nelle vostre classi. La sto testando e con ogni probabilità apporterò modifiche in itinere.

Perché fare educazione civica in laboratorio di sistemi elettronici

Perché progettare un algoritmo è progettare una convivenza: si definiscono condizioni, stati, ingressi/uscite e verifiche di esito. Nel laboratorio trasformiamo i principi di costituzione, diritti e responsabilità in procedure operative che gli studenti possono vedere, toccare e migliorare.

In più, scrivere l’algoritmo e svilupparlo in gruppo porta inevitabilmente a riflettere su questi problemi, a cercare modi concreti per affrontarli e, soprattutto, a coltivare un senso di giustizia che nasce dal confronto civile. È nella pratica del “decidere insieme” e non nell’imposizione dall’alto tipica di leadership autocratiche che si progetta la pace: solo così, con regole condivise, possiamo contribuire a rendere migliore questo mondo.

Infine, in un contesto in cui il bombardamento continuo di notizie rischia di assuefarci a una falsa normalità della violenza e di farci sentire impotenti di fronte ai problemi globali, il laboratorio offre un antidoto: riflettere e progettare insieme percorsi di dialogo e cooperazione. Farlo non è solo un’opportunità didattica: è un dovere civico, un esercizio concreto di responsabilità verso il bene comune.

Ho previsto una versione base che, secondo la mia progettazione, richiede circa tre ore. Non so se durante le prossime lezioni o più avanti proporrò una versione avanzata, che integra criteri di valutazione, punteggi: questa seconda forse la farò sviluppare quando la classe avrà acquisito maggiore dimestichezza con la programmazione, ma osservo e nel caso troverete su questo sito la proposta avanzata integrata all’interno delle tre lezioni che vi condividerò settimanalmente (credo) con lo sviluppo di una proposta di soluzione del diagramma di flusso, pseudocodice e Sketch Arduino.

Scheda di lavoro

In questa attività uniamo educazione civica e competenze tecnico-scientifiche per riflettere su conflitti che toccano la nostra società: escalation di guerre, fenomeni di apartheid e discriminazione, crisi climatica, violenza verbale online e offline. Al centro c’è un’idea semplice e credo potente: molte forme di violenza nascono dal non-ascolto e dalla prevaricazione, dal non tenere conto del pensiero altrui e dei diritti delle minoranze.
Useremo il pensiero computazionale (diagrammi di flusso, pseudocodice, automazione con Arduino) per progettare procedure di dialogo e mediazione: la logica degli algoritmi diventa un modo per rendere trasparente, equo e verificabile il percorso verso una soluzione condivisa.

Obiettivi formativi

  • Civici: sviluppare ascolto attivo, rispetto reciproco, gestione non violenta dei conflitti, attenzione ai diritti e alle minoranze.
  • Tecnici: saper rappresentare un processo con diagramma di flusso e pseudocodice; tradurre la procedura in uno sketch Arduino semplice con input da seriale e feedback visivo/sonoro.
  • Metodologici: passare da opinioni generiche a passi operativi (regole, turni di parola, verifica di comprensione, decisione).

Struttura del percorso (3 lezioni)

Lezione 1 – Definizione del problema

  • Analisi di casi: conflitti quotidiani (classe, social, famiglia) e macro-temi (discriminazione, clima, linguaggi d’odio).
  • Riconoscere attori, interessi, regole e condizioni minime per un confronto sicuro.
  • Distinguere fatti da interpretazioni e formulare il problema in una frase chiara.

Lezione 2 – Diagramma di flusso e pseudocodice

  • Costruzione di una versione base dell’algoritmo di mediazione:
    controllo sicurezza del confronto > turni di parola > parafrasi reciproca > generazione di opzioni > decisione o richiesta di mediazione.
  • Stesura del pseudocodice con variabili in italiano e commenti esplicativi.

Lezione 3 – Sketch Arduino

  • Implementazione su Arduino con input via Serial Monitor e feedback con LED integrato (e buzzer opzionale).
  • Test guidato: simulare conversazioni e verificare come l’algoritmo aiuta a ridurre ambiguità, toni aggressivi e fraintendimenti.

Competenze attese

  • Competenze civiche e sociali: ascolto, empatia, negoziazione, responsabilità.
  • STEM: modellazione di processi, astrazione, controllo di flusso (condizioni e cicli), debugging di procedure.
  • Comunicazione: parafrasi, sintesi in una frase problema, linguaggio tecnico chiaro.

Materiali essenziali

  • PC con Arduino IDE, scheda Arduino UNO (o equivalente), cavo USB.
  • Serial Monitor per l’interazione, LED integrato (pin 13) e buzzer opzionale su pin 5.
  • Fogli per diagrammi/pseudocodice; regole di dialogo condivise.

Valutazione (formativa)

  • Qualità del diagramma di flusso (chiarezza, completezza, uso corretto di bivi e cicli).
  • Aderenza del pseudocodice al diagramma.
  • Funzionamento dello sketch e qualità dei commenti.
  • Comportamenti osservabili di ascolto e rispetto durante le simulazioni.

Inclusione e clima di classe

  • Ruoli rotanti (moderatore, portavoce, time-keeper, osservatore del linguaggio).
  • Consegnare una griglia di frasi utili per “io-messaggi” e parafrasi.
  • Tempi scanditi e check-point per favorire la partecipazione di tutti.

Progettiamo la pace 🙂

Progettare bene, programmare meglio: pseudocodice e diagrammi per sistemi elettronici – lezione 5/5


Ripasso di inizio anno – appunti per la classe.

Di seguito un mini vocabolario, come sempre stampatelo e mettetelo nel tuo quadernone (alcune cose le abbiamo viste anche nella lezione precedente):

Useremo un dialetto semplice.

  • Una istruzione per riga.
  • Parole chiave in MAIUSCOLO e con i due punti : quando aprono un blocco:
    • SE … ALLORA: … ALTRIMENTI:
    • MENTRE (condizione):
    • PER i da A a B:
    • FUNZIONE nome(parametri): RITORNA valore
  • Indentazione (rientro) di 2–4 spazi per il contenuto dei blocchi.
  • Commenti: usa // all’inizio della riga.
  • Nomi chiari per variabili e costanti: sogliaLuce, tempoGiallo, pinLed.

Mini-vocabolario

  • IMPOSTA x a 10: assegna un valore
  • LEGGI x: prendi un input (da Serial o da sensore)
  • SCRIVI …: stampa (su Serial o su un display)
  • ATTENDI 500 ms: pausa
  • ESCI DAL CICLO: interrompi MENTRE o PER
  • OperatorI: ==, !=, <, >, >=, <=, AND, OR, NOT

Mappa mentale

Pseudocodice Arduino (C/C++)
IMPOSTA x a 10 int x = 10; oppure x = 10;
LEGGI da Serial parseInt()/readStringUntil('\n')
LEGGI digitale pin digitalRead(pin)
LEGGI analogico pin analogRead(pin)
SCRIVI su Serial Serial.print()/println()
ACCENDI LED digitalWrite(pin, HIGH)
SPEGNI LED digitalWrite(pin, LOW)
ATTENDI t ms delay(t)
PER i da 1 a N: for (int i=1; i<=N; i++) { ... }
MENTRE (condizione): while (condizione) { ... }
SE / ALTRIMENTI if (...) { ... } else { ... }
FUNZIONE tipo nome(params){...}
RITORNA return

Funzioni di aiuto per leggere dal Monitor Seriale

Blocchi riutilizzabili

// ---------------------------
// Aiuti per I/O seriale
// ---------------------------

// Legge un intero dalla Serial (es.: 42, -17).
// Attende che ci siano dati disponibili, usa parseInt()
// e poi "pulisce" il buffer fino al newline '\n' per preparare
// la prossima lettura.
int leggiInt() {
  // Attende finché il buffer seriale è vuoto.
  // Serial.available() restituisce quanti byte sono pronti da leggere.
  while (!Serial.available()) {
    // ciclo di attesa attivo: resta qui finché non arriva almeno 1 byte
  }

  // parseInt():
  //  - salta automaticamente spazi e caratteri non numerici iniziali;
  //  - legge opzionalmente il segno (-);
  //  - si ferma quando incontra un separatore (es. spazio, '\n', ecc.)
  //  - rispetta Serial.setTimeout(): se i numeri arrivano "a pezzi", attende fino al timeout.
  int v = Serial.parseInt();

  // Dopo parseInt possono essere rimasti caratteri nel buffer
  // (ad es. l'utente ha premuto Invio, quindi c'è '\n' o anche "\r\n").
  // Questo while consuma tutto ciò che c'è fino a trovare '\n' e poi esce,
  // in modo da "allineare" la prossima lettura all'inizio della riga seguente.
  while (Serial.available()) {
    // Legge un carattere dal buffer
    if (Serial.read() == '\n') break; // esce quando trova il newline
    // Nota: se volessi trattare anche '\r' come fine riga su sistemi Windows,
    // potresti controllare anche '\r' (carriage return).
  }

  // Restituisce il valore intero letto.
  return v;
}

// Legge una riga di testo fino al newline '\n' e la restituisce come String.
// Esempio di input: "ciao mondo\n" -> "ciao mondo" (senza newline né spazi finali).
String leggiLinea() {
  // Attende che arrivi almeno un byte.
  while (!Serial.available()) {
    // attesa attiva
  }

  // Legge i caratteri fino al delimitatore '\n' (newline).
  // Il newline non viene incluso nella String risultante.
  String s = Serial.readStringUntil('\n');

  // trim():
  //  - rimuove spazi iniziali/finali, tab e ritorni a capo residui.
  //  - Utile se su alcune piattaforme l'invio produce "\r\n" (Windows):
  //    readStringUntil('\n') rimuove '\n', ma può restare '\r' in coda; trim() lo elimina.
  s.trim();

  // Restituisce la riga "pulita".
  return s;
}

Codice senza commenti da copiare ed incollare:

// ——— Aiuti per I/O seriale ———
int leggiInt() {
  while (!Serial.available()) {}
  int v = Serial.parseInt();
  while (Serial.available()) {
    if (Serial.read() == '\n') break;
  }
  return v;
}

String leggiLinea() {
  while (!Serial.available()) {}
  String s = Serial.readStringUntil('\n');
  s.trim();
  return s;
}

Esempi guidati pseudocodice > sketch Arduino

Esempio 01 – Saluto con nome (solo Serial)

Scopo: input/output base, variabili stringa.

Pseudocodice – esempio 01

SCRIVI "Come ti chiami?"
LEGGI nome
SCRIVI "Ciao, " + nome + "!"

Arduino – esempio 01 – con commenti

void setup() {
  Serial.begin(9600);          // Inizializza la seriale a 9600 baud (Monitor Seriale deve avere lo stesso valore).

  while (!Serial) { ; }        // Attende che la porta seriale sia pronta (utile su schede con USB "native", es. UNO R4).
                               // Su UNO R3 spesso non serve, ma non fa danni.

  Serial.println("Come ti chiami?"); // Messaggio iniziale: l’utente vede la richiesta nel Monitor Seriale.

  Serial.setTimeout(60000);    // Imposta il "tempo massimo di attesa" a 60 s per funzioni come readStringUntil/parseInt.
                               // Se l’utente impiega tempo a digitare, la lettura aspetta fino a 60 s prima di rinunciare.
}

void loop() {
  String nome = leggiLinea();  // Legge una riga di testo inserita dall’utente fino al tasto Invio (newline '\n').
                               // Esempio: se scrivo "Michele" e premo Invio, nome = "Michele".

  Serial.print("Ciao, ");      // Stampa senza andare a capo...
  Serial.print(nome);          // ...stampa il nome letto...
  Serial.println("!");         // ...e chiude la riga con il punto esclamativo + newline.

  while (true) {}              // Ferma il programma qui (loop infinito).
                               // Serve per NON chiedere nuovamente il nome in un ciclo senza fine.
                               // Se vuoi che ripeta la domanda, rimuovi questa riga.
}

Arduino – esempio 01 – senza commenti

void setup() {
  Serial.begin(9600);
  while (!Serial) {;}
  Serial.println("Come ti chiami?");
  Serial.setTimeout(60000);
}

void loop() {
  String nome = leggiLinea();
  Serial.print("Ciao, ");
  Serial.print(nome);
  Serial.println("!");
  while (true) {}  // fine
}

Esercizio aggiuntivo: chiedi anche l’età e rispondi “Sei maggiorenne/minorenne”.

Esempio 02 – Blink (LED lampeggiante)

Collegamenti: LED con resistenza su pin 13 (o usa quello onboard).

Pseudocodice – esempio 02

IMPOSTA pinLed a 13
IMPOSTA periodo a 500 ms
MENTRE (vero):
    ACCENDI LED
    ATTENDI periodo
    SPEGNI LED
    ATTENDI periodo

Arduino – esempio 02

const int pinLed = 13;
const int periodo = 500;

void setup() {
  pinMode(pinLed, OUTPUT);
}

void loop() {
  digitalWrite(pinLed, HIGH);
  delay(periodo);
  digitalWrite(pinLed, LOW);
  delay(periodo);
}

Esercizio aggiuntivo: leggi periodo da Serial.

Esempio 03 – Pulsante accende/spegne LED

Collegamenti: pulsante su pin 2, modalità INPUT_PULLUP; LED su pin 8.
Nota: il pulsante chiude a GND (premuto = LOW).

Pseudocodice – esempio 03

IMPOSTA statoLed a SPENTO
MENTRE (vero):
    LEGGI pulsante
    SE (pulsante premuto) ALLORA:
        ATTENDI 20 ms  // anti-rimbalzo semplice
        SE (ancora premuto) ALLORA:
            inverti statoLed
            applica stato al LED
            ATTENDI rilascio

Arduino – esempio 03

const int pinBtn = 2;
const int pinLed = 8;
bool statoLed = false;

void setup() {
  Serial.begin(9600);
  pinMode(pinBtn, INPUT_PULLUP);
  pinMode(pinLed, OUTPUT);
}

void loop() {
  if (digitalRead(pinBtn) == LOW) {  // premuto
    delay(20);                       // debounce base
    if (digitalRead(pinBtn) == LOW) {
      statoLed = !statoLed;  // toggle
      digitalWrite(pinLed, statoLed ? HIGH : LOW);
      // Attendi rilascio
      while (digitalRead(pinBtn) == LOW) {}
      delay(20);
    }
  }
}

Esercizio aggiuntivo: Estensione: stampa su Serial “ON/OFF” ad ogni pressione.

Esercizi

Esercizio 01 – Potenziometro > luminosità (PWM)

Obiettivo: Regolare mediante potenziometro l’intensità luminosa del LED.
Collegamenti: potenziometro su A0; LED su pin PWM 9.

Esercizio 02 – LED ON per 3 secondi quando premo il pulsante

Obiettivo: premo il pulsante > il LED rimane acceso per 3 secondi > poi si spegne.
Evitare ripetizioni mentre si tiene premuto (debounce base).

Componenti & Collegamenti

  • 1 × LED + 1 × resistenza (220–330 Ω) su pin 8 → GND
  • 1 × pulsante su pin 2 con INPUT_PULLUP (l’altro capo del pulsante a GND)

Esercizio 03 — LDR: accendi il LED quando è buio

Obiettivo: leggo la luce con una LDR. Se il valore è sotto una soglia (buio), accendo il LED; altrimenti lo spengo. Stampo i valori su Serial.

Componenti & Collegamenti

  • LDR in partitore su A0 (esempio: 5V — LDR — A0 — resistenza 10 kΩ — GND)
  • LED + resistenza su pin 9 → GND

Esercizio 04 – Potenziometro > luminosità LED (PWM)

Obiettivo: con il potenziometro regolo la luminosità del LED usando analogWrite (PWM).

Componenti & Collegamenti

  • Potenziometro 10 kΩ su A0 (estremi a 5V e GND, cursore ad A0)
  • LED + resistenza su pin ~9 (pin PWM) > GND

Buon Coding a tutti 🙂