Prosty Sterownik C.O.


9
Ocena: None Średnia: 9 (13 głosujących)

Urządzenie to jak sama nazwa wskazuje jest sterownikiem do instalacji centralnego ogrzewania. Układ sprawdza się w bardzo prostych instalacjach posiadających jedną wspólną pompkę do grzejników i do wymiennika C.W.U. W wersji podstawowej nie jest oprogramowany wentylator nadmuchowy, gdyż nie było go w instalacji w której opisywany sterownik miał działać. Dodatkowe wyjście z triakiem pozwoli łatwo zmodyfikować program i dodać obsługę wentylatora. Sterownik posiada dwa tryby pracy, letni w którym głównie nastawia się na grzanie wody i pompa pracuje gdy temperatura na piecu jest większa niż w wymienniku, oraz tryb zimowy gdzie pompa pracuje zawsze gdy temperatura na piecu jest większa od minimalnej. Dodatkową funkcją sterownika jest pomiar temperatury na piecu, w bojlerze, w domu i na zbiorniku wyrównawczym. Konfiguracja w menu pozwala ustawić temperaturę minimalną i alarmową oraz zmieniać tryb pracy.

Działanie:

Schemat ideowy układu znajduje się na rysunku poniżej:

Sercem układu jest mikrokontroler U1 (ATMega8) wraz z rezonatorem kwarcowym X1(16MHz) i kondensatorami C1 (22pF) i C2 (22pF). Kondensatory C3 (220uF) i C4 (100nF) filtrują napięcie zasilania, które powinno zostać podane na złącze Zas (ARK2) z drugiej płytki sterownika. Potencjometr P1 (10k) umożliwia regulację kontrastu wyświetlacza W1 (LCD 2x16). Za pomocą tranzystora T1 (BC556) i rezystora R2 (3,3k) możliwe jest włączenie podświetlania wyświetlacza w sposób programowy. Rezystor R1 (47R) ogranicza prąd struktur LED podświetlających wyświetlacz. Buzzer z generatorem BUZ1 (5V) pełni funkcję sygnalizatora alarmu. Alarm uruchamiany jest za pośrednictwem tranzystora T2 (BC556) oraz rezystorów R3 (3,3k) i R4 (3,3k) gdy temperatura przekroczy ustawiony próg. Złącze 1W_TR (ARK3) służy do podłączenia magistrali 1-Wire z czujnikami DS18B20 (4 sztuki) oraz zapewnia połączenie sterownika z płytka wykonawczą. Układ U2 jest w praktyce podstawką pod czujnik DS18B20, która przydaje się w momencie rejestracji czujników. Zworka 1W_ENA (goldpin) umożliwia odłączenie całej magistrali od płytki na czas rejestracji czujników. Rezystor R8 (4,7k) jest konieczny do poprawnej pracy układów DS18B20. Zworki DSR1...DSR3 (goldpin) poprzez różne kombinacje pozwalają na wybranie który czujnik ma być w danej chwili zarejestrowany. Przyciski S1..S3 (uSwitch) stanowią klawiaturę urządzenia, natomiast diody D1..D3 (LED) wraz z rezystorami ograniczającymi prąd R5...R7 (470R) stanowią kontrolki pracy pompy, wentylatora oraz alarmu. Złącze Prog (goldpin) służy do zaprogramowania procesora, podobnie jak pin Res, który dodatkowo umożliwia reset procesora podczas rejestracji czujników.

Schemat ideowy układu wykonawczego znajduje się na rysunku poniżej:

W skład modułu wykonawczego wchodzi stabilizator napięcia U1 (7805) wraz z kondensatorami C1 (220uF) i C2 (47uF). Do złącza Zas (ARK) należy podłączyc napięcie o wartości w granicach 7-15V, w pierwowzorze miała to być ładowarka od telefonu. Złącze VCC (ARK) umożliwia zasilanie sterownika. W roli elementów wykonawczych pracują triaki TR1 (BT138-600E) oraz TR2 (BT138-600E), rezystory R2 (180R), R3 (180R), R5 (180R) i R6 (180R) ograniczają prąd bramek triaków. W rolli zabezpieczenia przeciwprzepięciowego zastosowano warystory WR1 (JVR-7N431) i WR2 (JVR-7N431), chociaż nie są one wymagane. Przed zwarciem zabezpiecza bezpiecznik F1 (2A). Złącze 230V umożliwia podłączenie zasilania sieciowego do płytki. Wyjściami napięciowymi dla pompy i wentylatora są złącza TRO1 (ARK) i TRO2 (ARK). Oddzielenie wysokonapięciowych obwodów sieciowych od niskonapięciowego sterownika zapewniają optotriaki OPT1 (MOC3041) i OPT2 (MOC3041). Prąd ich struktur LED ograniczają rezystory R1 (330R) i R2 (330R), a szeregowo włączone diody LED sygnalizują stan triaków. Do złącza TRI (ARK) podłączamy wyjścia sterownika.

Budowa:

Układ z powodzeniem można zbudować w oparciu o płytkę drukowaną dostępną tutaj. Rysunek w odbiciu lustrzanym dostępny jest tutaj. Pomocą w konstrukcji może okazać się schemat montażowy dostępny tutaj.

Układ wykonawczy można zbudować w oparciu o płytkę drukowaną dostępną tutaj. Rysunek w odbiciu lustrzanym dostępny jest tutaj
Pomocą w konstrukcji może okazać się schemat montażowy dostępny tutaj.

Wykaz Elementów:

Sterownik:

1x Złącze śrubowe ARK2(podwójne)
1x Złącze śrubowe ARK3(potrójne)
4x Listwa Goldpin 1x2 (1W_ENA)
1x Listwa Goldpin 1x3 (DS18B20)
1x Listwa Goldpin 1x4 (Prog)
3x uSwitch

3x 3,3k
1x 47R
3x 470R
1x 4,7k
1x Potencjometr Montażowy 10k

2x 22pF
1x 100nF
1x 220uF Elektrolit

1x Rezonator Kwarcowy 16MHz
3x Dioda LED
2x BC556
1x Mikrokontroler ATMEGA8 + Podstawka
1x Buzzer z Generatorem 5V
1x 16x2

Układ Wykonawczy:

1x Bezpiecznik 2A
6x Złącze śrubowe ARK2(podwójne)

4x 180R
2x 330R
2x Warystor JVR-7N431

1x 47uF Elektrolit
1x 220uF Elektrolit

2x Dioda LED
1x Stabilizator 7805
2x BT138-600E
2x MOC3041

Programowanie:

Kod Źródłowy do sterownika został napisany w BASCOM AVR firmy MCS Electronics (http://www.mcselec.com/). Program przedstawiony jest poniżej:

'************* Konfiguracja uC *****************
'***********************************************
$regfile = "m8def.dat"
$crystal = 16000000
 
'Config Porta = &B00111111 : Porta = &B11111111
Config Portb = &B11111000 : Portb = &B11111111
Config Portc = &B11111111 : Portc = &B11111111
Config Portd = &B00011111 : Portd = &B11111111
 
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5       'mirley UPT M16
Config Lcd = 16 * 2
Cls
Cursor Off Noblink
 
Config 1wire = Pind.2
 
 
Sw_port Alias Pinb                                          'nazwa portu
Pompa Alias Portd.3
Went Alias Portd.4
Buzz Alias Portd.1
Light Alias Portd.0
 
Ds1r Alias Pind.7
Ds2r Alias Pind.6
Ds3r Alias Pind.5
 
Led_a Alias Portb.5
Led_p Alias Portb.3
Led_w Alias Portb.4
 
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
 
 
Enable Interrupts
'********** Konfiguracja uC Koniec  ************
 
'******************  Zmienne *******************
'***********************************************
Dim Stan_sw As Byte , Sw As Byte , Licznik_sw As Byte       'sw
Dim Wyswietlanie As Byte , Poz_wysw As Byte , Wyswietlono As Bit       'Lcd
Dim Mig As Bit , Poz_ust As Byte
Dim Autosave As Byte , Autopowrot As Byte , Autolight As Byte
 
 
Dim Ds1(8) As Byte , Ds2(8) As Byte , Ds3(8) As Byte , Ds4(8) As Byte , Ds(8) As Byte , Ds_adr As Byte , Ds_ok As Bit       'DS18B20
Dim Ktory_ds As Byte , Lsb As Byte , Msb As Byte , Minusy As Byte
Dim T(4) As Word
 
Dim T_min As Word , T_alarm As Word
 
Dim Dzielnik(2) As Byte                                     'dzielniki timera
Dim Flaga_4ms As Bit , Flaga_500ms As Bit , Flaga_1s As Bit 'flagi przerwa?
Dim Hbyte(2) As Byte , Hword(3) As Word , N As Byte , Hbit As Bit , M As Byte
 
Dim Buzz_en As Bit
Dim Tryb_letni As Bit                                       '0- tryb zimowy, 1- tryb letni
 
'*************  Zmienne Koniec  ****************
 
'************ Warunki Poczatkowe ***************
'***********************************************
Light = 0
 
Lcd " Sterownik  C.O."
Lowerline
Lcd "  Wersja 0.96"
 
Wait 1
 
If Ds1r = 1 And Ds2r = 0 And Ds3r = 0 Then
  Ds_adr = 30
  Gosub Ds_reg
  Cls
  Lcd "Ds Piec"
End If
If Ds1r = 0 And Ds2r = 1 And Ds3r = 0 Then
  Ds_adr = 40
  Gosub Ds_reg
  Cls
  Lcd "Ds Bojler"
End If
If Ds1r = 1 And Ds2r = 1 And Ds3r = 0 Then
  Ds_adr = 50
  Gosub Ds_reg
  Cls
  Lcd "Ds Zbiornik"
End If
If Ds1r = 0 And Ds2r = 0 And Ds3r = 1 Then
  Ds_adr = 60
  Gosub Ds_reg
  Cls
  Lcd "Ds Kuchnia"
End If
 
 
For N = 1 To 8
  Hbyte(1) = 30 + N
  Readeeprom Ds1(n) , Hbyte(1)
  Hbyte(1) = 40 + N
  Readeeprom Ds2(n) , Hbyte(1)
  Hbyte(1) = 50 + N
  Readeeprom Ds3(n) , Hbyte(1)
  Hbyte(1) = 60 + N
  Readeeprom Ds4(n) , Hbyte(1)
Next N
 
Readeeprom T_min , 2
Readeeprom T_alarm , 4
Readeeprom Hbyte(1) , 6
 
Tryb_letni = Hbyte(1).0
If T_min < 100 Or T_min > 950 Then T_min = 400
If T_alarm < 100 Or T_alarm > 950 Then T_alarm = 850
 
 
Wait 1
Wyswietlono = 1
Wyswietlanie = 1
Autosave = 5
Autolight = 0
 
'*******  Warunki Poczatkowe Koniec  ***********
 
'**************  Petla glowna ******************
'***********************************************
Do
  '***********************************************   co 4ms
  If Flaga_4ms = 1 Then
    Flaga_4ms = 0
 
    Gosub Przyciski
    If Wyswietlono = 1 Then Gosub Wysw_lcd
 
  End If
  '***********************************************
 
  '***********************************************   co 500ms
  If Flaga_500ms = 1 Then
    Flaga_500ms = 0
 
    Mig = Not Mig
 
    'Portd.6 = Buzz_en
 
    If Pompa = 0 Then Led_p = Mig Else Led_p = 1
    If Went = 0 Then Led_w = Mig Else Led_w = 1
    Led_a = Buzz
 
    Wyswietlanie = Poz_wysw
 
  End If
  '***********************************************
 
  '***********************************************   co 1s
  If Flaga_1s = 1 Then
    Flaga_1s = 0
 
    If Light = 0 Then
      Incr Autolight
      If Autolight >= 20 Then Light = 1
    Else
      Autolight = 0
    End If
 
    If Poz_wysw <> 1 Then
      Incr Autopowrot
      If Autopowrot = 6 Then
        'Poz_wysw = 1
        Wyswietlanie = 1
        Poz_ust = 0
      End If
    Else
      Autopowrot = 0
    End If
 
 
    If Autosave < 5 Then
      Incr Autosave
      If Autosave = 5 Then
        'tu zapis do eeprom
        Writeeeprom T_min , 2
        Writeeeprom T_alarm , 4
        Hbyte(1) = 0
        Hbyte(1).0 = Tryb_letni
        Writeeeprom Hbyte(1) , 6
        Poz_ust = 0
      End If
    End If
 
    Gosub Temperatura
    Gosub Sterowanie
 
  End If
  '***********************************************
 
Loop
End
'************ Petla glowna Koniec **************
 
'************ Przerwanie timer 0 ***************
'***********************************************
Prztimer0:
  Timer0 = 5
  Set Flaga_4ms
  Incr Dzielnik(1)
  If Dzielnik(1) = 125 Then
    Dzielnik(1) = 0
    Set Flaga_500ms
    Incr Dzielnik(2)
    If Dzielnik(2) = 2 Then
      Dzielnik(2) = 0
      Set Flaga_1s
    End If
  End If
Return
'******** Przerwanie timer 0 Koniec ************
 
'***********************************************
'*****************  Przyciski     **************
Przyciski:
Sw = Sw_port And &B00000111                                 'maska na piny nieu?ywane jako sw
If Sw <> &B00000111 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 68 Then
      Licznik_sw = 0
      Select Case Stan_sw
        Case &B00000011:                                    'incr
        '***********************************************************
          Select Case Poz_wysw
            Case 3:
              Select Case Poz_ust
                Case 0:
                   Poz_ust = 1
                Case 1:
                   If T_min < 950 Then T_min = T_min + 10
                Case 2:
                   If T_alarm < 950 Then T_alarm = T_alarm + 10
              End Select
              Autosave = 0
            Case 4:
              If Poz_ust = 0 Then Poz_ust = 1 Else Tryb_letni = Not Tryb_letni
              Autosave = 0
            'Case 5:
 
          End Select
          If Buzz = 0 Then Buzz_en = 0
          Autopowrot = 0
          Light = 0
          Autolight = 0
 
        Case &B00000101:                                    'ustaw next
        '***********************************************************
          If Poz_ust = 0 Then
            Wyswietlanie = Poz_wysw + 1
            If Wyswietlanie = 5 Then Wyswietlanie = 1
          Else
            Select Case Poz_wysw
              Case 3:
                Incr Poz_ust
                If Poz_ust = 3 Then Poz_ust = 0
              Case 4:
                Incr Poz_ust
                If Poz_ust = 2 Then Poz_ust = 0
 
            End Select
          End If
          If Buzz = 0 Then Buzz_en = 0
          Autopowrot = 0
          Light = 0
          Autolight = 0
 
        Case &B00000110:                                    'decr
        '***********************************************************
          Select Case Poz_wysw
            Case 3:
              Select Case Poz_ust
                Case 0:
                  Poz_ust = 1
                Case 1:
                  If T_min > 100 Then T_min = T_min - 10
                Case 2:
                  If T_alarm > 100 Then T_alarm = T_alarm - 10
              End Select
              Autosave = 0
            Case 4:
              If Poz_ust = 0 Then Poz_ust = 1 Else Tryb_letni = Not Tryb_letni
               Autosave = 0
 
            'Case 5:
 
          End Select
          If Buzz = 0 Then Buzz_en = 0
          Autopowrot = 0
          Light = 0
          Autolight = 0
 
      End Select
    End If
  Else
    Stan_sw = Sw
    Licznik_sw = 60
  End If
 
Return
'***********************************************
 
'***********************************************
'**************    LCD     ***********
Wysw_lcd:
 If Wyswietlanie <> 0 Then
   Wyswietlono = 0
   Select Case Wyswietlanie
     Case 1:                                                'temp piec bojler
     '**************************************************************
       If Poz_wysw <> 1 Then
         Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32  'stopien
         'Deflcdchar 1 , 4 , 32 , 14 , 17 , 17 , 17 , 14 , 32       ' o kreskowane
 
         Cls
         Lcd "Piec:"
         Lowerline
         Lcd "Bojler:"
       End If
 
       For N = 1 To 2
         Hword(1) = T(n) / 10
         Hword(2) = 12
         If Hword(1) >= 10 Then Decr Hword(2)
         If Hword(1) >= 100 Then Decr Hword(2)
         If Minusy.n = 1 Then Decr Hword(2)
         Locate N , Hword(2)
         Hword(2) = T(n) Mod 10
         If Minusy.n = 1 Then Lcd "-"
         Lcd Hword(1) ; "." ; Hword(2) ; Chr(0) ; "C"
       Next N
 
     Case 2:                                                'temb banka,dom
     '**************************************************************
        If Poz_wysw <> 2 Then
         Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32  'stopien
 
         Cls
         Lcd "Zbiornik:"
         Lowerline
         Lcd "Kuchnia:"
       End If
 
       For N = 3 To 4
         Hword(1) = T(n) / 10
         Hword(2) = 12
         If Hword(1) >= 10 Then Decr Hword(2)
         If Hword(1) >= 100 Then Decr Hword(2)
         If Minusy.n = 1 Then Decr Hword(2)
         M = N - 2
         Locate M , Hword(2)
         Hword(2) = T(n) Mod 10
         If Minusy.n = 1 Then Lcd "-"
         Lcd Hword(1) ; "." ; Hword(2) ; Chr(0) ; "C"
       Next N
 
     Case 3:
     '**************************************************************
       If Poz_wysw <> 3 Then
         Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32  'stopien
         'Deflcdchar 1 , 4 , 32 , 14 , 17 , 17 , 17 , 14 , 32       ' o kreskowane
 
         Cls
         Lcd "T.Min:"
         Lowerline
         Lcd "T.Alarm"
       End If
 
       If Poz_ust = 1 And Mig = 1 Then
          Locate 1 , 10
          Lcd "       "
       Else
       't minimalna
         Hword(1) = T_min / 10
         Hword(2) = 12
         If Hword(1) >= 10 Then Decr Hword(2)
         If Hword(1) >= 100 Then Decr Hword(2)
         Locate 1 , Hword(2)
         Hword(2) = T_min Mod 10
         Lcd Hword(1) ; "." ; Hword(2) ; Chr(0) ; "C "
       End If
 
       If Poz_ust = 2 And Mig = 1 Then
          Locate 2 , 10
          Lcd "       "
       Else
       't alarmowa
         Hword(1) = T_alarm / 10
         Hword(2) = 12
         If Hword(1) >= 10 Then Decr Hword(2)
         If Hword(1) >= 100 Then Decr Hword(2)
         Locate 2 , Hword(2)
         Hword(2) = T_alarm Mod 10
         Lcd Hword(1) ; "." ; Hword(2) ; Chr(0) ; "C"
       End If
 
 
      Case 4:
     '**************************************************************
        If Poz_wysw <> 4 Then
         Cls
         Lcd "Tryb: "
       End If
 
       Locate 1 , 7
       If Poz_ust = 1 And Mig = 1 Then
          Lcd "       "
       Else
         If Tryb_letni = 1 Then Lcd "Letni" Else Lcd "Zimowy"
       End If
 
 
     Case 5:
     '**************************************************************
        If Poz_wysw <> 5 Then
         Cls
         Lcd "Przedmuch:"
         Lowerline
         Lcd "Przerwa:"
       End If
 
 
   End Select
   Poz_wysw = Wyswietlanie
   Wyswietlanie = 0
   Wyswietlono = 1
 End If
Return
'************** LCD Koniec ***********
 
'**********  rejestracja DS *********
Ds_reg:
  Disable Interrupts
  1wreset
  1wwrite &H33
  Ds(1) = 1wread(8):
  Enable Interrupts
  If Ds(1) <> 255 Or Ds(2) <> 255 Or Ds(3) <> 255 Or Ds(4) <> 255 Or Ds(5) <> 255 Or Ds(6) <> 255 Or Ds(7) <> 255 Or Ds(8) <> 255 Then
    Ds_ok = 1
    For N = 1 To 8
      Hbyte(1) = Ds_adr + N
      Writeeeprom Ds(n) , Hbyte(1)
    Next N
  Else
    Ds_ok = 0
  End If
Return
'******  rejestracja DS Koniec ******
 
'*************  Temperatura   ***********
Temperatura:
  Disable Interrupts
  1wreset
  Select Case Ktory_ds
    Case 0:
      1wwrite &HCC
      1wwrite &H44
    Case 1:
      1wwrite &H55
      1wwrite Ds1(1) , 8
      1wwrite &HBE
      Lsb = 1wread():
      Msb = 1wread():
    Case 2:
      1wwrite &H55
      1wwrite Ds2(1) , 8
      1wwrite &HBE
      Lsb = 1wread():
      Msb = 1wread():
    Case 3:
      1wwrite &H55
      1wwrite Ds3(1) , 8
      1wwrite &HBE
      Lsb = 1wread():
      Msb = 1wread():
    Case 4:
      1wwrite &H55
      1wwrite Ds4(1) , 8
      1wwrite &HBE
      Lsb = 1wread():
      Msb = 1wread():
  End Select
 
  Enable Interrupts
 
  If Ktory_ds > 0 Then
    T(ktory_ds) = Msb * 256
    T(ktory_ds) = T(ktory_ds) + Lsb
    Minusy.ktory_ds = Msb.7
 
    If Minusy.ktory_ds = 1 Then
      T(ktory_ds) = Not T(ktory_ds)
      T(ktory_ds) = T(ktory_ds) + 1
    End If
 
    T(ktory_ds) = T(ktory_ds) * 10
    T(ktory_ds) = T(ktory_ds) / 16
   Else
    If Poz_wysw = 1 And Wyswietlono = 1 Then Wyswietlanie = 1
  End If
 
  Incr Ktory_ds
  If Ktory_ds = 5 Then Ktory_ds = 0
 
Return
'**********  Temperatura  Koniec *********
 
 
'************   Sterowanie       ***************
'***********************************************
Sterowanie:
 
 
  If Tryb_letni = 1 Then
    If T(1) >= T_min Then
      Hword(1) = T(2) + 70
      Hword(2) = T(2) + 30
      If T(1) >= Hword(1) Then Pompa = 0
      If T(1) <= Hword(2) Then Pompa = 1
    Else
      Pompa = 1
    End If
  Else
    If T(1) >= T_min Then
     Pompa = 0
    Else
      Pompa = 1
    End If
  End If
 
 
  If T(1) >= T_alarm Or T(2) >= T_alarm Then
    If Buzz_en = 1 Then Buzz = Not Buzz Else Buzz = 1
  Else
    Buzz = 1
    Hword(1) = T_alarm - 50
    If T(1) <= Hword(1) And T(2) <= Hword(1) Then Buzz_en = 1
  End If
  'tutaj sterowanie wentylatorem
 
Return
'********    Sterowanie      Koniec ************

Ustawienia fusebitów dla mikrokontrolera ATMEGA8 przedstawione są poniżej:

Obsługa:

Wstępne uruchomienie sterownika sprowadza się do zaprogramowania czujników z którymi będzie współpracował. Przy wyłączonym zasilaniu rozwieramy zworkę 1W_ENA wkładamy pierwszy czujnik (od pieca) do złącza na płytce (układ U2), rozwieramy zworkę DSR1 i zwieramy DSR2 i DSR3. Włączamy zasilanie a na wyświetlaczu pojawia się napis "Ds Piec" co świadczy o poprawnym odczycie czujnika. W tej chwili temperatura powinna być już odczytywana. Wyłączamy ponownie zasilanie i kontynuujemy rejestrację pozostałych czujników w taki sam sposób, z tym że ustawienia zworek DSR1...DSR3 są inne. Podczas rejestracji do układu może być jednorazowo podłączony tylko jeden czujnik.

Ustawienia zworek:
Piec: DSR1 = 1, DSR2 = 0, DSR3 = 0
Bojler: DSR1 = 0, DSR2 = 1, DSR3 = 0
Zbiornik wyrównawczy: DSR1 = 1, DSR2 = 1, DSR3 = 0
Dom: DSR1 = 0, DSR2 = 0, DSR3 = 1
*"0" oznacza zworkę zwartą, a "1" rozwartą

Po zakończeniu procedury rejestracyjnej czujników podłączamy je wszystkie naraz do układu i umieszczamy w przeznaczonych miejscach. W przypadku zmiany jednego z czujników trzeba go zarejestrować w taki sam sposób pamiętając że wszystkie pozostałe muszą być odłączone (Zworka 1W_ENA).

Zdjęcia Projektu:

ZałącznikWielkość
Sterownik Schemat58.95 KB
Sterownik Płytka16.38 KB
Sterownik Płytka (odbicie lustrzane)16.51 KB
Sterownik Płytka (4 na stronie)57.41 KB
Sterownik Montowanie22.69 KB
Układ wykonawczy Schemat8.64 KB
Układ wykonawczy Płytka8.14 KB
Układ wykonawczy Płytka (odbicie lustrzane)8.2 KB
Układ wykonawczy Płytka (6 na stronie)36.54 KB
Układ wykonawczy Montowanie12.05 KB
Sterownik + Układ Wykonawczy Płytka47.56 KB
Kod Źródłowy13.82 KB
Panel przedni (SVG)9.6 KB
Panel przedni (SVG) (4 na stronie)30.71 KB
Panel przedni (PDF) (4 na stronie)158.99 KB
Kod Źródłowy (wersja z wentylatorem 2009.11.20) (nie testowana w praktyce)17.49 KB
Program po kompilacji (BIN)7.52 KB
Program po kompilacji (HEX)21.15 KB
Kod Źródłowy (wersja z wentylatorem 2016.01.30) (poprawione temperatury <10)17.57 KB
Program po kompilacji (BIN)7.55 KB
Program po kompilacji (HEX)21.25 KB



Portret użytkownika mirley

Re: Klawiatura

Jeśli chodzi o zmianę pinów pod AVT1665 to musisz napisać na jakich portach chcesz żeby było co podłączone to zobaczymy.

----------------

Klawiatura to po prostu wystający uSwitch na równo z obudową i naklejka

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika kylo

avt1665

jak to bedzie podlaczone to generalnie jest obojetne, bo kazdy port i pin wyprowadzony jest na listwie...obostrzeniami objety jest tylko wyswietlacz, ledy i switche...ogarnac wyswietlacz to nie problem...natomiast maskowanie portu ze switchami to jest dla mnie czarna magia i najgorsze ze nie sa one na jednym porcie tylko na 2 zalozmy ze + jako PD2, down PD3 i ok jako PB2...1 wire rozwiazalem przelaczalne na PB3 PB4 i PB5(3 czujniki)...znika problem z detekcja czujnikow i ten fragment kodu z detekcja do wyciecia

Portret użytkownika luki

Połączenie

Czytałem juz kilka razy i nie bardzo rozumiem, "Do złącza TRI (ARK) podłączamy wyjścia sterownika.". Ale jakie to są wyjścia. Bo o ile dobrze sie orientuję to na płytce sterownika jest wejście "ZAS"(ARK2) gdzie podłączamy zasilanie z płytki wykonawczej z wyjścia VCC oraz "1W_TR" (ARK3), gdzie podłączamy DS-y. To które to są te wyjścia? Drugie moje pytanie to takie czy te wszystkie 4 DS-y podłączam do tego samego wejścia "1W_TR"? Z góry dziękuję za odpowiedź. Pozdrawiam

Portret użytkownika gino

podłączenie

luki, złącze 1w_tr sterownika to wyjścia sygnałowe t1 i t2 do sterowania układem wykonawczym (triakami) podłącza się je do złącza tri układu wykonawczego, oraz wyjście w1 magistrali 1_wire, do niej podłącza się wszystkie czujniki temperatury (po uprzednim zarejestrowaniu w podstawce u2 aby było prościej). Podstawka u2 jest "podpięta" pod zasilanie, masę i wyjście w1.
Ds-y to ciekawe czujniki pracujące na tej właśnie magistrali.
Bardzo ogólnie mają w sobie unikatowy 64-bitowy klucz i wedle niego po magistrali 1-wire rejestruje się każdy z czujników. Po podłączeniu wszystkich razem sterownik (master) przepytuje magistralę w poszukiwaniu urządzeń (slave) pracujących po tej magistrali (w tym przypadku są to ds-y) i poprzez odpowiedni algorytm odczytuje ich stany temperatury. To tak bardzo ogólnie bo tego Mirley nie napisał a ciekawa rzecz.

Portret użytkownika luki

Dzięki za wyjaśnienie

Dzięki za wyjaśnienie sprawy.;) A i jeszcze jedno pytanko, tą 3 nóżkę DS-a gdzie powinno być podłączone napięcie +5V powinienem zewrzeć do masy czy podprowadzić 3 kabelek z zasilaniem?

Portret użytkownika gino

Re: Ds

Jedną z cech układu DS18B20 jest możliwość jego pracy bez zewnętrznego źródła zasilania, na tzw. zasilaniu pasożytniczym. Czyli może być zasilany napięciem 3-5V albo napięciem z linii danych. Tak ogólnie to DS zawiera w sobie kondensator, który ładuje się napięciem z linii danych i jego energia zgromadzona może zasilić układ. Ja mam podłączone zasilanie, ale mogę spróbować bez to odpowiem czy faktycznie w tym układzie będzie pracował, ale dopiero późnym popołudniem. Chyba, że wcześniej Mirley się wypowie :-)

edit: jednak zrobiłem to jeszcze teraz będzie pracował, nóżki masy i zasilania do masy.

Portret użytkownika Zenek5011

Błąd wyświetlania temperatury.

Sterownik działa bardzo dobrze, włącza pompę C.O. kiedy trzeba, działa alarm po przekroczeniu temp. Jest jednak jeden mankament, po włączeniu sterownika wyświetla np. Piec 25 st. po jakimś czasie (różnym) wyświetla np. -325 lub 625 (też różnie) ale zawsze dwie ostatnie są poprawną temperaturą. Gdy przełączę menu i gdy wróci do pierwszego ekranu przez jakiś czas jest poprawnie a potem znów źle wyświetla. Czujniki DS18B20, kable do czujników to skrętka.

Portret użytkownika mirley

Re: Wyświetlacz

W programie raczej nie powinien znaleźć się wynik 625 a tym bardziej -325, w pierwszym wypadku włączył by się alarm napewno, gdyby taki był wnik pomiaru. Zatem DS jest ok i jego kable też. Myślę że to sprawa wyświetlania... Dorzuc do programu linijki:

 Locate N , 8
 Lcd "      "

tutaj:

...
         Hword(1) = T(n) / 10
         Hword(2) = 12
         If Hword(1) >= 10 Then Decr Hword(2)
         If Hword(1) >= 100 Then Decr Hword(2)
         If Minusy.n = 1 Then Decr Hword(2)
 
         'tu wstaw kod wyżej
 
         Locate N , Hword(2)
         Hword(2) = T(n) Mod 10
         If Minusy.n = 1 Then Lcd "-"
...

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Zenek5011

Dzięki. Dorzucę ten kod i dam

Dzięki. Dorzucę ten kod i dam znać czy jest ok.

Portret użytkownika Pier

Mała sugestia

Witam.
Mam mała podpowiedz do Twojego programu Mirku.
W procedurze rejestracji ds-a kiedy sprawdzasz poprawność adresu a co za tym idzie czy jest czujnik na magistrali zamiast Twojego sposobu można dać po prostu 1wcount.
Jeśli funkcja zwróci 1 to wiemy że na pewno czujnik jest na magistrali.

Portret użytkownika Marcin_130189

Witam, Czy układ się

Witam,

Czy układ się sprawdzi do sterowania tylko i wyłącznie pompą? Mam dosyć stary piec, nie mam wentylatora itp. Nie wiem jak ma wyglądać kalibracja czujników, gdy mam do dyspozycji tylko pompę... Ogólnie założenie jest proste: 40-50 stopni, pompa się włącza, poniżej wyłącza. Sprawdzi się to w praktyce? i jak w ogóle mam ją podłączyć? bezpośrednio pod układ wykonawczy A gdzie mam podłączyć czujnik temperatury (przykleić do rury)?

Portret użytkownika IMEX2

Marcin_13018

imex2@op.pl - napisz to podam ci do tego gotowca

-

Grzesiek - miasto Ostróda

GG 12372371 dom
tel 502812675 SMS

Portret użytkownika mirley

Re: Sterownik

U mnie się sprawdza sterowanie samą pompą.... czujnik przyklejony jest taśmą klejącą do rury tuz nad wylotem z pieca.

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika dawid

Praca/STOP

Witam na początku odrazu mówie ze z AVR i Bascomem dopiero zaczynam "zabawe"
więc jestem jeszcze cimny z tego.
Zrobiłem taki sterownik dla mojej babci chciałbym jednak żeby na dolnym ekranu tam gdzie pisze temperatura bojlera pisało czy sterownik jest w trybie "pracy" czyli może spodziewać się, że dmuchawa się uruchomi czy też np. "stop" czyli wtedy bezpiecznie można przyłożyć do pieca.
sterownik steruje dmuchawą i pompą

Portret użytkownika mirley

Re: CO

Najprościej dodać diodę, która świeci jak piec nie jest w trybie wygaszenia.... Trzeba by tutaj użyc diody alarmowej. Zamiast led_a=BUzz trzeba by dać led_a= not Wygaszenie i powinno zadziałać

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika pawel1968

Sterownik CO

Wita. Czy mógłbyś dokładnie wyjaśnić o co chodzi w tym fragmencie kodu?
Sterowanie:


If Tryb_letni = 1 Then
If T(1) >= T_min Then
Hword(1) = T(2) + 70
Hword(2) = T(2) + 30
If T(1) >= Hword(1) Then Pompa = 0
If T(1) <= Hword(2) Then Pompa = 1

Pozdrawiam

Portret użytkownika mirley

Re: Sterownik

Sterowanie jest bardzo proste. W trybie letnim grzejniki sa zakręcone a pompka pracuje tylko wtedy gdy temp> temp minimalnej i gdy na piecu jest przynajmniej 7 stopni więcej niż w bojlerze.

W trybie zimowym pompka chodzi zawsze gdy piec ma temperaturę poniżej minimalnej....

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika dziura

ds

Witam Panie Mirku
Mam problem z instalowaniem czujników ds18b20. Mianowicie ustawiam zworki programowania na wyświetlaczu wyskakuje stosowna informacja ja czujnik nic nie pokazuje. W czym może być problem? Proszę o odpowiedź. Pozdrawiam

Portret użytkownika EDC

Przerobiłem! :D

Witam. Bardzo fajny projekt. Trochę mi zeszło zanim zrozumiałem działanie menu i ustawień w programie bo ostatni raz programowałem jeszcze 89C2051 :D
Jako że piec który mam nie posiada wentylatora, opalany tylko weglem albo drzewem (w górach), to zrezygnowałem w programie z jego obsługi. Z temperatur zostawiłem sobie tylko piec i bojler, wywaliłem też alarm, ALE DOŁOŻYŁEM CIEKAWĄ funkcjonalność.
Mój sterownik w menu ma dołożoną "Histerezę" i pilnuje czy w piecu nie trzeba dołożyć opału.
Jeśli temperatura zacznie opadać to włącza się sygnał, takie trzy piknięcia po 0,5s co 5 min.
Z bezwładności mojego pieca wyszło że jak temp opadnie o 4 stopnie to są już tylko czerwone węgle.

Alarm:
 
If T(1) > T_old Then
T_old = T(1)
Reset Flaga_5min
Reset L
T_obl = T_old - Hist
End If
If T(1) <= T_obl Or T(1) < T_min Then
 If Flaga_5min = 1 And Alarms = 1 Then Gosub Sygnal 'alarms to globalne wyłaczenie alarmów gdy L=3
End If
Return
'---------------------------------
 
Sygnal:
Incr L  'ilosc alarmów
Set Mig_en   ' miga podswietlanie
Reset Flaga_5min
Reset Buzz
Waitms 100
Set Buzz
Waitms 100
Reset Buzz
Waitms 100
Set Buzz
Waitms 100
Reset Buzz
Wait 1
Set Buzz
If L = 3 Then
L = 0
Reset Mig_en
Reset Alarms
End If
Return

Po trzech alarmach przestaje pikać i migać wyswietlaczem (zgasło i nikogo to nie obchodzi bo śpię)

Jak widać temperatura obliczona podwyższana jest przy rozpalaniu i rośnie do temp jaką napalimy. W kodzie dalej jest jeszcze ze naciśniecie klawisza NEXT powoduje przyjecie temperatury obecnej minus histereza jako obliczoną (obniża podbitą wczesniej by dać po podłożeniu do pieca 4 stopnie na reakcję )

W programie sygnał zastosowałem Wait idac na łatwiznę, ale nie przeszkadza mi że na czas piszczenia program tam utknie.
W podświetlaniu równolegle z tranzystorem dałem rezystor 4,7k co na stałe lekko podswietla niebieski wyświetlacz dając możliwość obserwacji temperatur a przy alarmie i manipulacjach świeci pełnym błękitem :D

Zapomniałbym.. Dodałem też strzałki "góra" "dół" przy temperaturach zmieniające się jednak tylko co minutę by pokazywały "tendencję" ..czy wzrastajaca czy opadajaca temperatura.

-

BARTek
Moja strona

Portret użytkownika dziura

wsad

Witam
Program po kompilacji hex jest już z wentylatorem do pieca???
pozdrawiam

Portret użytkownika mirley

Re: Kod sterownik CO

Trzeba skompilować sobie bascomem kod źródłowy z wentylatorem

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika EDC

Mini Sterownik CO

Witam. Chciałem pokazać co zrobiłem na bazie tego sterownika. Jak widać nie musi być duży i może też ładnie wyglądać. W obudowie KM-39 zostało jeszcze duzo miejsca. Zrezygnowałem z pokazywania temperatur ujemnych i zostało miejsca na "strzałki" pokazujące na pierwszy rzut oka czy temperatura spada czy się podnosi. Temperatury porównuje co 5 min. Z procedury obsługi "wygaszania" zaimplementowałem sobie tez sygnał dzwiękowy który trzykrotnie jest uruchamiany jeśli temperatura spada. Miga wyświetlaczem jak w przypadku alarmu gdybyśmy przegapili sygnał. Wszystko się uspakaja jeśli wygaszanie = 1. Steruje zaworem bojlera. Nastaw dokonuje się pokrętłem MultiJog :D (impulsatorem za 2,5zł + gałka za 1zł) Czytając że babcia Mirleja zmienia mu nastawy chcąc sprawdzić inne temperatury lub włączyć światło zmieniłem sposób wejścia do menu. Trzeba dłużej nacisnąć by tam wejść. Krótkie naciśnięcie włącza tylko podświetlanie i kasuje alarmy i zmienne. Dodałem też czujnik światła - fotorezystor międy bramkę tranzystora a mase. Sterownik mam naprzeciwko okna. Im jaśniej świeci słońce tym jaśniej wyświetlacz. W nocy jest przyciemniony ale nie wyłaczony. Ciągle można podglądac nastawy.
Sterownik wisi przy wejściu do kotłowni. Drugie zdjęcie pokazuje proporcje między wyłącznikiem światła a sterownikiem - jego wielkość.

-

BARTek
Moja strona

Portret użytkownika EDC

Duże cyfry dodane! :D

Dodałem wczoraj nową funkcjonalność. Po krótkim naciśnięciu przycisku "multi-joga" pojawia się duża temperatura bojlera. Wyłącza ją Autopowrót.

O dużych fontach więcej w tym watku -> LINK

-

BARTek
Moja strona

Portret użytkownika romekw

Inne zastosowanie?

Witam!

Czy można zastosować ten projekt do innych celów? Chciałbym sterować chłodziarką w której fabryczny sterownik nie spełnia moich oczekiwań.

Portret użytkownika romekw

Inne zastosowanie?

Witam!

Czy można zastosować ten projekt do innych celów? Chciałbym zastosować go do chłodziarki w której fabryczny sterownik nie spełnia moich oczekiwań. Chodzi o utrzymywanie stałej temperatury około 12'C.

Portret użytkownika mirley

Re. Sterownik CO

Dało by się sterować chłodziarkę.... zamiast pompki CO. Trzeba tylko zanegować sterowanie i zmodyfikować jeszcze zakres ustawianych temperatur

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika inspector

A jak wyświetlić temperaturę

A jak wyświetlić temperaturę po rs232 do wyświetlacza VFD?
Ta komenda:

Print Chr(16) ; Chr(12) ; Hword(1) ; "." ; Hword(2) ; Chr(0) ; "C"

Nie działa jak trzeba. Dla Hword1 wyświetla się 0 na przemian z pulsującym poprawnym odczytem. np
25stopni i zero 25stopni i zero. Hword2 podobnie, z tym że na hword2 ostatnia cyfra jest wyświetlana dobrze.
W dodatku wynik jest wyświetlany tylko dla pieca, a dla bojlera już nie. To zrozumiałe bo komenda:

Print Chr(16) ; Chr(12) ;

Ustawia pierwszy wiersz 12-stą kolumnę.

Jak zatem wyświetlić na VFD obie temperatury, skoro te komendy Hword są wspólne dla obu wierszy wyświetlacza LCD?

Portret użytkownika inspector

vfd

A jak wyświetlić temperaturę po rs232 do wyświetlacza VFD?
Ta komenda:

Print Chr(16) ; Chr(12) ; Hword(1) ; "." ; Hword(2) ; Chr(0) ; "C"

Nie działa jak trzeba. Dla Hword1 wyświetla się 0 na przemian z pulsującym poprawnym odczytem. np
25stopni i zero 25stopni i zero. Hword2 podobnie, z tym że na hword2 ostatnia cyfra jest wyświetlana dobrze.
W dodatku wynik jest wyświetlany tylko dla pieca, a dla bojlera już nie. To zrozumiałe bo komenda:

Print Chr(16) ; Chr(12) ;

Ustawia pierwszy wiersz 12-stą kolumnę.

Jak zatem wyświetlić na VFD obie temperatury, skoro te komendy Hword są wspólne dla obu wierszy wyświetlacza LCD?

Portret użytkownika EDC

Odp. vfd

Dodaj sobie w deklaracjach zmiennych np. cztery dodatkowe swoje zmienne. Kiedy Hword(1) i Hword(2) przyjmuja wartośc np. dla temperatury bojlera zaraz za tym napisz "Twoja zmienna1 = Hword(1) i Twoja zmienna2 = Hword(2).
Potem w wolnej dla procesora chwili wyślij wszystkie cztery na raz, na wyświetlacz :)
Hword to tutaj skrót Help word - Pomocnicza zmienna typu word do celów uniwersalnych, wiec wykorzystywana w kilku miejscach. Twoje zmienne będa przybierac wartości tylko tam gdzie je porównasz do tych których wartośc chcesz przejać.

Ps. Twoje mogą być typu Byte.

-

BARTek
Moja strona

Portret użytkownika inspector

vfd

Dokleciłem do oryginalnego kodu, w miejscu odczytu ds-ów, swój kawałek kodu dla DS-a pieca:

Temperatura:
  Disable Interrupts
  1wreset
  Select Case Ktory_ds
    Case 0:
      1wwrite &HCC
      1wwrite &H44
   Case 1:
      1wwrite &H55
      1wwrite Ds1(1) , 8
      1wwrite &HBE
      Lsb = 1wread():
      Msb = 1wread():
   '------------------------------------------------------------------------------'
    '  1wreset        ' to moje
  ' 1wwrite &H55      ' to moje
  ' 1wverify Ds1(1)   ' to moje
  ' 1wwrite &HBE      ' to moje
  ' I1 = 1wread(2)     ' to moje
  ' I1 = I1 * 10  '   to moje
  ' I1 = I1 / 16    '   to moje
  ' Ss = Str(i1)        ' to moje
  ' Ss = Format(ss , " 0.0")  '   to moje
 
   'Print Chr(16) ; Chr(12) ; Ss;  '  to moje
 
  '-------------------------------------------------------------------------------'
 
 
    Case 2:
      1wwrite &H55
      1wwrite Ds2(1) , 8
      1wwrite &HBE
      Lsb = 1wread():
      Msb = 1wread():
    Case 3:
      1wwrite &H55
      1wwrite Ds3(1) , 8
      1wwrite &HBE
      Lsb = 1wread():
      Msb = 1wread():
    Case 4:
      1wwrite &H55
      1wwrite Ds4(1) , 8
      1wwrite &HBE
      Lsb = 1wread():
      Msb = 1wread():
  End Select

Działa, i identycznie wyświetla temperaturę na VFD jak i LCD (oba podłączone).
Jednak to rozwiązanie nie jest najlepsze, ponieważ ostatecznie zostaje tylko VFD, i będę jakoś musiał pozmieniać program pod VFD, bo mega8 ma mało pamięci. Jak zostawię podwójny odczyt 4 ds-ów, to już całkiem słabo z miejscem.

Pojawia się jeszcze problem buzzera, który ktoś już poruszał. U mnie zadziałał tylko raz.

Portret użytkownika EDC

Odp. Vfd

Się nie wygłupiaj i przed samym Return z powrotu z temperatury wpisz

Ss = Str(T(1))
itd....
i to samo dla T(2)
Po co robić dwa razy to samo. Te dane tam są tylko chyba ich nie widzisz...

-

BARTek
Moja strona

Portret użytkownika inspector

vfd

Moje zmienne typu BYTE nic nie dały. Jest tak samo. Wyświetla poprawnie, na przemian z zerami. To tak jakby zera były na siłę wyświetlane, a na nie nakłada się migający odczyt. Nie mogę tego rozgryść. Napisałem tak:

For N = 1 To 2
         Hword(1) = T(n) / 10
         Hword(2) = 12
 
         If Hword(1) >= 10 Then Decr Hword(2)
         If Hword(1) >= 100 Then Decr Hword(2)
         If Minusy.n = 1 Then Decr Hword(2)
         Locate N , Hword(2)
         Hword(2) = T(n) Mod 10
         If Minusy.n = 1 Then Lcd "-"
         Lcd Hword(1) ; "." ; Hword(2) ; Chr(0) ; "C"
 
           Odcz1 = Hword(1)
          Odcz2 = Hword(2)
 
 
 
        Print Chr(16) ; Chr(12) ; Odcz1 ; "." ; Odcz2 ; Chr(167) ; "C"

Portret użytkownika EDC

Odp. Vfd

Przepraszam. Źle chyba odczytałem pierwszy post. Ten wyswietlacz czyta kody ASCII. Jeśli Twoje rozwiązanie ze zmienną String zadziałało, a nie chcesz podwójnie czytać to dla pieca zamieniaj na String zmienną T(1).
Bardzo dużo miejsca w tym programie zajmują wartości domyslne dla zmiennych zapisywanych w Eeprom. Nauka adresów DS`ów też.
Można dużo miejsca zaoszczędzić jeśli odczytasz sobie raz poprawnie DS`y, zapiszą się w eepromie razem ze zmiennymi. Potem odczytujesz eeproma programatorem, bo kazdy programator teraz to obsługuje. Możesz sobie właczyć w Fusebitach EESAVE (Tylko ostrożnie, najpierw odzytaj Fusebity, zmień EESAVE i dopiero zapisz).

Od tej pory nie musisz już uczyć DS`ów po każdej zmianie w programie. Jak nie chcesz zmieniać Fusebitów to po prostu wgrywasz też pamięć EEpromu.

Korzyści z tego sa takie że można wywalić procedury nauki DS`ów i zapis zmiennych przy pustej pamięci. Wtedy masz miejsce na inne wodotryski :)

-

BARTek
Moja strona

Portret użytkownika inspector

vfd

Z zapisem i odczytem EEpromu będę się bawił później. Już wiem dla czego mój wyświetlacz "świrował". Otóż ostatnia kolumna w drugim wierszu musi zostać pusta, bo inaczej wszystko się wysypuje na wyświetlaczu. Nie wiem czemu tak jest.
Wyświetlacz to M202MD15B.
Z poprawnym wyświetlaniem sobie poradziłem(pomogłeś). Teraz jest problem z wyświetlaniem znaku ujemnego. Mimo tego że ds czyta mi 27 stopni, to na wyświetlaczu mam wynik :
-27"C. Temperatura jest prawidłowa, bo na LCD i innym termometrze jest 27 stopni na plusie.

Portret użytkownika EDC

Odp. VFD

Bascom wiele rzeczy sam konwertuje gdzy używa się poleceń LCD lub PRINT. Wielu nie trzeba konwertować ale czasem wychodza zawiłości które trzeba doczytac. Na próbę zamień na stringa nie T(1) a np jakas Single 27,3 i wyślij to na swój wyświetlacz. Jesli to da rezultat pozytywny to spróbuj użyć polecenia Abs() dla zamienianej wartości. Zwraca wartośc absolutną wyrażenia czyli bez minusa ;)

http://wiki.mcselec.com/bavr/ABS

..a tak w ogóle to Tommorrowland na YT na żywo leci :D

-

BARTek
Moja strona

Portret użytkownika inspector

Chyba zrezygnuję z tego

Chyba zrezygnuję z tego sterownika. Ten minus uparcie się wyświetla, do tego nie działa ten alarm.

Portret użytkownika inspector

vfd

Ustawiłem coś takiego :

If Hword(1) < 0 Or Hword(2) < 0 Then
           Print Chr(16) ; Chr(11) ; Chr(45) ;

Jeżeli hword1 lub hword2 mniejsze od zera, wtedy wyświetl - w odpowiednim miejscu. Teraz niby nie ma minusa przy dodatnim wyniku, ale nie ma też przy zerach gdy brak czujnika. Nie wiem jak się zachowa przy ujemnej temperaturze.

Portret użytkownika EDC

Odp. Prosty sterownik C.O.

Się szybko poddajesz :) Chyba dopiero kiedy zrozumie się instrukcję swojego wyświetlacza to można wiedzieć czego on oczekuje, wysłac mu to i spodziewac się zadowalajacych rezultatów ;)
Im dłużej się bawię w programowanie tym więcej rzeczy kiedyś nieosiągalnych staje się możliwe :)
W oryginale Atmega8 tu pęka w szwach (98%). Okazuje się że wszystko można napisać inaczej i pewnie autor też to potrafi. Po prostu po czasie jest się mądrzejszym o doświadczenie.
W wolnej chwili wpadłem kiedys na pomysł by przepisać swój program pod płytke Mirleja żeby każdy kto będzie chciał mógł przetestować wersję "DeLux" :D
Tak jak tylko dobra piosenka doczeka się remiksu tak dobry projekt też może mieć remix :D
Mój program ma enkoder, inne menu i duże czcionki zachowując pełną funkcjonalność poprzednika. Ds`y programuje się z Menu. Mieści się w Atmega8 i jeszcze jest miejsce :)
Postaram sie wszystko sprawdzić jeszcze raz bo przepisywałem go jakiś czas temu i wtedy zamieszczę :)

Dodane po chwili: Wykorzystaj If minusy = 0 then -> twój kod.
Jak minusy będą 1 to Twój kod nie zadziała i minus się wyświetli.

-

BARTek
Moja strona

Portret użytkownika inspector

vfd

Napisałem tak :

If Minusy = 1 Then Print Chr(16) ; Chr(11) ; Chr(45) ;
If Minusy = 1 Then Print Chr(16) ; Chr(31) ; Chr(45) ;

Nie ma minusów w ogóle, a powinien być przy 0.00 . Teraz to kompletnie zbaraniałem :/

Portret użytkownika EDC

Odp. Vfd

Myslałem że reszty się domyślisz Kolego..Minusy.n
Tak to jest tam zapisane gdzie sam cytowałes kawalek...myśl albo zrób sobie kawę tak jak ja teraz po obiedzie :D

 If Minusy.n = 1 Then Lcd "-"

więc jeśli ma być minus to Twojego kodu nie chcesz :)..odwróć warunek

Minusy to cały Bajt ale w nim jest osiem Bitów. To co zapisane po kropce oznacza numer Bitu. Zależy który DS to ten numer Bitu jest mu przypisywany 0 albo 1 już przy czytaniu temperatury.

Minusy.ktory_ds = Msb.7

7 Bit z Msb z danego Dallasa jest przypisywany przy okazji w miejscu odpowiadajacym numerowi Dallasa :)

-

BARTek
Moja strona

Portret użytkownika inspector

vfd

Próbowałem, i jeśli wstawię minusy.n to niestety oba minusy są. Mam dość, zostaje zwykły lcd. Na nim dobrze wyświetla. Mam jeszcze oleda zgodnego z HD44780, ale jest mały, więc go nie użyję.

Portret użytkownika EDC

Masz za wytrwałość VFD - powinno działać

If Minusy.1 = 0 Then Print Chr(16) ; Chr(11) ; Chr(45) ;  'Minusy.1 bo dla DS1
If Minusy.2 = 0 Then Print Chr(16) ; Chr(31) ; Chr(45) ;  'Minusy.2 bo dla DS2
'przeciez nie masz n :)

-

BARTek
Moja strona

Portret użytkownika inspector

vfd

Dziękuję Ci BARTek. Ja zrobiłem to w ten sposób:

If I1 <= 0 Then Print Chr(16) ; Chr(11) ; "-" ;
If I2 <= 0 Then Print Chr(16) ; Chr(31) ; "-" ;
If I1 > 0 Then Print Chr(16) ; Chr(11) ; " " ;
If I2 > 0 Then Print Chr(16) ; Chr(31) ; " " ;

Zaraz sprawdzę Twój.

Portret użytkownika inspector

vfd

To nie działa, i chyba nie zadziała, bo modyfikuję program. Na koncu jest druga pętla sprawdzająca temp. Przy konwersji w ten sposób, mogę normalnie wyświetlać na VFD. Na razie na tym stanąłem, bo mega ma już prawie 100%.

'************* Konfiguracja uC *****************
'***********************************************
$regfile = "m8def.dat"
$crystal = 16000000
 
'Config Porta = &B00111111 : Porta = &B11111111
Config Portb = &B11111000 : Portb = &B11111111
Config Portc = &B11111111 : Portc = &B11111111
Config Portd = &B00011111 : Portd = &B11111111
 
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5       'mirley UPT M16
Config Lcd = 16 * 2
Cls
Cursor Off Noblink
 
Config 1wire = Pind.2
 
 
Sw_port Alias Pinb                                          'nazwa portu
Pompa Alias Portd.3
Went Alias Portd.4
Buzz Alias Portd.0
Light Alias Portd.1
 
Ds1r Alias Pind.7
Ds2r Alias Pind.6
Ds3r Alias Pind.5
 
Led_a Alias Portb.5
Led_p Alias Portb.3
Led_w Alias Portb.4
 
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
 
 
Enable Interrupts
'********** Konfiguracja uC Koniec  ************
 
'******************  Zmienne *******************
'***********************************************
Dim Stan_sw As Byte , Sw As Byte , Licznik_sw As Byte       'sw
Dim Wyswietlanie As Byte , Poz_wysw As Byte , Wyswietlono As Bit       'Lcd
Dim Mig As Bit , Poz_ust As Byte
Dim Autosave As Byte , Autopowrot As Byte , Autolight As Byte
 
 
Dim Ds1(8) As Byte , Ds2(8) As Byte , Ds3(8) As Byte , Ds4(8) As Byte , Ds(8) As Byte , Ds_adr As Byte , Ds_ok As Bit       'DS18B20
Dim Ktory_ds As Byte , Lsb As Byte , Msb As Byte , Minusy As Byte
Dim T(4) As Word
 
Dim T_min As Word , T_alarm As Word
 
Dim Dzielnik(2) As Byte                                     'dzielniki timera
Dim Flaga_4ms As Bit , Flaga_500ms As Bit , Flaga_1s As Bit 'flagi przerwa?
Dim Hbyte(2) As Byte , Hword(3) As Word , N As Byte , Hbit As Bit , M As Byte
 
Dim Buzz_en As Bit
Dim Tryb_letni As Bit                                       '0- tryb zimowy, 1- tryb letni
 
Dim I1 As Integer
Dim I2 As Integer
Dim Cz1 As String * 6 , Cz2 As String * 6
 
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
 
Declare Sub Sprawdz()
 
 Dsid2(1) = 1wsearchfirst()                                 'Znajdź kolejny czujnik podpięty do portu
Dsid1(1) = 1wsearchnext()
 
 
 
 
 
 
'************  Zmienne Koniec  ****************
 
'************ Warunki Poczatkowe ***************
'***********************************************
'Light = 0
 
Lcd " Sterownik  C.O."
Lowerline
Lcd "  Wersja 0.96"
Print Chr(31) ; Chr(20);
Print Chr(16) ; Chr(3) ; " Sterownik  C.O." ;
Print Chr(16) ; Chr(24) ; " Wersja 0.96 " ;
Waitms 1500
 
 
 
 
 
If Ds1r = 1 And Ds2r = 0 And Ds3r = 0 Then
  Ds_adr = 30
  Gosub Ds_reg
  Cls
  Lcd "Ds Piec"
  Print Chr(31) ; Chr(20);
  Print Chr(16) ; Chr(0) ; "DS  Piec Ok" ;
  waitms 1500
 
 
 
  End If
If Ds1r = 0 And Ds2r = 1 And Ds3r = 0 Then
  Ds_adr = 40
  Gosub Ds_reg
  Cls
  Lcd "Ds Bojler"
  Print Chr(31) ; Chr(20);
  Print Chr(16) ; Chr(0) ; "DS Boiler Ok" ;
  Waitms 1500
  End If
If Ds1r = 1 And Ds2r = 1 And Ds3r = 0 Then
  Ds_adr = 50
  Gosub Ds_reg
  Cls
  Lcd "Ds na zewnatrz "
   Print Chr(31) ; Chr(20);
  Print Chr(16) ; Chr(0) ; "DS na Zewnatrz Ok" ;
  Waitms 1500
  End If
If Ds1r = 0 And Ds2r = 0 And Ds3r = 1 Then
  Ds_adr = 60
  Gosub Ds_reg
  Cls
  Lcd "Ds Kotlownia"
  Print Chr(31) ; Chr(20);
  Print Chr(16) ; Chr(0) ; "DS kotlownia Ok" ;
  Waitms 1500
  End If
 
 
For N = 1 To 8
  Hbyte(1) = 30 + N
  Readeeprom Ds1(n) , Hbyte(1)
  Hbyte(1) = 40 + N
  Readeeprom Ds2(n) , Hbyte(1)
  Hbyte(1) = 50 + N
  Readeeprom Ds3(n) , Hbyte(1)
  Hbyte(1) = 60 + N
  Readeeprom Ds4(n) , Hbyte(1)
Next N
 
Readeeprom T_min , 2
Readeeprom T_alarm , 4
Readeeprom Hbyte(1) , 6
 
Tryb_letni = Hbyte(1).0
If T_min < 100 Or T_min > 950 Then T_min = 400
If T_alarm < 100 Or T_alarm > 950 Then T_alarm = 850
 
 
Wait 1
Wyswietlono = 1
Wyswietlanie = 1
Autosave = 5
'Autolight = 0
 
'*******  Warunki Poczatkowe Koniec  ***********
 
'**************  Petla glowna ******************
'***********************************************
Do
 
  '***********************************************   co 4ms
  If Flaga_4ms = 1 Then
    Flaga_4ms = 0
 
    Gosub Przyciski
    If Wyswietlono = 1 Then Gosub Wysw_lcd
 
  End If
  '***********************************************
 
  '***********************************************   co 500ms
  If Flaga_500ms = 1 Then
    Flaga_500ms = 0
 
    Mig = Not Mig
 
    'Portd.6 = Buzz_en
 
    If Pompa = 0 Then Led_p = Mig Else Led_p = 1
    If Went = 0 Then Led_w = Mig Else Led_w = 1
    Led_a = Buzz
 
    Wyswietlanie = Poz_wysw
 
  End If
  '***********************************************
 
  '***********************************************   co 1s
  If Flaga_1s = 1 Then
    Flaga_1s = 0
 
   ' If Light = 0 Then
      'Incr Autolight
     ' If Autolight >= 20 Then Light = 1
   ' Else
    '  Autolight = 0
   ' End If
 
    If Poz_wysw <> 1 Then
      Incr Autopowrot
      If Autopowrot = 6 Then
        'Poz_wysw = 1
        Wyswietlanie = 1
        Poz_ust = 0
      End If
    Else
      Autopowrot = 0
    End If
 
 
    If Autosave < 5 Then
      Incr Autosave
      If Autosave = 5 Then
        'tu zapis do eeprom
        Writeeeprom T_min , 2
        Writeeeprom T_alarm , 4
        Hbyte(1) = 0
        Hbyte(1).0 = Tryb_letni
        Writeeeprom Hbyte(1) , 6
        Poz_ust = 0
      End If
    End If
 
    Gosub Temperatura
    Gosub Sterowanie
 
  End If
  '***********************************************
 
  Loop
 
End
 
'************ Petla glowna Koniec **************
 
'************ Przerwanie timer 0 ***************
'***********************************************
Prztimer0:
  Timer0 = 5
  Set Flaga_4ms
  Incr Dzielnik(1)
  If Dzielnik(1) = 125 Then
    Dzielnik(1) = 0
    Set Flaga_500ms
    Incr Dzielnik(2)
    If Dzielnik(2) = 2 Then
      Dzielnik(2) = 0
      Set Flaga_1s
    End If
  End If
Return
'******** Przerwanie timer 0 Koniec ************
 
'***********************************************
'*****************  Przyciski     **************
Przyciski:
Sw = Sw_port And &B00000111                                 'maska na piny nieu?ywane jako sw
If Sw <> &B00000111 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 68 Then
      Licznik_sw = 0
      Select Case Stan_sw
        Case &B00000011:                                    'incr
        '***********************************************************
          Select Case Poz_wysw
            Case 3:
              Select Case Poz_ust
                Case 0:
                   Poz_ust = 1
                Case 1:
                   If T_min < 950 Then T_min = T_min + 10
                Case 2:
                   If T_alarm < 950 Then T_alarm = T_alarm + 10
              End Select
              Autosave = 0
            Case 4:
              If Poz_ust = 0 Then Poz_ust = 1 Else Tryb_letni = Not Tryb_letni
              Autosave = 0
            'Case 5:
 
          End Select
          If Buzz = 0 Then Buzz_en = 0
          Autopowrot = 0
         ' Light = 0
         ' Autolight = 0
 
        Case &B00000101:                                    'ustaw next
        '***********************************************************
          If Poz_ust = 0 Then
            Wyswietlanie = Poz_wysw + 1
            If Wyswietlanie = 5 Then Wyswietlanie = 1
          Else
            Select Case Poz_wysw
              Case 3:
                Incr Poz_ust
                If Poz_ust = 3 Then Poz_ust = 0
              Case 4:
                Incr Poz_ust
                If Poz_ust = 2 Then Poz_ust = 0
 
            End Select
          End If
          If Buzz = 0 Then Buzz_en = 0
          Autopowrot = 0
         ' Light = 0
         ' Autolight = 0
 
        Case &B00000110:                                    'decr
        '***********************************************************
          Select Case Poz_wysw
            Case 3:
              Select Case Poz_ust
                Case 0:
                  Poz_ust = 1
                Case 1:
                  If T_min > 100 Then T_min = T_min - 10
                Case 2:
                  If T_alarm > 100 Then T_alarm = T_alarm - 10
              End Select
              Autosave = 0
            Case 4:
              If Poz_ust = 0 Then Poz_ust = 1 Else Tryb_letni = Not Tryb_letni
               Autosave = 0
 
            'Case 5:
 
          End Select
          If Buzz = 0 Then Buzz_en = 0
          Autopowrot = 0
         ' Light = 0
         ' Autolight = 0
 
      End Select
    End If
  Else
    Stan_sw = Sw
    Licznik_sw = 60
  End If
 
Return
'***********************************************
 
'***********************************************
'**************    LCD     ***********
Wysw_lcd:
 If Wyswietlanie <> 0 Then
   Wyswietlono = 0
   Select Case Wyswietlanie
     Case 1:                                                'temp piec bojler
     '**************************************************************
       If Poz_wysw <> 1 Then
         Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32  'stopien
         'Deflcdchar 1 , 4 , 32 , 14 , 17 , 17 , 17 , 14 , 32       ' o kreskowane
         Print Chr(31) ; Chr(20);
         Cls
         Lcd "Piec:"
         Lowerline
         Lcd "Bojler:"
         Print Chr(31) ; Chr(20);
         Print Chr(16) ; Chr(0) ; "Piec:";
         Print Chr(16) ; Chr(20) ; "Boiler:";
       End If
 
       For N = 1 To 2
         Hword(1) = T(n) / 10
         Hword(2) = 12
         If Hword(1) >= 10 Then Decr Hword(2)
         If Hword(1) >= 100 Then Decr Hword(2)
         If Minusy.n = 1 Then Decr Hword(2)
         Locate N , Hword(2)
         Hword(2) = T(n) Mod 10
         If Minusy.n = 1 Then Lcd "-"
         Lcd Hword(1) ; "." ; Hword(2) ; Chr(0) ; "C"
 
 
 
 
 
 
  Print Chr(16) ; Chr(13) ; Cz1 ; "'" ; "C" ;
  Print Chr(16) ; Chr(33) ; Cz2 ; "'" ; "C" ;
 
          'If I1 <= 0 Then Print Chr(16) ; Chr(12) ; "-" ;
          'If I2 <= 0 Then Print Chr(16) ; Chr(32) ; "-" ;
          'If I1 > 0 Then Print Chr(16) ; Chr(12) ; " " ;
         ' If I2 > 0 Then Print Chr(16) ; Chr(32) ; " " ;
           If Minusy.1 = 0 Then Print Chr(16) ; Chr(12) ; Chr(45) ;       'Minusy.1 bo dla DS1
           If Minusy.2 = 0 Then Print Chr(16) ; Chr(32) ; Chr(45) ;       'Minusy.2 bo dla DS2
 
 
 
       Next N
 
     Case 2:                                                'temb banka,dom
     '**************************************************************
        If Poz_wysw <> 2 Then
         Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32  'stopien
 
         Cls
         Lcd "Na zewnatrz:"
         Lowerline
         Lcd "Kotlownia:"
 
        Print Chr(31) ; Chr(20);
        Print Chr(16) ; Chr(0) ; "Na zewnatrz:";
        Print Chr(16) ; Chr(20) ; "Kotlownia:" ;
 
       End If
 
       For N = 3 To 4
         Hword(1) = T(n) / 10
         Hword(2) = 12
         If Hword(1) >= 10 Then Decr Hword(2)
         If Hword(1) >= 100 Then Decr Hword(2)
         If Minusy.n = 1 Then Decr Hword(2)
         M = N - 2
         Locate M , Hword(2)
         Hword(2) = T(n) Mod 10
         If Minusy.n = 1 Then Lcd "-"
         Lcd Hword(1) ; "." ; Hword(2) ; Chr(0) ; "C"
         Print Chr(16) ; Chr(14) ; Hword(1) ; "." ; Hword(2) ; "'" ; "C" ;
         Print Chr(16) ; Chr(34) ; Hword(1) ; "." ; Hword(2) ; "'" ; "C" ;
 
       Next N
 
     Case 3:
     '**************************************************************
       If Poz_wysw <> 3 Then
         Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32  'stopien
         'Deflcdchar 1 , 4 , 32 , 14 , 17 , 17 , 17 , 14 , 32       ' o kreskowane
 
         Cls
         Lcd "Temp. zal. pompy:"
         Lowerline
         Lcd "Temp.Alarmu:"
         Print Chr(31) ; Chr(20);
         Print Chr(16) ; Chr(0) ; "T.Zal Pompy:";
         Print Chr(16) ; Chr(20) ; "T.Alarmu:";
       End If
 
 
 
 
 
       If Poz_ust = 1 And Mig = 1 Then
          Locate 1 , 10
          Lcd "       "
          Print Chr(16) ; Chr(13) ; "       ";
 
       Else
       't minimalna
         Hword(1) = T_min / 10
         Hword(2) = 12
         If Hword(1) >= 10 Then Decr Hword(2)
         If Hword(1) >= 100 Then Decr Hword(2)
         Locate 1 , Hword(2)
         Hword(2) = T_min Mod 10
         Lcd Hword(1) ; "." ; Hword(2) ; Chr(0) ; "C "
        Print Chr(16) ; Chr(13) ; Hword(1) ; "." ; Hword(2) ; "'" ; "C" ;
       End If
 
       If Poz_ust = 2 And Mig = 1 Then
          Locate 2 , 10
          Lcd "       "
          Print Chr(16) ; Chr(32) ; "       " ;
                                                                                  ' Print Chr(16) ; Chr(13) ; Hword(1) ; "." ; Hword(2) ; "'" ; "C" ;
       Else
       't alarmowa
         Hword(1) = T_alarm / 10
         Hword(2) = 12
         If Hword(1) >= 10 Then Decr Hword(2)
         If Hword(1) >= 100 Then Decr Hword(2)
         Locate 2 , Hword(2)
         Hword(2) = T_alarm Mod 10
         Lcd Hword(1) ; "." ; Hword(2) ; Chr(0) ; "C"
         Print Chr(16) ; Chr(33) ; Hword(1) ; "." ; Hword(2) ; "'" ; "C";
 
       End If
 
 
      Case 4:
     '**************************************************************
        If Poz_wysw <> 4 Then
         Cls
         Lcd "Tryb: "
        Print Chr(31) ; Chr(20);
        Print Chr(16) ; Chr(0) ; "Tryb:" ;
       End If
 
       Locate 1 , 7
        Print Chr(16) ; Chr(6) ;
       If Poz_ust = 1 And Mig = 1 Then
          Lcd "       "
         Print Chr(16) ; Chr(6) ; "       ";
       Else
         If Tryb_letni = 1 Then Lcd "Letni" Else Lcd "Zimowy"
         If Tryb_letni = 1 Then Print Chr(16) ; Chr(6) ; "Letni" ; Else Print Chr(16) ; Chr(6) ; "Zimowy" ;
 
       End If
 
 
 
     Case 5:
     '**************************************************************
        If Poz_wysw <> 5 Then
         Cls
         Lcd "Przedmuch:"
         Lowerline
         Lcd "Przerwa:"
       End If
 
 
   End Select
   Poz_wysw = Wyswietlanie
   Wyswietlanie = 0
   Wyswietlono = 1
 End If
Return
'************** LCD Koniec ***********
 
'**********  rejestracja DS *********
Ds_reg:
  Disable Interrupts
  1wreset
  1wwrite &H33
  Ds(1) = 1wread(8):
  Enable Interrupts
  If Ds(1) <> 255 Or Ds(2) <> 255 Or Ds(3) <> 255 Or Ds(4) <> 255 Or Ds(5) <> 255 Or Ds(6) <> 255 Or Ds(7) <> 255 Or Ds(8) <> 255 Then
    Ds_ok = 1
    For N = 1 To 8
      Hbyte(1) = Ds_adr + N
      Writeeeprom Ds(n) , Hbyte(1)
    Next N
  Else
    Ds_ok = 0
  End If
Return
'******  rejestracja DS Koniec ******
 
'*************  Temperatura   ***********
Temperatura:
 
 
  Disable Interrupts
   Gosub Sprawdz
 1wreset
  Select Case Ktory_ds
    Case 0:
 
      1wwrite &HCC
      1wwrite &H44
 
    Case 1:
      1wwrite &H55
      1wwrite Ds1(1) , 8
      1wwrite &HBE
      Lsb = 1wread():
      Msb = 1wread():
 
    Case 2:
      1wwrite &H55
      1wwrite Ds2(1) , 8
      1wwrite &HBE
      Lsb = 1wread():
      Msb = 1wread():
 
    Case 3:
      1wwrite &H55
      1wwrite Ds3(1) , 8
      1wwrite &HBE
      Lsb = 1wread():
      Msb = 1wread():
    Case 4:
      1wwrite &H55
      1wwrite Ds4(1) , 8
      1wwrite &HBE
      Lsb = 1wread():
      Msb = 1wread():
 
 
 
 
  End Select
 
  Enable Interrupts
 
  If Ktory_ds > 0 Then
    T(ktory_ds) = Msb * 256
    T(ktory_ds) = T(ktory_ds) + Lsb
    Minusy.ktory_ds = Msb.7
 
    If Minusy.ktory_ds = 1 Then
      T(ktory_ds) = Not T(ktory_ds)
      T(ktory_ds) = T(ktory_ds) + 1
    End If
 
    T(ktory_ds) = T(ktory_ds) * 10
    T(ktory_ds) = T(ktory_ds) / 16
   Else
    If Poz_wysw = 1 And Wyswietlono = 1 Then Wyswietlanie = 1
  End If
 
  Incr Ktory_ds
  If Ktory_ds = 5 Then Ktory_ds = 0
 
 
  Return
'**********  Temperatura  Koniec *********
 
 
'************   Sterowanie       ***************
'***********************************************
Sterowanie:
 
 
  If Tryb_letni = 1 Then
    If T(1) >= T_min Then
      Hword(1) = T(2) + 70
      Hword(2) = T(2) + 30
      If T(1) >= Hword(1) Then Pompa = 0
      If T(1) <= Hword(2) Then Pompa = 1
    Else
      Pompa = 1
    End If
  Else
    If T(1) >= T_min Then
     Pompa = 0
    Else
      Pompa = 1
    End If
  End If
 
 
  If T(1) >= T_alarm Or T(2) >= T_alarm Then
    If Buzz_en = 1 Then Buzz = Not Buzz Else Buzz = 1
  Else
    Buzz = 1
    Hword(1) = T_alarm - 50
    If T(1) <= Hword(1) And T(2) <= Hword(1) Then Buzz_en = 1
  End If
  'tutaj sterowanie wentylatorem
 
  Return
'********    Sterowanie      Koniec ************
'================================================================================
 
 Sub Sprawdz()
 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 &HCC
   1wwrite &H44
   Waitms 700
 
   I1 = I1 * 10
   I1 = I1 / 16
   'If I1 > 0 Then Cls                                       'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
  Cz1 = Str(i1)
   Cz1 = Format(cz1 , " 0.0")
 
     I2 = I2 * 10
   I2 = I2 / 16
   'If I1 > 0 Then Cls                                       'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
   Cz2 = Str(i2)
   Cz2 = Format(cz2 , " 0.0")
 
 
 
 
 ' Print Chr(16) ; Chr(13) ; Cz1 ; "'" ; "C" ;
  'Print Chr(16) ; Chr(33) ; Cz2 ; "'" ; "C" ;
 
          'If I1 <= 0 Then Print Chr(16) ; Chr(12) ; "-" ;
         ' If I2 <= 0 Then Print Chr(16) ; Chr(32) ; "-" ;
          'If I1 > 0 Then Print Chr(16) ; Chr(12) ; " " ;
          'If I2 > 0 Then Print Chr(16) ; Chr(32) ; " " ;
 
          End Sub
          Loop

Portret użytkownika EDC

Odp. Prosty sterownik C.O.

W oryginalnym programie Autora wystarczyło dopisać sobie ta zmienna i w Sub Temperatura poczynić zaznaczone zmiany :)

Dim Cz(2) As String * 6
 
 
 
'*************  Temperatura   ***********
Temperatura:
  Disable Interrupts
  1wreset
  Select Case Ktory_ds
    Case 0:
      1wwrite &HCC
      1wwrite &H44
    Case 1:
      1wwrite &H55
      1wwrite Ds1(1) , 8
      1wwrite &HBE
      Lsb = 1wread():
      Msb = 1wread():
    Case 2:
      1wwrite &H55
      1wwrite Ds2(1) , 8
      1wwrite &HBE
      Lsb = 1wread():
      Msb = 1wread():
    Case 3:
      1wwrite &H55
      1wwrite Ds3(1) , 8
      1wwrite &HBE
      Lsb = 1wread():
      Msb = 1wread():
    Case 4:
      1wwrite &H55
      1wwrite Ds4(1) , 8
      1wwrite &HBE
      Lsb = 1wread():
      Msb = 1wread():
  End Select
 
  Enable Interrupts
 
  If Ktory_ds > 0 Then
    T(ktory_ds) = Msb * 256
    T(ktory_ds) = T(ktory_ds) + Lsb
    Minusy.ktory_ds = Msb.7
 
    If Minusy.ktory_ds = 1 Then
      T(ktory_ds) = Not T(ktory_ds)
      T(ktory_ds) = T(ktory_ds) + 1
    End If
 
    T(ktory_ds) = T(ktory_ds) * 10
    T(ktory_ds) = T(ktory_ds) / 16
'************************************ dodane *********************
   Select Case Ktory_ds
    Case 1
     Cz(1) = Str(t(1))
     Cz(1) = Format(cz(1) , " 0.0")
     Print Chr(16) ; Chr(13) ; Cz(1) ; "'" ; "C" ;
    Case 2
     Cz(2) = Str(t(2))
     Cz(2) = Format(cz(1) , " 0.0")
     Print Chr(16) ; Chr(33) ; Cz(2) ; "'" ; "C" ;
    End Select
'*****************************************************************
   Else
    If Poz_wysw = 1 And Wyswietlono = 1 Then Wyswietlanie = 1
  End If
 
  Incr Ktory_ds
  If Ktory_ds = 5 Then Ktory_ds = 0
 
Return

Przyjrzyj się i resztę spróbuj dopisac sam. Wywal te Twoje modyfikacje i podziałaj na oryginale :) Dopisz te znaki i bedzie git (ok) :D

-

BARTek
Moja strona

Portret użytkownika inspector_electro

Prawie zrobione

Dziękuję za wielką pomoc.Był błąd w tym co mi podałeś, ale poradziłem sobie. Prawie zrobione. Mam jeszcze problem z rejestracją czujnika. Nie chce mi wykrywać drugiego, po podłączeniu obu na raz.

Portret użytkownika EDC

Odp. Prosty sterownik C.O.

Ideą szyny 1Wire jest umieszczenie wielu czujników na jednym przewodzie by nie ciągnąć osobnych przewodów do każdego gdy sterownik oddalony jest od kotłowni. Jeśli ktoś ma tylko dwa czujniki, sterownik w kotłowni i tak jak Ty tylko wyświetlacz dalej to powinien rozważyć inne podejście. Dwa czujniki na osobnych pinach procesora tak jak w minitermometrze stąd. Prostsza obsługa programowa, bez adresów..odpada programowanie, czujniki wymienne bez programowania w razie awarii...same zalety :P

-

BARTek
Moja strona

Portret użytkownika dziura

problem

Witam
Podpoiłem się przekaźnikiem pod buzer aby rozłączało mi wentylator gdy temp. max. zostanie osiągnięta i jest taki problem że przy włączaniu się przekaźnika atmega wiesza się na wyświetlaczy jest samo podświetlanie. pomocy!!!

Portret użytkownika EDC

Odp. problem

To mało profesjonalne podejscie :P Może się nie wiesza, ale wyswietlacz głupieje od zakłóceń generowanych przez cewkę przekaźnika. Oddalenie go pewnie by pomogło. Niemniej masz tam tylko 5v.. Nie lepiej jest znaleźć w kodzie w podprogramie "Sterowanie:" taki zapis:

If Wygaszenie = 0 Then
  If Tryb_pracy = 0 Then
 
 ' tu znajduje sie wiecej kodu ale dla przejrzystosci pominę
 
 Else
    Went = 1
  End If

i zmienić pierwsza linijke, dopisując : "And Buzz_en = 0"

If Wygaszenie = 0 And Buzz_en = 0 Then

Te "Else Went = 1" znaczy że jeśli powyzsze warunki nie sa spełnione to wentylator ma sie wyłaczyć.

-

BARTek
Moja strona

Portret użytkownika Maciej Z

zmiana w kodzie

Witam . Jakiś rok temu zbudowałem ten sterownik i działa świetnie . Od kilku dni w domu mam zamontowane solary i potrzebował bym małej modyfikacji w kodzie.Mianowicie potrzebuję aby sterownik sterował pompą(i tylko pompą)na dwa sposoby :
a) załącza pompę po przekroczeniu temperatury na piecu np.40 stopni i wyłącza ją gdy temperatura spadnie oraz po przekroczeniu np.70 stopni aby się załączał alarm(tak jak działał dotychczas)
b) załącza tą samą pompę po przekroczeniu temperatury na bojlerze np. 80 stopni i wyłącza ją gdy temperatura spadnie oraz po przekroczeniu np.90 stopni aby się załączał alarm .
Wartości mogą być ustawione na stałe bez możliwości ich zmian .