Archivi tag: Arduino UNO R4 WiFi

Realizziamo un orologio con l’RTC di Arduino UNO R4 WiFi

Arduino UNO R4 WiFi possiede un RTC interno facilmente programmabile che ci consentirà di mantenere costantemente traccia dell’ora e della data corrente.

Per chi ha iniziato da poco le sperimentazioni elettroniche ricordo che un Real-Time Clock (RTC), o Orologio in Tempo Reale, è un tipo di orologio costituito da un circuito elettronico utilizzato per tracciare il tempo in tempo reale. Questo significa che tiene traccia del giorno della settimana, della data e dell’ora corrente, dei minuti, dei secondi, proprio come un orologio normale, inoltre è possibile impostare un RTC per gestire l’ora legale e l’ora solare.

Nelle versione precedente di Arduino, UNO R3 non era presente un RTC pertanto bisognava utilizzare un apposito circuito elettronico esterno così come dettagliato nel post su questo sito: Utilizzare un orologio RTC con Arduino – Modulo Tiny RTC I2C, modulo RTC dotato di un integrato DS1307 cuore fondamentale della scheda.

L’utilizzo dell’RTC su Arduino UNO R4 WiFi avviene utilizzando la libreria RTC che consente di impostare oppure ottenere l’orario o ancora gestire allarmi per attivare interrupt.

Come accennato ad inizio post l’RTC integrato dispone di un pin VRTC, che viene utilizzato per mantenere in funzione l’RTC, anche quando l’alimentazione della scheda viene interrotta. Per utilizzare questa funzione è sufficiente fornire una tensione compresa tra 1,6 e 3,6 V al pin VRTC. In un post successivo mostrerò come utilizzare il pin VRTC.

Facendo riferimento agli esempi disponibili sul sito Arduino e nell’IDE analizziamo le fasi di configurazione dell’RTC.

Impostazione della data e dell’ora

1RTCTime startTime(01, Month::AUGUST, 2023, 20, 49, 00, DayOfWeek::TUESDAY, SaveLight::SAVING_TIME_ACTIVE)
2 
3RTC.setTime(startTime)

Per impostare l’orario bisogna creare un oggetto RTCTime, in cui deve essere specificato il giorno, il mese, l’anno, l’ora, il minuto, il secondo, il giorno della settimana e l’attivazione dell’ora legale se prevista nella nazione in cui si sta utilizzando la scheda, quindi per impostare l’orario bisogna usare il metodo startTime.

Per chi incomincia con la programmazione il concetto di metodo appartiene alla programmazione ad orientata agli oggetti come ad esempio in C++, quando si programma in C è meglio parlare di funzione, ma spesso i due concetti vengono usati in modo alternativo.

Il primo sketch non fa altro che impostare l’ora corrente:

1// inclusione della libreria RTC
2#include "RTC.h"
3 
4void setup() {
5 
6  // impostazione della velocità della serial monitor
7  Serial.begin(9600);
8 
9  // avvio dell'RTC
10  RTC.begin();
11 
12  // creazione dell'oggetto RTCTime (possiamo assegnare un nome a piacimento)
13  // data del giorno, mese, anno, ore, minuti, secondi, giorno della settimana, attivazione passaggio all'ora legale
14  RTCTime startTime(2, Month::AUGUST, 2023, 9, 15, 00, DayOfWeek::WEDNESDAY, SaveLight::SAVING_TIME_ACTIVE);
15 
16  // impostazione dell'RTC con la data e lora configurate per RTCTime
17  RTC.setTime(startTime);
18}
19 
20// il loop non contiene nulla
21void loop() {
22}

Continua a leggere

Arduino UNO R4 WiFi – Visualizzare il livello di una grandezza fisica mediante una barra incrementale sulla matrice LED di Arduino

Come anticipato nelle scorse lezioni vediamo in questo tutorial come visualizzare il livello di una grandezza fisica mediante una barra incrementale sulla matrice LED dell’Arduino UNO R4 WiFi.
Gli esempi mostrati possono essere adattati per qualsiasi tipologia di sensore, per semplicità e rapidità di realizzazione ho scelto di rilevare l’intensità luminosa mediante un LDR. Lascio a voi correzioni e miglioramenti a quanto ho scritto.

La matrice, come sapete è costituita da 8 righe di LED, Il numero di linee LED attive sarà proporzionale all’intensità luminosa rilevata:

  • Livello minimo di intensità = accensione della sola riga 7
  • Livello massimo di intensità = accensione di tutte le righe della matrice

I 6 sketch di esempio che seguono sono molto simili, tutti eseguono la calibrazione del sensore, basata sullo sketch standard che trovate all’interno degli esempi dell’IDE di Arduino. Il codice di calibrazione prevede 5 secondi di analisi che permettono di impostare il livello minimo e massimo della grandezza da misurare. Ho aggiunto per ognuno dei 6 esempi alternative diverse per mostrare sulla matrice di LED il timer di 5 secondi.

Il funzionamento di ogni parte del codice dei 6 sketch, è dettagliato mediante commenti, se avete necessità di chiarimenti non esitate a contattarmi.

Circuito

Il circuito prevede l’utilizzo di:

  • Arduino UNO R4 WiFi
  • LDR
  • Resitore da 10 KOhm

Esempio 01

Il trascorrere del tempo di calibrazione è mostrato dall’accensione sequenziale dei primi 5 LED posti sulla riga n. 7, terminata la fase di calibrazione, dopo 0,5 secondi l’array della matrice viene azzerato e viene poi avviata la rilevazione.

sketch01

1// Prof. Maffucci Michele
2// 31/07/23
3// Visualizzazione livello luminoso su matrice LED Uno R4 WiFi
4// con calibrazione sensore e visualizzazione timer di calibrazione
5// con l'accensione di 5 LED della matrice
6 
7// Esercizio 01
8 
9// inclusione della libreria per la gestione della matrice
10#include "Arduino_LED_Matrix.h"
11 
12// creazione dell’oggetto matrix
13ArduinoLEDMatrix matrix;
14 
15// inizializzazione dell'array per inizializzare lo stato della matrice
16uint8_t frame[8][12] = { 0 };
17 
18// pin a cui collegare il sensore
19int pinSensore = A0;
20 
21// variabile in cui memorizzare il valore letto dal sensore
22int valoreSensore = 0;
23 
24// variabili per calibrazione lovello minimo e massimo luce ambiente
25int sensoreMin = 1023;  // valore minimo sensore
26int sensoreMax = 0;     // valore massimo sensore
27 
28// contatore passi di calibrazione
29int contatore = 0;
30 
31// valore del millis al passo precedente
32unsigned long millisPrecedente = 0;
33// valore del millis attuale
34unsigned long millisCorrente = 0;
35 
36// intervallo in millisecondi per l'accensione di una riga di LED
37const long intervallo = 1000;
38 
39// riga LED precedentemente accesa
40int precedenteLivello = 0;
41 
42void setup() {
43  // inizializzazione della velocità della serial monitor
44  Serial.begin(115200);
45 
46  // avvio della matrice di LED
47  matrix.begin();
48 
49  // calibrazione del sensore nei primi 5 secondi di avvio di Arduino
50  while (millis() < 5000) {
51 
52    // memorizzazione dle valore attuale del millis
53    millisCorrente = millis();
54 
55    // lettura valore
56    valoreSensore = analogRead(pinSensore);
57 
58    // registra il valore massimo rilevato dal sensore
59    if (valoreSensore > sensoreMax) {
60      sensoreMax = valoreSensore;
61    }
62 
63    // registra il valore minimo rilevato dal sensore
64    if (valoreSensore < sensoreMin) {
65      sensoreMin = valoreSensore;
66    }
67 
68    // timer
69    if (millisCorrente - millisPrecedente >= intervallo) {
70      millisPrecedente = millisCorrente;
71      frame[7][contatore] = 1;
72      matrix.renderBitmap(frame, 8, 12);
73      contatore++;
74    }
75  }
76  // accensione dell'ultimo LED al 5' secondo
77  frame[7][4] = 1;
78  matrix.renderBitmap(frame, 8, 12);
79 
80  // attesa di 0,5 secondi prima di spegnere tutti i LED
81  delay(500);
82 
83  // spegnimento di tutti i LED della matrice
84  uint8_t frame[8][12] = { 0 };
85  matrix.renderBitmap(frame, 8, 12);
86}
87 
88// Accensione linee matrice (dalla riga 7)
89// maggiore e' il valore numeriico di "livello" (riga LED) più bassa sarà l'intensità luminosa
90// minore e' e' il valore numeriico di "livello" (riga LED) più alta sarà l'intensità luminosa
91 
92// Livello minimo di intensità = accensione della sola riga 7
93// Livello massimo di intensità = accensione di tutte le linee della matrice
94 
95void barra(int livello) {
96  // spegnimento della riga "livello"
97  if (livello > precedenteLivello) {
98    for (int y = livello; y >= precedenteLivello; y--) {
99      // spegnimento dei 12 LED della riga "livello"
100      for (int x = 0; x < 12; x++) {
101        frame[y][x] = 0;
102      }
103      matrix.renderBitmap(frame, 8, 12);
104      delay(1);
105    }
106    // accensione della riga "livello"
107  } else {
108    for (int y = 7; y >= precedenteLivello; y--) {
109      for (int x = 0; x < 12; x++) {
110        frame[y][x] = 1;
111      }
112      matrix.renderBitmap(frame, 8, 12);
113      delay(1);
114    }
115  }
116  precedenteLivello = livello;
117}
118 
119void loop() {
120 
121  // per evitare sprechi di memoria viene utilizzata usata una stessa variabile: valoreSensore
122  // per memorizzare ad ogni passo valori diversi
123 
124  // lettura del valore del sensore
125  valoreSensore = analogRead(pinSensore);
126 
127  // Forzare il valore all'interno del valore minimo e del massimo nel caso di errori di lettura.
128  // Nel caso non si aggiungesse il "constrain" nel caso di errore si blocca l'esecuzione
129  valoreSensore = constrain(valoreSensore, sensoreMin, sensoreMax);
130 
131  // Il valore minimo di lettura è associato all'accensione della riga 7
132  // quindi si rimappa tra 7 e 0
133  valoreSensore = map(valoreSensore, sensoreMin, sensoreMax, 7, 0);
134 
135  // barra(valoreSensore) è la funzione che gestisce l'accensione delle linee di LED
136  barra(valoreSensore);
137}

Continua a leggere