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

// Prof. Maffucci Michele
// 31/07/23
// Visualizzazione livello luminoso su matrice LED Uno R4 WiFi
// con calibrazione sensore e visualizzazione timer di calibrazione
// con l'accensione di 5 LED della matrice

// Esercizio 01

// inclusione della libreria per la gestione della matrice
#include "Arduino_LED_Matrix.h"

// creazione dell’oggetto matrix
ArduinoLEDMatrix matrix;

// inizializzazione dell'array per inizializzare lo stato della matrice
uint8_t frame[8][12] = { 0 };

// pin a cui collegare il sensore
int pinSensore = A0;

// variabile in cui memorizzare il valore letto dal sensore
int valoreSensore = 0;

// variabili per calibrazione lovello minimo e massimo luce ambiente
int sensoreMin = 1023;  // valore minimo sensore
int sensoreMax = 0;     // valore massimo sensore

// contatore passi di calibrazione
int contatore = 0;

// valore del millis al passo precedente
unsigned long millisPrecedente = 0;
// valore del millis attuale
unsigned long millisCorrente = 0;

// intervallo in millisecondi per l'accensione di una riga di LED
const long intervallo = 1000;

// riga LED precedentemente accesa
int precedenteLivello = 0;

void setup() {
  // inizializzazione della velocità della serial monitor
  Serial.begin(115200);

  // avvio della matrice di LED
  matrix.begin();

  // calibrazione del sensore nei primi 5 secondi di avvio di Arduino
  while (millis() < 5000) {

    // memorizzazione dle valore attuale del millis
    millisCorrente = millis();

    // lettura valore
    valoreSensore = analogRead(pinSensore);

    // registra il valore massimo rilevato dal sensore
    if (valoreSensore > sensoreMax) {
      sensoreMax = valoreSensore;
    }

    // registra il valore minimo rilevato dal sensore
    if (valoreSensore < sensoreMin) {
      sensoreMin = valoreSensore;
    }

    // timer
    if (millisCorrente - millisPrecedente >= intervallo) {
      millisPrecedente = millisCorrente;
      frame[7][contatore] = 1;
      matrix.renderBitmap(frame, 8, 12);
      contatore++;
    }
  }
  // accensione dell'ultimo LED al 5' secondo
  frame[7][4] = 1;
  matrix.renderBitmap(frame, 8, 12);

  // attesa di 0,5 secondi prima di spegnere tutti i LED
  delay(500);

  // spegnimento di tutti i LED della matrice
  uint8_t frame[8][12] = { 0 };
  matrix.renderBitmap(frame, 8, 12);
}

// Accensione linee matrice (dalla riga 7)
// maggiore e' il valore numeriico di "livello" (riga LED) più bassa sarà l'intensità luminosa
// minore e' e' il valore numeriico di "livello" (riga LED) più alta sarà l'intensità luminosa

// Livello minimo di intensità = accensione della sola riga 7
// Livello massimo di intensità = accensione di tutte le linee della matrice

void barra(int livello) {
  // spegnimento della riga "livello"
  if (livello > precedenteLivello) {
    for (int y = livello; y >= precedenteLivello; y--) {
      // spegnimento dei 12 LED della riga "livello"
      for (int x = 0; x < 12; x++) {
        frame[y][x] = 0;
      }
      matrix.renderBitmap(frame, 8, 12);
      delay(1);
    }
    // accensione della riga "livello"
  } else {
    for (int y = 7; y >= precedenteLivello; y--) {
      for (int x = 0; x < 12; x++) {
        frame[y][x] = 1;
      }
      matrix.renderBitmap(frame, 8, 12);
      delay(1);
    }
  }
  precedenteLivello = livello;
}

void loop() {

  // per evitare sprechi di memoria viene utilizzata usata una stessa variabile: valoreSensore
  // per memorizzare ad ogni passo valori diversi

  // lettura del valore del sensore
  valoreSensore = analogRead(pinSensore);

  // Forzare il valore all'interno del valore minimo e del massimo nel caso di errori di lettura.
  // Nel caso non si aggiungesse il "constrain" nel caso di errore si blocca l'esecuzione
  valoreSensore = constrain(valoreSensore, sensoreMin, sensoreMax);

  // Il valore minimo di lettura è associato all'accensione della riga 7
  // quindi si rimappa tra 7 e 0
  valoreSensore = map(valoreSensore, sensoreMin, sensoreMax, 7, 0);

  // barra(valoreSensore) è la funzione che gestisce l'accensione delle linee di LED
  barra(valoreSensore);
}

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

/*
 * Prof. Michele Maffucci
 * Data 01.03.2021
 * 
 * Oggetto: sensore di seduta a pressione
 * 
*/

// variabile in cui verrà memorizzato il valore presente sul pin A0
const int misura = A0;

// valore restituito dall'analogRead
int val = 0;

// pin a cui è connesso il LED del sensore di seduta
int pinLed = 2;

// LED che segnala la seduta della persona
int pinLedAlert = 13;

void setup() {
  // Inizializzazione della Serial Monitor
  Serial.begin(9600);

  // ledPin è il pin a cui è connesso il LED del sensore di seduta
  pinMode(pinLed, OUTPUT);

  // pinLedAlert è il pin a cui è connesso il LED che segnala la seduta della persona
  pinMode(pinLedAlert, OUTPUT);

  // Attivazione del LED del sensore di seduta
  digitalWrite(pinLed, HIGH);

  // Messaggio di avvio
  Serial.println("Sistema di rilevazione seduta");
  Serial.println("-----------------------------");
  Serial.println(""); 
  delay(1000);
}

void loop() {
  // analogRead leggerà il valore su A0 restituendo un valore tra 0 e 1023
  val = analogRead(misura);

  // il valore di controllo nell'if deve essere sperimentato in funzione
  // delle necessità costruttive (ad es. la lunghezza del tubo)

  // se vero la persona è seduta
  if (val >= 100) {
    digitalWrite(pinLedAlert, HIGH);                      // accensione del LED di avviso
    Serial.println("Persona NON seduta alla scrivania");  // segnalazione di assenza persona
    Serial.print("Valore letto dal sensore = ");          // Stringa di stampa 
    Serial.println(val);                                  // Valore restituito dall'AnalogRead
    Serial.println("");                                   // Stampa linea vuota di separazione
    delay(1000);                                          // Intervallo di 1 secondo tra ogni stampa
  }
  else
  {
    digitalWrite(pinLedAlert, LOW);                       // spegnimento del LED di avviso
    Serial.println("Persona seduta alla scrivania");      // segnalazione di presenza persona
    Serial.print("Valore letto dal sensore = ");          // Stringa di stampa 
    Serial.println(val);                                  // Valore restituito dall'AnalogRead
    Serial.println("");                                   // Stampa linea vuota di separazione
    delay(1000);                                          // Intervallo di 1 secondo tra ogni stampa
  }
}

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?.