Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Kategoria: Kamery IP / Alarmy / Automatyka Bram
Montersi
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Atmega8][Bascom] Termostat

skater156 20 Lut 2010 15:55 4345 14
  • #1 20 Lut 2010 15:55
    skater156
    Poziom 14  

    Witam.Jestem w trakcie robienia wytrawiarki i termostatu do niej.Opieram się na projekcie kolegi Ducha.Zrobił bardzo fajny termostat na diodach led.Jego program trochę przerobiłem na moje potrzeby.Lecz nic nie trwa wiecznie.Na początku szło gładko,ale potem zaczeły sie schody.W założeniu mój program ma działać tak:

    -temperatura wyświetla sie od 35 stopni C do 45 stopni C na led (10)
    -ustawiam temperature microswitch,po włączeniu zasilania klikam raz i zapala sie 1 dioda,drugi raz klikam i następna itd. poczym potwierdzam to przytrzymując microswitch na 5s (wszystkie diody mrygną raz po potwierdzeniu)
    -histereza 2 stopnie C
    -jak grzałka grzeje to pali sie czerwona led a jak nie grzeje to zielona led
    -pompkę załączam 2 microswitch,port sie otwiera lub zamyka a do portu jest podłączony przekaźnik

    Część programu już mam ale dalej nie wiem co zrobić.Bardzo proszę o pomoc.Poniżej kod.

    Code:
    $regfile = "m8def.DAT"                                      'deklaracja procesora, w tym wypadku Atmega8
    
    $crystal = 1000000                                          'deklaracja cześtotlwiości pracy (wew oscylator 1MHz w zupełności wystarcza)



    '*************************************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.6                                      'deklaracja portu na którym będą podpięte DS18b20
    Config Portd.3 = Input                                      'Microswitch 1
    Config Portd.4 = Input                                      'Microswitch 2
    do                                         'pętla nieskończona

       if pinb.0=1 then                         'jeżeli przycisk 1 wciśnięty
       portd.0=1                                'otwiera port
       elseif pinb.1=1 then                     'jeżeli przycisk 2 wciśnięty
       portd.0=0                                'zamyka port
       endif                                    'koniec bloku warunkowego

     loop                                       'koniec pętli


    Config Portd.7 = Output                                     'Przekaźnik 2
    Config Portb.0 = Output                                     'Przekaźnik 1
    Config Portc.5 = Output
    Config Portc.4 = Output
    Config Portc.3 = Output
    Config Portc.2 = Output
    Config Portc.1 = Output
    Config Portc.0 = Output
    Config Portb.5 = Output
    Config Portb.4 = Output
    Config Portb.3 = Output
    Config Portb.2 = Output
    Config Portb.1 = Output

    Config 1wire = Portd.6

    Dim Ilosc_czujnikow As Byte
    Dim Powtorz As Byte
    Dim I1 As Integer , Ss As String * 6
    Dim Temp As Integer
    Dim Dsid1(8) As Byte
    Dim Tempmax As Byte
    Dim Tempmin As Byte
    Dim Status_grzalki As Bit

    Grzanie Alias Portb.0
    Led45 Alias Portc.5
    Led44 Alias Portc.4
    Led43 Alias Portc.3
    Led42 Alias Portc.2
    Led41 Alias Portc.1
    Led40 Alias Portc.0
    Led39 Alias Portb.5
    Led38 Alias Portb.4
    Led37 Alias Portb.3
    Led36 Alias Portb.2
    Led35 Alias Portb.1
    Powerled Alias Portd.2


    Set Led45
    Set Led44
    Set Led43
    Set Led42
    Set Led41
    Set Led40
    Set Led39
    Set Led38
    Set Led37
    Set Led36
    Set Led35
    Reset Grzanie
    Reset Powerled




    '------------------Ustawienia początkowe-----------------
    Tempmax = 35
    Tempmin = 34

    Status_grzalki = 0
    Powtorz = 0
    '----------------------Start programu--------------------



    Waitms 100
    Set Powerled



    Poczatek:
    Do


    Gosub Pomiar_temperatury
    Gosub Wyswietl_temp
    Gosub Termostat

    Loop


    '-------------Obsługa Pomiar temperatury-------------
    Pomiar_temperatury:
    1wreset
       1wwrite &HCC
       1wwrite &H44
    Wait 2

       1wreset
       1wwrite &H55
       1wverify Dsid1(1)                                        'wysyłamy adres pierwszego czujnika
       1wwrite &HBE
       I1 = 1wread(2)
    Wait 1

      I1 = I1 * 10
      I1 = I1 / 16
      Temp = I1 / 10
    Return

    '-------------Obsługa Wyswietlanie temperatury-------------
    Wyswietl_temp:
    If Temp >= 35 Then
    Reset Led35
    Else
    Set Led35
    End If

    If Temp >= 36 Then
    Reset Led36
    Else
    Set Led36
    End If

    If Temp >= 37 Then
    Reset Led37
    Else
    Set Led37
    End If

    If Temp >= 38 Then
    Reset Led38
    Else
    Set Led38
    End If

    If Temp >= 39 Then
    Reset Led39
    Else
    Set Led39
    End If

    If Temp >= 40 Then
    Reset Led40
    Else
    Set Led40
    End If

    If Temp >= 41 Then
    Reset Led41
    Else
    Set Led41
    End If

    If Temp >= 42 Then
    Reset Led42
    Else
    Set Led42
    End If

    If Temp >= 43 Then
    Reset Led43
    Else
    Set Led43
    End If

    If Temp >= 44 Then
    Reset Led44
    Else
    Set Led44

    If Temp >= 45 Then
    Reset Led45
    Else
    Set Led45

    Return

    '-------------Obsługa Termostatu-------------
    Termostat:
    If Temp >= Tempmax And Status_grzalki = 1 Then
    Status_grzalki = 0
    Reset Grzanie
    End If

    If Temp =< Tempmin And Status_grzalki = 0 Then
    Status_grzalki = 1
    Set Grzanie
    End If

    Return


    Pozdro:)

    Dodano po 44 [minuty]:

    inventco.eu -Proszę zapoznać się z regulaminem forum i używać znaczników CODE

  • #2 20 Lut 2010 19:42
    Logan
    Poziom 30  

    Eeee... a jak program wychodzi z tej pętli:

    Code:
    do 'pętla nieskończona
    

    if pinb.0=1 then 'jeżeli przycisk 1 wciśnięty
    portd.0=1 'otwiera port
    elseif pinb.1=1 then 'jeżeli przycisk 2 wciśnięty
    portd.0=0 'zamyka port
    endif 'koniec bloku warunkowego

    loop 'koniec pętli

    :?:

  • #3 20 Lut 2010 20:25
    xury
    Poziom 38  

    Myślę, że w zupełności to nie jest kod kolegi tylko jakiś zlepek kilku kodów.
    Nie mam ochoty nawet tego analizować. Nikt tak nie pisze kodu nawet bardzo początkujący, no chyba, że się coś bezmyślnie kopiuje i wkleja.
    Najpierw trochę deklaracji, potem jakaś pętla, potem kolejne deklaracje zmiennych, potem jakieś ustawienia początkowe i kolejna pętla główna (?)
    Kompletny chaos.

  • #4 21 Lut 2010 10:34
    skater156
    Poziom 14  

    Witam,dzięki za odpowiedź.Zdecydowałem się że temperatura będzie ustawiona w programie na stałe 40 stopni C.Wyświetlanie temperatury będzie na 10 led (od 30 stopni C do 40 stopni C).Histereza 1 stopień C.Dioda czerwona będzie się palić jak grzałka będzie grzać a zielona jak nie grzeje.Tylko z tym przekaźnikiem do pompki jest problem.Ja to sobie wyobrażam tak,do portu Atmegi8 jest podczepiony microswitch i jak go nacisnę to jakieś inny port sie otworzy popłynie napięcie na przekaźnik itd. i tak samo w drugą stronę jak drugi raz nacisnę microswitch to obwód sie przerywa.Poniżej zamieszczam poprawiony kod,bardzo bym prosił o pomoc bo wszystkiego nie udało mi się napisać ponieważ nie wiem jak :)


    Code:



    $regfile = "m8def.DAT"                                      'deklaracja procesora, w tym wypadku Atmega8
    $crystal = 1000000                                          'deklaracja cześtotlwiości pracy (wew oscylator 1MHz w zupełności wystarcza)



    '*************************************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.6                                      'deklaracja portu na którym będą podpięte DS18b20

    Config Portd.3 = Input                                      'Microswitch 1
    Config Portd.7 = Output                                     'Przekaźnik 2 pompka
    Config Portb.0 = Output                                     'Przekaźnik 1 grzałka
    Config Portc.4 = Output
    Config Portc.3 = Output
    Config Portc.2 = Output
    Config Portc.1 = Output
    Config Portc.0 = Output
    Config Portb.5 = Output
    Config Portb.4 = Output
    Config Portb.3 = Output
    Config Portb.2 = Output
    Config Portb.1 = Output

    Config 1wire = Portd.6

    Dim Ilosc_czujnikow As Byte
    Dim Powtorz As Byte
    Dim I1 As Integer , Ss As String * 6
    Dim Temp As Integer
    Dim Dsid1(8) As Byte
    Dim Tempmax As Byte
    Dim Tempmin As Byte
    Dim Status_grzalki As Bit
    Dim Temp_zalaczenie_pompki As Byte


    Grzanie Alias Portb.0
    Led40 Alias Portc.5
    Led39 Alias Portc.4
    Led38 Alias Portc.3
    Led37 Alias Portc.2
    Led36 Alias Portc.1
    Led35 Alias Portc.0
    Led34 Alias Portb.5
    Led33 Alias Portb.4
    Led32 Alias Portb.3
    Led31 Alias Portb.2
    Led30 Alias Portb.1
    Powerled Alias Portd.2


    Set Led40
    Set Led39
    Set Led38
    Set Led37
    Set Led36
    Set Led35
    Set Led34
    Set Led33
    Set Led32
    Set Led31
    Set Led30
    Reset Grzanie

    Reset Powerled


    '------------------Ustawienia początkowe-----------------
    Tempmax = 35
    Tempmin = 34
    Temp_zalaczenie_pompki = 40

    Status_grzalki = 0
    Powtorz = 0
    '----------------------Start programu--------------------



    Waitms 100
    Set Powerled



    Poczatek:
    Do


    Gosub Pomiar_temperatury
    Gosub Wyswietl_temp
    Gosub Termostat

    Loop


    '-------------Obsługa Pomiar temperatury-------------
    Pomiar_temperatury:
    1wreset
       1wwrite &HCC
       1wwrite &H44
    Wait 2

       1wreset
       1wwrite &H55
       1wverify Dsid1(1)                                        'wysyłamy adres pierwszego czujnika
       1wwrite &HBE
       I1 = 1wread(2)
    Wait 1

      I1 = I1 * 10
      I1 = I1 / 16
      Temp = I1 / 10
    Return

    '-------------Obsługa Wyswietlanie temperatury-------------
    Wyswietl_temp:
    If Temp >= 30 Then
    Reset Led30
    Else
    Set Led30
    End If

    If Temp >= 31 Then
    Reset Led31
    Else
    Set Led31
    End If

    If Temp >= 32 Then
    Reset Led32
    Else
    Set Led32
    End If

    If Temp >= 33 Then
    Reset Led33
    Else
    Set Led33
    End If

    If Temp >= 34 Then
    Reset Led34
    Else
    Set Led34
    End If

    If Temp >= 35 Then
    Reset Led35
    Else
    Set Led35
    End If

    If Temp >= 36 Then
    Reset Led36
    Else
    Set Led36
    End If

    If Temp >= 37 Then
    Reset Led37
    Else
    Set Led37
    End If
    If Temp >= 38 Then
    Reset Led38
    Else
    Set Led38
    End If

    If Temp >= 39 Then
    Reset Led39
    Else
    Set Led39
    End If

    If Temp >= 40 Then
    Reset Led40
    Else
    Set Led40
    End If



    '-------------Obsługa Termostatu-------------
    Termostat:
    If Temp >= Tempmax And Status_grzalki = 1 Then
    Status_grzalki = 0
    Reset Grzanie
    End If

    If Temp =< Tempmin And Status_grzalki = 0 Then
    Status_grzalki = 1
    Set Grzanie
    End If

    Return




    Bardzo proszę o pomoc :)

    Ps.te code to gdzie trzeba wstawić ????
    http://www.elektroda.pl/rtvforum/faq.php?mode=bbcode
    I szukamy "Wstawianie kodu lub danych o stałej szerokości"
    [zumek]

  • #5 22 Lut 2010 09:09
    Logan
    Poziom 30  

    Całą procedurę Wyswietl_temp: możesz uprościć wpisując binarnie odpowiednie wartości na porty.

  • #6 08 Sty 2012 20:30
    Klucha93
    Poziom 12  

    A ja mam takie pytanko. Bo sam próbuje zrobić temorstat na ds18b20 i myślałem żeby wynik pomiaru przepisać do zmiennej i zrobić warunek większy bądź równy. Najlepiej przedstawie:
    .....
    I3 = I3 * 10
    I3 = I3 / 16
    Termostat = I3 * 10
    Termostat = I3 / 16
    If I3 > 0 Then 'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
    Ss = Str(i3)
    Ss = Format(ss , " 0.0")
    Locate 3 , 1 'Pozycja wyświetlania nazwy i temperatury ujemnej
    Lcd "Pokoj " ; Ss ; Chr(0) ;
    Else
    Ss = Str(i3)
    Ss = Format(ss , " 0.0")
    Locate 3 , 1 'Pozycja wyświetlania nazwy i temperatury w wierszu 1
    Lcd "Pokoj " ; Ss ; Chr(0) ;
    End If


    If Termostat >= 30 Then
    Portc.0 = 0
    Else
    Portc.0 = 1
    End If

    .....
    oczywiście w pętli i deklaracja zmiennych itp.
    I mam problem, że ten warunek jest właściwy dla temperatury ok. 50 stopni celcjusza, chociaż, że powinien być taki jak na wyświetlaczu. Czy mógłby ktoś poradzić, żeby żeby powyżej 30 stopni na portc.0 było 0?

  • #7 08 Sty 2012 21:42
    arktik1
    Poziom 27  

    Po co ci to:

    Code:

    Termostat = I3 * 10
    Termostat = I3 / 16

    I potem jeszcze to:
    Code:

    If Termostat >= 30 Then

    Zrób:
    Code:

    If I3 >= 300 Then

  • #8 09 Sty 2012 03:36
    emarcus
    Poziom 34  

    skater156 napisał:
    Witam,dzięki za odpowiedź. Zdecydowałem się że temperatura będzie ustawiona w programie na stałe 40 stopni C.Wyświetlanie temperatury będzie na 10 led (od 30 stopni C do 40 stopni C)


    Nie jest przestępstwem , ani nic złego we wzorowaniu sie na dobrych i sprawdzonych przykładach, ale bezmyślne kopiowanie ich bez analizy i zrozumienia własnych potrzeb prowadzi do sytuacji, z których nie wiemy jak wybrnąć. Kolejne poprawki nie niweluja problemu ale często go pogłebiają.
    "Przy kiepskich ściągawkach 'oblewa się' egzaminy".

    Pierwsze co rzuca się w oczy to: jeżeli masz tylko jeden DS w systemie (z opisu wygląda że tak jest) to nie interesuje cię jego ID i nie musisz go wcale addresować aby z nim nawiązać komunikację. (To mniej więcej tak jakby nauczyciel miał tylko jednego ucznia w klasie; - nie potrzebna jest lista obecności, nie potrzeba "wyczytywać po nazwisku" kto ma odpowiadać na pytania, itd..).
    Istnieje commenda "Skip ROM" - &HCC , więc korzystaj z niej.

    Drugi aspekt to: wyświetlenie zadanej, bądź aktualnej temperatury roztworu trawiącego (można to uogólnić do 'temperatury kontrolowanego środowiska').
    Bezspornie, o wiele łatwiej w obsłudze i programowaniu, a być może nie wiele drożej w wykonaniu byłoby zastosować 'Alpha-Numeric Display' czyli zwykły, tani numeryczny wyświetlacz. To tyle od strony technicznej.

    Bez urazy, uważam że ten aktualnie przedstawiony code jest 'zwyczajnie kiepski' - co zrobisz jeżeli zechcesz podnieść regulacje temperatury o 1 stopień?
    Będziesz programował od nowa processor? To już lepiej jest zrobiony tani bimetaliczny termostat w żelazku do prasowania.

    Jak to byłoby w praktyce:
    Górną i dolną granice temperatury zadeklaruj jako zmienne do których porównujesz w, powiedzmy 1 sekundowych odstępach czasu (mierzonego timerem) z aktualna temperaturą czytaną z czujnika DS w tychsamych odstępach czaswych. Eliminujesz w ten sposób potrzebny okres wyczekania na Convertion Temp w DS.
    Jednym lub dwoma przyciskami ustawiasz zadane temperatury pracy. Jeżeli dasz stałą wartość histerezy temperatury to wystarczy tylko jeden przycisk incrementujący (o 1) tylko jedną zmienna w okeślonym zakresie (powiedzmy od 30 do 40 st.).
    Aby nie gubić ustawień na czas wyłączenia zasilania, wystarcza mała subrutyna (w run time !) wpisu do EEPROM, a przy starcie, -odczyt poprzednich ustawień.
    Mega8 ma dostatecznie dużo pamięci i wpisanie jednego czy dwóch bajtów do EEPROM nie ma znaczenia - możesz to robić 100 tys. razy.
    Do takiego projektu z powodzeniem wystarczyłby ATtiny 2313 a bez wyświetlacza w zamian, na kilku diodach 'orientacyjnych' wskazujących poziom ustawionej temperatury wystarczyłby bez wysiłku ATtiny 13. Posiada również pewną (małą, ale wystarczającą wielkość EEprom).
    Tak ja to widzę....

    e marcus

    Moderowany przez Dzimi:

    Dokonałem korekty posty - ten sam post powielony 3 razy.

  • #9 13 Sty 2012 17:42
    Klucha93
    Poziom 12  

    I3 = I3 * 10
    I3 = I3 / 16
    If I3 >= 30 Then
    Portb.0 = 0
    Else
    Portb.0 = 1
    End If
    If I3 > 0 Then
    .....
    Zrobiłem tak i nie działa tak jak ma, czyli powyżej 30 stopni nie ma ZERA na porcie b.0. Czy może trzeba dokonać jakiś operacji matematycznych, żeby otrzymać 30?

  • #10 14 Sty 2012 12:01
    arktik1
    Poziom 27  

    Podałem ci najprostsze rozwiązanie do termostatu, nic dziwnego że nie działa.
    Miałeś napisać:

    Code:

    If I3 >= 300 Then

    300 przedstawia właśnie temperaturę 30,0 stopni, tylko że nie ma przecinka.
    Jeśli chcesz ustawić np 30,5 stopnia to wpisujesz 305.

  • #11 14 Sty 2012 14:45
    Klucha93
    Poziom 12  

    Sorki, zrobiłem w ten sposób:

    I3 = I3 * 10
    I3 = I3 / 16
    If I3 > 0 Then 'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
    Ss = Str(i3)
    Ss = Format(ss , " 0.0")
    Locate 3 , 1 'Pozycja wyświetlania nazwy i temperatury ujemnej
    Lcd "Pokoj " ; Ss ; Chr(0) ;
    Else
    Ss = Str(i3)
    Ss = Format(ss , " 0.0")
    Locate 3 , 1 'Pozycja wyświetlania nazwy i temperatury w wierszu 1
    Lcd "Pokoj " ; Ss ; Chr(0) ;
    If I3 >= 300 Then
    Portb.0 = 0
    Else
    Portb.0 = 1
    End If

    End If

    I nie działa, czyli powyżej, bądź równe 30 stopni dioda się nie pali. (steruje 0)

  • #12 14 Sty 2012 16:20
    arktik1
    Poziom 27  

    Wklej cały program, łącznie z deklaracją zmiennych.
    I używaj CODE do wklejania kodu.

  • #13 14 Sty 2012 16:32
    Klucha93
    Poziom 12  

    [code]

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    $regfile = "m32def.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 Portb.0 = Output




    Config Lcd = 20 * 4 '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.7
    '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 Odczyt(2) As Byte
    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 odczyt u ilośc czujników
    Dim Licz As Byte
    Dim Godz As Byte
    Dim Minu As Byte
    Dim Sek As Byte
    Dim Ss1 As String * 2
    Dim Ss2 As String * 2
    Dim Ss3 As String * 2


    Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32 'znak stopnia Celsjusza
    Deflcdchar 1 , 4 , 2 , 9 , 1 , 1 , 9 , 2 , 4 'buzka
    Deflcdchar 3 , 32 , 32 , 14 , 17 , 15 , 1 , 1 , 14 'g



    Cursor Off 'Wyłącza kursor
    Cls
    Locate 1 , 4 'Funkcja CLS czyści ekran
    Lcd " Termometr" ; Chr(1) 'ekran powitalny
    Locate 2 , 5
    Lcd " by Klucha"
    Locate 3 , 7
    Lcd " 2011"
    Locate 4 , 5
    Lcd "Version 2.0.!"
    Wait 3
    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
    Lcd W
    Wait 1
    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()


    '*******************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
    Waitms 500

    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
    Waitms 500

    If Dsid3(8) = Crc8(dsid3(1) , 7) Then
    Locate 3 , 1
    Lcd "Czujnik 3 OK"
    Wait 1
    Locate 2 , 1
    For B = 1 To 8
    Lcd Hex(dsid2(b))
    Next
    End If
    Waitms 500

    Portc.0 = 1

    Cls

    '*******************koniec odczytu ID czujników temperatury*********************




    Do


    Incr Licz
    If Licz < 60 Then
    Sek = Licz
    Else
    Sek = 0
    Licz = 0
    Incr Minu
    If Minu > 59 Then
    Minu = 0
    Incr Godz
    End If
    End If
    Ss1 = Str(sek)
    Ss1 = Format(ss1 , "00")
    Ss2 = Str(minu)
    Ss2 = Format(ss2 , "00")
    Ss3 = Str(godz)
    Ss3 = Format(ss3 , "00")
    Locate 4 , 1
    Lcd "Workin" ; Chr(3) ; " " ; Ss3 ; ":" ; Ss2 ; ":" ; Ss1

    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 drugiego czujnika
    1wwrite &HBE
    I3 = 1wread(2)

    '---------------------------------

    '--------konwersja temp dla wszystkich dsow
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Waitms 720

    '****Jeśli pracujesz z wyświetlaczem innym niż 4x16 to tutaj trzeba wprowadzić zmiany w LOCATE********

    I1 = I1 * 10
    I1 = I1 / 16
    If I1 > 0 Then '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 ujemnej
    Lcd "Zewnatrz " ; Ss ; Chr(0) ;
    Else
    Ss = Str(i1)
    Ss = Format(ss , " 0.0")
    Locate 1 , 1 'Pozycja wyświetlania nazwy i temperatury w wierszu 1
    Lcd "Zewnatrz " ; Ss ; Chr(0) ;
    End If



    I2 = I2 * 10
    I2 = I2 / 16
    If I2 > 0 Then
    Ss = Str(i2)
    Ss = Format(ss , " 0.0") 'Pozycja wyświetlania nazwy i temperatury ujemnej
    Locate 2 , 1
    Lcd "Grzejnik " ; Ss ; Chr(0) ;
    Else
    Ss = Str(i2)
    Ss = Format(ss , " 0.0")
    Locate 2 , 1 'Pozycja wyświetlania nazwy i temperatury w wierszu 2
    Lcd "Grzejnik " ; Ss ; Chr(0) ;
    End If


    I3 = I3 * 10
    I3 = I3 / 16
    If I3 > 0 Then 'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
    Ss = Str(i3)
    Ss = Format(ss , " 0.0")
    Locate 3 , 1 'Pozycja wyświetlania nazwy i temperatury ujemnej
    Lcd "Pokoj " ; Ss ; Chr(0) ;
    Else
    Ss = Str(i3)
    Ss = Format(ss , " 0.0")
    Locate 3 , 1 'Pozycja wyświetlania nazwy i temperatury w wierszu 1
    Lcd "Pokoj " ; Ss ; Chr(0) ;
    If I3 >= 300 Then ' Zaświeć diode
    Portb.0 = 0
    Else
    Portb.0 = 1 ' Jeśli I3 nie jest >= 30 to stan 1
    End If
    End If




    Loop





    'Koniec programu

    Proszę, cały program. Miejscami trochę się zlało, ale wiadomo o co chodzi. Właśnie wpisałem wartość 300 i powinien po przekroczeniu 30 stopni zaświecić diode, a tak nie jest. Próbowałem także w zmienne podać wartość zadaną i jeśli I3 będzie większe to Portb.0 = 0, ale także to nie działa. Całą procedure z Portb.0 wklejałem także przed If I3 > 0 Then .Nie wiem właśnie, w którym miejscu robię błąd, bo w sumie przepisuje wynik pomiaru do I3 i procedure If, then, else, end if.

  • #14 14 Sty 2012 20:35
    arktik1
    Poziom 27  

    Jeśli jest to cały program, to gdzie są deklaracje portów?
    A w szczególności LCD?

  • #15 14 Sty 2012 20:43
    emarcus
    Poziom 34  

    Klucha93 napisał:

    Code:

    .................


       I3 = I3 * 10
       I3 = I3 / 16
       If I3 > 0 Then                                           'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
       Ss = Str(i3)
       Ss = Format(ss , "  0.0")
       Locate 3 , 1                                             'Pozycja wyświetlania nazwy i temperatury ujemnej
       Lcd "Pokoj         " ; Ss ; Chr(0) ;
       Else
       Ss = Str(i3)
       Ss = Format(ss , " 0.0")
       Locate 3 , 1                                             'Pozycja wyświetlania nazwy i temperatury w wierszu 1
       Lcd "Pokoj         " ; Ss ; Chr(0) ;
       If I3 >= 300 Then                            ' Zaświeć diode             
       Portb.0 = 0
       Else
       Portb.0 = 1                                     ' Jeśli I3 nie jest >= 30 to stan 1
       End If
       End If




    Loop





    Nie wiem właśnie, w którym miejscu robię błąd, bo w sumie przepisuje wynik pomiaru do I3 i procedure If, then, else, end if.


    Dla tej ostatniej części spróbuj takiej alternatywy:

    Code:
    [syntax=basic4gl][/syntax]
    

    I3 = I3 * 10
    I3 = I3 / 16
    If I3 > 0 Then                                              'korekta przesuniecia znaku st C przy przejs'ciu z temp ujemnej na dodatnia;
    Ss = Str(i3)
    Ss = Format(ss , " 0.0")
    Locate 3 , 1                                                'Pozycja wys'wietlania nazwy i temperatury ujemnej
    Lcd "Pokoj " ; Ss ; Chr(0) ;
    Else
    Ss = Str(i3)
    Ss = Format(ss , " 0.0")
    Locate 3 , 1                                                'Pozycja wys'wietlania nazwy i temperatury w wierszu 1
    Lcd "Pokoj " ; Ss ; Chr(0)
    End If

    If I3 >= 300 Then                                           ' Zas'wiec' diode
    Portb.0 = 1
    Else
    Portb.0 = 0                                                 ' Jes'li I3 jest >= 30 to stan 1
    End If



    Chociaż to może pracować, to niemniej jednak nie bardzo podoba mi się ten sposób rachunku temperatury i warunowei zmiany stanu portu (dla powiedzmy alarmu (?)). Operujesz dwoma różnymi kompletami liczb (!).
    W jednym miejscu masz stopnie, w innym operujesz decystopniami...., praktycznie w odniesieniu do tejsamej zmiennej.

    A co przeszkadza liczyć czas jednym z timerów? Masz ich chyba ze trzy.

    e marcus

 
Promocja -20%
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME
tme