Termostat


Witam!
Potrzebuję małej pomocy w dopisaniu kawałka kodu do już istniejącego programu.
Otóż zrobiłem sobie układ
http://zapodaj.net/b3e88db739d0.jpg.html
Schemat ściągnięty z sieci
Podłączenie buzzera zaczerpnąłem z tej stronki:)
Program ściągnąłem z sieci i przerobiłem go (jakimś cudem bo dopiero zaczyna przygodę z mikrokontrolerami)na własne potrzeby czyli 3 czujniki (wewnątrz, zewnątrz, oraz piec) lcd 16*2
Funkcję którą potrzebuję dopisać to jest żeby po przekroczeniu określonej temperatury( czujnik piec- temperatura 85stC) załączany został buzer na ok. 5s i na lcd wyświetlał się napis przegrzanie.

$regfile = "m8def.DAT"                                      'deklaracja procesora, w tym wypadku Atmega8
$crystal = 1000000                                          'deklaracja cześtotlwiości pracy (wew oscylator 1MHz w zupełności wystarcza)
'Deklaracja portów od wyświetlacza LCD
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
 
Config Lcd = 16 * 2                                         'ustawiamy typ wyświetlacza (soft jest dostosowany do pracy z wyświetlaczem 2x20, przy pracy z innym wyświetlaczem trzeba będzie skorygować wyświetlanie znaków)
 
'*************************************WAŻNE**********************************************
'Pamiętać o podłączeniu rezystora podciągającego o wartości 4.7kohm między linią DQ a VCC
Config 1wire = Portd.5                                      'deklaracja portu na którym będą podpięte DS18b20
 
Dim I1 As Integer , Ss As String * 6
Dim I2 As Integer
Dim I3 As Integer
 
 
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim Dsid3(8) As Byte
 
Dim B As Byte                                               'deklaracja zmiennej do odczytu kodów ID
Dim W As Byte                                               'deklaracja zmiennej do odczytu ilośc czujników
 
Deflcdchar 0 , 8 , 20 , 8 , 32 , 32 , 32 , 32 , 32          'znak stopnia celsjusza
Deflcdchar 1 , 4 , 5 , 7 , 7 , 15 , 25 , 9 , 15             ' Dom lewy
Deflcdchar 2 , 32 , 16 , 24 , 28 , 30 , 19 , 18 , 18        ' dom prawy
Deflcdchar 3 , 4 , 14 , 27 , 14 , 4 , 1 , 7 , 32            ' Słońce lewe
Deflcdchar 4 , 32 , 32 , 32 , 14 , 31 , 30 , 28 , 32        ' Słońce prawe
 
Cursor Off                                                  'Wyłącza kursor
Cls                                                         'Funkcja CLS czyści ekran
Lcd "   Termometr    " ;                                    'ekran startowy (pojawia się tylko podczas włączania urządzenia)
Lowerline
Lcd "      2009      "
Wait 5
Cls
W = 1wirecount()
Lcd "Ilosc czuj: "                                          'Informuje ile czujników jest podpiętych do układu (pojawia się tylko podczas włączania urządzenia)
Waitms 500
Lcd W
Wait 3
Cls                                                         'Znajdź pierwszy czujnik podpięty do portu
Dsid1(1) = 1wsearchfirst()                                  'Znajdź kolejny czujnik podpięty do portu
Dsid2(1) = 1wsearchnext()                                   'Znajdź kolejny czujnik podpięty do portu
Dsid3(1) = 1wsearchnext()                                   'Znajdź kolejny czujnik podpięty do portu
 
 
 
'*******************Odczyt numerów ID czujników temperatury*********************
 
If Dsid1(8) = Crc8(dsid1(1) , 7) Then                       'ta opcja pojawia się tylko przy włączaniu urządzenia
 Locate 1 , 1
 Lcd " CRC OK Czuj. 1 "
 Wait 1
 Locate 1 , 1
 For B = 1 To 8
 Lcd Hex(dsid1(b))
 Next
End If
Wait 2
 
If Dsid2(8) = Crc8(dsid2(1) , 7) Then
 Locate 2 , 1
 Lcd " CRC OK Czuj. 2 "
 Wait 1
 Locate 2 , 1
 For B = 1 To 8
 Lcd Hex(dsid2(b))
 Next
End If
Wait 2
 
If Dsid3(8) = Crc8(dsid3(1) , 7) Then
 Locate 1 , 1
 Lcd " CRC OK Czuj. 3 "
 Wait 1
 Locate 1 , 1
 For B = 1 To 8
 Lcd Hex(dsid3(b))
 Next
End If
Wait 2
Cls
 
 
 
'*******************koniec odczytu ID czujników temperatury*********************
 
Do
   1wreset
   1wwrite &H55
   1wverify Dsid1(1)                                        'wysyłamy adres pierwszego czujnika
   1wwrite &HBE
   I1 = 1wread(2)
'---------------------------------
   1wreset
   1wwrite &H55
   1wverify Dsid2(1)                                        'wysylam adres drugiego czujnika
   1wwrite &HBE
   I2 = 1wread(2)
'---------------------------------
 
   1wreset
   1wwrite &H55
   1wverify Dsid3(1)                                        'wysylam adres trzeciego czujnika
   1wwrite &HBE
   I3 = 1wread(2)
 
'--------konwersja temp dla wszystkich dsow
   1wreset
   1wwrite &HCC
   1wwrite &H44
Wait 1
 
 
'****Jeśli pracujesz z wyświetlaczem innym niż 2x20 to tutaj trzeba wprowadzić zmiany w LOCATE********
 
  I1 = I1 * 1                                               'zmiana tego mnożnika oraz
   I1 = I1 / 16
   'If I1 > 0 Then Cls                      'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
   Ss = Str(i1)
   Ss = Format(ss , "1")                                    'tej wartości  zmieniamy sposób wyświetlania temperatury (jak jest mnożnik 10 oraz    Locate 1 , 1   jest 0.0
   Locate 1 , 1
   Lcd Chr(1)                                               ' słońce lewe
   Locate 1 , 2                                             ' Słońce prawe
   Lcd Chr(2) ;
   Lcd " " ; Ss ; Chr(0) ;
 
  I2 = I2 * 1
   I2 = I2 / 16
   'If I2 > 0 Then Cls
   Ss = Str(i2)
   Ss = Format(ss , "1")
   Locate 1 , 9
   Lcd "Piec " ; Ss ; Chr(0) ;
 
  I3 = I3 * 1
   I3 = I3 / 16
   'If I3 > 0 Then Cls
   Ss = Str(i3)
   Ss = Format(ss , "1")
   Locate 2 , 1                                             ' dom lewy
   Lcd Chr(3)
   Locate 2 , 2                                             ' dom prawy
   Lcd Chr(4) ;
   Lcd " " ; Ss ; Chr(0) ;
 
Loop
 
'Koniec programu

Proszę o pomoc

ps. soft nie jest mojego autorstwa i został znaleziony w sieci.
http://zapodaj.net/b3e88db739d0.jpg.html




Portret użytkownika mirley

Re: Termostat

Program napisany jest trochę kiepsko bo nie ma żadnego timera i wszystko chodzi w do loop ale poprostu wystarczy dopisać jednego if'a w miejscu gdzie masz wyświetlanie temperatury pieca

if I2 < 85 then 
  Locate 1 , 9
  Lcd "Piec " ; Ss ; Chr(0) ;
else
  Locate 1 , 1 'to sobie musisz sam ustawić
  lcd " Przegrzanie"
  Buzzer = 0
  wait 5
  buzzer = 1  
end if

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika pokokolo

Dzięki za odpowiedź:) Dopiero

Dzięki za odpowiedź:)
Dopiero dzisiaj znowu zabrałem się za ten układ....
Mam jeszcze jedno pytanie odnośnie tego co napisałeś.
Czy na początku program pod config 1 wire powinienem dopisać config dla buzzera?? Bo nigdzie nie jest napisane z którego pinu powinien być sterowany buzzer.
Pozdrawiam!

Portret użytkownika mirley

Re: Termostat

Nazwa "Buzzer" w powyższym kodzie to poprostu nazwa pinu, możesz albo zastapić nazwę Buzzer bezpośrednio przez Portx.y albo bardziej elegancko dopisac na początku programu polecenie:

Buzzer alias Portx.y

Od tej pory wszędzie gdzie napiszesz Set Buzzer, reset buzzer lub buzzer = 1 itp to zawsze zmieniany będzie stan na pinie portx.y, który napisany jest na początku

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika pokokolo

Re: Termostat

Witam!
Wpisałem tak jak mówisz i buzzer załączył się przy temperaturze 30st (tyle ustawiłem do testów) ale następnie po zejściu poniżej zadanej temperatury załączył się na stałe i na wyświetlaczu została komenda przegrzanie. :(
Niestety nie jestem jeszcze na tyle dobry w programowaniu i prosze o pomoc.
Pozdrawiam!

Portret użytkownika mirley

Re: Termostat

Pamiętaj że buzzer ma być załączany stanem niskim na danym pinie za pomocą tranzystora PNP. Dodatkowo pin wyjściowy buzzera ma byc skonfigurowany jako wyjście.

Poza tym sprubuj to wstawić tak:

if I2 < 85 then 
  buzzer = 1 
  Locate 1 , 9
  Lcd "Piec " ; Ss ; Chr(0) ;
else
  Locate 1 , 9
  lcd " Przeg"
  Buzzer = 0
  wait 5
  buzzer = 1  
end if

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.