Humidity
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. |
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:
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:
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.
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