Translate

Monitor Suhu dan Kelembaban (Temperture Humidity) DHT22 Bascom AVR

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




b. Sensor DHT22




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





No comments:

Post a Comment