14. Arduino lämpötilan ja ilman kosteuden mittaus

Alunperin julkaistu: 4.2.2021

Viimeksi muokattu: torstai 4.2.2021

Tässä lyhyessä oppaan osassa kokeillaan, kuinka lämpötilaa ja ilmankosteutta voidaan Arduinolla (Uno) yksinkertaisesti mitata. Kuten arvata saattaa, niin minkä tahansa fysikaalisen suureen mittaamisen tarvitaan anturi ja tässä tapauksessa se on tämä anturi nimeltään DHT11.

Arduino lämpötila-anturi ja kosteusanturi
Kuvan anturi on hieman jäässä kylmäsprayn jäljiltä...

Lämpötila-antureita on olemassa montaa eri sorttia ja tässä käytetty, useimmista kokeiluseteistä löytyvä DHT11-anturi antaa lämpötilan ja ilmankosteuden digitaalisessa muodossa eli nollina ja ykkösinä. Mittausalue on 0-60 astetta celsiusta ja 20-90% RH, joten kovin alhaisiin tai korkeisiin lämpötiloihin tämä ei sovellu. Anturissa on siis yhdistettynä ilmankosteuden mittaus, joten tämä sopii hyvin esimerkiksi yksinkertaisiin kasvihuonesovelluksiin tai kastepisteen mittaukseen.

DHT11 Arduino anturi
DHT11 lämpötila- ja kosteusanturi

Anturi käyttää kolmea pinniä, joista kaksi ovat +5V käyttöjännite ja maa sekä kolmas on datan siirtoon käytettävä pinni. Vaikka kyseessä on periaatteessa ns. 1-wire anturi, se ei kuitenkaan noudata virallista OneWire-protokollaa. Menikö yli? Ei hätää. Lue eteenpäin, yritetään selvittää.

Datan lukeminen

Anturin data luetaan siis binäärisenä ja tarkemmin protokollan toiminnasta voi lukea tästä linkistä (https://www.electronicwings.com/sensors-modules/dht11). Käydään kuitenkin lyhyesti läpi kuinka anturi datansa ilmoittaa.

Kommunikointi jakautuu kolmeen eri vaiheeseen. Ensimmäisessä vaiheessa Arduino kysyy DHT11 anturilta onko dataa saatavilla lähettämällä väylälle 18 millisekunnin mittaisen 0-pulssin (start).

DHT11 väylän aloituspulssi

Anturi vastaa tähän 1-pulssilla, jonka pituus on 54 mikrosekuntia ja sen jälkeen pitää datalinjaa 80 mikrosekuntia 1-asennossa (response).

DHT11 väylän vastauspulssi

Tämän jälkeen anturi lähettää datansa 40 bitin pituisena purskeena, mikä Arduinon pitää vastaanottaa. Bitin määritys nollaksi tai ykköseksi tapahtuu pitämällä linjaa 1-asennossa eri pituisen ajan verran. Eli käytännössä Arduino mittaa väylältä, kuinka pitkään datalinja on ykkösessä ja asettaa bitin arvon sen perusteella. Alemmassa kuvassa on esitetty em. säännöistä muodostuva protokolla eli bittijono käytännössä.

DHT11 anturin 1 ja 0 bitit
DHT11 väylän protokolla

Kun lähetys loppuu, DHT11 anturi päättää tiedonsiirtonsa 54 mikrosekunnin mittaisella 0-pulssilla, minkä jälkeen väylä nousee takaisin 1-asentoon ja anturi palaa lepotilaan.

DHT11 lopetuspulssi

Lepotilassa anturi kuluttaa mahdollisimman vähän virtaa, eli noin 60 mikroampeeria.

Kuvien lähde: https://www.electronicwings.com/sensors-modules/dht11

DHT11 anturin (+näytön) kytkeminen Arduinolle

Anturin kytkeminen Arduinolle on varsin helppoa. Tarvitaan vain kolme hyppylankaa ja koekytkentäalusta. Anturi kytketään kuvan mukaisesti:

  1. Data -> Arduino pinni 7
  2. Käyttöjännite -> Arduino +5V
  3. Maa -> Arduino GND
Anturin kytkeminen Arduinoon

Anturin datojen tarkastelemiseen voidaan käyttää I2C-väyläistä näyttöä ja se kytketään Arduinoon seuraavasti:

  • Arduino +5V --> LCD-näytön VCC
  • Arduino GND --> LCD-näytön GND
  • Arduino pinni A5 --> LCD-näytön SCL (kellopulssi)
  • Arduino pinni A4 --> LCD-näytön SDA (data)
I2C-näytön kytkeminen Arduinolle

LCD-näyttö ei ole pakollinen juttu lisätä, yhtä hyvin anturitiedot voi lähettää sarjaportinkin kautta tietokoneelle.

DHT11 anturin lukeminen Arduinolla

Vaikka datan lukeminen voitaisiin suhteellisen helposti rakentaa itse, ei siihen tarvitse ryhtyä vaan voi käyttää olemassa olevia kirjastoja. Tässä esimerkissä käytetään DHTlib-nimistä valmista pakettia anturin datojen lukemiseen.

Aloitetaan lataamalla kirjasto Arduinolle Library Managerin kautta. Valitse Arduino IDE:n valikosta Tools -> Library Manager. Kirjoita hakukenttään "dhtlib" ilman hakasulkuja ja asenna hausta löytyvä DHTlib. Kun tämä on tehty voidaan siirtyä koodin kirjoittamiseen.

DHTlib Arduino kirjasto

Esimerkki 1: Lämpötilan luku Arduinolla

Tässä esimerkkiohjelmassa anturilta luetaan lämpötila ja näytetään se I2C-näytöllä.

#include <LiquidCrystal_I2C.h>
#include <dht.h>

#define LCD_ADDRESS       0x27
#define DHT11_PIN         7

// Prepare LCD library
LiquidCrystal_I2C lcd(LCD_ADDRESS,16,2);  

// Initialize DHT-library
dht humiditySensor;

// Initialize variables
int sensorValue = 0;
int sensorStatus = 0;

void setup() {
  lcd.init();                      // initialize the lcd 
  lcd.backlight();
  lcd.clear();
  lcd.print("DHT11 Demo");
}

void loop() 
{

  sensorStatus = humiditySensor.read11(DHT11_PIN);

  if(sensorStatus >= 0)
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Read OK!");
    delay(1000);
    String sensorValue = "Temp: " + String(humiditySensor.temperature) + " C";
    lcd.setCursor(0,0);
    lcd.print(sensorValue);
    lcd.setCursor(0,1);
    int _sensorValue = humiditySensor.temperature;
    lcd.print("Temp: ");
    lcd.print(_sensorValue,DEC);
    lcd.print(" C");
    
  }
  delay(3500);
}

Kun koodi ajetaan, näytössä näkyy lämpötilat kahdessa eri "formaatissa":

Ylemmällä rivillä koodissa yhdistetään String-tyyppiseen muuttujaan kaikki tiedot yhdellä koodirivillä. Alemmallä näytön rivillä on luku rakennettu yksittäisistä komennoista ns. pala palalta.

Esimerkki 2: Ilmankosteuden luku Arduinolla

Lisätään ohjelmaan ilmankosteuden mittaus. Muutetaan olennaisille riveille vain alla olevat kohdat (ohjelma on muutoin täysin sama):

    int _sensorValue = humiditySensor.humidity;
    lcd.print("RH: ");
    lcd.print(_sensorValue,DEC);
    lcd.print(" %");

Esimerkki 3: Kastepisteen laskeminen Arduinolla

Kastepisteellä tarkoitetaan lämpötilaa, missä ilmassa oleva vesihöyry alkaa tiivistymään kappaleiden pinnoille (tai maahan).

Ohjelmaan kastepiste-funktion lisäys on käytännössä kopioimista Arduinon virallisilta sivuilta. Toki voit kopioida sen tästäkin. Ohjelma kokonaisuudessaan tässä:

#include <LiquidCrystal_I2C.h>
#include <dht.h>

#define LCD_ADDRESS       0x27
#define DHT11_PIN         7

// Prepare LCD library
LiquidCrystal_I2C lcd(LCD_ADDRESS,16,2);  

// Initialize DHT-library
dht humiditySensor;

// Initialize variables
int sensorValue = 0;
int sensorStatus = 0;

void setup() {
  lcd.init();                      // initialize the lcd 
  lcd.backlight();
  lcd.clear();
  lcd.print("DHT11 Demo");
}

void loop() 
{
  sensorStatus = humiditySensor.read11(DHT11_PIN);

  if(sensorStatus >= 0)
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Read OK!");
    delay(1000);
    String sensorValue = "Temp: " + String(humiditySensor.temperature) + " C";
    lcd.setCursor(0,0);
    lcd.print(sensorValue);
    lcd.setCursor(0,1);
    int _sensorValue = humiditySensor.humidity;
    lcd.print("RH: ");
    lcd.print(_sensorValue,DEC);
    lcd.print("%");
    lcd.print("DP:");
    lcd.print(dewPointFast());
    
  }
  delay(3500);
}

// delta max = 0.6544 wrt dewPoint()
// 6.9 x faster than dewPoint()
// reference: https://en.wikipedia.org/wiki/Dew_point
double dewPointFast()
{
  double a = 17.271;
  double b = 237.7;
  double temp = (a * (double)humiditySensor.temperature) / (b + (double)humiditySensor.temperature) + log(humiditySensor.humidity*0.01);
  double Td = (b * temp) / (a - temp);
  return Td;
}

Ohjelma tulostaa nyt muiden tietojen lisäksi myös kastepisteen:

Arduino kastepisteen laskeminen
Säätiedot LCD-näytöllä

Kastepisteen voit tarkistaa esimerkiksi kastepistelaskurin avulla.

Kastepisteen desimaalin saa muutettua, kun käyttää lcd.print -komennon sisällä numeroa, joka kertoo montako desimaalia käytetään:

    lcd.print(dewPointFast(),1);

DHT11-anturin käyttäminen Arduinolla on kuten nähdään aika yksinkertainen ja nopea tehdä. Tätä tietoa voit hyödyntää esimerkiksi yksinkertaisen sää-aseman teossa tai vaikkapa osana kasvihuoneen anturointijärjestelmää.

Lähteitä ja linkkejä:

https://playground.arduino.cc/Main/DHT11Lib/
https://www.circuitbasics.com/how-to-set-up-the-dht11-humidity-sensor-on-an-arduino/
https://learn.adafruit.com/dht/connecting-to-a-dhtxx-sensor
https://www.openimpulse.com/blog/products-page/product-category/dht11-temperature-and-humidity-sensor/