Archivi tag: ldr

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

Arduino – realizzare un sensore di seduta a pressione con un tubo di gomma

Questa mattina, durante la realizzazione e l’analisi dei problemi per il progetto di PCTO: “misura di sedentarietà delle persone sedute alla scrivania” che stanno realizzando i miei studenti di 3′ Elettronica, è nata l’esigenza di associare un doppio controllo per la valutazione della presenza della persona seduta alla scrivania, un controllo effettuato con PIR HC-SR501 ed un sensore di forza resistivo (FSR) inserito all’interno del cuscino della seduta.

Per evitare l’acquisto di un sensore di forza resistivo e non pesare sulle finanze dei ragazzi le modalità sono tre:

  • richiesta alla scuola
  • compra il Prof.
  • farlo costruire ai ragazzi

l’acquisto da parte della scuola o mia non è un problema, ma la terza soluzione è quella che in questo momento prediligo, perché può essere realizzata in 5 minuti, credo che possa gratificare di più lo studente Maker in erba 🙂 , inoltre ritengo importante che gli allievi assumano la capacità di costruire il sensore perché ne dovranno ottimizzare l’uso, scontrandosi inevitabilmente con una serie di variabili fisiche che dovranno gestire.

Ma come si costruisce il sensore?

E’ indispensabile piccolo tubo cilindrico non trasparente, preferibilmente nero che possa essere compresso e al termine della compressioni ritorni abbastanza velocemente nella sua posizione di riposo. Possiamo ricavare il tubo sguainando un cavo elettrico o cavo di rete, oppure come ho fatto in questo tutorial, prendendo una guaina termorestingente.

Inserire un diodo LED ad un’estremità del cilindro e dalla parte opposta inserire un LDR.
Collegare il sistema nella solita modalità, inserendo in serie al LED un resistore da 220 Ohm e creando un partitore di tensione tra l’LDR e un resistore da 10KOhm, così come indicato nel circuito indicato di seguito.

Come test di funzionamento utilizzare il semplice sketch che trovate di seguito, nei commenti la spiegazione di tutte le parti del codice.

Aprite la Serial Monitor e premete e rilasciate il tubo

1/*
2 * Prof. Michele Maffucci
3 * Data 01.03.2021
4 *
5 * Oggetto: sensore di seduta a pressione
6 *
7*/
8 
9// variabile in cui verrà memorizzato il valore presente sul pin A0
10const int misura = A0;
11 
12// valore restituito dall'analogRead
13int val = 0;
14 
15// pin a cui è connesso il LED del sensore di seduta
16int pinLed = 2;
17 
18// LED che segnala la seduta della persona
19int pinLedAlert = 13;
20 
21void setup() {
22  // Inizializzazione della Serial Monitor
23  Serial.begin(9600);
24 
25  // ledPin è il pin a cui è connesso il LED del sensore di seduta
26  pinMode(pinLed, OUTPUT);
27 
28  // pinLedAlert è il pin a cui è connesso il LED che segnala la seduta della persona
29  pinMode(pinLedAlert, OUTPUT);
30 
31  // Attivazione del LED del sensore di seduta
32  digitalWrite(pinLed, HIGH);
33 
34  // Messaggio di avvio
35  Serial.println("Sistema di rilevazione seduta");
36  Serial.println("-----------------------------");
37  Serial.println("");
38  delay(1000);
39}
40 
41void loop() {
42  // analogRead leggerà il valore su A0 restituendo un valore tra 0 e 1023
43  val = analogRead(misura);
44 
45  // il valore di controllo nell'if deve essere sperimentato in funzione
46  // delle necessità costruttive (ad es. la lunghezza del tubo)
47 
48  // se vero la persona è seduta
49  if (val >= 100) {
50    digitalWrite(pinLedAlert, HIGH);                      // accensione del LED di avviso
51    Serial.println("Persona NON seduta alla scrivania");  // segnalazione di assenza persona
52    Serial.print("Valore letto dal sensore = ");          // Stringa di stampa
53    Serial.println(val);                                  // Valore restituito dall'AnalogRead
54    Serial.println("");                                   // Stampa linea vuota di separazione
55    delay(1000);                                          // Intervallo di 1 secondo tra ogni stampa
56  }
57  else
58  {
59    digitalWrite(pinLedAlert, LOW);                       // spegnimento del LED di avviso
60    Serial.println("Persona seduta alla scrivania");      // segnalazione di presenza persona
61    Serial.print("Valore letto dal sensore = ");          // Stringa di stampa
62    Serial.println(val);                                  // Valore restituito dall'AnalogRead
63    Serial.println("");                                   // Stampa linea vuota di separazione
64    delay(1000);                                          // Intervallo di 1 secondo tra ogni stampa
65  }
66}

Il risultato sulla Serial Monitor è il seguente

Il valore di soglia scelto deve essere ricavato sperimentalmente in funzione della lunghezza e della trasparenza del tubo.

Buon Making a tutti 🙂

Lezioni di laboratorio di elettronica – Uso del multimetro: misurare la resistenza elettrica

In questa breve lezione vedremo:

  • cosa vuol dire resistenza
  • cosa � un resistore
  • come si usa un multimetro per misurare la resistenza elettrica

Cosa � la resistenza?

La resistenza � l’opposizione al flusso di corrente e il componente chiamato RESISTORE � progettato per questo scopo. I resistori possono essere di molte forme e dimensioni, alcuni hanno un valore fisso ed altri sono variabili. L’immagine mostra i pi� comuni resistori che potete trovare in un laboratorio di elettronica.

Unit� di misura

L’ohm � l’unit� di misura della resistenza e la sua unit� di misura � indicata con la lettera greca ? (omega).
Il valore della resistenza di un circuito elettronico pu� variare da frazioni di ohm a molti milioni di ohm.
Utilizzeremo multipli e sottompultipli per indicare il valore di resistenza e quindi ad esempio:

  • 1 Kilohm = 1000 ohm
  • 1 Megaohm = 1000000 ohm

Ohm, Kilohm, Megaohm sono in genere abbreviati per questioni di praticit� e quindi useremo la seguente notazione:

  • ohm = ?
  • Kilohm = K?
  • Megaohm = M?

Alcuni esempi:

  • 15 ohm = 15 ?
  • 2.200 ohm = 2,2 k?
  • 47.000 ohm = 47 K?
  • 30.000 ohm = 30 K?
  • 2.700.000 ohm = 2,7 M?

Codice colore delle resistenze

Sul resistore le bande colorate indicano il valore di resistenza.
Fate riferimento alla seguente schema per identificare il valore della resistenza:


In laboratorio opererete con resistori che possono avere 4 o 5 bande colorate.
L’immagine che segue mostra una resistenza di �1K? con il �5% di tolleranza.

Cosa indica la tolleranza?

Il quarto o quinto anello, a seconda del tipo di resistenza che stiamo usando, indica il grado di precisione o tolleranza al quale il resistore � stato costruito. L’anello � chiamato genericamente anello di tolleranza e per i resistori a 4 anelli pu� avere il colore oro o argento e come indicato nel codice colori:

  • oro = � 5%
  • argento = � 10%

nel caso in cui tale fascia non fosse presente, la tolleranza � del � 20%

Esempio:

Supponiamo di avere un resistore con le seguenti fasce colorate:

ARANCIONE, ARANCIONE, MARRONE, ORO

Il suo valore di resistenza sar�:

330 ? con tolleranza �5%

dire che la tolleranza � del �5% significa che i valori limiti di resistenza, massimo e minimo potranno essere:

[pmath size=16]R_max (+5%) = 330 + (330*5)/100 = 346,5 Omega [/pmath]
[pmath size=16]R_max (-5%) = 330 – (330*5)/100 = 313,5 Omega [/pmath]

Quindi il valore di resistenza potr� assumere i valori tra 346,5 ? e 313,5 ?.

Ma cosa serve misurare la resistenza?

La misurazione di resistenza pu� essere utile in moltissimi casi, questi alcuni esempi:

  • Verifica della continuit� elettrica, ovvero valutare se un componente consente pi� o meno il passaggio di corrente.
  • Verificare il valore di resistenza di un resistore quando il codice colori non � ben visibile.
  • Misurare la resistenza di ingresso o uscita di un circuito.
  • Verificare il funzionamento di un sensore o di un potenziometro (vedi pi� avanti)

IMPORTANTISSIMO! DA NON DIMENTICARE

  • Si pu� misurare il valore di resistenza solamente se il componente non � alimentato. La misurazione di resistenza viene effettuata applicando, da parte del multimetro, �una piccola tensione, il multimetro valuter� la quantit� di corrente che fluisce nel componente e tradurr� il tutto in un valore di resistenza. Se il componente � alimentato il valore di resistenza rilevato sar� errato.
  • La misura di resistenza deve essere fatta prima che il componente venga inserito nel circuito. Se effettuate la misurazione con componente nel circuito, misurerete la resistenza di tutto ci� che � collegato al componente in analisi.
  • Dovete essere sicuri che il vostro strumento funzioni correttamente, dovete avere una resistenza di riferimento. Tipicamente il laboratorio di elettronica � fornito di resistenze di precisione e per verificare la taratura dello strumento pu� essere sufficiente munirsi di resistenze da 1K? e 10K? con tolleranza di �1%

Attenzione! La misura di resistenza richiede l’uso della batteria interna del multimetro, se questa batteria � scarica le misure di resistenza risultano errate.
Nella misura di resistenza � indifferente l’ordine con cui vengono inseriti i puntali, la misura sar� sempre la stessa.

Il multimetro digitale � dotato normalmente di un selettore che consente di selezionare la misurazione di resistenza in un determinato intervallo di valori. Altri intervalli sono riservati per la misurazione di altre grandezze elettriche.

Usiamo lo strumento

Cercate il simbolo ? a fianco del selettore circolare, questo identifica l’intervallo in cui potrete spostare il selettore.

Nella zona identificata con ? avete 5 suddivisioni che vanno da 200 ? a 2 M?, ci� vuol dire che a seconda di dove posizionate il selettore potrete misurare un valore massimo (valore di fondoscala) di 200 ?, 2 K?, 20K?, 200K?, 2M?.

Misura di resistenza

Come esercizio prendiamo una resistore lo copriamo e verifichiamo se questo ha un valore di resistenza inferiore a 2 K?

Per far ci� bisogner� porre il selettore su un valore di fondoscala di 2 K?.

Si rileva un valore di 0,978, che significa 0,978 K? (si noti che il selettore � posto su un fondoscala di 2 K?), ovvero un valore commerciale di 1 K?, infatti, come si evince dalla fotografia si possono notare i colori: MARRONE, NERO, ROSSO, ORO.

Ora misuriamo una resistenza di valore diverso�e vediamo se siamo al di sopra o al di sotto dei 2 K? di valore.

La visualizzazione di 1 sul display significa che siete fuori scala

bisogna allora spostare il selettore su altro valore, spostiamolo sul fondoscala di 20 K?.
Leggeremo 9,90 che indica 9,90 K?, quindi il resistore ha un valore commerciale di 10 K?:

Misurare il valore di resistenza di un potenziometro

Un potenziometro � un resistore la cui resistenza varia al variare della rotazione di una manopola, nelle lezioni successive saremo pi� precisi e vi mostrer� che il potenziometro � assimilabile a quello che viene chiamato partitore di tensione resistivo variabile, ma ne parleremo pi� avanti.

E’ possibile misurare il valore massimo di resistenza del potenziomentro collegando i due terminali del multimetro sul piedino sinistro e destro del componente

Poich� la variazione di resistenza di un potenziometro pu� essere lineare o logaritmica, potete verificare con il multimetro la tipologia di potenziometro che avete a disposizione. Ponete un puntale su un estremo e l’altro sul centrale, se a met� della rotazione il valore della resistenza sar� la met� del valore massimo, allora il potenziometro sar� di tipo lineare. (In una successiva lezione vedremo la variazione di resistenza di un potenziometro logaritmico)

Esempio pratico
(Per semplicit� � stato inserito un foglietto di carta usato come indice per evidenziare l’escursione del potenziometro)

Valore minimo misurato 0 ?

Valore misurato a met� rotazione � di circa 10K?

Valore misurato alla massima escursione � di circa 19,47K?

Quindi il potenziometro ha un valore massimo di resistenza di 10K?

Il video mostra come varia la resistenza al variare della rotazione della manopola del potenziometro. Il potenziometro � di tipo lineare e si nota che a circa met� dell’escursione il suo valore � di circa 10K?.