Quick References per lo studio – Mini Gantt di progetto

Il mini-Gantt è il cruscotto dei lavori di gruppo: in una tabella unica vedi attività, responsabili, scadenze, stato e milestone. Non serve un software complesso: 5–8 attività ben definite, un responsabile (e un backup), date realistiche con buffer del 20% e codici semplici per lo stato (☐/▣/☑). È didatticamente prezioso perché rende visibile il processo, non solo il prodotto: chi fa cosa, quando, con quali dipendenze. Aiuta a prevenire il “tutto all’ultimo” e sostiene l’autovalutazione: se manca una definizione chiara di “fatto”, il blocco è dietro l’angolo. Chiusura imprescindibile: retrospettiva breve (“cosa tenere/cosa cambiare”) per migliorare il prossimo ciclo.

Perfetto per lavori di gruppo, PCTO e preparazione verifiche di lungo periodo. In una pagina ottieni il quadro d’insieme e la checklist operativa.

Scarica PDF A4 della guida operativaApri il sorgente Markdown su GitHub

Se non sai cos’è il Markdown segui il link

---
title: "QR - Mini‑Gantt di progetto"
version: "1.0"
autore: "<Classe/Team>"
licenza: "CC BY 4.0"
ultimo_aggiornamento: "31.08.2025"
---

| ID | Attività | Responsabile | Inizio | Fine | Stato | Note |
|----|----------|--------------|--------|------|-------|------|
| 1 | | | | | ☐/▣/☑ | |
| 2 | | | | | ☐/▣/☑ | |

## Milestone
- M1: 
- M2: 

Vediamo un esempio pratico su un’attività di laboratorio.

Mini-Gantt — “Stazione ambientale con Arduino Sensor Kit”

Setup progetto (premesse)

  • Team (4 studenti):
    PM (coordinamento), HW (cablaggi), SW (codice), DOCS (relazione/slide).
  • Durata: 2 settimane scolastiche (6 ore in laboratorio + 2 a casa).
  • Consegna: sketch .ino, demo funzionante, grafico dei dati, mini-report (2 pagine) o slide (6–8).

Tabella mini-Gantt (compilata)

Stati: ☐ non iniziato · ▣ in corso · ☑ completato

Versione PDF della tabella di esempio (ingrandita).

ID Attività Responsabile Inizio Fine Dipendenze Stato Definizione di “fatto”
1 Kick-off, ruoli, criteri di valutazione PM 02/10 02/10 Ruoli assegnati + checklist comune
2 Inventario kit e test IDE HW 02/10 02/10 1 IDE apre, board selezionata, cavo OK
3 Cablaggio sensori (Temp/Umid, Luce) HW 03/10 03/10 2 Wiring secondo schema + foto
4 Sketch base: lettura sensori + Serial SW 03/10 04/10 3 Serial.println() valori leggibili ogni 1s
5 Soglie e feedback (LED/Buzzer) SW 04/10 04/10 4 LED/Buzzer attivi se superate soglie
6 Logging dati (CSV) SW/DOCS 04/10 05/10 4 CSV con timestamp + 50 righe campione
7 Analisi rapida e grafico (foglio di calcolo) DOCS 05/10 05/10 6 Grafico linea luce/temp/umidità
8 Test integrato + bugfix PM+Tutti 06/10 06/10 5,6 10 min run stabile, nessun falso allarme
9 Slide/mini-report + foto schemi DOCS 06/10 07/10 7,8 6–8 slide/2 pagine, font leggibile
10 Prova demo e consegna PM 07/10 07/10 9 Repository/Drive ordinato + consegna docente

Milestone

  • M1 (03/10): Cablaggio completato e foto schema.
  • M2 (05/10): Dati registrati in CSV + grafico generato.
  • M3 (07/10): Demo + consegna finale.

Schema di lavoro (che cosa fare concretamente)

Wiring (HW):

  • Sensore temperatura/umidità → I²C o pin indicati dal Kit.
  • Sensore luce/Fotoresistenza → ingresso analogico A0.
  • LED + Buzzer → pin digitali (es. D5 buzzer, D6 LED).
  • Scatta foto del cablaggio finito (serve per la relazione).

Codice (SW):

  • setup(): Serial.begin(9600); test di lettura sensori; pinMode uscita LED/Buzzer.
  • loop(): leggi sensori → stampa timestamp,temp,umidità,luce → applica soglie (es. luce < 200 → LED rosso; temp > 28°C → buzzer breve).
  • File CSV: usa Serial + salvataggio lato PC (copiando dal monitor o con un logger semplice).

Documentazione (DOCS):

  • Tabella decisioni (soglie adottate e motivazione).
  • Grafico lineare (luce/temp/umidità) da CSV.
  • 1 pagina di “lezioni apprese” (cosa ha funzionato/cosa cambiare).

Coordinamento (PM):

  • Aggiorna stato ogni fine sessione (☐/▣/☑).
  • Verifica dipendenze (es. 6 parte solo dopo 4).
  • Mantiene lista bug e check pre-demo (vedi sotto).

Checklist tecnica rapida (per non perdere tempo)

  • IDE: scheda corretta (UNO/compatibile), porta seriale ok.
  • Librerie sensori installate (se necessarie).
  • Numeri pin nel codice = pin del wiring (evita errori “LED non va”).
  • delay() brevi; usa millis() per letture periodiche.
  • Stampa formato CSV coerente: ms,temperatura,umidità,luce.

Esempio di definizione soglie (adattabili)

  • Luce bassa: < 200 (scala 0–1023) → LED rosso acceso. Caldo eccessivo: temp > 28°C per > 5 s → beep corto ogni 2 s.
  • Umidità alta: umidità > 70% → messaggio su Serial.

Spiegate sempre perché avete scelto quelle soglie (es. classe luminosa, temperatura in aula, ecc.).

Rischi (da incollare vicino al Gantt)

  • Cavo/porta non riconosciuta → prova altro cavo/porta, riavvia IDE.
  • Rumore luce → media mobile su 5 letture.
  • Buzzer fastidioso → limita durata, usa segnale visivo in alternativa.
  • CSV confuso → intestazione time_ms,temp,hum,light e separatore coerente.

Buon lavoro 🙂

Lezione 9 – Corso di Elettronica Creativa con Arduino Sensor Kit

Sensore di temperatura ed umidità (DHT22)

Ho parlato in precedenti post dei sensori di temperatura ed umidità, nello specifico l’uso del diffusissimo DHT11. L’Arduino Sensor Kit li può usare entrambi, ma nel kit è presente il DHT22.

Caratteristiche tecniche del DHT22

Il DHT22 è un sensore digitale che integra:

  • un elemento capacitivo per l’umidità relativa (RH),
  • un sensore termico per la temperatura,
  • un microcontrollore che invia i dati su un’unica linea (single-wire digitale, non analogica).
  • Range tipici e specifiche:
    • Temperatura: –40…+80 °C (risoluzione 0,1 °C, tip. ±0,5 °C),
    • Umidità relativa: 0…100 % RH (risoluzione 0,1 % RH, tip. ±2 % RH, max ±5 %),
  • Alimentazione: 3,3–5 V,
  • Frequenza di campionamento: max 0,5 Hz (una misura ogni ~2 s).

Cos’è l’umidità relativa

L’umidità relativa (RH) indica quanta vapor d’acqua è presente nell’aria rispetto alla quantità massima che quell’aria potrebbe contenere alla stessa temperatura.

  • 50 % RH = l’aria contiene metà del vapore “possibile” a quella temperatura.
  • 100 % RH = saturazione (rischio di condensa).
    Poiché la capacità dell’aria di trattenere vapore cresce con la temperatura, la RH dipende dalla temperatura: per questo i sensori come il DHT22 misurano entrambe le grandezze.

Mi è capitato spesso rispondere alla domanda: “ma Prof. cosa è meglio usare il DHT11 o il DHT22”

Se si dispone di entrambi certamente scegliere il DHT22 è da preferire, ma perché?

  • Precisione e range migliori: DHT22 copre –40…+80 °C (vs 0…+50 °C del DHT11) con ±0,5 °C tipici; RH 0…100 % con ±2–5 % (DHT11 è meno preciso e più limitato).
  • Risoluzione più fine: 0,1 °C / 0,1 % RH (utile per realizzare grafici e verificare trend).

Un vantaggio derivante dall’uso dell’Arduino Sensor Kit è che il DHT22 viene connesso all’Arduino mediante connessione I²C pertanto per il suo utilizzo è possibile collegarlo ad una delle uscite I²C presenti sulla Base Shield.

Veniamo ora agli esempi pratici, ne indico 6 di base, come sempre nei commenti la spiegazione. In classe ne realizzerò altri in cui mostreremo ad esempio la rilevazione della temperatura a media mobile a 10 campioni, attivazione di allarmi e ventole e molto altro.

Connessioni usate in questa lezione:

  • Sensore di Temperatura ed Umidità: connesso ad una qualsiasi dei pin I²C della Base Shield.
  • Display OLED: connesso ad una qualsiasi dei pin I²C della Base Shield.
  • Diodo LED: connesso al D6.

Esempio 01: sensore ambiente – lettura base (temperatura – umidità)

/*
  Prof. Maffucci Michele
  01.10.2025
  Sensore Ambiente – Lettura base (Temperatura + Umidità)

  NOTE:
    - DHT20 (I2C): decommenta la define Environment_I2C e abilita Wire.begin()
    - DHT11 (pin D3 via Base Shield): commenta la define, la libreria gestisce il pin di default
*/

#include <Arduino_SensorKit.h>

// >>> Decommenta se il sensore è DHT20 (I2C) <<<
#define Environment Environment_I2C

void setup() {
  Serial.begin(9600);
  // Necessario per DHT20 (I2C); non influisce negativamente su DHT11
  Wire.begin();

  Environment.begin();  // inizializza il sensore ambiente (DHT11 o DHT20)
}

void loop() {
  float temperaturaC = Environment.readTemperature(); // °C
  float umiditaRH    = Environment.readHumidity();    // %RH

  // Stampa della temperatura e dell'umidità sulla Serial Monitor ogni secondo
  Serial.print("Temperatura: ");
  Serial.print(temperaturaC, 1);
  Serial.print(" °C   Umidità: ");
  Serial.print(umiditaRH, 1);
  Serial.println(" %");

  delay(1000);
}

Esempio 02: Lettura Temperatura e Umidità con allarme su D6 (LED)

In questo esempio utilizziamo il diodo LED connesso al D6 come allarme, pertanto verrà acceso se la temperatura supera un valore di soglia impostato.

/*
  Prof. Maffucci Michele
  01.10.2025
  Lettura Temperatura e Umidità con allarme su D6 (LED)

  - Allarme: LED su D6 si accende se T > soglia.
  - Messaggi su Serial Monitor: ALERT all'attivazione, DISATTIVATO allo spegnimento.
  - DHT20 (I2C): lascia attiva la define Environment_I2C.
  - DHT11: commenta la define sotto; la libreria gestisce il pin del Base Shield.
*/

#include "Arduino_SensorKit.h"

#define Environment Environment_I2C

// Configurazione allarme
const int pinLedAllarme = 6;            // LED collegato al pin D6
const float sogliaTemperaturaC = 25.0;  // soglia in °C

bool allarmeAttivo = false;  // stato attuale dell'allarme

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

  // Necessario per DHT20 e per eventuali altre periferiche I2C (OLED, ecc.)
  Wire.begin();

  // Inizializza il sensore ambiente (DHT11 o DHT20 a seconda della define)
  Environment.begin();

  // LED di allarme
  pinMode(pinLedAllarme, OUTPUT);
  digitalWrite(pinLedAllarme, LOW);

  Serial.println("== Avvio lettura Temperatura & Umidita' con allarme su D6 ==");
  Serial.print("Soglia T = ");
  Serial.print(sogliaTemperaturaC, 1);
  Serial.println(" C");
}

void loop() {
  // Letture dal sensore
  float temperaturaC = Environment.readTemperature();  // °C
  float umiditaRH = Environment.readHumidity();        // %RH

// --- Gestione allarme con isteresi ---
// Usiamo DUE soglie diverse per evitare ON/OFF continui vicino al limite.
//  - Soglia di ACCENSIONE  (T_on):  temperaturaC > sogliaTemperaturaC
//  - Soglia di SPEGNIMENTO (T_off): temperaturaC < sogliaTemperaturaC // Finché T resta tra T_off e T_on, manteniamo lo stato attuale (nessun cambiamento). if (!allarmeAttivo && temperaturaC > sogliaTemperaturaC) {
  // Caso 1: l'allarme è attualmente OFF e la temperatura SUPERA la soglia di ACCENSIONE.
  // Accendiamo l'allarme (LED ON) e stampiamo un messaggio di ALERT.
  allarmeAttivo = true;
  digitalWrite(pinLedAllarme, HIGH);

  Serial.print("!!! ALERT: Temperatura sopra soglia: ");
  Serial.print(temperaturaC, 1);
  Serial.println(" C");

} else if (allarmeAttivo && temperaturaC < sogliaTemperaturaC) { // Caso 2: l'allarme è attualmente ON e la temperatura SCENDE sotto la soglia di SPEGNIMENTO // Spegniamo l'allarme (LED OFF) e informiamo che è rientrato. allarmeAttivo = false; digitalWrite(pinLedAllarme, LOW); Serial.print("Allarme DISATTIVATO: Temperatura rientrata: "); Serial.print(temperaturaC, 1); Serial.println(" C"); } // Nota sui casi limite: // - Se temperaturaC == sogliaTemperaturaC, NON si accende (serve ">" strettamente).
// - Se temperaturaC == (sogliaTemperaturaC, NON si spegne (serve "<" strettamente).

  // Stampa della temperatura e dell'umidità sulla Serial Monitor
  Serial.print("T=");
  Serial.print(temperaturaC, 1);
  Serial.print(" C   RH=");
  Serial.print(umiditaRH, 1);
  Serial.print(" %   ALLARME=");
  if (allarmeAttivo) {
    Serial.println("ON");
  } else {
    Serial.println("OFF");
  }

  delay(1000);
}

Esempio 03: Lettura Temperatura e Umidità con allarme su D6 (LED) con isteresi

Premessa

In elettronica, isteresi è la presenza di due soglie diverse per il passaggio tra due stati, così l’uscita dipende non solo dal valore istantaneo dell’ingresso, ma anche dalla sua storia. Serve a evitare commutazioni rapide e instabili quando il segnale oscilla vicino a una soglia.

Come nell’esempio precedente utilizziamo il diodo LED connesso al D6 come allarme, inoltre useremo l’isteresi per evitare che il LED “sfarfalli” (ON/OFF ripetuti) quando la temperatura oscilla vicino alla soglia a causa di rumore o piccole variazioni.

Nello sketch che segue l’isteresi funziona in questo modo:

  • Soglia di attivazione: sogliaTemperaturaC = 26.0 °C
    L’allarme si accende appena T > 26.0 °C.
  • Isteresi: isteresiC = 0.5 °C
    L’allarme si spegne solo quando T < 26.0 − 0.5 = 25.5 °C.

Quindi usi due soglie:

  • T_on = 26.0 °C (accendo quando la supero)
  • T_off = 25.5 °C (spengo solo quando scendo sotto)

Senza isteresi, se la temperatura è nell’intorno di intorno a 26 °C (es. 25.9 ↔ 26.1 per il rumore), l’allarme continuerebbe ad accendersi e spegnersi rapidamente. Con l’isteresi, una volta acceso, resta acceso finché non rientra ben al di sotto della soglia, evitando lampeggi/ronzii fastidiosi e messaggi “ALERT” ripetuti.

Quindi come regola generale per i sensori DHT che utilizziamo in laboratorio valori tra 0,3 e 1°C sono di solito sufficienti. Se è presente ancora sfarfallio, aumentare leggermente; se la risposta è troppo lenta a spegnersi, ridurre.

Come schema logico si tenga in conto:

  • Se allarme OFF e T > T_on → accendere
  • Se allarme ON e T < T_off → spegnere
  • Altrimenti mantenere lo stato corrente

È la stessa logica usata nei termostati: due soglie (accensione/spegnimento) invece di una sola, per ottenere un comportamento stabile.

/*
  Prof. Maffucci Michele
  01.10.2025
  Lettura Temperatura e Umidità con allarme su D6 (LED) con isteresi

  - Allarme: LED su D6 si accende se T > soglia.
  - Messaggi su Serial Monitor: ALERT all'attivazione, DISATTIVATO allo spegnimento.
  - DHT20 (I2C): lascia attiva la define Environment_I2C.
  - DHT11: commenta la define sotto; la libreria gestisce il pin del Base Shield.
*/

#include <Arduino_SensorKit.h>

#define Environment Environment_I2C

// Configurazione allarme
const int pinLedAllarme = 6;            // LED collegato al pin D6
const float sogliaTemperaturaC = 25.0;  // soglia in °C
const float isteresiC = 0.5;            // isteresi per evitare lampeggi (spegnimento sotto soglia - isteresi)

bool allarmeAttivo = false;  // stato attuale dell'allarme

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

  // Necessario per DHT20 e per eventuali altre periferiche I2C (OLED, ecc.)
  Wire.begin();

  // Inizializza il sensore ambiente (DHT11 o DHT20 a seconda della define)
  Environment.begin();

  // LED di allarme
  pinMode(pinLedAllarme, OUTPUT);
  digitalWrite(pinLedAllarme, LOW);

  Serial.println("== Avvio lettura Temperatura & Umidita' con allarme su D6 ==");
  Serial.print("Soglia T = ");
  Serial.print(sogliaTemperaturaC, 1);
  Serial.println(" C");
}

void loop() {
  // Letture dal sensore
  float temperaturaC = Environment.readTemperature();  // °C
  float umiditaRH = Environment.readHumidity();        // %RH

// --- Gestione allarme con isteresi ---
// Usiamo DUE soglie diverse per evitare ON/OFF continui vicino al limite.
//  - Soglia di ACCENSIONE  (T_on):  temperaturaC > sogliaTemperaturaC
//  - Soglia di SPEGNIMENTO (T_off): temperaturaC < (sogliaTemperaturaC - isteresiC) // Finché T resta tra T_off e T_on, manteniamo lo stato attuale (nessun cambiamento). if (!allarmeAttivo && temperaturaC > sogliaTemperaturaC) {
  // Caso 1: l'allarme è attualmente OFF e la temperatura SUPERA la soglia di ACCENSIONE.
  // Accendiamo l'allarme (LED ON) e stampiamo un messaggio di ALERT.
  allarmeAttivo = true;
  digitalWrite(pinLedAllarme, HIGH);

  Serial.print("!!! ALERT: Temperatura sopra soglia: ");
  Serial.print(temperaturaC, 1);
  Serial.println(" C");

} else if (allarmeAttivo && temperaturaC < (sogliaTemperaturaC - isteresiC)) { // Caso 2: l'allarme è attualmente ON e la temperatura SCENDE sotto la soglia di SPEGNIMENTO // (cioè sotto la soglia di accensione meno l'isteresi). // Spegniamo l'allarme (LED OFF) e informiamo che è rientrato. allarmeAttivo = false; digitalWrite(pinLedAllarme, LOW); Serial.print("Allarme DISATTIVATO: Temperatura rientrata: "); Serial.print(temperaturaC, 1); Serial.println(" C"); } // Nota sui casi limite: // - Se temperaturaC == sogliaTemperaturaC, NON si accende (serve ">" strettamente).
// - Se temperaturaC == (sogliaTemperaturaC - isteresiC), NON si spegne (serve "<" strettamente).
// Questo evita cambi di stato ripetuti quando il valore oscilla esattamente sulla soglia.

  // Stampa della temperatura e dell'umidità sulla Serial Monitor
  Serial.print("T=");
  Serial.print(temperaturaC, 1);
  Serial.print(" C   RH=");
  Serial.print(umiditaRH, 1);
  Serial.print(" %   ALLARME=");
  if (allarmeAttivo) {
    Serial.println("ON");
  } else {
    Serial.println("OFF");
  }

  delay(1000);
}

Esempio 04: Lettura Temperatura e Umidità con stampa su OLED e Serial Monitor

Abbiamo visto nella precedente lezione l’uso del display OLED dell’Arduino Sensor Kit, utilizziamolo ora per mostrare temperatura ed umidità che stamperemo anche sulla Serial Monitor.

/*
  Prof. Maffucci Michele
  01.10.2025
  Lettura Temperatura e Umidità con stampa su OLED e Serial Monitor

  - DHT20 (I2C): lascia attiva la define Environment_I2C.
  - DHT11: commenta la define sotto; la libreria gestisce il pin del Base Shield.
*/

#include <Arduino_SensorKit.h>

#define Environment Environment_I2C

void setup() {
  Serial.begin(9600);
  Wire.begin();         // necessario con DHT20/OLED su I2C
  Environment.begin();  // DHT11 o DHT20 (in base alla define)
  Oled.begin();         // inizializza OLED

  // Orientamento e font leggibile
  Oled.setFlipMode(true);
  Oled.setFont(u8x8_font_chroma48medium8_r);

  // Pulisci UNA volta all’avvio
  Oled.clearDisplay();

  // Etichette fisse (non cambiano > non serve riscriverle)
  Oled.setCursor(0, 2);
  Oled.print("T=");
  Oled.setCursor(0, 4);
  Oled.print("RH=");
}

void loop() {

  float tC = Environment.readTemperature();  // °C
  float rH = Environment.readHumidity();     // %RH

  // --Stampa su OLED

  // Sovrascrivo soltanto il campo variabile, SENZA clearDisplay
  Oled.setCursor(2, 2);  // subito dopo "T="
  Oled.print(tC);

  Oled.setCursor(3, 4);  // subito dopo "RH="
  Oled.print(rH);

  // --Stampa su seriale
  Serial.print("T=");
  Serial.print(tC);
  Serial.print(" C   RH=");
  Serial.print(rH);
  Serial.println(" %");

  delay(500);  // aggiorna 2 volte al secondo (meno sfarfallio)
}

Esempio 05: Lettura Temperatura e Umidità con stampa su OLED e Serial Monitor ed accensione LED con isteresi

Aggiungiamo alla versione precedente l’allarme dato con il LED.

/*
  Prof. Maffucci Michele
  01.10.2025
  Lettura Temperatura e Umidità con stampa su OLED e Serial Monitor
  ed accensione LED con isteresi

  - DHT20 (I2C): lascia attiva la define Environment_I2C.
  - DHT11: commenta la define sotto; la libreria gestisce il pin del Base Shield.
*/

#include <Arduino_SensorKit.h>

#define Environment Environment_I2C

// Configurazione allarme
const int pinLedAllarme = 6;            // LED collegato al pin D6
const float sogliaTemperaturaC = 25.0;  // soglia in °C
const float isteresiC = 0.5;            // isteresi per evitare lampeggi (spegnimento sotto soglia - isteresi)

bool allarmeAttivo = false;  // stato attuale dell'allarme

void setup() {
  Serial.begin(9600);
  Wire.begin();         // necessario con DHT20/OLED su I2C
  Environment.begin();  // DHT11 o DHT20 (in base alla define)
  Oled.begin();         // inizializza OLED

  // Orientamento e font leggibile
  Oled.setFlipMode(true);
  Oled.setFont(u8x8_font_chroma48medium8_r);

  // Pulisci UNA volta all’avvio
  Oled.clearDisplay();

  // Etichette fisse (non cambiano → non serve riscriverle)
  Oled.setCursor(0, 2);
  Oled.print("T=");
  Oled.setCursor(0, 4);
  Oled.print("RH=");

  pinMode(pinLedAllarme, OUTPUT);
  digitalWrite(pinLedAllarme, LOW);

  Serial.println("== Avvio lettura Temperatura & Umidita' con allarme su D6 ==");
  Serial.print("Soglia T = ");
  Serial.print(sogliaTemperaturaC, 1);
  Serial.println(" C");
}

void loop() {

  float tC = Environment.readTemperature();  // °C
  float rH = Environment.readHumidity();     // %RH

// --- Gestione allarme con isteresi ---
// Usiamo DUE soglie diverse per evitare ON/OFF continui vicino al limite.
//  - Soglia di ACCENSIONE  (T_on):  temperaturaC > sogliaTemperaturaC
//  - Soglia di SPEGNIMENTO (T_off): temperaturaC < (sogliaTemperaturaC - isteresiC) // Finché T resta tra T_off e T_on, manteniamo lo stato attuale (nessun cambiamento). if (!allarmeAttivo && tC > sogliaTemperaturaC) {
  // Caso 1: l'allarme è attualmente OFF e la temperatura SUPERA la soglia di ACCENSIONE.
  // Accendiamo l'allarme (LED ON) e stampiamo un messaggio di ALERT.
  allarmeAttivo = true;
  digitalWrite(pinLedAllarme, HIGH);

  Serial.print("!!! ALERT: Temperatura sopra soglia: ");
  Serial.print(tC, 1);
  Serial.println(" C");

} else if (allarmeAttivo && tC < (sogliaTemperaturaC - isteresiC)) {
  // Caso 2: l'allarme è attualmente ON e la temperatura SCENDE sotto la soglia di SPEGNIMENTO
  // (cioè sotto la soglia di accensione meno l'isteresi).
  // Spegniamo l'allarme (LED OFF) e informiamo che è rientrato.
  allarmeAttivo = false;
  digitalWrite(pinLedAllarme, LOW);

  Serial.print("Allarme DISATTIVATO: Temperatura rientrata: ");
  Serial.print(tC, 1);
  Serial.println(" C");
}

  // -- Stampa su OLED --

  // Sovrascrivo soltanto il campo variabile, SENZA clearDisplay
  Oled.setCursor(2, 2);  // subito dopo "T="
  Oled.print(tC);

  Oled.setCursor(3, 4);  // subito dopo "RH="
  Oled.print(rH);

  // -- Stampa su seriale --
  Serial.print("T=");
  Serial.print(tC);
  Serial.print(" C   RH=");
  Serial.print(rH);
  Serial.println(" %");

  delay(500);  // aggiorna 2 volte al secondo (meno sfarfallio)
}

Esempio 06: lettura Temperatura & Umidità con stampa su OLED e Serial Monitor ed accensione LED – su OLED viene mostrato allarme

Aggiungiamo allo sketch precedente la visualizzazione del messaggio di alert sul display. Per semplicità di lettura ho tolto i commenti nella sezione: “Gestione allarme con isteresi”, lasciando solo quelli che si riferiscono alla stampa dell’alert sul display.

/*
  Prof. Maffucci Michele
  01.10.2025
  Lettura Temperatura & Umidità con stampa su OLED e Serial Monitor
  ed accensione LED - su OLED viene mostrato allarme

  - DHT20 (I2C): lascia attiva la define Environment_I2C.
  - DHT11: commenta la define sotto; la libreria gestisce il pin del Base Shield.
*/

#include <Arduino_SensorKit.h>

#define Environment Environment_I2C

// Configurazione allarme
const int pinLedAllarme = 6;            // LED collegato al pin D6
const float sogliaTemperaturaC = 25.0;  // soglia in °C
const float isteresiC = 0.5;            // isteresi per evitare lampeggi (spegnimento sotto soglia - isteresi)

bool allarmeAttivo = false;  // stato attuale dell'allarme

void setup() {
  Serial.begin(9600);
  Wire.begin();         // necessario con DHT20/OLED su I2C
  Environment.begin();  // DHT11 o DHT20 (in base alla define)
  Oled.begin();         // inizializza OLED

  // Orientamento e font leggibile
  Oled.setFlipMode(true);
  Oled.setFont(u8x8_font_chroma48medium8_r);

  // Pulisci UNA volta all’avvio
  Oled.clearDisplay();

  // Etichette fisse (non cambiano → non serve riscriverle)
  Oled.setCursor(0, 2);
  Oled.print("T=");
  Oled.setCursor(0, 4);
  Oled.print("RH=");

  pinMode(pinLedAllarme, OUTPUT);
  digitalWrite(pinLedAllarme, LOW);

  Serial.println("== Avvio lettura Temperatura & Umidita' con allarme su D6 ==");
  Serial.print("Soglia T = ");
  Serial.print(sogliaTemperaturaC, 1);
  Serial.println(" C");
}

void loop() {

  float tC = Environment.readTemperature();  // °C
  float rH = Environment.readHumidity();     // %RH

  // --- Gestione allarme con isteresi ---
  if (!allarmeAttivo && tC > sogliaTemperaturaC) {
    allarmeAttivo = true;
    digitalWrite(pinLedAllarme, HIGH);

    // cursore nell'angolo in alto a destra
    Oled.setCursor(0, 0);
    // stampa del messaggio di alert
    Oled.print("ALERT: t>tMax");
    Serial.print("!!! ALERT: Temperatura sopra soglia: ");
    Serial.print(tC, 1);
    Serial.println(" C");
  } else if (allarmeAttivo && tC < (sogliaTemperaturaC - isteresiC)) {
    allarmeAttivo = false;
    digitalWrite(pinLedAllarme, LOW);

    // cursore nell'angolo in alto a destra
    Oled.setCursor(0, 0);
    // cancellazione con spazi del messaggio di alert
    Oled.print("             ");
    Serial.print("Allarme DISATTIVATO: Temperatura rientrata: ");
    Serial.print(tC, 1);
    Serial.println(" C");
  }

  // -- Stampa su OLED --

  // Sovrascrivo soltanto il campo variabile, SENZA clearDisplay
  Oled.setCursor(2, 2);  // subito dopo "T="
  Oled.print(tC);

  Oled.setCursor(3, 4);  // subito dopo "RH="
  Oled.print(rH);

  // -- Stampa su seriale --
  Serial.print("T=");
  Serial.print(tC);
  Serial.print(" C   RH=");
  Serial.print(rH);
  Serial.println(" %");

  delay(500);  // aggiorna 2 volte al secondo (meno sfarfallio)
}

Buon Coding a tutti 🙂

Quick References per lo studio – Checklist pre-verifica

Questa checklist mi piace definirla “un paracadute cognitivo”: in 3 minuti aiuta a controllare ciò che conta davvero prima di una prova. Tocca quattro aree chiave: contenuti, materiali, strategia del tempo, benessere, in più ho inserito una parte logistica e regole per evitare dimenticanze che costano punti. Non sostituisce lo studio: lo rende verificabile in modo chiaro e tracciabile ed anche consapevole.

Scarica PDF A4 della guida operativaApri il sorgente Markdown su GitHub

Se non sai cos’è il Markdown segui il link

---
title: "QR – Checklist pre-verifica"
version: "1.1"
autore: "<Classe/Studente>"
licenza: "CC BY 4.0"
ultimo_aggiornamento: "2025-09-30"
---

## Contenuti (sapere e saper fare)
- [ ] Ho coperto tutti gli argomenti della griglia ufficiale
- [ ] Ho svolto ≥3 esercizi rappresentativi per **ogni** argomento
- [ ] Ho rivisto gli errori frequenti e scritto una **mini-spiegazione corretta**
- [ ] Ho 1 esempio **risolto e commentato** per l’orale (se previsto)

## Materiali (cosa porto)
- [ ] Penne + riserva / correttore / righello
- [ ] Calcolatrice **consentita** (modalità esame se richiesta)
- [ ] Formulari/schede **consentite** (nome e data in alto)
- [ ] Documento / tessera / fogli protocollo (se richiesti)

## Strategia tempo (piano di gara)
- [ ] Lettura consegna (2–3′) → sottolineo verbi d’azione e vincoli
- [ ] Ordino gli esercizi: **facili → medi → difficili**
- [ ] Stima minuti per esercizio: … / … / …  (buffer +20%)
- [ ] Ultimi 5–10′ per **ricontrollo** e intestazione

## Benessere (corpo + attenzione)
- [ ] Sonno ≥7 h
- [ ] Idratazione / snack leggero
- [ ] Smartphone **spento** e fuori vista
- [ ] 2′ di respirazione se sento ansia (4-4-6)

## Logistica & regole
- [ ] Aula/orario verificati – arrivo 10′ prima
- [ ] Postazione ordinata (niente fogli non autorizzati)
- [ ] Nome, classe e data su ogni foglio
- [ ] Riletta la **policy** su citazioni/uso strumenti

## Piano d’emergenza (se mi blocco)
- [ ] Passo al punto successivo (max 90″ di stallo)
- [ ] Scrivo i **passi logici** anche se non completo
- [ ] Torno indietro con la checklist di controllo

## Note personali
- Cose da ricordare: …
- Errori tipici da evitare: …

In genere consiglio di usarla in questo modo:

  • La sera prima (3 minuti): spuntare le voci, preparare ciò che manca, chiudere con 5 minuti di ripasso mirato sugli errori tipici.
  • Mattina della prova (2 minuti): rivedere strategia tempo, impostare l’ordine degli esercizi e decidere un tempo di riserva per rivedere/correggere.
  • Durante (ultimi 5–10 minuti): ricontrollo finale: intestazione, unità di misura, passaggi logici, ordine e pulizia.

Penso che una lista di questo genere possa ridurre l’ansia (sai cosa fare e quando), abbassa i “colli di bottiglia” (materiali, tempi, regole) e si allinea alle rubriche di valutazione: ciò che la checklist rende visibile è spesso ciò che fa la differenza nel giudizio finale.

Esempio concreto su un esercizio di un possibile compito
Compito sui diagrammi di flusso

Consegna per gli studenti

Scegli un problema reale della tua giornata e trasformalo in un diagramma di flusso che porti a una decisione chiara o a un risultato misurabile. Usa blocchi standard (Start/Stop, Azione, Decisione, Input/Output) e gestisci almeno due ramificazioni condizionali.

Possibile risposta

  • Problema: come scegliere il mezzo per arrivare puntuale a scuola?
  • Input disponibili: orario attuale, tempo residuo (min), meteo (pioggia sì/no), bici disponibile sì/no, orario bus (min).
  • Output: mezzo scelto (a piedi / bici / bus) + messaggio “parti ora” / “sei in ritardo”.

Flowchart (Mermaid)

flowchart TD
  A([Start]) --> B[Leggi orario e tempo residuo]
  B --> C{Tempo residuo >= 25 min?}
  C -- No --> D{Bus in arrivo entro 10 min?}
  D -- Sì --> E[Prendi BUS]
  D -- No --> F[Chiedi passaggio / Avvisa ritardo]
  C -- Sì --> G{Piove?}
  G -- Sì --> D
  G -- No --> H{Bici disponibile e gomme ok?}
  H -- Sì --> I[Prendi BICI]
  H -- No --> L[Vai A PIEDI]
  E --> Z([Stop])
  F --> Z
  I --> Z
  L --> Z

Flowchart

Cosa valuto (mini-rubrica 10pt)

  • Correttezza sintattica dei blocchi e delle frecce (2)
  • Chiarezza degli input/output e delle condizioni (2)
  • Completezza (almeno due decisioni, tutti i casi gestiti) (3)
  • Ordine e leggibilità (etichette brevi, layout pulito) (1)
  • Coerenza con il problema reale (2)

Suggerimenti pratici

  • Definisci prima variabili e soglie (es. “tempo residuo ≥ 25′”).
  • Scrivi le domande sì/no in forma chiara (“Piove?” “Bus in arrivo entro 10′?”).
  • Se un ramo diventa lungo, prova a modularizzare (sotto-diagramma “Controllo bici”).
  • Alla fine, ripassa con la checklist: blocchi chiusi, nessuna freccia sospesa, tutti i casi coperti.

Buon ripasso 🙂

Arduino Plate v03 – Base di sperimentazione compatta, modulare e senza viti

La nuova platea per Arduino UNO R3 e breadboard: più piccola, stampabile su piatti 180×180 mm, con supporto a slitta e contenitore breadboard ad incastro. Sorgenti 3D e laser inclusi.

Questa platea nasce dal bisogno quotidiano di avere una base di sperimentazione ordinato, riutilizzabile e accessibile per le attività in laboratorio.
Dopo la v02 che è stata utilizzata da diversi colleghi in altri istituti, ho raccolto le osservazioni dei miei studenti e quelle degli insegnanti ed ho realizzato l’Arduino Plate v03: stessa filosofia e credo più pratica.

In alcune classi l’assemblaggio è a tutti gli effetti attività di laboratorio; per questo ho organizzato i passaggi in modo sequenziale e completo. I lettori “più maker” non si sorprendano della presenza di istruzioni di base: con i più giovani è fondamentale non dare nulla per scontato.

Attualmente sto utilizzando questa Plate come la mia classe 5 Elettronica su cui svolgo attività di  Laboratorio di Sistemi Elettronici, ma verrà utilizzata da altri colleghi dell’indirizzo.

Caratteristiche

  • Compatta: il layout è stato ripensato per stare su piatti piccoli 180×180 mm (anche stampanti entry-level).
  • Zero viti (se volete): la UNO R3 e la R4 scorrono e si bloccano in un supporto a slitta; nessun cacciavite per montare/smontare.
  • Breadboard non incollata: alloggia in un contenitore ad incastro, esce e rientra ed è assicurata mediante uno spessore.
  • Modulare: restano disponibili fori/slot per fissare piccole schede o sensori aggiuntivi.
  • Opzione viti: se preferite, potete comunque fissare Arduino con viti.

Cosa condivido

  • Sorgenti 3D (STL)
  • Sorgenti laser (PDF) + piccoli componenti stampati in 3D
  • Istruzioni di stampa/taglio e montaggio
  • Suggerimenti didattici per l’uso in classe

Download include:  

  • STL (stampa 3D, 4 pezzi)
  • PDF (taglio laser, 3 pezzi)

Per prelevare i file seguire il link su: Thingiverse

Se replicate oppure adattate il progetto, se puoi citami e condividi le tue varianti: è così che cresce la cultura Maker. 🙂

Componenti del progetto

Versione A – Solo stampa 3D (4 elementi)

  1. Base forata (layout compatto)
  2. Supporto a slitta per Arduino UNO R3
  3. Contenitore breadboard (per breadboard 830 punti)
  4. Clip/fermo

Versione B – Ibrida laser + 3D (3 elementi laser + 3 elementi 3D)

  • Laser: base + cornice + pannello superiore
  • 3D: supporto a slitta UNO, contenitore breadboard, piccoli distanziali/clip

Gli unici elementi da incollare (con nastro biadesivo) sono:  

  • Base Arduino (supporto a slitta) sulla platea
  • Contenitore breadboard sulla platea  
  • Tutto il resto resta smontabile.

Assemblaggio (passo-passo)

  1. Prepara la base (stampa o laser).
  2. Applica il biadesivo sotto al supporto a slitta e posizionalo sulla base.
  3. Inserisci Arduino UNO R3 nella slitta: infila la scheda e spingila fino a battuta; verifica che USB e jack restino comodi.
  4. Fissa il contenitore breadboard con biadesivo nella sede dedicata; inserisci la breadboard a incastro.
  5. (Opzionale) Usa viti nei fori passanti dedicati se preferisci un montaggio tradizionale o permanente.

Obiettivo (che consiglio): non vincolare in modo definitivo gli apparati alla base, per poterli riusare in mille attività.

Per quanto riguarda la versione da tagliare a laser, l’involucro della breadboard viene fissata a filo della base, una volta incollato procedete con l’involucro dell’Arduino ed utilizzate come distanziale lo spessore che verrà incollato sotto la breadboard, in questo modo sarete certi che non fisserete storta la base dell’Arduino.

Come ultima fase procedete con l’incollare gli spessori, il più stretto da fissare in prossimità del manico e l’altro al di sotto della breadboard, nell’immagine e nel video potete vedere come sono stati fissati.

Buon Making a tutti 🙂

Quick References per lo studio – Mappa concettuale

La mappa concettuale è uno strumento logico-relazionale: non un disegno bello, ma una rete di concetti collegati da parole-legame con verbi (“X causa Y”, “A è parte di B”). Guidando a passare dal generale al particolare, aiuta a scomporre capitoli densi, preparare orali e costruire ponti tra discipline. È potente perché obbliga alla sintesi (un’idea per nodo), alla gerarchia (5–7 rami principali) e alle connessioni trasversali (quando due rami dialogano). In ottica inclusiva, offre un supporto visivo per chi beneficia di organizzatori grafici e riduce il carico cognitivo. La regola d’oro: poche forme, pochi colori (per categorie), parole-legame sempre esplicite. L’obiettivo non è “riempire lo spazio”, ma rendere inferenze e relazioni leggibili in 30 secondi.

Scarica PDF A4 della guida operativaApri il sorgente Markdown su GitHub

Se non sai cos’è il Markdown segui il link

---
title: "QR - Mappa concettuale"
version: "1.0"
autore: "<Classe/Studente>"
licenza: "CC BY 4.0"
ultimo_aggiornamento: "31.08.2025"
---

## Tema centrale
< concetto principale >

## Rami principali
- < ramo 1 — parola‑legame → sotto‑concetti >
- < ramo 2 — parola‑legame → sotto‑concetti >
- < ramo 3 — parola‑legame → sotto‑concetti >

## Collegamenti trasversali
- < concetto A > ↔ < concetto B > (perché …)

## Esempio di frase‑legame
" **causa**  perché …"