
In riferimento alla lezione: Arduino – istruzione “do…while”: eseguire almeno una volta, poi verificare pubblico una possibile soluzione agli esercizi proposti.
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.
Soluzione
/*
Prof. Maffucci Michele
data: 27.10.25
Soluzione esercizio 01 - Attendi pulsante
Hardware:
- Pulsante su D2 con INPUT_PULLUP (un capo a D2, l'altro a GND)
- LED integrato (pin 13)
Obiettivo:
- Lampeggiare il LED mentre si attende la pressione del pulsante
- Usare while(digitalRead(PIN_BTN) == HIGH) come attesa
- Quando il pulsante viene premuto -> stampare "OK" e fermarsi
*/
// PIN_BTN dichiarato come byte e non come int per occupare meno spazio di memoria
// collegare il pulsante a GND (INPUT_PULLUP)
const byte PIN_BTN = 2;
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
pinMode(PIN_BTN, INPUT_PULLUP);
Serial.begin(9600);
Serial.println("Premi il pulsante per continuare...");
}
void loop() {
// Attesa attiva: finché il pulsante NON è premuto (HIGH con pull-up)
// il LED_BUILTIN (13) lampeggia
while (digitalRead(PIN_BTN) == HIGH) {
digitalWrite(LED_BUILTIN, HIGH);
delay(150);
digitalWrite(LED_BUILTIN, LOW);
delay(150);
}
// Debounce semplice per elimina rimbalzi meccanici
// realizzato con piccolo ritardo
delay(30);
while (digitalRead(PIN_BTN) == LOW) { // resta qui finché è tenuto premuto
}
Serial.println("OK");
digitalWrite(LED_BUILTIN, HIGH); // lascia il LED acceso come conferma
while (true) {} // ferma la demo
}

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.
Soluzione
/*
Prof. Maffucci Michele
data: 27.10.25
Soluzione esercizio 02 — Svuota buffer seriale
Obiettivo:
- Appena arriva del testo, fare echo di TUTTI i caratteri presenti nel buffer
- Usare while(Serial.available() > 0) per svuotare il buffer
- Contare i byte letti e mostrarli
Ricordare:
- Impostare il Serial Monitor a 9600 baud
*/
void setup() {
Serial.begin(9600);
Serial.println("Scrivi una riga di testo e premi invio...");
}
void loop() {
if (Serial.available() > 0) {
int conteggioByte = 0;
Serial.print("Echo: ");
// Legge TUTTO ciò che è attualmente in buffer
while (Serial.available() > 0) {
char c = Serial.read(); // leggi un byte
Serial.write(c); // echo (stampa il carattere così com'è)
conteggioByte++; // conta i byte letti
// piccola attesa facoltativa per dare tempo al buffer di riempirsi
delay(1);
}
Serial.println();
Serial.print("Byte letti: ");
Serial.println(conteggioByte);
Serial.println("----");
}
// Se serve introdurre qui altro codice non bloccante
}
Attenzione!
Può capitare che vengano contati due byte in più, ciò accade perché la Serial Monitor (in basso a destra)
aggiunge automaticamente i caratteri di fine riga quando premete invio.
- entrambi NL & CR (Both NL & CR) > aggiunge due byte: \r (CR, 13) e \n (LF, 10) → ecco il tuo +2 costante;
- a capo NL (Newline) > aggiunge un byte: \n > +1;
- ritorno carrello (CR) (Carriage return) > aggiunge un byte: \r > +1;
- nessuna fine riga (No line ending) > +0 (il conteggio coincide con i caratteri digitati, salvo caratteri non ASCII).

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!”.
Soluzione
/*
Prof. Maffucci Michele
data: 27.10.25
Soluzione esercizio 03 — Timer regressivo
Obiettivo:
- Leggere un intero t (5..20) dal Serial Monitor
- Eseguire while(t > 0) con stampa del tempo e t--
- Al termine: beep su D5 e messaggio "Decollo!"
Note:
- Usa Serial.parseInt() per semplicità (attende un numero)
- Per maggior informazioni sull'uso di parseInt() consultare il link:
https://wp.me/p4kwmk-4Ah
*/
const int PIN_BUZ = 5; // collegare un buzzer piezo (se disponibile)
void setup() {
Serial.begin(9600);
pinMode(PIN_BUZ, OUTPUT);
Serial.println("Inserisci un numero intero t tra 5 e 20 e premi invio:");
}
void loop() {
int t = 0;
// Attendi un numero valido nell'intervallo [5..20]
while (t < 5 || t > 20) {
if (Serial.available() > 0) {
t = Serial.parseInt(); // legge il primo intero disponibile
// Svuota residui (ad es. '\n')
while (Serial.available() > 0) Serial.read();
if (t < 5 || t > 20) {
Serial.println("Valore non valido. Inserisci un numero tra 5 e 20:");
}
}
}
// Countdown con while(t > 0)
while (t > 0) {
Serial.print("T-");
Serial.println(t);
delay(1000); // 1 secondo
t--;
}
// Fine: beep + messaggio
tone(PIN_BUZ, 880, 350); // beep di 350 ms
Serial.println("Decollo!");
while (true) {} // ferma la demo
}

Buon lavoro.








