Realizzare un Cronometro Digitale con Arduino

Obiettivo: Realizzare un cronometro digitale per misurare lo scorrere del tempo in millisecondi utilizzando il microcontrollore Arduino, un display LCD e due pulsanti
Un progetto realizzato dagli alunni della classe 3ATLC dell’Istituto Tecnico Industriale “Enrico Mattei” di Urbino:
– Benedetti Nicolas
– Puca Edoardo

Componenti elettronici:

  • Arduino UNO
  • Breadboard
  • 2 Resistenze da 100 Ohm per i pulsanti
  • 1 Display LCD
  • 2 Pulsanti

Pre-requisiti:


Blinking Led Senza Delay: MILLIS()


TeoriaRealizzare un cronometro digitale con il controllore Arduino, è relativamente semplice. Per implementare questo dispositivo, basta collegare arduino ad un display LCD ed utilizzare l’istruzione millis() nell’apposito sketch.
Nel dettaglio, la funzione millis restituisce il numero di millisecondi che sono passati da quando la board Arduino ha eseguito il programma corrente. Questo numero si riazzera dopo circa 50 giorni.
A tale fine è importante ribadire che mediante la funzione millis è possibile effettuare più misurazioni nel corso del tempo e per calcolare il tempo trascorso tra una misurazione e l’altra basta fare al differenza:

tempo = misura2 – misura1 

Collegamento Circuitale:

Collegamento Circuitale

Codice:

Attraverso l’utilizzo della funzione millis è possibile realizzare un cronometro digitale con il controllore Arduino. Nel caso specifico due differenti misure vengono effettuate per determinare il tempo trascorso. La prima misura viene salvata nella variabile “tempoI” mentre la seconda nella variabile “tempoF“. Il tempo trascorso tra le due differenti misure viene memorizzato nella variabile”tempo” ottenuta come la differenza tra “tempoF” e “tempoI“.



Tinkercad






Realizzazione di un Gioco a Quiz – La macchina a stati finiti

Obiettivo: Realizzare un gioco a Quiz mediante pulsanti e display LCD 16×2 (basato su un Driver Hitachi HD44780). L’attività prevede la realizzazione software di una macchina a stati.



Componenti elettronici:

  • Arduino UNO
  • Breadboard
  • 1 Display LCD (e.g., 1602A) compatibile con Driver Hitachi HD44780 
  • 1 Resistenza da 220 Ohm (per il display)
  • 1 Trimmer da 10 kOhm (per il display)
  • 2 Pulsanti
  • 2 Resistenze da 1kOhm (per i pulsanti)

Pre-requisiti:


Come Collegare un Display LCD ad Arduino



LED e Pulsante


TeoriaL’utilizzo di una progettazione basata sul concetto di macchina a stati finiti permette la facile realizzazione di apparati elettronici e sistemi capaci di fornire output desiderati a partire da specifici input ricevuti. Questo paradigma si basa sulla definizione degli stati di funzionamento del dispositivo da realizzare e sul codice associato allo stato stesso. A seguire sono riportati alcuni esempi pratici di stati di sistemi generici:

  • Semaforo: verde, giallo, rosso
  • Ascensore: primo piano, secondo piano, etc
  • Cancello: aperto, chiuso

Da un punto di vista pratico si potrebbe affermare che: “Attraverso una macchina a stati è possibile avere tanti loop quanti sono gli stati del dispositivo in questione “. Tuttavia è importante considerare che solamente uno di questi loop è attivo. (La macchina non può torvarsi in più stati contemporaneamente).
Nel caso specifico di un gioco a quiz gli stati sono rappresentati dalle:

  • Domande: la domanda deve essere visualizzata sul display
  • Risposte: l’utente deve premere il pulsante e il controllore deve verificare se la risposta è corretta.

Pertanto si avranno tanti stati quante sono il numero di domande moltiplicato per due.
E’ infine importante considerare che, nel caso della realizzazione di un quiz a risposta multipla, l’impiego di una macchina a stati permette di risolvere il problema annoso del delay. Questa funzione può infatti essere tranquillamente utilizzata negli stati associati alle domande (l’utente deve avere tempo di leggere la domanda) mentre non deve essere assolutamente impiegata negli stati relativi alle risposte.

La realizzazione di una macchina a stati mediante il controllore Arduino è relativamente semplice. Infatti, il concetto di stato viene implementato grazie all’utilizzo di una variabile globale (tipicamente denominata state) e attraverso una serie di if o mediante uno switch case si seleziona il codice da eseguire in quello specifico stato.

Collegamento Circuitale:

CodiceAttraverso la variabile “state” è possibile specificare il “loop” che Arduino dovrà eseguire. Nel dettaglio, valori pari della variabile “state” sono utilizzati per riprodurre la domanda sul display, mentre valori dispari sono impiegati per gestire la risposta. E ‘importante notare che non sono presenti delay nel loop di gestione della risposta (ad eccezione di quello utilizzato per visualizzare se la risposta data è corretta oppure errata).




PersonalizzazioniE’ possibile aggiungere un numero maggiore di domande ed un numero maggiore di pulsanti per gestire più risposte.





Controllo del Contrasto di un Display LCD mediante PWM

Obiettivo: Controllare il contrasto di un Display LCD 16×2 (basato su un Driver Hitachi HD44780) mediante PWM. (Se non possiedi un Trimmer puoi utilizzare questa strategia basata su PWM e filtro passa-basso).

Componenti elettronici:

  • Arduino UNO
  • Breadboard
  • 1 Display LCD (e.g., 1602A) compatibile con Driver Hitachi HD44780 
  • 1 Resistenza da 220 Ohm
  • 1 Resistenza da 1kOhm (per filtro passa basso)
  • 1 Condensatore elettrolitico da 22uF (per filtro passa basso)

Pre-requisiti:


Come Collegare un Display LCD ad Arduino


TeoriaIn un display LCD basato su Driver HD44780 il pin numero 3 è utilizzato per gestire il contrasto. Questo pin viene tipicamente collegato ad un potenziometro con tensione variabile nel range 0 a 5v. Pertanto variando la posizione del Trimmer cambia il livello di contrasto del display. Il contrasto è un parametro di fondamentale importanza nella gestione di una dispositivo elettronico che utilizza un display LDC. Un’errata regolazione del livello di contrasto può rendere un’immagine troppo o poco dettagliata con il rischio che le aree più chiare e/o quelle più scure possano scomparire rendendo il testo non leggibile. Pertanto, nel caso in cui non si possedesse un Trimmer, l’utilizzo di un display LCD potrebbe essere facilmente compromesso a causa della incapacità di settare un livello di contrasto corretto.
Tuttavia, è importante considerare che, esistono delle alternative all’utilizzo di un trimmer per generare una tensione variabile compresa tra 0 e 5 Volts. Nel dettaglio, in questo articolo viene presentata una tecnica basata sull’utilizzo della PWM e di un filtro passa basso. L’impiego della tecnica PWM permette di generare un segnale con un duty cycle regolabile. Questa tecnica viene utilizzata anche nell’istruzione analogWrite per creare dei segnali apparentemente analogici partendo da segnali digitali. Il segnale PWM viene in seguito filtrato utilizzando un filtro RC passa basso del primo ordine. Attraverso questa operazione è infatti possibile ottenere la componente continua del segnale PWM necessaria per regolare il contrasto.

Collegamento Circuitale:

Collegamento Circuitale

CodiceAttraverso la variabile contrast (regolabile nel range 0-255) è possibile modificare il valore del contrasto da software fino ad ottenere l’effetto desiderato.




PersonalizzazioniE’ possibile introdurre due pulsanti per modificare il contrasto del display utilizzando il valore PWM (0-255). Un pulsante può incrementare il valore della variabile contrast mentre l’altro pulsante può decrementare il suo valore.





Leggere informazioni dal GPS e scriverle su un Display LCD 20×4

Obiettivo:

Leggere tutte le informazioni provenienti dal GPS utilizzando la libreria TinyGPS++ e scriverle su un display LDC 20×4

Video:



Componenti elettronici:

Teoria:

Alla base di questa esercitazione c’è il modulo GPS come riportato nel precedente articolo di Arduino Facile.

Qui però abbiamo aggiunto anche un display LCD 20×4, cioè un display in grado di visualizzare 20 caratteri su 4 righe sovrapposte.

Display LCD 20x4

Schema Elettronico:

Codice:






Leggere temperatura ed umidità e calcolare il punto di rugiada tramite Arduino e DHT11

Obiettivo: Realizzare un sistema in grado di visualizzare, su LCD I2C, la temperatura, l’umidità e il punto di rugiada mediante il sensore DHT11.

Componenti elettronici:

  • Arduino UNO
  • DHT11
  • Display LCD I2C

TeoriaCome già detto nell’articolo di ArduinoFacile, il DHT11 è un sensore digitale per la misura della temperatura ed umidità molto stabile e semplice da usare e configurare.
E’ un sensore di basso costo che ha un range di misurazione dell’umidità che va da 20%RH al 90%RH (con una precisione di 5%RH) e di temperatura da 0 a 50°C (con una precisione di 2°C)

Il sensore si presenta con tre pin (esistono anche versioni a 4 pin e con configurazione in scatola chiusa, con LED, con piedinatura differente ecc ecc).

Per quanto riguarda la piedinatura fare attenzione alla posizione delle alimentazioni!!!

Collegamento Circuitale:

Viene in seguito riportato lo schema elettrico utilizzato per valutare la temperatura mediante il dispositivo elettronico DHT11 e display LCD I2C.

Fare attenzione al collegamento delle alimentazioni (+ e -) e alle linee SCL e SDA del bus I2C.

Inoltre collegare il pin del segnale del modulo DHT11 al pin 3 di Arduino seguendo la configurazione impostata nel codice sorgente.

Codice:

Per il funzionamento del dispositivo è necessario caricare la libreria DHT.h (ver. 2.1.0 di Dhruba Saha) e LiquidCrystal_I2C.h (ver. 2.0.0 di Martin Kubovčík) nell’ide. Successivamente va definito il tipo di sensore che si sta utilizzando per acquisire temperatura e umidità (nel nostro caso DHT11). Tale informazione va inserita nella dichiarazione dell’oggetto DHT ( DHT dht(DHTPIN); ).

Si definisce poi l’oggetto “lcd” tramite la classe “LiquidCrystal_I2C lcd(0x27,16,2);” per un display da 16 caratteri 2 righe (è possibile inoltre utilizzare LiquidCrystal_I2C lcd(0x27,20,4); per un display da 20 caratteri 4 righe).

Questo software inoltre utilizza la funzione dewPoint per calcolare il punto di rugiada.

Conoscendo infatti la temperatura dell’aria (T) e umidità relativa (UR) è possibile stimare il punto di rugiada (temperatura di condensazione) usando relazioni psicrometriche.

La formula più utilizzata in ambito meteorologico e HVAC è la formula di Magnus–Tetens, che fornisce un’ottima approssimazione tra −45 °C e +60 °C.

Ricapitolando l’istruzione “int result = dht11.readTemperatureHumidity(temperatura, umidita);” permette di memorizzare la temperatura e l’umidità nelle rispettive variabili “temperatura” e “umidita”, la funzione “float puntoRugiada = dewPoint(temperatura, umidita);” invece calcola il punto di rugiada.

La seconda parte del codice non fa altro che “popolare” le variabili acquisite dal sensore e calcolate dalla dewPoint apposita e stamparle sia su seriale, sia su display LCD.



Personalizzazioni:

E’ possibile modificare il circuito utilizzando altri tipi di sensori tipo DHT22 (AM2302), BME280, SHT31.

Tabella comparativa sintetica

Sensore T (°C) Precisione T RH (%) Precisione RH Pressione Protocollo Note
DHT11 0 → 50 ±2 °C 20 → 80 ±5 % Single-wire Economico, poco preciso
DHT22 -40 → 80 ±0.5 °C 0 → 100 ±2–3 % Single-wire Versione migliorata
AM2301 -40 → 80 ±0.5 °C 0 → 100 ±2–3 % Single-wire DHT22 in case ventilato
BME280 -40 → 85 ±1 °C 0 → 100 ±3 % I2C / SPI Multisensore Bosch
SHT31 -40 → 125 ±0.3 °C 0 → 100 ±2 % I2C Alta precisione



Come Collegare un Display LCD ad Arduino

Obiettivo: Utilizzare un Display LCD 16×2 (basato su un Driver Hitachi HD44780).



Componenti elettronici:

  • Arduino UNO
  • Breadboard
  • 1 Display LCD (e.g., 1602A) compatibile con Driver Hitachi HD44780 
  • 1 Potenziometro da 10 kOhm
  • 1 Resistenza da 220 Ohm

TeoriaI display basati su Driver Hitachi HD44780 sono tra i più diffusi in ambito embedded. Caratterizzati da differenti formati (i.e., 8×1, 8×2, 16×2, 20×2, 16×3, etc), questi display permettono di visualizzare solo caratteri. Nella seguente tabella si riporta la descrizione dei PIN del dispositivo:

PIN Descrizione
1 Vss (Massa)
2 Vcc (Genericamente 5 V)
3 Vee (Controllo contrasto, collegato in genere ad un potenziometrocon tensione che varia da 0 a 5v)
4 R/S (0 per selezionare l’invio di un comando, 1 per i dati)
5 R/W (0 per selezionare la scrittura di dati o comandi, 1 per la lettura dei dati o dello stato)
6 E (inizia il ciclo di scrittura o lettura, secondo R/S e R/W)
7 D0 (Bus dati)
8 D1 (Bus dati)
9 D2 (Bus dati)
10 D3 (Bus dati)
11 D4 (Bus dati)
12 D5 (Bus dati)
13 D6 (Bus dati)
14 D7 (Bus dati)
15 A (Vcc retroilluminazione, se presente)
16 K (Vss retroilluminazione, se presente)

Il Driver HD44780 si basa su una modalità di trasferimento dati di tipo parallelo. Nel dettaglio è supportato sia il trasferimento di 8 bit (l’intero comando D0-D7) sia il trasferimento di 4 bit (D4-D7). Nel secondo caso, per trasmettere un byte vengono effettuati due trasferimenti.

Per la scrittura di un singolo carattere è necessario rispettare il seguente “protocollo di trasmissione“:

  • Posizionare il cursore nella posizione desiderata
  • Impostare a 1 il pin R/S e a 0 il pin R/W
  • Inviare il codice ASCII del carattere
  • Impostare ad 1 il pin E per un minimo di 450 nanosecondi ed, in seguito, riportarlo a 0

Da un punto di vista pratico, grazie all’impiego della specifica libreria LiquidCrystal inclusa nel pacchetto software di Arduino è possibile pilotare il display semplificando notevolmente la parte di gestione dei pin, dei comandi e delle relative temporizzazioni. La libreria mette infatti a disposizione una classe LiquidCrystal all’interno della quale sono definite le principali funzioni necessarie per utilizzare i display basati su Driver HD44780. Quali:

  • Begin: Inizializza l’interfaccia del display LCD specificandone le dimensioni (larghezza ed altezza)
  • SetCursor: Posizione il cursore LCD ovvero la posizione nella quale verrà visualizzato il testo scritto
  • Print: Scrive il testo sul display LCD.

Collegamento Circuitale:

Codice:




PersonalizzazioniE’ possibile modificare il contrasto del display intervenendo sul potenziometro.