Archivi tag: sensore

Arduino – Sensore di temperatura digitale DS18B20 utilizzo in modalità singola

Nelle attività di laboratorio di Sistemi e TPSEE usiamo molto spesso il sensore di temperatura TMP36, ma un’alternativa interessante al TPM36 è il sensore temperatura digitale DS18B20 utilizzato in modalità diversa dal TPM36.
Questo tipo di sensore è adatto per misure di temperatura ambiente, ma anche del terreno o per rilevare temperature nei liquidi.
Il sensore di solito è disponibile in due form factor, uno che viene fornito nel package TO-92, forma ampiamente utilizzato per i  transistor, mentre un’altro, quello utilizzato da me è inserito all’interno di una sonda impermeabile a forma di siluro, utilissimo quando si ha la necessità di misurare temperature sottoterra, sott’acqua, o lontane dal microcontrollore.

Particolarmente utile inoltre in queste settimane in cui i miei studenti di 4′ automazione stanno realizzando come progetto di PCTO una serra idroponica in cui è essenziale misurare la temperatura dell’acqua del sistema.

Il DS18B20 è abbastanza preciso può misurare temperature da -55 ° C a + 125 ° C con una precisione di ± 0,5 ° C.

Il sensore si basa sul protocollo OneWire introdotto da Dallas Semiconductor ora Maxim e richiede due librerie. La prima è la libreria e la DallasTemperature di Miles Burton, la seconda è la libreria OneWire.
La prima libreria da installare è la DallasTemperature di Miles Burton. Sono disponibili diverse librerie con il nome OneWire, quella che vi consiglio di utilizzare è la Wire Library di Jim Studt, Tom Pollard e altri.

Noterete comunque che durante l’installazione della libreria DallasTemperature vi verrà chiesto in automatico se volete installare anche la OneWire, procedete installando in automatico entrambe le librerie. Leggete attentamente le fasi descritte di seguito in cui riporto tutte le schermate delle fasi di installazione.

Il collegamento è estremamente semplice, come indicato nell’immagine che segue collegate il cavo rosso a 5V o a 3,3V su schede a 3,3V, il cavo nero va connesso al GND e il cavo del segnale “Out”, in genere di colore giallo, bianco o di altro colore, collegatelo ad un pin digitale, nell’esempio viene connesso al pin 2 con una resistenza da 4,7 K Ohm tra il segnale e il pin di alimentazione (5 V o 3,3 V).

Pinout

GND: collegamento al ground
Out: Bus Dati 1-Wire, deve essere collegato a un pin digitale sul microcontrollore.
Vdd: da collegare alla tensione di alimentazione (3,3 – 5 V)

Per tutti i dati tecnici del sensore vi rimando al datasheet.

Schema di collegamento

Circuito – sensore con package TO-92

Circuito – sonda impermeabile

Installazione delle librerie

Il protocollo Dallas OneWire è piuttosto complesso e per nascondere questa complessità installeremo  la libreria DallasTemperature.h in modo da poter impartire semplici comandi per ottenere letture di temperatura dal sensore.

Per installare la libreria, Sketch > Include Library > Manage Libraries

Inserite nel campo di ricerca: ds18b20. Dovrebbero esserci un paio di voci. Tra le varie possibilità selezionate, quella indicata nell’immagine

Il sensore per poter comunicare ha necessità anche della libreria OneWire, libreria che non è specifica per questo sensore, ma viene utilizzata con tutti i dispositivi che utilizzano il protocollo One Wire.

Nel momento in cui installate la prima libreria della Dallas Semiconductor viene chiesto con una finestra aggiuntiva se volete installare anche la libreria OneWire fate click su Install all.

Nel caso in cui avete dimenticato di installare la libreria OneWire potrete cercare sempre attraverso il Manage Libraries inserendo nel campo di ricerca

Esempio 01

Stampa della temperatura rilevata in gradi Celsius.
Il funzionamento del codice è dettagliato nei commenti.

/* 
 *  Prof. Maffucci Michele
 *  data: 24.02.2021
 *  Utilizzo del sensore di temperatura
 *  resistente all'acqua DS18B20
 *  
 *  Sketch 01: stampa delle temperature rilevate
 *  in gradi Celsius 
*/

// librerie per il funzionamento del sensore
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2 // Pin Arduino a cui colleghiamo il pin DQ del sensore
const int pinLed = LED_BUILTIN; // Utilizzo del LED su scheda 

const int soglia = 25; // Accende il LED su scheda se si superano i 25°C

OneWire oneWire(ONE_WIRE_BUS); // Imposta la connessione OneWire

DallasTemperature sensore(&oneWire); // Dichiarazione dell'oggetto sensore

void setup(void)
{
  Serial.begin(9600);       // Inizializzazione della serial monitor
  sensore.begin();          // Inizializzazione del sensore
  pinMode(pinLed, OUTPUT);  // pinLed definito come OUTPUT

  // Stampa del messaggio di avvio
  Serial.println("Temperatura rilevata dal sensore DS18B20");
  Serial.println("----------------------------------------");
  delay(1000);
}

void loop()
{
  sensore.requestTemperatures(); // richiesta lettura temperatura
  
  // Restituzione della temperatura letta
  // in gradi Celsius

  // temperatura in Celsius
  float celsius = sensore.getTempCByIndex(0);
  
  // Visualizzazione delle letture 
  // della temperatura sulla Serial monitor
  
  Serial.print("C:");
  Serial.println(celsius);

  // se la temperatura è oltre la soglia
  // viene accesso il LED su scheda
  // altrimenti rimane spento
  
  if (celsius > soglia) {
    digitalWrite(pinLed, HIGH);
  } else {
    digitalWrite(pinLed, LOW);
  }
  // stampe delle temperature ogni secondo
  delay(1000);
}

All’interno del loop, lo sketch richiede una lettura della temperatura, quindi legge la temperatura in Celsius. Notare che non è necessario eseguire alcuna conversione aritmetica su
i risultati ottenuti dal sensore, tutto viene gestito dalla libreria. Tenete in conto che non è necessario apportare modifiche al codice, ma assicurati di cablare correttamente l’alimentazione del sensore, 3,3 V su schede che funzionano a questa tensione di riferimento o a 5V per schede che funzionano a 5V.

Esempio 02

Stampa della temperatura rilevata in gradi Celsius e Fahrenheit
Il funzionamento del codice è dettagliato nei commenti.

/* 
 *  Prof. Maffucci Michele
 *  data: 24.02.2021
 *  Utilizzo del sensore di temperatura
 *  resistente all'acqua DS18B20
 *  
 *  Sketch 02: stampa delle temperature rilevate
 *  in gradi Celsius e gradi Fahrenheit 
*/

// librerie per il funzionamento del sensore
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2 // Pin Arduino a cui colleghiamo il pin DQ del sensore
const int pinLed = LED_BUILTIN; // Utilizzo del LED su scheda 

const int soglia = 25; // Accende il LED su scheda se si superano i 25°C
// La soglia di 25°C corrisponde a 77 °F
// Formula di conversione (Tc°C × 9/5) + 32 = Tf°F
// dove:
// Tc: temperatura in gradi Celsius
// Tf: temperatura in gradi Fahrenheit

OneWire oneWire(ONE_WIRE_BUS); // Imposta la connessione OneWire

DallasTemperature sensore(&oneWire); // Dichiarazione dell'oggetto sensore

void setup(void)
{
  Serial.begin(9600);       // Inizializzazione della serial monitor
  sensore.begin();          // Inizializzazione del sensore
  pinMode(pinLed, OUTPUT);  // pinLed definito come OUTPUT

  // Stampa del messaggio di avvio
  Serial.println("Temperatura rilevata dal sensore DS18B20");
  Serial.println("----------------------------------------");
  delay(1000);
}

void loop()
{
  sensore.requestTemperatures(); // richiesta lettura temperatura
  
  // Restituzione della temperatura letta
  // in gradi Celsius e gradi Fahrenheit

  // temperatura in Celsius
  float celsius = sensore.getTempCByIndex(0);

  // temperatura in Fahrenheit
  float fahrenheit = sensore.getTempFByIndex(0);
  
  // Visualizzazione delle letture 
  // della temperatura sulla Serial monitor
  
  Serial.print("C:");
  Serial.print(celsius);
  Serial.print(",");
  Serial.print(" F:");
  Serial.println(fahrenheit);

  // se la temperatura è oltre la soglia
  // viene accesso il LED su scheda
  // altrimenti rimane spento
  
  if (celsius > soglia) {
    digitalWrite(pinLed, HIGH);
  } else {
    digitalWrite(pinLed, LOW);
  }
  // stampe delle temperature ogni secondo
  delay(1000);
}

Il codice è molto simile al precedente, all’interno del loop, lo sketch richiede una lettura della temperatura, quindi legge la temperatura in Celsius, poi Fahrenheit.

Sono disponibili alcune utili funzioni che possono essere usate con l’oggetto DallasTemperature di seguito il dettaglio di alcune di esse:

La funzione setResolution() function imposta la risoluzione del convertitore Analogico-Digitale del DS18B20 a 9, 10, 11, or 12-bit, che corrispondono ad incrementi di  0.5°C, 0.25°C, 0.125°C e  0.0625°C.

La funzione setHighAlarmTemp() e setLowAlarmTemp () imposta gli allarmi interni di alta e bassa temperatura in gradi Celsius. L’intervallo valido è compreso tra -55 e 125 ° C

La funzione bool hasAlarm () restituisce true se il sensore rileva una condizione di superamento dei limiti minimo o massimo di temperatura.

Esercizio 1

  • Rilevare ogni 2 secondi 10 misurazioni, memorizzare questi valori in un Array
  • Visualizzare la temperatura minima, media e massima ogni 10 secondi su un display 16×2 I2C
  • Se la temperatura scende sotto il valore minimo o supera il valore massimo impostati viene emesso un allarme (messaggio su display, emissione di un suono, accensione di un LED rosso per il superamento del valore massimo, azzurro se la temperatura scende al di sotto del valore minimo impostato)

Esercizio 2

Realizzare le medesime funzionalità dell’esercizio precedente aggiungendo:

  • Ridurre la luminosità del display dopo 15 secondi di funzionamento
  • Alla pressione di un pulsante viene attivata la retroilluminazione del display
  • Se viene attivato un allarme si attiva la retroilluminazione

Nella prossima lezione vedremo come collegare sullo stesso bus più sensori DS18B20.

Buon Coding a tutti 🙂

5 min al giorno di sperimentazione con M5Stack mini – Sensore TOF

Buoni propositi: utilizzare 5 minuti della mia giornata di lavoro per sperimentare alcuni utilizzi di M5Stick Mini, ma anche per sollecitare la curiosità e voglia di sperimentazione da parte dei miei studenti… pillole tecnologiche 🙂
Recentemente ho acquistato un sensore ToF (Time of Flight: tempo di volo) VL53L0X con connettore GROVE per effettuare misure precise sulla della distanza di ostacoli con M5Stick mini.

Un sensore ToF effettua un conteggio del tempo totale di volo dei fotoni dal momento in cui vengono emessi da un piccolissimo raggio laser al momento in cui viene rilevata la riflessione su un fotodiodo collocato sul sensore.
In generale il tempo di volo (spesso indicato con TOF, dall’inglese Time Of Flight) indica la misura del tempo impiegato da un oggetto, una particella o un’onda (elettromagnetica, acustica, elettromagnetica o di altro tipo) per percorrere una certa distanza in un mezzo determinato. (fonte: Wikipedia)
Il sensore è in grado di fornire una misura molto precisa della distanza, indipendentemente dalla riflettanza della superficie incidente.

Il sensore ToF di cui dispongo è un VL53L0X che incorporato un emettitore Laser VCSEL ed un fotodiodiodo ricevitore SPAD. Il laser è in grado di emettere impulsi a 940 nm (prossimi al campo infrarosso). Il fotodiodiodo SPAD è estremamente sensibile al singolo fotone e grazie alla schermatura di cui è costituito riceve soltanto la lunghezza d’onda di 940 nm del laser.

Il sensore che sto utilizzando sul mio M5Stick mini connesso in I2C, è in grado di misurare la distanza di oggetti dai 30mm a 800 mm, ma in commercio è possibile trovare sensori che sono in grado di misurare con precisione distanze fino a 2m. Campi di impiego: telecamere, macchine fotografiche, smartphone e sensoristica industriale.

L’integrato elettronico VL53L0 viene prodotto dalla ST Microelettronics, seguendo il link trovate maggiori informazioni tecniche.

Durante le nostre sperimentazioni elettroniche a scuola, spesso usiamo sensori basati sull’uso di un diodo LED emettitore di infrarossi ed un fotodiodi ad infrarossi ricevente  che sono influenzati dalla luce ambiente e dall’assorbimento della luce rilevata. Stessa cosa capita nel caso si utilizzi sensori ad ultrasuoni, dove la misura della distanza è fortemente dipendente dall’angolo di incidenza dell’onda ultrasonica e dalla fonoassobenza degli ostacoli di cui si vuole misurare la distanza.

Per maggiori informazioni sulle nozioni di base sull’utilizzo dei sensori ToF vi rimando al breve articolo di digikey dove oltre a presentare la tecnologia ToF, trovate dettagli interessanti su altre tecnologie utilizzate per la rilevazione della distanza degli ostacoli.
Nell’articolo si ripercorre la storia della sensistica per la misurazione degli ostacoli:

  • sensori di prossimità delle prime macchine fotografiche della Polaroid
  • sensori ad ultrasuoni come gli SR-HC04 che utilizziamo nelle sperimentazioni con Arduino
  • sensori ad infrarossi della Sharp
  • sensori ToF

Trovate il sensore ToF VL53L0X su schede che possono essere comodamente connessi in I2C ad Arduino a costi estremamente contenuti.

L’utilizzo del sensore ToF con M5Stick mini è estremamente semplice.

E’ sufficiente aggiungere tra i sensori disponibili il ToF, così come indicato nell’immagine che segue ed utilizzare così l’istruzione che permette di misurare la distanza dell’ostacolo.

Nel programma indicato di seguito viene misurate la distanza dell’ostacolo è nel caso in cui la misura sia inferiore ai 50 mm viene acceso il LED rosso disposto sull’M5Stick mini.

Ovviamente sviluppare ora un sistema per valutare il tempo necessario per lavarsi le mani, così come indicato nell’articolo: Arduino – Esercizio: Realizzare un timer per il lavaggio delle mani risulta semplicissimo.

Buona sperimentazione a tutti 🙂

Arduino: utilizzo del sensore di umidità e temperatura DHT11

Proseguo con le sperimentazioni di laboratorio di Sistemi dedicate alla progettazione di una semplice stazione meteorologica. In questa lezione i miei allievi di 5 Automazione dovranno gestire un sensore di umidità e temperatura DHT 11 e svolgere successivamente i tre esercizi proposti al termine di questa guida.

Il DHT11 è un sensore digitale di umidità e temperatura dell’aria costituito da una parte resistiva che si occupa della rilevazione dell’umidità e da un NTC che rileva la temperatura, queste due parti sono gestite da un microcontrollore che è parte integrante del sensore. Il DHT 11 viene pre-calibrato in fabbrica e i dati di calibrazione vengono memorizzati all’interno di una memoria di sola lettura (OPT Memory).

Caratteristiche del sensore

  • Intervallo di temperatura: da 0 a 50 ºC +/-2 ºC
  • Intervallo di umidità: da 20 a 90% +/-5%
  • Risoluzione:
    • Umidità: 1%
    • Temperatura: 1ºC
  • Tensione di alimentazione: 3 – 5.5 V DC
  • Corrente assorbita: 0.5 – 2.5 mA
  • Periodo di campionamento: 1 sec

Le dimensioni ridotte, il basso consumo energetico e la possibilità di trasmettere il segnale su cavo fino a 20 metri lo rendono interessante per diverse applicazioni sia in campo hobbistico che semiprofessionale.

Quando la lunghezza del cavo di collegamento è inferiore a 20 metri è consigliabile inserire una resistenza di pull-up da 4,7 Kohm sulla linea dati (pin 2).

Il sensore può essere acquistato in due configurazioni:

Componente singolo a 4 pin su stessa linea

Componente montato su breakout board a 3 pin (in questo caso la resistenza di pull-up interna sul pin 2 è già presente)

Pinout

Nel caso in cui si utilizzi il componente a 4 pin la corrispondenza è la seguente

  • pin 1: Vcc
  • pin 2: Out
  • pin 3: non connesso
  • pin 4: GND

Per filtrare i segnali di disturbo provenienti dall’alimentazione è consigliabile inserire un condensatore da 100nF tra Vcc e GND.

Modalità di comunicazione

La lettura dei dati rilevati dal sensore può avvenire solo dopo un tempo di 1 secondo dall’atto dell’accensione del sensore.

La comunicazione con il sensore avviene utilizzando una connessione seriale che utilizza un solo filo (Single-Wire Two-Way). Il pacchetto informativo che include i dati di temperatura ed umidità inviati dal sensore ha una lunghezza di 40 bit ed una durata di 4 ms.

Il DHT11 quando alimentato si pone in una modalità a basso consumo. Quando il microcontrollore invia un segnale di start, il DHT11 passa dalla modalità a basso consumo alla modalità di funzionamento nell’attesa che il Microcontrollore completi la fase di avvio. Completata la fase di avvio il sensore invia un pacchetto informativo di risposta al microcontrollore costituito da 40 bit al cui interno si trovano le informazioni relative a umidità e temperatura rilevate. Senza il segnale di start proveniente dal microcontrollore il DHT11 non fornirà mai i dati. Conclusa la fase di invio dati il DHT11 ritorna in una modalità a basso consumo fino a quando non rileva un nuovo segnale di start proveniente dal microcontrollore.

Schema di collegamento

Per poter utilizzare il sensore è indispensabile utilizzare una libreria specifica, utilizzeremo  la libreria DHT di Adafruit

Per poter installare la libreria andare in Sketch > Library > Include Library > Manage Libraries

Inserite nel campo di ricerca “DHT” e selezionate la libreria di Adafruit:

Procedere successivamente all’installazione della libreria “Adafruit Unified Sensor”, procedendo seguendo la medesima procedura adottata per la libreria precedente:

Per verificare il funzionamento del sensore aprite lo sketch: File > Examples > DHT Sensor library > DHTtester

Lo sketch DHTtester permetterà di stampare temperatura e umidità sulla Serial Monitor

// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

// REQUIRES the following Arduino libraries:
// - DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library
// - Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor

#include "DHT.h"

#define DHTPIN 2     // Digital pin connected to the DHT sensor
// Feather HUZZAH ESP8266 note: use pins 3, 4, 5, 12, 13 or 14 --
// Pin 15 can work but DHT must be disconnected during program upload.

// Uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 5V!
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

// Initialize DHT sensor.
// Note that older versions of this library took an optional third parameter to
// tweak the timings for faster processors.  This parameter is no longer needed
// as the current DHT reading algorithm adjusts itself to work on faster procs.
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  Serial.println(F("DHTxx test!"));

  dht.begin();
}

void loop() {
  // Wait a few seconds between measurements.
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  Serial.print(F("Humidity: "));
  Serial.print(h);
  Serial.print(F("%  Temperature: "));
  Serial.print(t);
  Serial.print(F("°C "));
  Serial.print(f);
  Serial.print(F("°F  Heat index: "));
  Serial.print(hic);
  Serial.print(F("°C "));
  Serial.print(hif);
  Serial.println(F("°F"));
}

Analisi del codice

Inclusione della libreria DHT

#include "DHT.h"

Definizione del pin digitale di Arduino a cui collegheremo il pin dati del DHT 11

#define DHTPIN 2     // Digital pin connected to the DHT sensor

Definizione di quale tipo di sensore DHT deve essere utilizzato, nel nostro caso il DHT 11.

#define DHTTYPE DHT11   // DHT 11

Se state utilizzando un altro sensore DHT, dovrete commentare la riga precedente e rimuovere il commento da una delle seguenti linee di codice:

//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

Inizializza un oggetto DHT chiamato dht con il pin e digitale che avete definito in precedenza

DHT dht(DHTPIN, DHTTYPE);

Nel setup() inizializziamo la Serial Monitor con un baud rate di 9600 caratteri e scriviamo un testo per avere percezione che il sistema è avviato

  Serial.begin(9600);
  Serial.println(F("DHTxx test!"));

Inizializziamo il sensore DHT con il metodo .begin()

dht.begin();

Nel loop() viene aggiunto un ritardo di 2 secondi affinché il sensore si stabilizzi ed abbia il tempo di effettuare la lettura dei dati. La frequenza di campionamento massima è di due secondi per il DHT22 e un secondo per il DHT11.

delay(2000);

Per ottenere l’umidità, è sufficiente utilizzare il metodo readHumidity() sull’oggetto dht. Nello scketck viene salvato il valore nella variabile. Si noti che il metodo readHumidity() restituisce un valore di tipo float.

float h = dht.readHumidity();

Per ottenere leggere la temperatura bisogna utilizzare il metodo readTemperature()

float t = dht.readTemperature();

Nel caso in cui si voglia leggere la temperatura in gradi Fahrenheit è sufficiente passare il valore true al metodo readTemperature()

  float f = dht.readTemperature(true);

La libreria include anche metodi per calcolare l’indice di calore in Fahrenheit e Celsius

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

Il codice che segue stampa sulla Serial Monitor i dati letti

  Serial.print(F("Humidity: "));
  Serial.print(h);
  Serial.print(F("%  Temperature: "));
  Serial.print(t);
  Serial.print(F("°C "));
  Serial.print(f);
  Serial.print(F("°F  Heat index: "));
  Serial.print(hic);
  Serial.print(F("°C "));
  Serial.print(hif);
  Serial.println(F("°F"));

Effettuato l’upload dello sketch sulla scheda aprendo la Serial Monitor vedere i dati letti dal sensore

Noterete che il sensore risulta molto lento nel fornire la temperatura e l’umidità reale, ha necessità di qualche minuto affinché la misura si stabilizzi su quella realmente presente nell’ambiente.

Di seguito lo sketch semplificato in più parti che fornisce solo la lettura di umidità e temperatura:

// Libreria DHT
#include "DHT.h"

// Pin digitale di arduino connesso al DHT
#define DHTPIN 2

// tipo del sensore: DHT 11
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  Serial.println(F("DHTxx test!"));

  dht.begin();
}

void loop() {
  // Attesa di 2 secondi prima di fornire la misura.
  delay(2000);

  // Lettura dell'umidità
  float h = dht.readHumidity();
  // Lettura della temperatura in gradi Celsius
  float t = dht.readTemperature();

  // Verifica se le si presenta un errore di lettura (e riprova nuovamente)
  if (isnan(h) || isnan(t)) {
    Serial.println(F("Impossibile leggere dal sensore DHT!"));
    return;
  }

  Serial.print(F("Umidità: "));
  Serial.print(h);
  Serial.print(F("%  Temperatura: "));
  Serial.print(t);
  Serial.println(F("°C "));
}

Nota

Avrete sicuramente notato che l’istruzione Serial.print contiene al suo interno come parametro F(“testo”). La “F” indica che la stringa non utilizza la RAM della scheda.

Quando compilate uno sketch Arduino alla fine della compilazione viene indicata la quantità di memoria occupata dal programma (memorizzata nella memoria flash) che state utilizzando e la quantità di RAM dinamica che state utilizzando.

Nel caso si utilizzi un gran quantità di testo costante potreste incorrere in un messaggio di errore di “memoria insufficiente”, ciò vuol dire che si è esaurita la RAM a disposizione.

Ciò dipende dal fatto che le stringhe di testo costanti presenti nello sketch vengono sempre allocate in RAM.

Per risolvere il problema è sufficiente indicare al compilatore che tutte le stringhe di testo costanti contenute nelle Serial.print non dovranno essere allocate nella RAM.

Attenzione che ciò non potrete essere fatto per le Serial.print che contengono variabili.

Quindi

  Serial.print("Umidità: ");

può essere sostituita con

  Serial.print(F("Umidità: "));

e così anche per le altre Serial.print che contengono un testo costante.

Esercizi

Esercizio 1: inviare temperatura e umidità su un display 16×2 I2C

Esercizio 2: utilizzare due pulsanti che permetteranno rispettivamente di mostrare temperatura e pressione sul display

Esercizio 3: All’avvio dello sketch con retroilluminazione attiva, appare un messaggio di benvenuto che dura 2 secondi, successivamente un messaggio che mostra l’help di utilizzo, ad esempio:

  • P1 temperatura
  • P2 umidità

questo messaggio persiste per 5 secondi, dopo di che la retroilluminazione viene disattivata (il testo help rimane presente sul display).

Non appena si preme uno dei due pulsanti si attiva la retroilluminazione del display e compare il dato richiesto per 5 secondi, allo scadere del tempo ricompare l’help e la retroilluminazione si disattiva.

Buon making a tutti 🙂

Esercizio Arduino in 5 minuti – usare un Sensor Tracking

Continuo la recensione del kit sensori di cui avevo parlato qualche giorno fa con questo breve post che nasce dall’esigenza di un lettore del blog che mi ha chiesto come utilizzare il sensor tracking incluso nella confezione. Il sensore si presenta come una piccola scheda elettronica i cui componenti principali sono costituiti da un led emettitore ad infrarossi ed un ricevitore.
Un’applicazione in cui io sfrutto questo sensore è ad esempio per la realizzazione di robot segui linea o ancora per realizzare un contagiri e controllare la velocità di rotazione dei miei prototipi robotico.
Potrete ad esempio di distinguere, per brevi distanza dal sensore, le differenze bianco/nero incontrate su una superficie. Su un apposito pin verrà emesso un segnale di tipo TTL che andremo a leggere con Arduino.

Il sensore è costituito da tre pin, GND, OUT (il segnale) e Vcc.
La sensibilità del sensore può essere regolata mediante un apposito trimmer.

Sensor-Tracking-03

Nell’esempio descritto, per avere percezione visiva e sonora della transizione tra bianco e nero ho utilizzato un led connesso al pin 12 ed buzzer connesso al pin 7. Utilizzerò un foglio bianco su cui ho disegnato due strisce nere.

Sensor-Tracking-01

Sensor-Tracking-02

Collegamenti:

Sensore – Arduino:

pin segnale OUT -> pin digitale 7
– negativo -> GND
+ positivo -> 5V

Buzzer – Arduino

pin segnale S -> pin digitale 4
+ positivo -> 5V
– negativo -> GND

Lo sketch è estremamente semplice è dovrete semplicemente verificare la presenza dello stato HIGH sul pin 7 di Arduino, accendere il led se si è sulla linea nera ed emettere un suono, oppure se si è sul bianco spegnere il led e non emettere suono.

// Prof. Michele Maffucci
// 25.01.15
// Utilizzo di un Sensor Tracking e di un buzzer passivo

const int pinSensore = 7;
// pin a cui è collegato il sensore

const int pinLed = 12;
// pin a cui è collegato il led

const int pinBuzzer = 4;
// pin a cui è collegato il buzzer

const int frequenza = 440;
// frequenza emessa dal buzzer (440 Hz)

void setup()
{
  // inizializzazione del pin sensore, led e buzzer
  pinMode(pinSensore, INPUT);
  pinMode(pinLed, OUTPUT);
  pinMode(pinBuzzer,OUTPUT);
}

void loop()
{
  // conserviamo nella variabile var lo stato del sensore
  int val = digitalRead(pinSensore);

  // verifichiamo se viene letto "NERO"
  // se vero accendiamo il led
  if(val == HIGH)
  {
    digitalWrite(pinLed, HIGH);   // accende il led
    tone(pinBuzzer, frequenza);   // viene emesso dal buzzer un suono a frequenza fissata
    delay(5);                     // attesa di 5 millisecondi (in modo da percepire il suono emesso)   
  }
  // altrimenti spegniamo il led
  else
  {
    digitalWrite(pinLed, LOW);   // spegne il led
    noTone(pinBuzzer);           // non viene emesso nessun suono dal buzzer
  }
}

Carnevale della matematica: Arduino e un po’ di informatica per sapere quanto sei “brillo” quando esci dalla discoteca

Il mio secondo contributo al 45° Carnevale della matematica.

Cerco di continuo appigli nel vivere quotidiano dei miei allievi per amplificare il loro spirito critico e di osservazione al fine di condurli verso la nascita di una passione per un interesse che potrebbe trasformarsi in un lavoro futuro o in una competenza utile.
In questi anni, come più volte dichiarato su queste pagine, insegno anche l’utilizzo di Arduino, un dispositivo elettronico che mi consente di far interagire tre mondi: l’elettronica, l’informatica e il mondo fisico che ci circonda. La potenzialità di Arduino risiede nel fatto che, se opportunamente utilizzato con specifiche sperimentazioni, amplifica la curiosità e la voglia di sperimentare, creando un sistema “reazionato mentale” (nel senso elettronico del termine 🙂 ) che induce la voglia di risolvere sempre più problemi tecnici anche complessi riducendo la paura della matematica, della logica e quindi dell’informatica.

In una delle mie lezioni introduttive sull’uso di Arduino ho illustrato come possa essere possibile con un po’ di senso pratico, elettronica e informatica progettare dispositivi complessie e tra i vari esempi ho parlato di rilevatori di gas e…

…addirittura potreste misurare quanto siete brilli quando uscite dalla discoteca costruendo un etilometro

La cosa ha suscitato talmente tanto interesse che la lezione ha avuto risvolti positivi… sperimentazione e studio anche a casa!

Ma perché ho parlato di etilometro?

Tutto nacque tempo fa quando confidai ad alcuni miei studenti di 5′ la preoccupazione nell’aver visto studenti di non più di 17 anni, che usciti da scuola, alla fermata del pullman, tirarono fuori dallo zaino di scuola un softdink.

Questa la risposta lapidaria della maggioranza dei ragazzi:

STUDENTE: Prof. bere a più non posso e fare casino in discoteca, sballarsi di alcolici e dare di stomaco sono cose che accadono di continuo fuori e dentro alle discoteche che frequentiamo, gente che si ritrova in festini che nascono al puro scopo di sballarsi di superalcolici…

IO: e tu come ti comporti?

STUDENTE: io sto alla larga da tutto ciò, ho un amico che è finito sulla sedia a rotelle per un incidente era pieno di alcool ed era alla guida, fortunatamente non ha ucciso nessuno.

Queste dichiarazioni alcune volte mi fanno rabbrividire, ma purtroppo sono confermate anche dalle statistiche dell’ISTAT che nella ricerca: L’uso e l’abuso di alcol in Italia viene detto che:

Nel 2010 la quota di popolazione di 11 anni e più che ha consumato almeno una bevanda alcolica durante l’anno è pari al 65,7%, in diminuzione rispetto al 2009 (68,5%); il 26,3% della popolazione (14 milioni 126 mila persone) beve alcolici quotidianamente, mentre il 38,4% ha consumato alcol almeno una volta fuori dai pasti.

Beve vino il 53,3% delle persone di 11 anni e più, birra il 45,9% e aperitivi alcolici, amari, superalcolici o liquori il 39,9%; beve vino tutti i giorni il 24,1% e birra il 4,3% della popolazione di riferimento.

Negli ultimi 10 anni tra i giovani sono aumentati i consumatori occasionali, quelli che bevono fuori pasto e di chi consuma altri alcolici oltre a vino e birra, mentre si sono ridotti i consumatori giornalieri e quelli che bevono solo vino e birra.

Nel complesso i comportamenti a rischio nel consumo di alcol (consumo giornaliero non moderato), binge drinking (sei o più bicchieri di bevande alcoliche in un’unica occasione) e consumo di alcol da parte dei ragazzi di 11-15 anni) riguardano 8 milioni e 624 mila persone, il 16,1% della popolazione di 11 anni e più. Tale quota appare stabile nel tempo.

per i dati completi si legga il pdf dell’intera ricerca che trovate seguendo il link.

Tutto ciò è molto preoccupante ed io cosa posso fare?

Posso incominciare a rendere il “bit fisico” a misurare la quantità di alcol che uno studente ha nel sangue, con la speranza di metterlo in allerta, sperando che lo strumento da lui costruito (che serve a lui) lo sensibilizzi ancora di più rispetto al problema alcol.
Allora come sempre dico: fare e costruire per prevenire… anche con l’informatica.

Quello che segue e la prima parte di un circuito ed un software più complesso che svilupperemo con i miei allievi nei prossimi mesi, è l’inizio di una unità didattica che ho chiamato:

Ecco come ti misuro con Arduino lo sballo alcolico che ti può uccidere.
Costruiamo un etilometro indossabile

L’idea e di creare un dispositivo elettronico molto piccolo ed indossabile che può misurare in tempo reale la quantità di alcol nel sangue. Questa è la parte preliminare di costruzione del primo prototipo. Gli sviluppi successivi prevedono:

  • una versione con una barra led che indica il livello di alcol
  • una versione con un display che indica numericamente il livello di alcol

Per la costruzione del primo prototipo di cosa abbiamo bisogno?

  • scheda Arduino UNO,
  • un sensore di alcol MQ-3
  • potenziometro da 100 KOhm
  • un pizzico di informatica

La visualizzazione della quantità di alcol verrà visualizzata in tempo reale sul computer.

Non mi dilungherò molto sulle caratteristiche fisiche del sensore per approfondimenti seguite i link:

Il sensore è molto sensibile all’alcol, è costituito, come mostrato in figura, da 6 piedini di cui però ne utilizzeremo solo 4 in quanto due piedini sono duplicati. I piedini A sono tra loro collegati così come i piedini B.

 

Il sensore per funzionare deve essere riscaldato e ciò avviene collegandolo tramite i piedini H ad una tensione di alimentazione di 5V.
A questo punto scegliete quali piedini utilizzare (A o B è la stessa cosa) seguendo lo schema elettrico sopra indicato. La Vout dovrà essere inviata al pin analogico 0 di Arduino e l’altro capo della RL a GND.

L’utilizzo di un potenziometro ci consentirà di aumentare e diminuire la sensibilità dello struento.

Questo il codice:

/*
etilometro ver. 1.0
Michele Maffucci: https://www.maffucci.it
derivato dal lavoro di TigPT: http://www.LusoRobotica.com
*/

const unsigned int PIN = 0; // pin a cui sarà collegato il sensore
const unsigned int BAUD_RATE = 9600; // definiamo il boud rate della porta seriale
unsigned int valore = 0; // variabile intera non negativa per il valore rilevato dal sensore

void setup() {
Serial.begin(BAUD_RATE); // apriamo la porta seriale USB e la inizializziamo a 9600 bps.
pinMode(PIN,INPUT); // dichiariamo di utilizzare il piedino PIN come ingresso
}

void loop() {
valore = analogRead(PIN); // in valore conserviamo la lettura che proviene da PIN
Serial.println(valore); // stampiamo sulla Serial monitor "valore"
delay(500); // aggiungiamo un ritardo tra le letture successive di mezzo secondo
}

Questo il filmato: