Translate

Membuat Alat Monitor Suhu dan Kelembaban Menggunakan Sensor DHT22 + BASCOM AVR

Membuat Alat Monitor Suhu dan Kelembaban Menggunakan Sensor DHT22 + BASCOM AVR


            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