Humidity

Fra HTX Arduino
Spring til navigation Spring til søgning
Billede af Humidity Temperatur modul DHT11

Overordnet beskrivelse af modul DHT11.

Modulet man måle både temperatur og luftfugtighed, og skal aflæses digitalt.

Modulet

Modulet er fra keyes-serien keyes-moduler, og har betegnelsen KY-015.

Princip-diagram for DHT11 modul

Føleren skal have +5V og stel (GND) for at fungere.

Man kan aflæse føleren på et enkelt ben, som skal have en pull-up modstand monteret, for at det fungerer korrekt - den er monteret på Keyes modulet.

Komponenten er kinesisk, og det er det originale datablad også. Det kan ses i denne PDF fil på kinesisk, men der er så meget information, at nogen har kunnet oversætte den, og udgive den som http://www.robotshop.com/PDF/dht11.pdf [1] - den er også gemt i denne PDF fil på engelsk.

Principskitse af DHT11 modul

Andre versioner af DHT moduler

Der findes også et modul der hedder DHT22, som er mere præcist, og som kan svare med 1 decimal.

Nøjagtigheden er +/- 2% luftfugtighed og +/- 0.5 grad C

Specifikationerne er hentet fra denne PDF fil på engelsk.

Software modulet DHT11.jal

Softwaren kan aflæse DHT11 modulet, og svarer med en luftfugtighed i hele procent og en temperatur i hele grader.

Anvendelse af DHT11

Når man vil anvende DHT11 modulet, så skal man include DHT11.jal som følger:

   include DHT11

Hvis DHT11.jal ligger i \lib inde i c:\jalpack så kan compileren finde modulet.

DHT11 anvender ikke andre moduler

JAL-filen ligger sammen med et par eksempler inde i Fil:Hum Temp jal.zip

DHT11 er testet på følgende kombinationer:

PIC pin
PIC16F684
PIC16F690 a2

Modulet har ikke andre begrænsninger end at det skal kunne sætte benet op til både udgang og indgang, så det burde kunne fungere på de fleste ben og de fleste PIC-typer.

Interface fil til DHT11

Beskrivelse af hvad man kan rette på i interface-filen.

I DHT11_def.jal kan man angive hvilket portben føleren er tilsluttet ved:

alias Hum_I_O_pin      is pin_a2
alias Hum_I_O_pin_dir  is pin_a2_direction

Desuden er der angivet konstanter som er tælletallet der afgør om det er et højt eller et lavt bit der læses:

const Hum_count_high_4_MHz = 6
const Hum_count_high_8_MHz = 12

Anvendelsen af DHT11

Man skal have DHT11_def.jal i samme mappe som sin kode, så man får angivet benforbindelsen og konstanterne til modulet.

I loopet kan man kalde DHT11, der returnerer true, hvis kommunikationen med modulet fungerede korrekt. De to parametre der angives i funktionskaldet er faktisk dem der returnerer værdierne for relativ luftfugtighed og temperatur.

En ting man skal være opmærksom på er at funktionen ikke må kaldes for tit, da DHT11 modulet skal have lidt tid inden det kan returnere en ny måleværdi. Databladet angiver 1s som periodetid, men ud fra eksperimenter kan en pause på ca. 200 ms være nok - det er dog ikke noget der er testet for alle værdier af temperatur og luftfugtighed.

 include DHT11.jal

 forever loop
   if (DHT11(Hum, Temp) then
      -- Display de hentede værdier
   else
      -- Kom med en fejlmelding
   end if
   delay_100ms(5)    -- Her skal der gå noget tid inden man kalder modulet igen

   --
   -- Her kan placeres anden kode i loopet, der skal lave andre ting
   --
 end loop

Demo-softwaren kan sammen med DHT11 modulet give følgende visning på et display:
Hum demo.jpg

Forklaring af DHT11 modulets software

Set ude fra kaldes funktionen der aflæser DHT11 føleren.

Inde i funktionen foretages kommunikationen med føleren, og der tjekkes om resultatet er fornuftigt

Initialisering af softwaren

Initialiseringen kan i Pseudokode udtrykkes som følger:

   Læs opsætningen i DHT11_def.jal
   Sæt I/O-benet op til Input


Funktionen DHT11

Beskrivelse af de funktioner der er til modulet (hvad kan man bruge af forskellige ting)

Konstanterne i interface-filen

De konstanter der er angivet i interfacefilen er lavet for at kunne arbejde med modulet på forskellige clock-frekvenser.

Konstanterne angiver middelværdien mellem det antal tællinger man kan nå på 26 us og det man kan nå på 70 us, som er forskellem på at angive 0 og 1.

Funktionsbeskrivelse

Aflæsningen foregår ved at man starter med at sætte I/O-benet til output og trækker det lavt.

Der sendes så en lav puls i ca. 18 ms.

Så starter man kommunikationen ved at trække I/O-benet højt, og sætte det til at være input.

Benet er højt i ca. 20 us, så man venter på at benet går lavt.

Som start sender modulet en lav puls i 80 us, og derefter en høj puls i 80 us.

Starten kan illustreres som følger:

DHT11-start.PNG

Efter starten sendes der 40 bit, der fordeles på 5 bytes.

Hver byte kodes ved at en 0 bit sendes som en lav puls i 50 us efterfulgt af en høj puls på 26 us, hvor en 1 bit sendes som 50 us lav efterfulgt af 70 us høj puls.

En 0 bit ser ud som følger:
DHT11-0bit.PNG

En 1-bit ser ud som følger:
DHT11-1bit.PNG

Disse 40 bits samles op i et array med 5 byte, hvor værdierne er kodet som følger:

  • Første byte er luftfugtigheden
  • Anden byte er ment som decimalerne på luftfugtigheden, men den er altid 0
  • Tredje byte er temperaturen i grader celcius
  • Fjerde byte er ment som decimalerne på temperaturen, men den er altid 0
  • Femte byte er en sammentælling af de 4 første bytes som checksum.

Hvis den ikke passer er der fejl i kommunikationen

Koden inde i funktionen DHT11

Funktionsdefinitionen angiver at funktionen hedder DHT11, og at den er af typen bit, altså kan returnere enten sandt eller falsk.

De to parametre er også returværdier, der indeholder den relative luftfugtighed og temperaturen i grader celcius.

function DHT11(byte out Fugt, byte out Temp) return bit is
   -- Koden inde i funktionen
end function

Den første del i funktionen sender det til føleren, som sætter kommunikationen i gang. 18 ms lav puls og så at den sættes høj, og omstilles til input.

  -- Send en lav puls ud, for at starte modtagelsen af 40 bit
  Hum_I_O_pin_dir = output
  Hum_I_O_pin = low
  delay_1ms(18)
  Hum_lowcount = 0
  Hum_highcount = 0
  -- Afslut pulsen og gør klar til modtagelse
  Hum_I_O_pin = high
  Hum_I_O_pin_dir = input

Efter starten registreres følerens start-sekvens.

  -- Vent på at DHT11 svarer
  while Hum_I_O_pin loop
     Hum_highcount = Hum_highcount + 1
     if Hum_highcount == 0 then
        exit loop
     end if
  end loop
  -- Vent på en lav startbit
  while ! Hum_I_O_pin loop
     Hum_lowcount = Hum_lowcount + 1
     if Hum_lowcount == 0 then
        exit loop
     end if
  end loop
  -- Vent på en høj startbit
  while Hum_I_O_pin loop
     Hum_highcount = Hum_highcount + 1
     if Hum_highcount == 0 then
        exit loop
     end if
  end loop

Herefter hentes de 40 bit data, og de gemmes i et array på 5 byte

  -- Lav et loop der henter 8 byte ind
  for 5 using Hum_ptr loop
     -- Lave et loop der læser 1 byte ind
     for 8 loop
        Hum_lowcount = 0
        Hum_highcount = 0
        -- Vent på den lave start af en bit (ca. 50 us)
        while ! Hum_I_O_pin loop
           Hum_lowcount = Hum_lowcount + 1
           if Hum_lowcount == 0 then
              exit loop
           end if
        end loop
        -- Vent på den høje del af en bit - 26 us svarer til 0, 70 us svarer til 1
        while Hum_I_O_pin loop
           Hum_highcount = Hum_highcount + 1
           if Hum_highcount == 0 then
              exit loop
           end if
        end loop
        -- Registrer om bitten er læst som høj eller lav - saml op i Hum_inbyte
        -- Denne værdi er afhængig af clock-frekvensen
if target_clock == 4_000_000 then
        if Hum_highcount > Hum_count_high_4_MHz then
           Hum_inbyte = (Hum_inbyte << 1) + 1
        else
           Hum_inbyte = Hum_inbyte << 1
        end if
elsif target_clock == 8_000_000 then
        if Hum_highcount > Hum_count_high_8_MHz then
           Hum_inbyte = (Hum_inbyte << 1) + 1
        else
           Hum_inbyte = Hum_inbyte << 1
        end if
else
pragma error "Der skal angives en counter værdi til clock-frekvensen"
end if
     end loop
     Hum_array[Hum_ptr] = hum_inbyte
  end loop

Når de 5 byte er hentet kontrolleres der om der er sket fejl i transmissionen, dels ved at kigge på om den sidste høje er talt for langt, dels ved at se om summen af de 4 første bytes er 0 (det er svaret, hvis modulet ikke har været klar til at kommunikere) og endelig tjekkes om summen af de 4 første bytes er det samme som der er sendt i den 5. byte, som er check-summen.

  -- Hvis highcount har talt helt igennem, så er der smuttet en eller flere bit
  if Hum_highcount == 0 then
     return false
  end if
  -- Beregn summen af de 4 svar-byte
  Hum_lowcount = Hum_array[0] + Hum_array[1] + Hum_array[2] + Hum_array[3]
  -- Hvis summen bliver 0, så er resultatet meget sandsynligt at både fugtighed
  -- og temperatur viser 0, og det er en fejl (sker ved for hurtig læsning)
  if Hum_lowcount == 0 then
     return false
  end if
  -- Hvis summen af de 4 svarbyte ikke er det samme som den sendte tjeksom, så er svaret
  -- ikke pålideligt
  if Hum_lowcount != Hum_array[4] then
     return false
  end if

Hvis der ikke har været fejl i kommunikationen, så hentes de to bytes og der returneres tru, for at indikere at kommunikationen er i orden.

  -- Hent værdierne og indiker at de er i orden.
  Fugt = Hum_array[0]
  Temp = Hum_array[2]
  return true

Referener


Moduler på Holstebro HTX
Tastaturer Displays AD-konvertering I/O-ekspander Serielt Interface Færdige Andre
RC-tast - AD-tast - M_tast ALCD - LCD ADC_holst - ADC
mcp3201 - mcp3208
input - output Seriel_holst - Serial hardware
Serial hw int cts - Serial software
Stepmotor - RFID
RGB - RF-link - Afstand
Humidity - Analog temp - Dig temp
Accelerometer
Rotary Encoder

Oversigt over Hardware Moduler på Holstebro HTX

Keyes-moduler på Holstebro HTX
Simple Digitale Input Switch modul - Reedrør - Hall sensor - Optisk Skift - Photo Gate - Vibration sensor - Vibration switch - Tilt sensor - Kviksølv kontakt - Linje følger
Digitalt kodede Input IR Modtager - Humidity -Digital Temperatur
5 benede Input Rotary Encoder -XY Joystick
Digitale 4 benede Input Magic Cup Light - LED 3-farve - RGB - RF-link - Afstand
Justerbare analoge/digitale Input Reed Magnetsensor - Temperatur Niveau - Metal detektor - Flamme - Hall Kontakt - Almindelig Mikrofon - Følsom Mikrofon
Simple digitale Output LED 2-farve - Aktiv Buzzer - Blink LED - IR LED - Laser - Relæ modul - Passiv Buzzer
Analoge input Analog Temperatur - LDR - Finger Pulsmåler - Lineær Magnetfelt
Arduino-Modul-Oversigt
Arduino Generelt: Biblioteker - Board - Driver - Shield - Arduino Analog - Arduino Seriel

Arduino-typer: Arduino UNO - Arduino Nano - Arduino Pro Mini - Arduino MEGA 2560 - LiliyPad Mikrocontroller - Arduino DUE - WeMOS

Input-moduler Trådløse: Bluetooth - Transceiver modul - WiFi Modul - SMS Modul - I2C-RF-modtager - RF Link - GPRS/GSM - GSM_Modul

Sensorer: GPS - Strøm-sensor - I2C Humidity - Lys og Nærhed - Magnetisk Kompas - I2C barometer - Farvegenkendelsesmodul - Alkoholsensor - Accelerometer - I2C Accelerometer - I2C Gyroskop - Vejecelleforstærker - IR Distance - AC Strømsensor - Afstand - XY Joystick - Humidity - Tryksensor - Vindhastighedsmåler
Photo og IR: IR Fjernbetjening - Photo Interrupter - IR Modtager - Bevægelsescensor - Photo Refleks Sensor - VGA Kamera
Power: Power Adapter - Lithium Batteri
Lager: SD Kort
Konvertere: I2C AD-konverter
Funktionsmoduler: RFID-modul - Matrix tastatur - DS1307 RTC - ENC28J60 Ethernet - IO Expander
Touch Display: Touch Display

Output-moduler Trådløse: Bluetooth - RF Link - GPRS/GSM - Transceiver modul - WiFi Modul - SMS Modul

Display: Display Shield - Touch Display - Arduino Display - Nokia 5110 Display - Dot-Matrix - Lys-avis - I2C Display
Funktionsmoduler: Lydgiver - Lydmodul - Relæ modul - Audio Power Forstærker - ENC28J60 Ethernet - Peltier Element - IO Expander
Hukommelse: SD Kort
Motorer: Stepper Motor Driver - Stepper med Accelleration - Servo

I2C-Moduler Funktionsmoduler: DS1307 RTC - I2C-RF-modtager - I2C tastatur

Sensorer: I2C Humidity - Magnetisk Kompas - I2C barometer - I2C Accelerometer - I2C Gyroskop
Konvertere: I2C AD-konverter
Display: I2C Display