So langsam nimmt die Wetterstation Form an.
Nachfolgend ein Codeschnipsel für den DHT-22 Sensor. Der Sensor nutzt eine Art 1-Wire Protokoll zur Kommunikation, das natürlich nicht 1-Wire kompatibel ist und deshalb die BASCOM-Befehle für das 1-Wire Protokoll nicht genommen werden können. Das Datenblatt beschreibt, wie eine Kommunikation auszusehen hat. Der Sensor sendet kurze ( etwa 26 µs) und lange Impulse / Signale (etwa 70 µs), deren Zeitdauer ausgewertet werden muss, da diese dann als 0 und 1 im Sinne eines Bits zu interpretieren sind. Die Zeitdauer eines Signals wird mit Hilfe eines Timers ermittelt. Es werden 40 Bits übertragen, die die Luftfeuchtigkeit (RH), die Temperatur (T) und eine Prüfsumme enthalten. Diese Zeiten werden in Bits umgerechnet, fertig. Aus 40 Bits werden 2 x Word (RH und T) und 1 x Byte. Ich weiß nicht, ob meine Methode besonders elegant ist, aber sie scheint zu funktionieren. Die gemessenen Werte scheinen plausibel. Der Code muss noch an T < 0°C angepasst werden, das kann ich so auf dem Steckbrett momentan nicht testen.
Nachfolgend ein Codeschnipsel für den DHT-22 Sensor. Der Sensor nutzt eine Art 1-Wire Protokoll zur Kommunikation, das natürlich nicht 1-Wire kompatibel ist und deshalb die BASCOM-Befehle für das 1-Wire Protokoll nicht genommen werden können. Das Datenblatt beschreibt, wie eine Kommunikation auszusehen hat. Der Sensor sendet kurze ( etwa 26 µs) und lange Impulse / Signale (etwa 70 µs), deren Zeitdauer ausgewertet werden muss, da diese dann als 0 und 1 im Sinne eines Bits zu interpretieren sind. Die Zeitdauer eines Signals wird mit Hilfe eines Timers ermittelt. Es werden 40 Bits übertragen, die die Luftfeuchtigkeit (RH), die Temperatur (T) und eine Prüfsumme enthalten. Diese Zeiten werden in Bits umgerechnet, fertig. Aus 40 Bits werden 2 x Word (RH und T) und 1 x Byte. Ich weiß nicht, ob meine Methode besonders elegant ist, aber sie scheint zu funktionieren. Die gemessenen Werte scheinen plausibel. Der Code muss noch an T < 0°C angepasst werden, das kann ich so auf dem Steckbrett momentan nicht testen.
Code:
'######################## DHT-22 Humidity & Temperature Sensor####################
' DHT-22
'
' |-----o-- Vcc
' | |
' | -
' | 10k
' | -
' | |
' |-----o-- Data ~~~ PC0 (µC)
' |
' |-------- NC
' |
' |-------- GND
'
' Timings: Bit = 0 ~ 28 µs / Bit = 1 ~ 70 µs
' Min_time = 28 µs < TCNT0 Value (ticks) < 70 µs (in ticks)
' every time > Min_time >>> Bit = 1
' every time < Min_time >>> Bit = 0
'
' Min_time ~ 20 (ticks) for 3.6864 MHz
'
' ~ ticks for Bit = 0: 26 µs * $crystal (in MHz) / Prescale
' ~ ticks for Bit = 1: 70 µs * $crystal (in MHz) / Prescale
'
'######################## DHT-22 Humidity & Temperature Sensor####################
$regfile = "m8def.dat"
$crystal = 3686400
$baud = 115200
$hwstack = 64
$swstack = 64
$framesize = 64
'#####################################
Config Pinc.0 = Input
Config Timer0 = Timer , Prescale = 8
'#####################################
Const Min_time = 20 'this has to be changed according to your frequency settings in $crystal
Dim Count As Byte
Dim Signaltime(43) As Byte
Dim Humidityw As Word
Dim Temperaturew As Word
Dim Humsens_chksum As Byte
Dim Humiditys As String * 16
Dim Temperatures As String * 16
'#####################################
Declare Sub Read_timings
Declare Sub Humtemp_values
Declare Function Compare_chksum(byval Hsens_humidity As Word , Byval Hsens_temperature As Word , Byval Hsens_chksum As Byte) As Byte
'##################################### Main loop
Do
Call Humtemp_values
If Compare_chksum(humidityw , Temperaturew , Humsens_chksum) = 1 Then
Humiditys = Str(humidityw)
Temperatures = Str(temperaturew)
Print "Humidity: " ; Format(humiditys , "0.0") ; " %"
Print "Temperature: " ; Format(temperatures , "0.0") ; " deg"
Else
Print "Read Error"
End If
Loop
End
'############################################################# Read timings
' measure time (in ticks) for signal = high (Start / Stop TIMER0)
' 1st two measurements do not contain sensor values
Sub Read_timings
Wait 3
Count = 1
Config Pinc.0 = Output : Portc.0 = 0 ' request data
Waitms 20 ' wait 20 ms
Config Pinc.0 = Input ' wait for data, receive data
While Count < 43 'collect 42 timings / signals
Bitwait Pinc.0 , Set 'signal goes high > start timer
Start Timer0
Bitwait Pinc.0 , Reset 'signal goes low > stop timer
Stop Timer0
Signaltime(count) = Tcnt0 'store number of ticks per signal in Signaltime byte
Tcnt0 = 0
Incr Count
Wend
End Sub
'############################################################# Humidity and temperature values
' transform timings into bits (40 timings > 40 Bits)
' every time (in ticks) > Min_time >>> Bit = 1
' every time (in ticks) < Min_time >>> Bit = 0
' first word contains humidity
' second word contains temperature
' last byte contains checksum
Sub Humtemp_values
Local X As Byte
Humidityw = 0
Temperaturew = 0
Humsens_chksum = 0
Call Read_timings
For Count = 3 To 42 ' skip first two
Select Case Count
Case 3 To 18
X = 18 - Count
If Signaltime(count) > Min_time Then Toggle Humidityw.x
Case 19 To 34
X = 34 - Count
If Signaltime(count) > Min_time Then Toggle Temperaturew.x
Case 34 To 42
X = 42 - Count
If Signaltime(count) > Min_time Then Toggle Humsens_chksum.x
End Select
Next
End Sub
'############################################################# Calculate Checksum and compare with trasnmitted value
Function Compare_chksum(byval Hsens_humidity As Word , Byval Hsens_temperature As Word , Byval Hsens_chksum As Byte) As Byte
Local Chksum As Byte
Chksum = Low(hsens_humidity ) + High(hsens_humidity )
Chksum = Chksum + Low(hsens_temperature)
Chksum = Chksum + High(hsens_temperature)
If Chksum = Hsens_chksum Then
Compare_chksum = 1
Else
Compare_chksum = 0
End If
End Function