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.

Avr/Atmega16/Bascom - Ustawienie temperatury w menu do załączenia urządzenia

kulamario 23 Sty 2014 10:36 1812 14
  • #1 23 Sty 2014 10:36
    kulamario
    Poziom 22  

    Witam
    Mam pewien problem chciałem napisać program do obsługi termometru na DS18B20 ale z możliwością ustawienia temperatury w menu przy której dany pin w atmedze włączy stan wysoki.
    Chodzi mi głównie o to ze by np przy temperaturze 30 stopni włącz wentylator i poniżej 30 stopni wyłącz.
    Ale chodzi o właśnie o te ustawienie tej temperatury w menu
    Program do obsługi DS18B20 mam napisany wiec z tym problemu nie mam
    Nie wiem jak zrobić możliwość ustawienia temperatury

    Code:

    $regfile = "m16def.dat"
    $crystal = 16000000
    $hwstack = 32
    $swstack = 32
    $framesize = 32


    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Rs = Porta.2 , E = Porta.3 , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7

    Config 1wire = Portd.7

    Config Pind.4 = Output
    Fan Alias Portd.4
    Fan = 1

    Dim Odczyt(2) As Byte
    Dim Db(2) As Byte
    Dim T As Integer
    Dim Ulamek As Integer
    Dim A As Byte
    A = 0





    Licznik = T


    Cls

    Do




    1wreset
    1wwrite &HCC
    1wwrite &H44

    Waitms 750

    1wreset
    1wwrite &HCC
    1wwrite &HBE

    Db(1) = 1wread(2)
    T = Makeint(db(1) , Db(2))
    T = T * 10
    T = T / 16
    Ulamek = T Mod 10
    T = T / 10

    Locate 1 , 1
    Lcd "Temperatura " ; T ; "." ; Ulamek


    Loop
    End

    0 14
  • #2 23 Sty 2014 14:31
    Kaz K
    Poziom 20  

    W pętli głównej wpisz obsługę jakiegoś przycisku . Przy wciśnięciu ma nastąpić wyskok do podprogramu a tam np. zdefiniować sposób nastawiania, zapisać ustawioną temp. do epromu. W programie głównym odczytać temperaturę z DS , odczytać temp. z epromu , porównać temp. oraz wykonać odpowiednią procedurę załączenia lub wyłączenia.

    0
  • #3 23 Sty 2014 15:38
    kulamario
    Poziom 22  

    Wszystko niby proste i łatwe ale jak mam porównać temperatury a raczej zmienne bo jak mi się wydaje trzeba zrobić zmienna do nastawiania temperatury może chyba być nawet byte
    do ustawiania góra dól użyje decr i incr czyli mówisz ze muszę zapisywać do epromu zmienna z DS potem ja odczytać i dopiero wtedy porównać z ustawiona temperatura?

    0
  • #4 23 Sty 2014 16:16
    Kaz K
    Poziom 20  

    Do epromu zapisujesz nastawioną temp - jeśli byś zapisywał z DS to szybko załatwisz procesor. Tak musisz utworzyć i porównać zmienne.

    0
  • #5 23 Sty 2014 18:33
    emarcus
    Poziom 35  

    kulamario napisał:
    Witam
    Mam pewien problem chciałem napisać program do obsługi termometru na DS18B20 ale z możliwością ustawienia temperatury w menu przy której dany pin w atmedze włączy stan wysoki.
    Chodzi mi głównie o to ze by np przy temperaturze 30 stopni włącz wentylator i poniżej 30 stopni wyłącz.
    Ale chodzi o właśnie o te ustawienie tej temperatury w menu..............


    Zazwyczaj, ludzie najpierw próbuja cos zrobić we własnym zakresie, gdy to nie daje skutku, szukają coś na ten temat zaleźć gdziekolwiek, a dopiero w trzeciej kolejności zadają pytania(!)
    Ty przeskoczyłeś bepośrednio do ostatniej versji " dajcie mi coś gotowego !!!!"
    Zgodnie z żądaniem...
    Gotowy program masz tu;- kilka tematów wyżej/niżej:
    https://www.elektroda.pl/rtvforum/viewtopic.php?p=13196133#13196133
    Proste..., Nieprawdaż?
    P.s. tamten code możnaby też trochę 'wygładzić'.

    e marcus

    0
  • #6 25 Sty 2014 00:10
    kulamario
    Poziom 22  

    Witam
    Na początek chcę sprostować wypowiedz kolegi emarcus ja nie czekam na gotowca ja jestem początkujący w pisaniu programów.
    W tym linku co podałeś te kody nie są dobre, nie działają poprawnie a wręcz w ogóle
    dzięki za takie gotowce kolego
    Napisałem coś własnego ale jeszcze nie jest to dopracowane,może koledzy zerkną na kod i powiedzą co poprawić to co bym chciał zmienić w kodzie to to gdy wejdzie się do ustawień temperatury ze by ja zmienić to zacznie mrugać wartość temperatury
    zapis do pamięci eprom ma działać tylko po zmianie wartości nastawienia
    temperatury,teraz zapisuje przy każdym wyjściu z ustawień temperatury czyli z pod programu fanex po za tym trzeba dołożyć włączanie wentylatora przy danej temperaturze
    tak jak mowie jeszcze trzeba pomyśleć i posiedzieć nad kodem
    dodaje kod

    Code:
    $regfile = "m16def.dat"
    
    $crystal = 16000000
    $hwstack = 32
    $swstack = 32
    $framesize = 32





    Config Lcd = 20 * 4                                         'Konfigruacja LCD 20x4
    Config Lcdpin = Pin , Rs = Porta.2 , E = Porta.3 , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7


    Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32




    Config Portb.0 = Output                                     'Konfigruacja UP
    Set Portb.0
    Up Alias Pinb.0

    Config Portb.1 = Output                                     'Konfigruacja OK
    Set Portb.1
    Ok Alias Pinb.1



    Config Portb.2 = Output                                     'Konfigruacja DOWN
    Set Portb.2
    Down Alias Pinb.2






    Config 1wire = Portd.7                                      'Konfigruacja DS18B2 1Wire





    Declare Sub Fanex










    Config Pind.4 = Output                                      'Konfigruacja Wentylatora wywiewu cieplego powietrza
    Fan Alias Portd.4
    Fan = 1





    Dim Ustaw_temp1_growbox As Byte






    Ustaw_temp1_growbox = 0












    Dim Odczyt(2) As Byte
    Dim Db(2) As Byte
    Dim T As Integer                                            'zmienne DS18B20




    Dim Ulamek As Integer







    Readeeprom Ustaw_temp1_growbox , 1






    Cursor Off
    Cls




    Do




    If Ok = 0 Then Gosub Fanex




    1wreset
    1wwrite &HCC
    1wwrite &H44

    Waitms 750

    1wreset
    1wwrite &HCC
    1wwrite &HBE

    Db(1) = 1wread(2)
    T = Makeint(db(1) , Db(2))
    T = T * 10
    T = T / 16
    Ulamek = T Mod 10
    T = T / 10

    Locate 1 , 2
    Lcd "Temperatura " ; T ; "." ; Ulamek ; Chr(0) ; "C"





    Loop











    Sub Fanex



         Cls

         Do

         Waitms 50
         Locate 1 , 1
         Lcd "SET TEMP IN GROWBOX"
         Locate 2 , 1
         Lcd "GROWBOX TEMP: " ; Ustaw_temp1_growbox ; Chr(0) ; "C"
         Waitms 50



         If Pinb.0 = 0 Then Incr Ustaw_temp1_growbox            ' dodaj
         Waitms 250
         If Pinb.2 = 0 Then Decr Ustaw_temp1_growbox            ' dodaj
         Waitms 250


         Writeeeprom Ustaw_temp1_growbox , 1


         If Ustaw_temp1_growbox > 50 Then Ustaw_temp1_growbox = 50
         If Ustaw_temp1_growbox < 10 Then Ustaw_temp1_growbox = 10


         If Pinb.1 = 0 Then Exit Do

         Loop
    Cls



    Return

    End Sub Fanex






    0
  • #7 25 Sty 2014 17:37
    emarcus
    Poziom 35  

    kulamario napisał:
    Witam
    Na początek chcę sprostować wypowiedz kolegi emarcus ja nie czekam na gotowca ja jestem początkujący w pisaniu programów.
    W tym linku co podałeś te kody nie są dobre, nie działają poprawnie a wręcz w ogóle
    dzięki za takie gotowce kolego


    Eh, Tak na dobrą sprawę to tamten program nie jest taki zły!!!...
    Jak autor pisze.... testuje go z zadowoleniem przez pół roku...
    Byłoby dobrze gdybyś jednak zapoznał się głębiej z tym programem, - dostatecznie pasje do twoich załóżeń.
    Wymaga jedynie ograniczenia załączania/wyłączania wyjścia do tylko jednego urządzenia, oraz mała poprawka w procedurze zapisu ustawień temperatury do EEPROM. Tak jak pisałem - "wygładzic"
    Przeanalizuj jego budowę i funkcjonalność.
    Moja dygresja na określenie "gotowca" nie była złośliwa, bo "de-facto" to właściwie jest gotowiec...
    Nic więcej tu nie mogę na razie dodać..

    e marcus

    0
  • #8 25 Sty 2014 18:39
    kulamario
    Poziom 22  

    Czy wogole widziales zmieniony kod?
    Mozesz mi powiedziec jak zrobic mruganie wartosci temperatury prz jej zmianie?

    0
  • #9 26 Sty 2014 07:22
    emarcus
    Poziom 35  

    kulamario napisał:

    Mozesz mi powiedziec jak zrobic mruganie wartosci temperatury prz jej zmianie?


    Spróbuj tak
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    W programie nie masz związku załączania i wył. ventylatora względem temperatury; potrzebna instrukcja warunkowa.

    Wprowadź przynajmniej 1 stC różnicy pomiędzy załączaniem i wyłączaniem. Wyeliminujesz tym zbyt częste cykle.

    0
  • #11 27 Sty 2014 16:19
    emarcus
    Poziom 35  

    kulamario napisał:
    Poprawione sa przyciski ale mrugania temperatura nie ma


    Czy w ogóle wchodzisz w subrutynę ustawiania temperatury?
    I drugie , czy twoje aliasy do wejść pokrywają sie z tymi z przykładowego fragmentu, który miał być tyko jako jeden z przykładów, a nie gotowy snippet do wklejenia w resztę twojego programu.

    e marcus

    0
  • #12 27 Sty 2014 18:12
    kulamario
    Poziom 22  

    Nie nawet tego nie dodalem do programu ale widze ze mrugania temperatura nie ma wnioskuje to po braku blink on

    0
  • #13 27 Sty 2014 19:51
    emarcus
    Poziom 35  

    kulamario napisał:
    Nie nawet tego nie dodalem do programu ale widze ze mrugania temperatura nie ma wnioskuje to po braku blink on


    Ja podałem ci procedurę zmiany/ustawienia temperatury zał i wył went. oraz zapisu jej do EEprom (zgodnie z tytułem tematu), tak aby system pamietał jej poprzednie/ostatnie ustawienia na wypadek wyłączenia zasilania.
    To zabawkowe mruganie nie jest osiągane instrukcją "blink ON/ blink OF", którą możesz stosować jedynie w odniesieniu do kursora LCD(!).
    Jeżeli jednak chcesz aby pewna wpisana treść (string lub zmienna) w LCD "mrugała" to potrzebujesz dopisać do tego specjalną/własną rutynę np. dla zmiennej 'A' (dwucyfrowej)_

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    -gdzie wartość A będzie wyświetlona przez 400 ms i wygaszona przez następne 200ms.

    e marcus

    0
  • #14 27 Sty 2014 21:41
    kulamario
    Poziom 22  

    Przetestuje to nigdy jeszcze takiego czegos nie robilem
    Czyli mowisz ze by zrobic zmienna typu string A i dopisac ten kod co podales?

    0
  • #15 27 Sty 2014 23:31
    emarcus
    Poziom 35  

    kulamario napisał:
    Przetestuje to nigdy jeszcze takiego czegos nie robilem
    Czyli mowisz ze by zrobic zmienna typu string A i dopisac ten kod co podales?

    Nie, to jest tylko przykład.
    Zmienna A nie musi być string, choć może być dowolnego typu, cokolwiek masz w tym miejscu do wyświetlenia.
    Istotne jest, że akurat w tym przykładzie, "to coś" zajmuje dwa miejsca wyświetlacza i akurat w tym miejscu na pozycji określonej "Locate...".
    W twoim projekcie musisz policzyć które miejsca na LCD chcesz "mrugać" i je odpowiednio zaadresować w 'Locate...'

    P.s. Jest jeszcze jedna, marginesowa informacja: niezależnie co masz do wyśwetlenia na LCD (zmienna numeryczna lub textowa czyli string), Bascom i tak to zamienia to na string przed wysałniem do LCD choć to nie jest nigdzie widoczne dla programisty.
    Dla LCD wszysto co wyświetla jest zwyczajnie "znak".

    e marcus

    0