Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Pomiar Temperatury - sygnalizacja buzzer

forttres 23 Sty 2011 12:54 1932 16
  • #1 23 Sty 2011 12:54
    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

    Code:

    ' 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

    0 16
  • #2 23 Sty 2011 15:43
    M. S.
    Poziom 34  

    Code:
    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.

    0
  • #3 23 Sty 2011 19:28
    forttres
    Poziom 14  

    Ok zmieniłem port, ale nie rozumiem tego Juz_tu_bylem


    Code:

     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

    0
  • #4 23 Sty 2011 20:31
    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.

    0
  • #5 23 Sty 2011 20:51
    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ł.

    0
  • #6 23 Sty 2011 21:00
    M. S.
    Poziom 34  

    Code:
    ' 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.

    0
  • #7 23 Sty 2011 21:04
    arktik1
    Poziom 27  

    "nie znam wszystkich podstaw nawet"
    Musisz znać podstawy, inaczej do niczego to nie prowadzi.

    0
  • #8 23 Sty 2011 21:29
    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ść

    0
  • #9 23 Sty 2011 21:37
    M. S.
    Poziom 34  

    Parametry sound wziąłem z helpa, spróbuj może tak:

    Code:
    Sound Portx.y , 240 , 80

    0
  • #10 23 Sty 2011 21:40
    forttres
    Poziom 14  

    zaraz po wgraniu dalej to samo cały czas się drze.

    0
  • #11 23 Sty 2011 21:45
    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.

    0
  • #12 23 Sty 2011 22:53
    arktik1
    Poziom 27  

    Spróbuj tak:

    Code:

    If S = "0" then

    zmień na:
    Code:

    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.

    0
  • #13 24 Sty 2011 09:36
    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.

    0
  • #14 24 Sty 2011 14:28
    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!!!

    0
  • #15 24 Sty 2011 14:30
    arktik1
    Poziom 27  

    Przeczytaj to co napisałem ci wcześniej.

    0
  • Pomocny post
    #16 24 Sty 2011 15:25
    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
    Code:
    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)


    Code:
    ' 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.

    0
  • #17 24 Sty 2011 18:36
    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 !!!

    Code:

    ' 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

    0