Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat digunakan untuk monitoring suhu dan kelembaban serta timer on off led. alat ini menggunakan sensor DHT22 dan program menggunakan Bascom AVR. alat ini bisa disetting batas suhu dan kelembabannya dengan menggunakan tombol. untuk lebih jelasnya berikut adalah komponen dan programnya.
a. Minimum System ATMega
b. Sensor DHT22
c. LCD 16x2
d. Program Bascom AVR
$regfile = "m16def.dat"
$crystal = 12000000
'--------------------------
Config Lcdpin = Pin , Rs = Portc.5 , E = Portc.4 , Db4 = Portc.3
Config Lcdpin = Pin , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0
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
'czujnik podlaczony do PortD.6
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 Then
Led1 = 0
End If
If Nilai > 0 And T < Nilai Then
Led1 = 1
End If
If Nilai2 > 0 And H >= Nilai2 Then
Led2 = 0
End If
If Nilai2 > 0 And H < Nilai2 Then
Led2 = 1
End If
If Mark = 1 Then
Incr Cacah
End If
If Waktu > 0 And Cacah = Waktu Then
Cacah = 0
Goto Motor
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 Setting3
End If
Loop
Setting3:
Do
Upperline
Lcd "SET BATAS"
Lowerline
Lcd "Waktu= " ; Nilai3 ; " jam "
If Pbup = 0 Then
Buzzer = 0
Waitms 200
Buzzer = 1
Incr Nilai3
End If
If Pbdown = 0 Then
Buzzer = 0
Waitms 200
Buzzer = 1
Decr Nilai3
End If
If Nilai3 > 3 Then
Nilai3 = 3
End If
If Nilai3 < 0 Then
Nilai3 = 0
End If
If Pbok = 0 Then
Buzzer = 0
Waitms 100
Buzzer = 1
Waitms 100
Buzzer = 0
Waitms 100
Buzzer = 1
Cls
Wait 1
If Nilai3 = 1 Then
Waktu = 3600
'Waktu = 35
End If
If Nilai3 = 2 Then
Waktu = 7200
'Waktu = 40
End If
If Nilai3 = 3 Then
Waktu = 10800
'Waktu = 45
End If
Mark = 1
Goto Motor
End If
Loop
Motor:
Do
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 Then
Led1 = 0
End If
If Nilai > 0 And T < Nilai Then
Led1 = 1
End If
If Nilai2 > 0 And H >= Nilai2 Then
Led2 = 0
End If
If Nilai2 > 0 And H < Nilai2 Then
Led2 = 1
End If
Led3 = 1
Incr Cacah
Incr Vx
If Vx = 30 Then
Vx = 0
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
e. VIDEO HASILNYA
No comments:
Post a Comment