Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Termometr z alarmem, pomoc w dopisaniu alarmu

cugi253 09 Oct 2010 23:24 2480 13
  • #1
    cugi253
    Level 16  
    Witam. Na podstawie kodu źródłowego kolegi duch z tego forum stworzyłem termometr 3 funkcyjny. Pokazuje mi temperaturę w domu, na zewnatrz oraz w wody grzejnej w piecu. Dopisałem kawałek kodu tak aby po przekroczeniu 85 C wlaczal sie buzzer z piskliwym sygnalem. Niestety gdy dopisze moj kawałek kodu temperatura pokazuje duzo za dużą i sygnał mi sie nie włacza. Czy któś może mi pomoc co w tym kawałku jest żle?

    KOD kolegi duch
    'Termometr 4 punktowy DS18b20 by Duch na podstawie materiałów znalezionych w sieci
    'Kontakt duszkowski@o2.pl
    
    
    $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 = Portd.3 , Db5 = Portd.2 , Db6 = Portd.1 , Db7 = Portd.0 , E = Portd.6 , Rs = Portd.7
    
    Config Lcd = 20 * 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 Portb.0 = Output
    Speaker Alias Portb.0                                       'deklaracja portu glosnika
    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 I4 As Integer
    
    Dim Dsid1(8) As Byte
    Dim Dsid2(8) As Byte
    Dim Dsid3(8) As Byte
    Dim Dsid4(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 , 11 , 4 , 4 , 4 , 3 , 32             'znak stopnia Celsjusza
    
    Cursor Off                                                  'Wyłącza kursor
    Cls                                                         'Funkcja CLS czyści ekran
    Lcd "  Termometr CO  " ;                                    'ekran startowy (pojawia się tylko podczas włączania urządzenia)
    Lowerline
    Lcd "      PINKI        "
    Wait 5
    Cls
    W = 1wirecount()
    Lcd "Ilosc czujnikow:"                                      'Informuje ile czujników jest podpiętych do układu (pojawia się tylko podczas włączania urządzenia)
    Waitms 500
    Lowerline
    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 "Czujnik 1 OK"
     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 "Czujnik 2 OK"
     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 "Czujnik 3 OK"
     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 * 10
       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 , " 0.0")
       Locate 1 , 1                                             'Pozycja wyświetlania nazwy i temperatury (1.1 -> 1 linia 1 kolumna, 2.10 -> 2 linia 10 kolumna itd)
       Lcd "Ze" ; Ss ; Chr(0) ;
    
       I2 = I2 * 10
       I2 = I2 / 16
       'If I2 > 0 Then Cls
       Ss = Str(i2)
       Ss = Format(ss , " 0.0")
       Locate 1 , 10
       Lcd "We" ; Ss ; Chr(0) ;
    
       I3 = I3 * 10
       I3 = I3 / 16
       'If I3 > 0 Then Cls
       Ss = Str(i3)
       Ss = Format(ss , " 0.0")
          Locate 2 , 4
       Lcd "PIEC " ; Ss ; Chr(0) ;
    
      Loop
    
    'Koniec programu
    'Pozdrawiam Duch



    A ten kawałek chcialem wkleić:
    
    
    If I3 >= 85 Then
          Do
             
             Locate 2,4
             Lcd " !!PIEC!!" ; Ss ; Chr(0)
             Sound Speaker , 587 , 32
             Sound Speaker , 659 , 26
    
         Loop
       End If 
  • Helpful post
    #2
    M. S.
    Level 34  
    W zmiennej I3 jest temperatura 10 razy większa niż zmierzona. Później jest ona formatowana do wyświetlenia aby wstawić przecinek. To taki myk aby nie wchodzić w zmienne typu Single. W IF'ie przyrównaj zatem tą temperaturę nie do 85°C ale do 850°C.
    If I3 >= 850 Then
  • #3
    cugi253
    Level 16  
    Oki dziękuje. Teraz już działa. Mam jeszcze jedno pytanie dodałem GOTO tak aby po naciśnięciu przycisku(switcha) wracal do poczatku wtedy by buzzer sie wyłączał i włączał gdy temperatura obniży się poniżej 85 C i ponownie przekroczy 85 C. I takie pytanie jak by to można zapisać aby na początku IF sprawdzał czy temperatura się obniżyła i znów wzrosła. A może jest na to jakiś inny pomysl?


    'Termometr 4 punktowy DS18b20 by Duch na podstawie materiałów znalezionych w sieci
    'Kontakt duszkowski@o2.pl
    
    
    $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 = Portd.3 , Db5 = Portd.2 , Db6 = Portd.1 , Db7 = Portd.0 , E = Portd.6 , Rs = Portd.7
    
    Config Lcd = 20 * 2                                         
    
    
    
     Config Portb.1 = Input                                     'port b.1 bedzie  wejsciowy (switch- przcisk)
     Config Portb = &B0000000                                   'wszędzie stan spoczynkowy-0 (switch przycisk)
    Config Portb.0 = Output
    Speaker Alias Portb.0                                       'deklaracja portu glosnika
    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 I4 As Integer
    
    Dim Dsid1(8) As Byte
    Dim Dsid2(8) As Byte
    Dim Dsid3(8) As Byte
    Dim Dsid4(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 , 11 , 4 , 4 , 4 , 3 , 32             'znak stopnia Celsjusza
    
    Cursor Off                                                  'Wyłącza kursor
    Cls                                                         'Funkcja CLS czyści ekran
    Lcd "  Termometr CO  " ;                                    'ekran startowy (pojawia się tylko podczas włączania urządzenia)
    Lowerline
    Lcd "      PINKI        "
    Wait 5
    Cls
    W = 1wirecount()
    Lcd "Ilosc czujnikow:"                                      'Informuje ile czujników jest podpiętych do układu (pojawia się tylko podczas włączania urządzenia)
    Waitms 500
    Lowerline
    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                       
     Locate 1 , 1
     Lcd "Czujnik 1 OK"
     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 "Czujnik 2 OK"
     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 "Czujnik 3 OK"
     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
    
    
    
       I1 = I1 * 10
       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 , " 0.0")
       Locate 1 , 1                                            
       Lcd "Ze" ; Ss ; Chr(0) ;
    
       I2 = I2 * 10
       I2 = I2 / 16
       'If I2 > 0 Then Cls
       Ss = Str(i2)
       Ss = Format(ss , " 0.0")
       Locate 1 , 10
       Lcd "We" ; Ss ; Chr(0) ;
    
       I3 = I3 * 10
       I3 = I3 / 16
       'If I3 > 0 Then Cls
       Ss = Str(i3)
       Ss = Format(ss , " 0.0")
    
       Lowerline
       Lcd "   PIEC  " ; Ss ; Chr(0) ;
    
       K:
    
          If I3 >= 850 Then                                     ' jezeli temperatura rowna 85 to alarm
                                                                 ' jezeli temperatura rowna 85 to alarm
              Cls                                               '  jezeli temperatura rowna 85 to alarm
              Lowerline                                         ' jezeli temperatura rowna 85 to alarm
              Lcd " !!PIEC!!" ; Ss ; Chr(0)                     ' jezeli temperatura rowna 85 to alarm
              Sound Speaker , 587 , 32                          ' jezeli temperatura rowna 85 to alarm
              Sound Speaker , 659 , 26                          ' jezeli temperatura rowna 85 to alarm
                If Pinb.1 = 1 Then
                   Waitms 50
                   Goto K
    
                End If
          End If
      Loop
    
  • #4
    M. S.
    Level 34  
    Tak to działać nie będzie.
    Alarm samoczynnie wyłączy się bez twojego Goto.
    Jeśli chcesz kasować alarm ręcznie, to załóż zmienną bitową i przyciskiem nadaj jej wartość np 1 a ifem po obniżeniu temperatury nadaj jej wartość 0. Działanie alarmu uzależnij również od tej zmiennej.

    Dim Flaga as Bit
    
    
    If I3 >=850  then
    If flaga = 0 then
    Lowerline                                        
    Lcd " !!PIEC!!" ; Ss ; Chr(0);Spc(3)                   
    Sound Speaker , 587 , 32                        
    Sound Speaker , 659 , 26                         
    If Pinb.1 = 1 Then Set Flaga
    Endif
    else
    Reset Flaga
    End If


    Pamiętaj, że program wykonuje się linia po linii czy programista tego chce czy nie (z uwzględnieniem zaprogramowanych skoków).

    Programik wyłączy alarm ale napis pozostanie no chyba, że dalej zostanie skasowany.

    Jak chcesz sprawdzać czy temperatura wzrosła czy spadła to przed kolejnym pomiarem zapisz jej wartość do innej zmiennej, a później porównaj.

    Temperatura_stara = Temperatura_nowa
    Gosub Zmierz_temperatura_nowa
    If  Temperatura_stara > Temperatura_nowa Then ...
    If  Temperatura_stara < Temperatura_nowa Then ...
    If  Temperatura_stara = Temperatura_nowa Then ...
    


    P.S. Nie nadużywaj CLS bo wyświetlacz będzie migał. W pętli nadpisuj wyświetlacz.
  • #5
    cugi253
    Level 16  
    Wszystko w porządku, tylko chodzi mi o ty by alarm był do momentu aż nacisnę przycisk.
  • Helpful post
    #6
    M. S.
    Level 34  
    No i tak zostało to oprogramowane. Alarm do momentu wciśnięcia przycisku. Powtórny alarm po opadnięciu temperatury poniżej 85°C i wzroście powyżej 85°C.
    Przeanalizuj działanie zmiennej Flaga.
  • #7
    cugi253
    Level 16  
    Tak jak to czytam to logiccznie powinno działać ale po przekroczeniu temperatury pojawia sie napis !!PIEC!! program odgrywa dwie nuty i tyle. Wiec działania przycisku nawet nie mozen sprawdzić. ale bez nacisniecia przycisku po obniżeniu temperatury i znów podwyższeniu do temp. alarmowej znów wlacza sie alarm(dwie nuty) i koniec.
    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 = Portd.3 , Db5 = Portd.2 , Db6 = Portd.1 , Db7 = Portd.0 , E = Portd.6 , Rs = Portd.7
    
    Config Lcd = 20 * 2                                         '
    
    
     Config Portb.1 = Input                                     'port b.1 bedzie  wejsciowy (switch- przcisk)
     Config Portb = &B0000000                                   'wszędzie stan spoczynkowy-0 (switch przycisk)
    Config Portb.0 = Output
    Speaker Alias Portb.0                                       'deklaracja portu glosnika
    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 I4 As Integer
    
    Dim Dsid1(8) As Byte
    Dim Dsid2(8) As Byte
    Dim Dsid3(8) As Byte
    Dim Dsid4(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
    Dim Flaga As Bit
    
    Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32             'znak stopnia Celsjusza
    
    Cursor Off                                                  'Wyłącza kursor
    Cls                                                         'Funkcja CLS czyści ekran
    Lcd "  Termometr CO  " ;                                    'ekran startowy (pojawia się tylko podczas włączania urządzenia)
    Lowerline
    Lcd "      PINKI        "
    Wait 5
    Cls
    W = 1wirecount()
    Lcd "Ilosc czujnikow:"                                      'Informuje ile czujników jest podpiętych do układu (pojawia się tylko podczas włączania urządzenia)
    Waitms 500
    Lowerline
    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 "Czujnik 1 OK"
     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 "Czujnik 2 OK"
     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 "Czujnik 3 OK"
     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
    
    
    
       I1 = I1 * 10
       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 , " 0.0")
       Locate 1 , 1                                             'Pozycja wyświetlania nazwy i temperatury (1.1 -> 1 linia 1 kolumna, 2.10 -> 2 linia 10 kolumna itd)
       Lcd "Ze" ; Ss ; Chr(0) ;
    
       I2 = I2 * 10
       I2 = I2 / 16
       'If I2 > 0 Then Cls
       Ss = Str(i2)
       Ss = Format(ss , " 0.0")
       Locate 1 , 10
       Lcd "We" ; Ss ; Chr(0) ;
    
    
    
       I3 = I3 * 10
       I3 = I3 / 16
       'If I3 > 0 Then Cls
       Ss = Str(i3)
       Ss = Format(ss , " 0.0")
       Lowerline
       Lcd "   PIEC  " ; Ss ; Chr(0)
    
    
    
    
    
    If I3 > 240 Then
    If flaga = 0 then
    Lowerline
    Lcd " !!PIEC!!" ; Ss ; Chr(0) ; Spc(3)
    Sound Speaker , 587 , 32
    Sound Speaker , 659 , 26
    
    If Pinb.1 = 1 Then Set Flaga
    End If
    else
    Reset Flaga
    End If
    
      Loop
    
    


    Może ja coś źle przepisałem?
  • #10
    cugi253
    Level 16  
    Jezeli by kogos interesował koncowy kod to( moze komus sie przyda) takiemu laikowi jak ja:):
    $regfile = "m8def.DAT"                                      'deklaracja procesora Atmega8
    $crystal = 1000000                                          'deklaracja cześtotlwiości pracy
    'Deklaracja portów od wyświetlacza LCD
    Config Lcdpin = Pin , Db4 = Portd.3 , Db5 = Portd.2 , Db6 = Portd.1 , Db7 = Portd.0 , E = Portd.6 , Rs = Portd.7
    
    Config Lcd = 20 * 2                                         '
    
    
     Config Portb.1 = Input                                     'port b.1 bedzie  wejsciowy (switch- przcisk)
     Config Portb = &B0000000                                   'wszędzie stan spoczynkowy-0 (switch przycisk)
    Config Portb.0 = Output
    Speaker Alias Portb.0                                       'deklaracja portu glosnika
    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 I4 As Integer
    
    Dim Dsid1(8) As Byte
    Dim Dsid2(8) As Byte
    Dim Dsid3(8) As Byte
    Dim Dsid4(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
    
    Dim Flaga As Bit                                            ' deklaracja flagi1 dla 82 stopni
    Dim Flaga1 As Bit                                           ' deklaracja flagi dla 75  stopni
    Dim Flaga2 As Bit                                           'deklaracja flagi dla 60 stopni
    Dim Flaga3 As Bit                                           ' deklaracja flagi dla 88 stopni
    
    Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32             'znak stopnia Celsjusza
    
    Cursor Off                                                  'Wyłącza kursor
    Cls                                                         'Funkcja CLS czyści ekran
    Lcd "  Termometr CO  " ;                                    'ekran startowy (pojawia się tylko podczas włączania urządzenia)
    Lowerline
    Lcd "      PINKI        "
    Wait 5
    Cls
    W = 1wirecount()
    Lcd "Ilosc czujnikow:"                                      'Informuje ile czujników jest podpiętych do układu (pojawia się tylko podczas włączania urządzenia)
    Waitms 500
    Lowerline
    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 "Czujnik 1 OK"
     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 "Czujnik 2 OK"
     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 "Czujnik 3 OK"
     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
    
    
    
       I1 = I1 * 10
       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 , " 0.0")
       Locate 1 , 1                                             'Pozycja wyświetlania nazwy i temperatury (1.1 -> 1 linia 1 kolumna, 2.10 -> 2 linia 10 kolumna itd)
       Lcd "Ze" ; Ss ; Chr(0) ;
    
       I2 = I2 * 10
       I2 = I2 / 16
       'If I2 > 0 Then Cls
       Ss = Str(i2)
       Ss = Format(ss , " 0.0")
       Locate 1 , 10
       Lcd "We" ; Ss ; Chr(0) ;
    
    
    
       I3 = I3 * 10
       I3 = I3 / 16
       'If I3 > 0 Then Cls
       Ss = Str(i3)
       Ss = Format(ss , " 0.0")
       Lowerline
       Lcd "   PIEC  " ; Ss ; Chr(0)
    
    
    
    
    If I3 >= 600 Then                                           ' jezeli temp i3> 600 to...
    If Flaga2 = 0 Then
    Lowerline
    
    Lcd " !!PIEC!!" ; Ss ; Chr(0)
    Sound Speaker , 329 , 63                                    ' nuta dzwiekowa
    Sound Speaker , 369 , 99                                    ' nuta dziwekowa
    
    If Pinb.1 = 0 Then Set Flaga2                               'pod pinem b1 jest przycisk switch
    Waitms 50                                                   ' kasujemy alarm przytrzymujac go na minimum 50 ms
    End If
    Else
    Reset Flaga2
    End If
    
    
    
    
    
    
    If I3 >= 750 Then                                           ' jezeli temp i3> 750 to...
    If Flaga1 = 0 Then
    Lowerline
    
    Lcd " !!PIEC!!" ; Ss ; Chr(0)
    Sound Speaker , 1975 , 50                                   ' nuta dzwiekowa
    Sound Speaker , 261 , 63                                    ' nuta dziwekowa
    
    If Pinb.1 = 0 Then Set Flaga1                               'pod pinem b1 jest przycisk switch
    Waitms 50                                                   ' kasujemy alarm przytrzymujac go na minimum 50 ms
    End If
    Else
    Reset Flaga1
    End If
    
    
    
    
      If I3 >= 820 Then                                         ' jezeli temp i3> 820 to...
    If Flaga = 0 Then
    Lowerline
    
    Lcd " !!PIEC!!" ; Ss ; Chr(0)
    Sound Speaker , 587 , 32                                    ' nuta dzwiekowa
    Sound Speaker , 659 , 26                                    ' nuta dziwekowa
    
    If Pinb.1 = 0 Then Set Flaga                                'pod pinem b1 jest przycisk switch
    Waitms 50                                                   ' kasujemy alarm przytrzymujac go na minimum 50 ms
    End If
    Else
    Reset Flaga
    End If
    
    
    
    
    If I3 >= 880 Then                                           ' jezeli temp i3> 880 to...
    If Flaga3 = 0 Then
    Lowerline
    
    Lcd " !!PIEC!!" ; Ss ; Chr(0)
    Sound Speaker , 587 , 32                                    ' nuta dzwiekowa
    Sound Speaker , 587 , 30                                    ' nuta dziwekowa
    
    If Pinb.1 = 0 Then Set Flaga3                               'pod pinem b1 jest przycisk switch
    Waitms 50                                                   ' kasujemy alarm przytrzymujac go na minimum 50 ms
    End If
    Else
    Reset Flaga3
    End If
    
    
    
      Loop
    
  • #11
    cugi253
    Level 16  
    Tak teraz myśle ze nie bedzie to tak super działalo bo temperatura gdy bedzie np 75 stopni to po obnizeniu 74,9 i wzroscie do 75 bedzie sie ponownie właczał. Dobrym rozwiązaniem bylo by gdyby temp. obnizyla sie o 2 stopnie od granicznej. Wtedy będzie trzeba wprowadzić jakies nowe zmienne w które byly by zapisywane temp? czy da sie prościej?
  • #12
    boohoo
    Level 12  
    Ano, ze względu na szumy pomiarowe i zakłócenia, należałoby zrobić histerezę. Nie wiem jak to zapisać w Bascomie, ale w C np. tak:
         
       if(temperatura > (alarm + hysteresis))
            {
             //włącz alarm
            }
       if(temperatura < (alarm - hysteresis))
            {
             //wyłącz alarm
            }
    


    Alarm włączy się, jeśli temperatura będzie większa od wartości przypisanej zmiennej alarm + wartośc histerezy, a wyłączy, gdy temperatura opadnie do wartości alarm - wartośc histerezy. Czyli gdy przypiszemy zmiennej alarm wartość 85, a hysteresis wartość 1, to alarm włączy się w temperaturze 86 stopni, a wyłączy, gdy ta opadnie do 84 stopni.
    Pozdrawiam.
  • #13
    M. S.
    Level 34  
    W takim razie zmodyfikujemy nieco program. Było:
    If I3 >= 880 Then                                           ' jezeli temp i3> 880 to...
    If Flaga3 = 0 Then
    Lowerline
    
    Lcd " !!PIEC!!" ; Ss ; Chr(0)
    Sound Speaker , 587 , 32                                    ' nuta dzwiekowa
    Sound Speaker , 587 , 30                                    ' nuta dziwekowa
    
    If Pinb.1 = 0 Then Set Flaga3                               'pod pinem b1 jest przycisk switch
    Waitms 50                                                   ' kasujemy alarm przytrzymujac go na minimum 50 ms
    End If
    Else
    Reset Flaga3
    End If 


    Jest:
    If I3 >= 880 Then                                           ' jezeli temp i3> 880 to...
       If Flaga3 = 0 Then
          Lowerline
    
          Lcd " !!PIEC!!" ; Ss ; Chr(0)
          Sound Speaker , 587 , 32                              ' nuta dzwiekowa
          Sound Speaker , 587 , 30                              ' nuta dziwekowa
    
          If Pinb.1 = 0 Then Set Flaga3                         'pod pinem b1 jest przycisk switch
          Waitms 50                                             ' kasujemy alarm przytrzymujac go na minimum 50 ms
       End If
    End If
    If I3 < 860 Then Reset Flaga3                               'Zmieniamy znacznik jeśli temp spadnie ponizej 86st.C


    P. S. "kasujemy alarm przytrzymujac go na minimum 50 ms" - to nie będzie tak działać. Trzeba by powtórzyć if po Waitms 50 i dopiero w tym ifie ustawiać Flaga3
  • #14
    cugi253
    Level 16  
    rozumiem ze cos takiego aby okreslic czas przycisniecia przycisku?
    
    f I3 >= 880 Then                                           ' jezeli temp i3> 880 to...
       If Flaga3 = 0 Then
          Lowerline
    
          Lcd " !!PIEC!!" ; Ss ; Chr(0)
          Sound Speaker , 587 , 32                              ' nuta dzwiekowa
          Sound Speaker , 587 , 30                              ' nuta dziwekowa
    
    If Pinb.1 = 0 Then
       Waitms 50
       If Pinb.1 = 0 Then Set Flaga3
    End if
    End If
    If I3 < 860 Then Reset Flaga3