logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Pomiar Temperatury - sygnalizacja buzzer

forttres 23 Sty 2011 12:54 2205 16
REKLAMA
  • #1 9045175
    forttres
    Poziom 14  
    Nie wiem jeszcze jak więc, liczę na pomoc do kodu poniżej chciałbym dodać funkcje sygnalizacji piknięciem z głośniczka na płytce, informującego o zmianie temperatury co 1 stopień w górę lub dół.

    płytka EvB 4.3 procesor - Atmega32
    kod napisany w Bascomie

    
    ' Termometr DS18B20 
    $regfile = "m32def.dat" 
    $crystal = 16000000 
    
    
    
    
    Config Lcdpin = Pin , Rs = Portc.2 , E = Portc.3 , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7       'standard 
    Config Lcd = 16 * 2 
    
    Config 1wire = Portd.4 
    
    Dim Id(8) As Byte 
    
    Dim T As Word 
    Dim S As String * 4 
    Dim Minus As Bit 
    
    
    Display Off 
    Deflcdchar 0 , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32        ' definicja symbolu stopnia 
    
    
    Id(1) = 1wsearchfirst()                                     'znajdź czujnik 
    
       1wreset 
       1wwrite &HCC                                             'opóść sprawdzanie numeru czujnika 
       1wwrite &H44                                             'Konwersja temperatury 
       Waitms 750 
    
    
    Display On 
    Cursor Off 
    Cls 
    
    Locate 1 , 1 
    Lcd "Temperatura" 
    
    
    Do 
    
       1wreset 
       1wwrite &H55                                             'porównaj numer czujnika 
       1wverify Id(1) 
       1wwrite &HBE                                             'komenda odczytania z czujnika 
       T = 1wread(2) 
    
       1wreset 
       1wwrite &HCC                                             'opóść sprawdzanie numeru czujnika 
       1wwrite &H44                                             'Konwersja temperatury 
       Waitms 750 
    
    
    
    
       If T > &HFC00 Then                                       'sprawdza, czy temperatura ujemna 
       T = 65536 - T                                            'wartość ujemna zapisana w kodzie U2 
       Minus = 1 
       Else 
       Minus = 0 
       End If 
    
       T = T * 10 
       T = T / 16 
       S = Str(t) 
       S = Format(s , "0.0") 
    
       Locate 2 , 1 
    
       If Minus = 1 Then 
       Lcd "-" 
       End If 
    
       Lcd S ; Chr(0) ; "C " 
    
    Loop 
    End
    
  • REKLAMA
  • #2 9046073
    M. S.
    Poziom 34  
    Do
       1wreset
       1wwrite &H55                                             'porównaj numer czujnika
       1wverify Id(1)
       1wwrite &HBE                                             'komenda odczytania z czujnika
       T = 1wread(2)
    
       1wreset
       1wwrite &HCC                                             'opóść sprawdzanie numeru czujnika
       1wwrite &H44                                             'Konwersja temperatury
       Waitms 750
    
       If T > &HFC00 Then                                       'sprawdza, czy temperatura ujemna
       T = 65536 - T                                            'wartość ujemna zapisana w kodzie U2
       Minus = 1
       Else
       Minus = 0
       End If
    
       T = T * 10
       T = T / 16
       S = Str(t)
       S = Format(s , "0.0")
    
       Locate 2 , 1
    
       If Minus = 1 Then
       Lcd "-"
       End If
    
       Lcd S ; Chr(0) ; "C "
    
      S = RIGHT( S , 1 )
    
      If S = "0" then
        If Juz_tu_bylem = 0 Then
          Sound Portx.y , 10000, 10 'Wpisz parametry portu
          Juz_tu_bylem = 1
        End if
      Else
       Juz_tu_bylem = 0 
      End if   
    Loop
    End 


    Dim Juz_tu_bylem As Bit

    Za każdym pojawieniem się "0" na miejscu dziesiętnych program jednorazowo poda sygnał.
    Czy o to chodziło?
    Zadanie. Uodpornij program na wielokrotne generowanie sygnału gdy temperatura oscyluje wokół pełnego stopnia.
  • REKLAMA
  • #3 9047262
    forttres
    Poziom 14  
    Ok zmieniłem port, ale nie rozumiem tego Juz_tu_bylem


    
     If S = "0" then
        If Juz_tu_bylem = 0
          Sound PORTD.3 , 10000 , 10                            'Wpisz parametry portu
          Juz_tu_bylem = 1
        End if
      Else
       Juz_tu_bylem = 0
      End if
    Loop
    End
    


    Po kompilacji w bascomie wywala błędy:

    Pomiar Temperatury - sygnalizacja buzzer
  • #4 9047582
    arktik1
    Poziom 27  
    Chodzi oto by przy S="0" nie był podawany cały czas sygnał.
    Jeśli zmienna "Juz_tu_bylem = 0" to program włączy sygnał i ustawi zmienną na 1.
    Wtedy przy następnej pętli jeśli S będzie równać się 0 sygnał nie zostanie włączony ,bo "Juz_tu_bylem = 1"

    Dodano po 1 [minuty]:

    A błędy wywala bo prawdopodobnie nie zadeklarowałeś zmiennej.
  • #5 9047707
    forttres
    Poziom 14  
    Kurcze dalej nic nie kumam, dopiero od 3 dni bawię się mikro kontrolerami nie znam wszystkich podstaw nawet, mógłbyś zmienić ten kod tak aby działał.
  • REKLAMA
  • #6 9047762
    M. S.
    Poziom 34  
    ' Termometr DS18B20
    $regfile = "m32def.dat"
    $crystal = 16000000
    
    
    
    
    Config Lcdpin = Pin , Rs = Portc.2 , E = Portc.3 , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7       'standard
    Config Lcd = 16 * 2
    
    Config 1wire = Portd.4
    
    Dim Id(8) As Byte
    
    Dim T As Word
    Dim S As String * 4
    Dim Minus As Bit
    Dim Już_tu_bylem As Bit
    
    Display Off
    Deflcdchar 0 , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32        ' definicja symbolu stopnia
    
    
    Id(1) = 1wsearchfirst()                                     'znajdź czujnik
    
       1wreset
       1wwrite &HCC                                             'opóść sprawdzanie numeru czujnika
       1wwrite &H44                                             'Konwersja temperatury
       Waitms 750
    
    
    Display On
    Cursor Off
    Cls
    
    Locate 1 , 1
    Lcd "Temperatura"
    
    
    Do
       1wreset
       1wwrite &H55                                             'porównaj numer czujnika
       1wverify Id(1)
       1wwrite &HBE                                             'komenda odczytania z czujnika
       T = 1wread(2)
    
       1wreset
       1wwrite &HCC                                             'opóść sprawdzanie numeru czujnika
       1wwrite &H44                                             'Konwersja temperatury
       Waitms 750
    
       If T > &HFC00 Then                                       'sprawdza, czy temperatura ujemna
       T = 65536 - T                                            'wartość ujemna zapisana w kodzie U2
       Minus = 1
       Else
       Minus = 0
       End If
    
       T = T * 10
       T = T / 16
       S = Str(t)
       S = Format(s , "0.0")
    
       Locate 2 , 1
    
       If Minus = 1 Then
       Lcd "-"
       End If
    
       Lcd S ; Chr(0) ; "C "
    
      S = RIGHT( S , 1 )
    
      If S = "0" then
        If Już_tu_bylem = 0 Then
          Sound Portx.y , 10000 , 10                            'Wpisz parametry portu
          Już_tu_bylem = 1
        End if
      Else
       Już_tu_bylem = 0
      End if
    Loop
    End


    Poprawiłem, przy IF brakowało then. Wot rutyna.

    Poucz się jeszcze trzy dni, a później jeszcze trzy dni i wypracujesz sobie poprawny kod. To ty się uczysz, a nie ja.
  • #7 9047778
    arktik1
    Poziom 27  
    "nie znam wszystkich podstaw nawet"
    Musisz znać podstawy, inaczej do niczego to nie prowadzi.
  • REKLAMA
  • #8 9047948
    forttres
    Poziom 14  
    ok dzięki za pomoc po wklejeniu kodu od M. S. po kompilacji bascom puszcza bez błędu, ale po wgraniu na płytkę buzer cały czas się drze.

    a zależy mi na takim schemacie:

    Np. jest temperatura 19,2 stopni po zwiększeniu temperatury do 20 stopni krótka sygnalizacja piknięciem z buzera i tak dalej.

    proszę o wyrozumiałość
  • #10 9048009
    forttres
    Poziom 14  
    zaraz po wgraniu dalej to samo cały czas się drze.
  • #11 9048033
    M. S.
    Poziom 34  
    Przed Loop wyświetl na wyświetlaczu powtórnie zmienną S i Juz_tu_bylem. Zobaczysz jakie przyjmują wartości. Daj po LCD opóźnienie, żebyś zdążył przeczytać. Na podstawie odczytu zmodyfikuj program.
  • #12 9048403
    arktik1
    Poziom 27  
    Spróbuj tak:
    
    If S = "0" then
    

    zmień na:
    
    If T >= 200 then
    

    teraz gdy temperatura osiągnie 20.0 C lub więcej odezwie się sygnał.

    Dodano po 2 [minuty]:

    A jeśli masz zwykły BOZZer zamiast głośnika to zamiast SOUND zrób:
    PORTX.Y = 1
    waitms 100
    PORTX.Y =0

    Dodano po 53 [sekundy]:

    I dopisz przed pętlą konfiguracje portów.
  • #13 9049243
    elektrofil
    Poziom 17  
    na tej płytce masz już piezo z generatorem. załączasz go stanem wysokim.
    więc zamiast sound, zrób tak jak radzi kolega arktik1:

    set "portX,Y"
    wait "jak długo piszczeć"
    reset "portX,Y"

    a sposób z wyświetlaniem zmiennych na wyświetlaczu jest doskonały dla osób początkujących, więc jak tylko masz jakiekolwiek wątpliwości to od razu zmienne na wyświetlacz.
    chociaż przy tej płytce sugeruje używanie PRINT'a
    i tak programujesz przez RS'a (połączenie przez USB FT232), więc po zaprogramowaniu odpal terminal RS'owy na PC, i jak masz wątpliwość w którymś miejscu kodu do PRINT'uj zmienne.
  • #14 9050185
    M. S.
    Poziom 34  
    Złożyłem układ i u mnie sygnalizacja działa. Działa, ale nie do końca! Jeśli temperatura zmieni się podczas jednego pomiaru pomiędzy 19,9 a 20,1 to sygnalizacja oczywiście nie zadziała :cry: Trzeba to naprawić wymyślając inny warunek!!!
  • #15 9050193
    arktik1
    Poziom 27  
    Przeczytaj to co napisałem ci wcześniej.
  • Pomocny post
    #16 9050402
    M. S.
    Poziom 34  
    Cytat:
    informującego o zmianie temperatury co 1 stopień w górę lub dół

    To są założenia więc co każdy stopień ma być krótki sygnał. Warunek
    If T >= 200 then

    spowoduje że przekroczenie 20 stopni spowoduje sygnał.
    Muszę chwilę pomyśleć. Trzeba badać także różnicę pomiędzy odczytem poprzednim a następnym.

    Sprawdź to:
    (zmień procesor, konfigurację LCD, portów, 1wire, crystal)


    ' Termometr DS18B20
    $regfile = "m8def.dat"
    $crystal = 2000000
    Config Lcdpin = Pin , Rs = Portb.0 , E = Portd.7 , Db4 = Portd.6 , Db5 = Portd.5 , Db6 = Portb.7 , Db7 = Portb.6       'standard
    Config Lcd = 20 * 4
    
    Config 1wire = Portb.1
    Config Portc.5 = 1 : Portc.5 = 0
    Dim Id(8) As Byte
    
    Dim T As Word , T1 As Word , Roznica As Integer
    
    Dim S As String * 4
    Dim Minus As Bit
    Dim Juz_tu_bylem As Bit
    
    Display Off
    Deflcdchar 0 , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32        ' definicja symbolu stopnia
    
    
    Id(1) = 1wsearchfirst()                                     'znajdź czujnik
    
       1wreset
       1wwrite &HCC                                             'opóść sprawdzanie numeru czujnika
       1wwrite &H44                                             'Konwersja temperatury
       Waitms 750
    
    
    Display On
    Cursor Off
    Cls
    
    Locate 1 , 1
    Lcd "Temperatura"
    
    
    Do
    
       T1 = T \ 10 : T1 = T1 * 10
       1wreset
       1wwrite &H55                                             'porównaj numer czujnika
       1wverify Id(1)
       1wwrite &HBE                                             'komenda odczytania z czujnika
       T = 1wread(2)
    
       1wreset
       1wwrite &HCC                                             'opóść sprawdzanie numeru czujnika
       1wwrite &H44                                             'Konwersja temperatury
       Waitms 750
    
       If T > &HFC00 Then                                       'sprawdza, czy temperatura ujemna
       T = 65536 - T                                            'wartość ujemna zapisana w kodzie U2
       Minus = 1
       Else
       Minus = 0
       End If
    
    
       T = T * 10
       T = T / 16
       Roznica = T - T1
       S = Str(t)
       S = Format(s , "0.0")
    
       Locate 2 , 1
    
       If Minus = 1 Then
       Lcd "-"
       End If
    
       Lcd S ; Chr(0) ; "C "
       
      If Roznica >= 10 Or Roznica =< 0 Then
        If Juz_tu_bylem = 0 Then
          Portc.5 = 1
          Wait 1
          Portc.5 = 0                                           'Wpisz parametry portu
          Juz_tu_bylem = 1
        End If
      Else
       Juz_tu_bylem = 0
      End If
    Loop
    End



    Sygnalizuje każde przejście przez pełny stopień. Wyjątek występuje jeśli temperatura podczas jednego odczytu dwa razy przekracza pełen stopień (np z 26,8 na 28,1) to sygnalizacja jest jedna.
  • #17 9051294
    forttres
    Poziom 14  
    Dopiero teraz bo po pracy jestem, kod zmieniony wszystko działa dziękuje wszystkim za pomoc. Poniżej zamieszczam kod może komuś się przyda.

    Temat Rozwiązany !!!

    
    ' Termometr DS18B20
    $regfile = "m32def.dat"
    $crystal = 16000000
    Config Lcdpin = Pin , Rs = Portc.2 , E = Portc.3 , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7       'standard
    Config Lcd = 16 * 2
    
    Config 1wire = Portd.4
    
    Config Portb.5 = 1 : Portb.5 = 0
    Dim Id(8) As Byte
    
    Dim T As Word , T1 As Word , Roznica As Integer
    
    Dim S As String * 4
    Dim Minus As Bit
    Dim Juz_tu_bylem As Bit
    
    Display Off
    Deflcdchar 0 , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32        ' definicja symbolu stopnia
    
    
    Id(1) = 1wsearchfirst()                                     'znajdź czujnik
    
       1wreset
       1wwrite &HCC                                             'opóść sprawdzanie numeru czujnika
       1wwrite &H44                                             'Konwersja temperatury
       Waitms 750
    
    
    Display On
    Cursor Off
    Cls
    
    Locate 1 , 1
    Lcd "Temperatura"
    
    
    Do
    
       T1 = T \ 10 : T1 = T1 * 10
       1wreset
       1wwrite &H55                                             'porównaj numer czujnika
       1wverify Id(1)
       1wwrite &HBE                                             'komenda odczytania z czujnika
       T = 1wread(2)
    
       1wreset
       1wwrite &HCC                                             'opóść sprawdzanie numeru czujnika
       1wwrite &H44                                             'Konwersja temperatury
       Waitms 750
    
       If T > &HFC00 Then                                       'sprawdza, czy temperatura ujemna
       T = 65536 - T                                            'wartość ujemna zapisana w kodzie U2
       Minus = 1
       Else
       Minus = 0
       End If
    
    
       T = T * 10
       T = T / 16
       Roznica = T - T1
       S = Str(t)
       S = Format(s , "0.0")
    
       Locate 2 , 1
    
       If Minus = 1 Then
       Lcd "-"
       End If
    
       Lcd S ; Chr(0) ; "C "
    
      If Roznica >= 10 Or Roznica =< 0 Then
        If Juz_tu_bylem = 0 Then
          Portb.5 = 1
          Wait 1
          Portb.5 = 0                                           'Wpisz parametry portu
          Juz_tu_bylem = 1
        End If
      Else
       Juz_tu_bylem = 0
      End If
    Loop
    End
    
REKLAMA