Comparazione tra sensori di temperatura ed umidità (Codice e configurazione) – Parte 2

Spread the love

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

bmp280

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 AliExpress

Per 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
Vcc on thermistor
Vcc on thermistor 
Vcc on resistor
Vcc on resistor

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.

  1. Comparazione tra sensori di temperatura ed umidità (Specifiche)
  2. Comparazione tra sensori di temperatura ed umidità (Codice e configurazione)
  3. Comparazione tra sensori di temperatura ed umidità (Dati)

Spread the love

2 Risposte

  1. zoomx ha detto:

    bme.begin() adesso supporta anche l’indirizzo I2C da mettere fra le parentesi, non c’è più bisogno di modificare la libreria.

Rispondi a Renzo Mischianti Annulla risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *