Monitor Suhu dan Kelembaban (Temperture Humidity) DHT22 Bascom AVR
Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonitor suhu dan kelembaban, alat ini menggunakan sensor dht22. alat ini memiliki fitur setting untuk input setpoint suhu dan kelembabannya, jika nilai suhu lebih dari setpoint maka buzzer akan berbunyi, kemudian jika nilai kelembaban lebih dari setpoint maka buzzer juga akan berbunyi.
a. Minimum System ATMega16
c. Program Bascom AVR
$regfile = "m16def.dat"
$crystal = 8000000
'--------------------------
Config Lcdpin = Pin , Rs = Portc.0 , E = Portc.1 , Db4 = Portc.2
Config Lcdpin = Pin , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
Config Lcd = 16 * 2
Cursor Off
Cls
Declare Sub Get_th(t As Word , H As Word)
Config Serialin = Buffered , Size = 128
Config Serialout = Buffered , Size = 128
Dht_put Alias Porta.0
Dht_get Alias Pina.0
Dht_io_set Alias Ddra.0
Cls
Cursor Off
Dim Crc As Byte 'zmienna do przechowywania bajtów parzystosci
Dim Mybyte As Byte 'zmienna do obliczania bitu parzystosci
Dim Sensor_data As String * 40 'tutaj beda zapisywac sie dane z czujnika
Dim Count As Byte
Dim T As Word 'zmienna do przechowywania temperatury
Dim H As Word 'zmienna do przechowywania wilgotnosci
Dim S16 As String * 16 'zmienna do obliczania odebranych bitów
Dim Ti As Byte 'zmienna do przechowywania dziesietnej temperatury
Dim Hi As Byte 'zmienna do przechowywania dziesietnej wilgotnosci
Enable Interrupts
Dim Cacah As Integer
Dim Nilai As Integer
Dim Nilai2 As Integer
Dim Nilai3 As Integer
Dim Vx As Integer
Dim Mark As Integer
Dim Waktu As Integer
'led
Ddra.7 = 1
Ddra.6 = 1
Ddra.5 = 1
'buzzer
Ddra.4 = 1
Porta.4 = 1
'pushbutton
Ddrd.7 = 0
Ddrd.6 = 0
Ddrd.5 = 0
Ddrd.4 = 0
'Aktif Low Pushbutton
Portd.7 = 1
Portd.6 = 1
Portd.5 = 1
Portd.4 = 1
Pbset Alias Pind.7
Pbdown Alias Pind.6
Pbup Alias Pind.5
Pbok Alias Pind.4
Led1 Alias Porta.7
Led2 Alias Porta.6
Led3 Alias Porta.5
Buzzer Alias Porta.4
Led1 = 0
Led2 = 0
Led3 = 0
Utama:
Do
Led3 = 0
Dht_io_set = 1
Dht_put = 1
Wait 1
Call Get_th(t , H)
Upperline
Lcd "SUHU: " ; T ; " C " ; "/ " ; Nilai ; " "
Lowerline
Lcd "HUMY: " ; H ; " % " ; "/ " ; Nilai2 ; " "
If Pbset = 0 Then
Buzzer = 0
Waitms 100
Buzzer = 1
Waitms 100
Buzzer = 0
Waitms 100
Buzzer = 1
Cls
Wait 1
Goto Setting1
End If
If Nilai > 0 And T >= Nilai And Nilai2 > 0 And H >= Nilai2 Then
Porta.4 = 0
End If
If Nilai > 0 And T >= Nilai And Nilai2 > 0 And H < Nilai2 Then
Porta.4 = 0
End If
If Nilai > 0 And T < Nilai And Nilai2 > 0 And H >= Nilai2 Then
Porta.4 = 0
End If
If Nilai > 0 And T < Nilai And Nilai2 > 0 And H < Nilai2 Then
Porta.4 = 1
End If
Loop
Setting1:
Do
Upperline
Lcd "SET BATAS"
Lowerline
Lcd "Suhu= " ; Nilai ; " C "
If Pbup = 0 Then
Buzzer = 0
Waitms 200
Buzzer = 1
Incr Nilai
End If
If Pbdown = 0 Then
Buzzer = 0
Waitms 200
Buzzer = 1
Decr Nilai
End If
If Nilai > 100 Then
Nilai = 0
End If
If Nilai < 0 Then
Nilai = 100
End If
If Pbok = 0 Then
Buzzer = 0
Waitms 200
Buzzer = 1
Cls
Wait 1
Goto Setting2
End If
Loop
Setting2:
Do
Upperline
Lcd "SET BATAS"
Lowerline
Lcd "Humy= " ; Nilai2 ; " % "
If Pbup = 0 Then
Buzzer = 0
Waitms 200
Buzzer = 1
Incr Nilai2
End If
If Pbdown = 0 Then
Buzzer = 0
Waitms 200
Buzzer = 1
Decr Nilai2
End If
If Nilai2 > 100 Then
Nilai2 = 0
End If
If Nilai2 < 0 Then
Nilai2 = 100
End If
If Pbok = 0 Then
Buzzer = 0
Waitms 200
Buzzer = 1
Cls
Wait 1
Goto Utama
End If
Loop
Sub Get_th(t As Word , H As Word)
Count = 0
Sensor_data = ""
Dht_io_set = 1 'robimy wyjscie z PD.6
Dht_put = 0 'ustawic magistrale w stan LOW
Waitms 1 'odczekac co najmniej 18ms
Dht_put = 1 'zwolnic magistrale
Waitus 20
Dht_io_set = 0 'robimy wejscie z PD.6
Waitus 40 'odczekaj 40 ms
If Dht_get = 1 Then 'jesli jest jeszcze jeden, ???? ?? ??? ?? ???????? 1
H = 1 'oznacza ze czujnik nie odpowiedzial
Exit Sub 'konczymy podprogram
End If
'jesli czujnik odpowiedzial i wyciagnal magistrale do ziemi kontynuujemy prace
Waitus 80 'czekamy jeszcze 80ms
If Dht_get = 0 Then 'jesli na linii jest nadal 0
H = 2 'oznacza czujnik zwariowal
Exit Sub 'konczymy podprogram
End If
'jesli wszystko pójdzie dobrze i czujnik zareagowal prawidlowo, mozemy kontynuowac
While Dht_get = 1 : Wend 'czekamy, az magistrala pokazuje 1
Do 'zaczynamy przyjmowac 40-bitowe dane
While Dht_get = 0 : Wend 'czekamy na ustawienie magistrali w stan 0
Waitus 30 'po wystapieniu stamu 0 czekac 30 ms
If Dht_get = 1 Then 'jesli na szynie 1
Sensor_data = Sensor_data + "1" 'zapisujemy do zmiennej ta ?????????? ? ?????????? ??? ???????
While Dht_get = 1 : Wend 'i czekamy az nadajnik wysle kolejny bit
Else 'w przeciwnym razie, jesli tam jest 0
Sensor_data = Sensor_data + "0" 'zapisujem je do zmiennej
End If
Incr Count 'zwiekszamy licznik
Loop Until Count = 40 'Powtarzaj te czynnosc dopóki licznik osiagnie liczbe 40
Dht_io_set = 1
Dht_put = 1
'zaczynamy rozkladac otrzymane dane
S16 = Left(sensor_data , 16)
H = Binval(s16)
H = H / 10
Hi = H Mod 10
S16 = Mid(sensor_data , 17 , 16)
T = Binval(s16)
T = T / 10
Ti = T Mod 10
S16 = Right(sensor_data , 8)
Crc = Binval(s16)
'test sumy kontrolnej
Mybyte = T + H 'dodajemy wartosci temperatury i wilgotnosci
If Mybyte <> Crc Then 'jesli suma kontrolna sie nie zgadza
Lcd "error" 'Oznacza to, ze dane nie sa poprawne
End If
End Sub
d. VIDEO HASILNYA