
Ora traduciamo lo pseudocodice in uno sketch Arduino. Usiamo input da Serial Monitor per simulare le scelte e il LED integrato (e un buzzer opzionale) per avere feedback fisico. L’obiettivo non è “automatizzare i conflitti”, ma allenare il pensiero procedurale e la gestione consapevole dei passi. Si faccia riferimento alla lezione precedente (seguire il link) in cui è stato mostrato il diagramma di flusso nella modalità Mermaid e classica.
Nella dimostrazione viene usato un Arduino UNO R4 WiFi.
Di seguito una possibile soluzione, il funzionamento lo trovate nei commenti.
/* Prof. Maffucci Michele
data: 18.11.25
Risoluzione di un conflitto
Input da Serial Monitor
- LED integrato (pin 13) usato come feedback visivo
- Buzzer opzionale su pin 5 (beep brevi)
Istruzioni:
1) Aprire la Serial Monitor (115200 baud).
2) Rispondere alle domande con i tasti indicati (y/n, a/f) o premi invio quando richiesto.
*/
const int pinLed = LED_BUILTIN; // pin 13
const int pinBuzzer = 5; // pin a cui è connesso il Buzzer
int numeroBeep = 0;
bool chiaveMsg = 0; // per controllo stampa msg
// emissione della nota
void beep(int durataMs) {
tone(pinBuzzer, 880); // nota La4
delay(durataMs);
noTone(pinBuzzer);
}
// sequenza di beep ripetuta all'avvio del programma
void sequenzaAvvio() {
for (int i = 0; i < 10; i++) {
beep(100);
delay(100);
}
}
// Attende che ci sia almeno un carattere sulla seriale e lo legge (minuscolo)
char leggiChar() {
while (!Serial.available()) {
// lampeggio lento del LED per indicare "in attesa"
digitalWrite(pinLed, HIGH);
delay(200);
digitalWrite(pinLed, LOW);
delay(200);
}
// Legge un solo byte dalla seriale e lo mette in c (di tipo char).
// Questo è il primo carattere che l’utente ha inviato.
char c = Serial.read();
// Svuota il buffer rimanente leggendo tutto quello che è ancora arrivato
// (ad esempio il \n dell’invio, o più caratteri se l’utente ha incollato del testo).
while (Serial.available())
Serial.read();
if (c >= 'A' && c <= 'Z') // Conversione in minuscolo se il carattere è una lettera maiuscola.
c = c - 'A' + 'a';
return c;
}
// -- Utility: attende qualsiasi tasto (usata come "invio per continuare")
// “un puntatore a char costante”, cioè una stringa in stile C non modificabile
// (tipicamente una stringa letterale come "Ciao").
void attendiConferma() {
const char* messaggio = "Premi invio per continuare";
Serial.println(messaggio);
while (!Serial.available()) {
digitalWrite(pinLed, HIGH);
delay(150);
digitalWrite(pinLed, LOW);
delay(150);
}
// svuota
while (Serial.available())
Serial.read();
beep(100);
}
// -- Utility: domanda sì/no
bool domandaSiNo(const char* domanda) {
Serial.println(domanda);
Serial.println("Digita 'y' per SI, 'n' per NO");
//ripetiamo finché l’utente non inserisce una risposta valida.
// Il ciclo si interrompe con un return (es. quando l’utente digita ‘y’ o ‘n’).
for (;;) {
char c = leggiChar();
if (c == 'y') {
Serial.println("Hai risposto: SI");
beep(100);
return true;
}
if (c == 'n') {
Serial.println("Hai risposto: NO");
beep(100);
return false;
}
Serial.println("Risposta non valida. Usa 'y' o 'n'.");
}
}
// Pausa "simulata breve" al posto di 2 minuti reali
void pausaBreve(const char* motivo, int secondi = 5) {
Serial.print("Pausa: ");
Serial.print(motivo);
Serial.print(" (");
Serial.print(secondi);
Serial.println("s)");
for (int i = 0; i < secondi; i++) {
digitalWrite(pinLed, HIGH);
delay(300);
digitalWrite(pinLed, LOW);
delay(700);
Serial.print(".");
}
Serial.println();
beep(100);
}
void setup() {
pinMode(pinLed, OUTPUT);
Serial.begin(115200);
delay(1000);
Serial.println("=== Risoluzione Conflitto - VERSIONE BASE ===");
Serial.println("Benvenuto! Segui le istruzioni sul Serial Monitor.");
pinMode(pinBuzzer, OUTPUT);
sequenzaAvvio();
}
void loop() {
// 1) Sicurezza del confronto
bool sicuro = false;
do {
sicuro = domandaSiNo("E' sicuro parlare adesso?");
if (!sicuro) {
Serial.println("OK, facciamo un time-out breve al posto di 2 minuti.");
pausaBreve("time-out", 5);
}
} while (!sicuro);
// 2) Definizione del problema
Serial.println("Definisci il problema in UNA frase (in classe va bene scriverla su carta).");
attendiConferma();
// 3) Turni + Parafrasi
bool parafrasiOk = false;
do {
Serial.println("Turno A (60s simulati).");
attendiConferma();
Serial.println("Turno B (60s simulati).");
attendiConferma();
parafrasiOk = domandaSiNo("Parafrasi reciproca corretta?");
} while (!parafrasiOk);
// 4) Opzioni di soluzione (almeno 2)
int numeroOpzioni = 0;
Serial.println("Genera almeno 2 opzioni di soluzione.");
for (;;) {
Serial.println("a = aggiungi opzione, f = fine (consentita solo se >= 2 opzioni)");
char c = leggiChar();
if (c == 'a') {
numeroOpzioni++;
Serial.print("Opzione aggiunta. Totale: ");
Serial.println(numeroOpzioni);
beep(100);
} else if (c == 'f') {
if (numeroOpzioni >= 2) {
Serial.println("OK, passiamo alla decisione.");
beep(100);
break;
} else {
Serial.println("Servono almeno 2 opzioni prima di terminare.");
}
} else {
Serial.println("Scelta non valida. Usa 'a' o 'f'.");
}
}
// 5) Decisione finale
bool accordo = domandaSiNo("C'e' accordo su una opzione?");
if (accordo) {
Serial.println("Piano d'azione: definire chi/fa/cosa/entro quando (scrivere su carta).");
Serial.println("Promemoria: verifica dopo 24 ore.");
Serial.println("FINE. Riavvio tra 5 secondi...");
pausaBreve("chiusura", 5);
} else {
Serial.println("Coinvolgi un mediatore o rinvia il confronto.");
Serial.println("Ritorno al controllo 'E' sicuro parlare?'.");
pausaBreve("ritorno", 3);
}
}



