DHT11 ja DHT22 – temperatuuri- ja niiskusandurid Arduino jaoks

🔹 Peamine:
Tüübid: DHT11 (eelarve), DHT22 (täpsem, laiem vahemik)

Funktsioonid:

Temperatuuri mõõtmine (°C)

Niiskuse mõõtmine (% RH)

Andmeedastus: digitaalsignaal ühe viigu kaudu

Vajalikud raamatukogud (Arduino IDE-s):
DHT sensor library by Adafruit

Adafruit Unified Sensor (paigaldatakse automaatselt sõltuvusena).

Paigaldamine:
Sketch > Include Library > Manage Libraries > otsi “DHT sensor library”.

📏 Spetsifikatsioonid:
DHT11
Temperatuur: 0-50 °C (±2 °C)

Niiskus: 20-90% (±5%)

Aeglasem, odavam

DHT22
Temperatuur: -40…+80 °C (±0,5 °C)

Niiskus: 0-100% (±2-5%)

Täpsem, kallim

Code

include // Ühenda raamatukogu DHT11/DHT22-ga töötamiseks.

define DHTPIN 2 // Pin, millele ühendatakse anduri signaal.

define DHTTYPE DHT11 // Anduri tüübi määramine: DHT11 või DHT22

DHT dht(DHTPIN, DHTTYPE); // Loo dht objekt, millel on määratud pin ja tüüp.

void setup() {
Serial.begin(9600); // Andmete väljastamise jadapordi käivitamine
dht.begin(); // Anduri initsialiseerimine
}

void loop() {
float temp = dht.readTemperature(); // Loe temperatuuri (°C)
float hum = dht.readHumidity(); // Loe niiskust (% RH)

if (isnan(temp) || isnan(hum)) { // Kontrolli: kui lugemine ebaõnnestub
Serial.println(“Lugemisviga!”); // Teatada veast
return; // Praeguse iteratsiooni katkestamine
}

// Andmete väljastamine portmonitorile
Serial.print(“Temperatuur: “);
Serial.print(temp);
Serial.print(” °C | Niiskus: “);
Serial.print(hum);
Serial.println(” %”);

delay(2000); // Ootame 2 sekundit enne järgmist mõõtmist
}

🧩 Eesmärk

Projekt mängib lihtsat meloodiat, kasutades funktsiooni tone() ja piezo-summerit, mis on ühendatud Arduino plaadi pinniga 9.


🔢 Muutujate deklareerimine

  • buzzerPin: pin, millega summer on ühendatud.
  • songLength: nootide ja pauside koguarv.
  • notes[]: string, mis sisaldab nootide järjestust; tühik tähistab pausi.
  • beats[]: iga noodi kestus (tingühikutes).
  • tempo: tempo, mis määrab ühe takti kestuse. Mida väiksem väärtus, seda kiirem meloodia.

🧱 Funktsioon setup()

Seab summeri pinni väljundiks (OUTPUT).


🔁 Funktsioon loop()

  • Tsüklis mängitakse läbi kõik 18 märki massiivist notes[].
  • Kui märk on ' ' (tühik), tehakse paus (delay(duration)).
  • Kui tegemist on noodiga, käivitatakse funktsioon tone(), mis mängib ette vastava sagedusega heli ja kestuse.
  • Iga noodi järel on lühike paus.

🎵 Funktsioon frequency(char note)

Selgitus:

  • Võtab noodi tähise ja tagastab sellele vastava sageduse herztides (Hz).
  • Kasutatakse funktsioonis tone(buzzerPin, frequency(...), duration) heli genereerimiseks.

📊 Nootide tabel

NootSagedus (Hz)
c262 Hz
d294 Hz
e330 Hz
f349 Hz
g392 Hz
a440 Hz
b494 Hz
C523 Hz

🧾 Kokkuvõte

Kood mängib lihtsat meloodiat, järgides eelnevalt määratud nootide ja kestuste järjestust. Peamised funktsioonid:

  • tone() — heli mängimine.
  • delay() — kestuse kontrollimine.
  • frequency() — noodi tähise teisendamine sageduseks.

Ülesanne 6 Buzzeri kasutamine “Väike Alarm Süsteem”

#include <LiquidCrystal.h>

const int potPin        = A3;
const int tempPin       = A4;
const int ldrPin        = A5;
const int lcdRs         = 11;
const int lcdEn         = 12;
const int lcdD4         = 4;
const int lcdD5         = 5;
const int lcdD6         = 6;
const int lcdD7         = 7;
const int musicPin      = 3;
const int alarmPin      = 3;

const int   switchThreshold = 512;   // pot > mid → system ON
const float tempThreshold   = 23.0;  // °C
const int   lightThreshold  = 200;   // ADC units

const int songLength = 18;
char notes[songLength + 1] = "cdfda ag cdfdg gf ";
int beats[songLength] = {
  1,1,1,1,1,1,4,4,2,1,1,1,1,1,1,4,4,2
};
int tempo = 150;  // madalam → kiirem

LiquidCrystal lcd(lcdRs, lcdEn, lcdD4, lcdD5, lcdD6, lcdD7);

void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2);
  pinMode(musicPin, OUTPUT);
  pinMode(alarmPin, OUTPUT);
}

void loop() {
  // Lüliti/potentsiomeetri lugemine
  int controlVal = analogRead(potPin);
  bool systemOn = controlVal > switchThreshold;

  if (!systemOn) {
    // Süsteem OFF
    noTone(musicPin);
    noTone(alarmPin);
    lcd.clear();
    delay(500);
    return;
  }

  // TMP36 teisendus: V = raw*(5.0/1023); Temp = (V - 0.5)*100
  int   rawTemp = analogRead(tempPin);
  float voltage = rawTemp * (5.0 / 1023.0);
  float tempC   = (voltage - 0.5) * 100.0;

  // Fototakisti lugemine
  int lightVal = analogRead(ldrPin);

  Serial.print(tempC, 1);
  Serial.print(", ");
  Serial.println(lightVal);
  
  if (lightVal < lightThreshold) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Tuvastatud       ");
    lcd.setCursor(0, 1);
    lcd.print("pimedus          ");
  } 
  else if (tempC > tempThreshold) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Temp liiga       ");
    lcd.setCursor(0, 1);
    lcd.print("korge!           ");
  } 
  else {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Temp: ");
    lcd.print(tempC, 1);
    lcd.print((char)223);
    lcd.print("C");
    lcd.setCursor(0, 1);
    lcd.print("Light: ");
    lcd.print(lightVal);
  }

  // Alarmitingimus
  if (tempC > tempThreshold || lightVal > lightThreshold) {
    noTone(musicPin);
    tone(alarmPin, 1000); // alarm heli
  } else {
    noTone(alarmPin);
    tone(musicPin, 440);  // taustatoon
  }
 
  if (lightVal < lightThreshold) {
    noTone(musicPin);
    noTone(alarmPin);
  } else if (tempC > tempThreshold) {
    noTone(musicPin);
    playAlarmMelody();
  } else {
    noTone(alarmPin);
    playMelody();
  }
  delay(500);
}

void playMelody() {
  for (int i = 0; i < songLength; i++) {
    int duration = beats[i] * tempo;
    if (notes[i] == ' ') {
      delay(duration);
    } else {
      tone(musicPin, frequency(notes[i]), duration);
      delay(duration);
    }
    delay(tempo / 10);
  }
}

// Play alarm melody: 3 quick beeps
void playAlarmMelody() {
  for (int i = 0; i < 3; i++) {
    tone(alarmPin, 1000, 200);
    delay(250);
  }
}

// Map note character to frequency
int frequency(char note) {
  const char names[] = {'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C'};
  const int freqs[] = {262, 294, 330, 349, 392, 440, 494, 523};
  for (int i = 0; i < 8; i++) {
    if (names[i] == note) {
      return freqs[i];
    }
  }
  return 0;
}

📘 Mida programm teeb:

🔄 Tsüklis loop() käib pidev kontroll:

  1. Kui potentsiomeeter < 512 → süsteem on VÄLJAS:
    • Ekraan tühjendatakse.
    • Heli peatatakse.
  2. Kui süsteem sees:
    • Loetakse temperatuur ja valgus.
    • Kuvatakse:
      • Kui pime → tekst: “Tuvastatud pimedus”
      • Kui kuum → tekst: “Temp liiga kõrge!”
      • Kui kõik korras → tekst: “Temp: XX.X°C, Light: XXX”
    • Kontrollib alarmi tingimusi:
      • Kui pime → heli ei mängita.
      • Kui liiga kuum → mängib alarmheli 3 piiksuga.
      • Kui kõik korras → mängib meloodiat.

🧠 Tähtsamad muutujad ja funktsioonid:

NimiKirjeldus
potPinloeb potentsiomeetrit (A3)
tempPinTMP36 andur (A4)
ldrPinvalgusandur (A5)
musicPinbuzzer (D3)
alarmPinbuzzer (D3, sama pin)
tempThresholdtemperatuurilävi (23 °C)
lightThresholdvalguse lävi (200 ühikut)
notes, beatsmeloodia noodid ja rütm
playMelody()mängib vaikemuusikat
playAlarmMelody()mängib häireheli (3 kiiret piiksu)

🖥️ Ekraanil kuvatav tekst võib olla:

makefileCopyEditTemp: 22.5°C
Light: 420

või:

nginxCopyEditTuvastatud
pimedus

või:

nginxCopyEditTemp liiga
korge!

🎵 Heli käitumine:

  • Kui valgus < 200 → kõik helid peatatakse (justkui “öörežiim”).
  • Kui temperatuur > 23°C → mängib alarmheli.
  • Kui kõik on korras → mängib meloodiat tähtedest "cdfda ag cdfdg gf ".

🛠️ Soovid edasi arendada?

Näiteks saab lisada:

  • Ekraani teate, mis ütleb “Süsteem VÄLJAS”, kui potentsiomeeter on alla künnise.
  • Eraldi LED, mis süttib häire korral.
  • Uue funktsiooni, mis salvestab kõrgeima temperatuuri.