Comparazione tra sensori di temperatura ed umidità (Codice e configurazione) – Parte 2
Innanzitutto è necessario connettere tutti i sensori. Userò un Arduino UNO per leggere i valori.
BMP280
Puoi trovarlo qui AliExpress
Per questo sensore esiste una libreria dell’Adafruit che puoi cercare ed installare dall’Arduino IDE al link Library Manager
Per usare questa libreria devi anche installare l'”Adafruit Unified sensor”.
Cablaggio
Ora importa la libreria ed instanzia l’oggetto bme (userò questo sensore con il protocollo i2c).
// BMP280
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bme; // I2C
Su setup avvialo
if (!bme.begin()) {
Serial.println("Could not find a valid BMP280 sensor, check wiring!");
while (1);
}
Se ricevi un errore al begin fai il check della connessione innanzitutto, ma probabilmente dovrai cambiare l’indirizzo i2c, ti consiglio di caricare uno schetck che faccia da scanner i2c come questo sotto:
#include <Wire.h>
void setup()
{
Wire.begin();
Serial.begin(9600);
while (!Serial); // Leonardo: wait for serial monitor
Serial.println("\nI2C Scanner");
}
void loop()
{
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ )
{
// The i2c_scanner uses the return value of
// the Write.endTransmisstion to see if
// a device did acknowledge to the address.
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("I2C device found at address 0x");
if (address<16)
Serial.print("0");
Serial.print(address,HEX);
Serial.println(" !");
nDevices++;
}
else if (error==4)
{
Serial.print("Unknown error at address 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");
delay(5000); // wait 5 seconds for next scan
}
Per le vecchie librerie vai a settare l’indirizzo a questa riga della libreria:
/*=========================================================================
I2C ADDRESS/BITS
-----------------------------------------------------------------------*/
#define BMP280_ADDRESS (0x76)
/*=========================================================================*/
la nuova libreria supporta il passaggio dell’indirizzo i2c come mi è stato segnalato da zoomx.
bme.begin(0x76)
Ora fimalmente puoi leggere i dati dal tuo bme.
float t = bme.readTemperature();
bme280_T = t;
float p = bme.readPressure();
float alt = bme.readAltitude(1013.25); // this should be adjusted to your local forcase
Serial.print("bmp280 --> ");
Serial.print("Humidity: ");
Serial.print(" ");
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(" ");
Serial.print(" *F\t");
Serial.print("Pressure: ");
Serial.print(p);
Serial.print(" Pa ");
Serial.print(alt);
Serial.println(" m");
DHT11 and DHT22
Puoi trovarlo qui AliExpress
Puoi trovarlo qui AliExpress
Anche questi sensori hanno una libreria Adafruit.
Cablaggio.
Importa la libreria ed includila.
// DHT11 and DHT22
#include "DHT.h"
#define DHT22PIN 10 // what digital pin we're connected to
#define DHT11PIN 9 // what digital pin we're connected to
DHT dht22(DHT22PIN, DHT22);
DHT dht11(DHT11PIN, DHT11);
Al setup avvia i sensori
dht11.begin();
dht22.begin();
Ora puoi leggere i dati
float h = dht22.readHumidity();
dht22_H = h;
t = dht22.readTemperature();
dht22_T = t;
float f = dht22.readTemperature(true);
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
float hif = dht22.computeHeatIndex(f, h);
float hic = dht22.computeHeatIndex(t, h, false);
Serial.print("DHT22 --> ");
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F\t");
Serial.print("Heat index: ");
Serial.print(hic);
Serial.print(" *C ");
Serial.print(hif);
Serial.println(" *F");
h = dht11.readHumidity();
dht11_H = h;
t = dht11.readTemperature();
dht11_T = t;
f = dht11.readTemperature(true);
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
hif = dht11.computeHeatIndex(f, h);
hic = dht11.computeHeatIndex(t, h, false);
Serial.print("DHT11 --> ");
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F\t");
Serial.print("Heat index: ");
Serial.print(hic);
Serial.print(" *C ");
Serial.print(hif);
Serial.println(" *F");
DHT12
Puoi trovarlo qui DHT12 AliExpressPer questo sensore userò la mia libreria che puoi trovare qui ed il relativo articolo con tutta la descrizione e la libreria stessa qui.
Cablaggio
Importa la libreria ed includila. (userò in questo esempio il protocollo i2c).
// DHT12
#include <DHT12.h>
#define DHT12PIN 8 // what digital pin we're connected to
DHT12 dht12(DHT12PIN, true);
Al setup avvia il sensore
dht12.begin();
Ora puoi leggere i dati
h = dht12.readHumidity();
dht12_H = h;
t = dht12.readTemperature();
dht12_T = t;
f = dht12.readTemperature(true);
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
hif = dht12.computeHeatIndex(f, h);
hic = dht12.computeHeatIndex(t, h, false);
Serial.print("DHT12 --> ");
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F\t");
Serial.print("Heat index: ");
Serial.print(hic);
Serial.print(" *C ");
Serial.print(hif);
Serial.println(" *F");
Dallas Temperature ds18b20
Puoi trovarlo qui AliExpress
Termometro digitale con risoluzione programmabile.
Scarica la specifica libreria dal Library Manager:
Cablaggio
Importa la libreria ed instanzia l’oggetto OneWire e DallasTemperature.
// Data wire is plugged into port 11 on the Arduino
#define ONE_WIRE_BUS 11
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature dallas(&oneWire);
// arrays to hold device address
DeviceAddress insideThermometer;
DeviceAddress tempDeviceAddress; // We'll use this variable to store a found device address
Poi avvia con il corretto indirizzo:
dallas.begin();
dallas.getAddress(tempDeviceAddress, 0);
Ora puoi leggere i dati
// Dallas
dallas.requestTemperatures(); // Send the command to get temperatures
t = dallas.getTempC(tempDeviceAddress);
dallas_T = t;
f = DallasTemperature::toFahrenheit(t); // Converts tempC to Fahrenheit
Serial.print("Dallas --> ");
Serial.print("Humidity: ");
Serial.print(" ");
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F\t");
Serial.print("Heat index: ");
Serial.print(" ");
Serial.print(" *C ");
Serial.print(" ");
Serial.println(" *F");
Termistore
Puoi trovarlo qui NTC MF58 3950 B 5% 1% 5K 10K 20K 50K 100K
Per il termistore userò una mia libreria ma ne esiste una di default.
Thermistor connection schema
Scaricala installala (vedi il readme su github) ed importala.
// Thermistor
#include "Thermistor.h"
// Set pin to A3, using complex formula, adjust resistance to 9900ohom measured with tester, set 10kohom to nominal // of thermistor, 24° nominal thermistor, 3950 thermistor and take 10 analogRead
Thermistor therm(A3, false, 9900, 10000, 24, 3950, 10);
Lo connetterò con VCC sul termistore non sulla resistenza.
therm.setVccToThermisor(false);
Ora puoi leggere i dati
// Termistor
t = therm.readTemperature();
termistor_T = t;
f = therm.readTemperature(true);
Serial.print("Termistor> ");
Serial.print("Humidity: ");
Serial.print(" ");
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F\t");
Serial.print("Heat index: ");
Serial.print(" ");
Serial.print(" *C ");
Serial.print(" ");
Serial.println(" *F");
Grazie
Nel prossimo articolo finalmente andremo a fare la comparazione dei dati di questi sensori.
- Comparazione tra sensori di temperatura ed umidità (Specifiche)
- Comparazione tra sensori di temperatura ed umidità (Codice e configurazione)
- Comparazione tra sensori di temperatura ed umidità (Dati)
bme.begin() adesso supporta anche l’indirizzo I2C da mettere fra le parentesi, non c’è più bisogno di modificare la libreria.
Grazie per la segnalazione integro subito l’articolo.
Grazie ancora Renzo