Rob's web

Kamer thermo- hygrometer

De thermo- hygrometer geeft naast de actuele waardes ook de minimum en maximum waardes weer. De temperatuur in °C en relative-vochtigheid in %.

Benodigdheden

Bibliotheken

Gebruikt poorten

Lcd-keypad shield4, 5, 6, 7, 8, 9, 10, A0
DHT22 of 3

Sketch

Voor deze sketch gebruik ik een Mega. Heb je een UNO dan dien je de dht sensor op poort 3 aan te sluiten.

We beginnen met de bibliotheken.

#include <DHT.h>
#include <LiquidCrystal.h>

We defineren de knoppen.

#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5
#define btnUNKNOWN 6

We defineren de sensor.

#define DHTTYPE  DHT11     // DHT 11
#define DHTPIN   22        // Pin connected to the DHT sensor.

We schrijven nu de routine die een spanning naar een knop omzet. Zie schema van het shield.

int readkeypad(){
  int adc_key_in = analogRead(0);
  int ret = btnUNKNOWN;

  if (adc_key_in < 50) ret = btnRIGHT;
  if ((adc_key_in > 120) && (adc_key_in < 150)) ret = btnUP;
  if ((adc_key_in > 250) && (adc_key_in < 350)) ret = btnDOWN;
  if ((adc_key_in > 450) && (adc_key_in < 500)) ret = btnLEFT;
  if ((adc_key_in > 700) && (adc_key_in < 750)) ret = btnSELECT;
  if ((adc_key_in > 850) && (adc_key_in < 1150)) ret = btnNONE;
  
  return ret;
}

Nu initialiseren we de bibliotheken en stellen we de variabelen in. De display werkt in parallelle mode.

Voor het weergeven van de maximum en minimum temperaturen gebruiken we de rechterknop en voor de luchtvochtigheid de linkerknop. Het resetten van deze waarden gebeurd door een reset en bij het inschakelen.

DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// Zorgen dat de beginwaardes zo zijn dat ze altijd worden bijgewerkt nadat loop() start.
float hMax=0, hMin=100;
float tMax=-40, tMin=100;

We kmaken het welkomsscherm.

void setup() {
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Termometer en");
  lcd.setCursor(0,1);
  lcd.print("Hygrometer");
  dht.begin();
  delay(3000);
  lcd.clear();
}

We gaan nu de teksten die vast op het display verschijnen op het scherm plaatsen. Het is niet nodig om iedere keer de tekst over te schrijven, het werkt zelfs storend.

De extra spaties in de switch routine zijn nodig om het display te wissen van onnodige tekens. Werkt sneller dan een lcd.clear().

void loop() {
  float h, t;

  unsigned long rtime, lasttime;

  rtime=millis();

  if ((rtime - lasttime) > 2000) {
      // Reading temperature or humidity takes about 250 milliseconds!
      // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
      h = dht.readHumidity();
      // Read temperature as Celsius (the default)
      t = dht.readTemperature();
      lasttime = rtime;
  }

	// Update de maximum en minimum waardes.
  if (t > tMax) {
    tMax=t;
  }

  if (t < tMin) {
    tMin=t;
  }

  if (h > hMax) {
    hMax=h;
  }

  if (h < hMin) {
    hMin=h;
  }

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t)) {
    lcd.setCursor(0,0);
    lcd.print("Error:          ");
    lcd.setCursor(0,1);
    lcd.print("No DHT sensor   ");
    return;
  }

  // Leest toetsenboord uit.
  switch(readkeypad()) {
    case 0:
      lcd.setCursor(0,0);
      lcd.print("Hmax: ");
      lcd.print(hMax);
      lcd.print(" %     ");
      lcd.setCursor(0,1);
      lcd.print("Hmin: ");
      lcd.print(hMin);
      lcd.print(" %     ");
      break;
    case 3:
      lcd.setCursor(0,0);
      lcd.print("Tmax: ");
      lcd.print(tMax);
      lcd.print(" C     ");
      lcd.setCursor(0,1);
      lcd.print("Tmin: ");
      lcd.print(tMin);
      lcd.print(" C     ");
      break;
    default:
      lcd.setCursor(0, 0);
      lcd.print("T: ");
      lcd.print(t);
      lcd.print(" C     ");
      lcd.setCursor(0, 1);
      lcd.print("H: ");
      lcd.print(h);
      lcd.print(" %     ");
      break;
  }
}

Display

Sketch