Sterownik C.W.U.

Użytkownicy tworzą, zmieniają.
swiezak
Posty: 1358
Rejestracja: ndz maja 04, 2014 12:19 pm
Lokalizacja: śląskie

Sterownik C.W.U.

Post autor: swiezak » śr maja 18, 2016 10:08 pm

Witam!
Właśnie się zabrałem za stworzenie sterownika C.W.U. który jest mi potrzebny w domu a nettemp nie do końca daje radę (odczyty co minutę)
Założenie:
odczyt ds18b20 w dwóch miejscach (wylot z zasobnika, przy kranie w domu)
porównywanie różnicy temperatur- jeżeli temp. kran<temp. zasobnik i naciśnięty przycisk włącza pompkę do czasu zrównania temperatur
jeżeli przycisk on- temperatura kran>temp. zasobnik nie włącza przekaźnika
histereza ustawiona na stałe 10st.
Możliwość sterowania poprzez nettemp - podajemy impuls i cała logika jak wyżej
Możliwość sterowania ręcznego przyciskiem chwilowym.
Na razie podaję sam schemat poprawiony i dopieszczony przez niezastąpionego, wspaniałego, pomocnego @pimowo
Płytkę będę sam próbował projektować.
Wsad do Attiny2313 obiecał i na pewno dotrzyma słowa wcześniej wspominany @pimowo za co już mu dziękuję:)

Obrazek

Awatar użytkownika
pimowo
Betatester
Posty: 4313
Rejestracja: czw lut 19, 2015 9:17 am
Lokalizacja: Wołów

Re: Sterownik C.W.U.

Post autor: pimowo » śr maja 18, 2016 11:12 pm

@swiezak ale słodzisz :D
Tak sobie jeszcze myślę... DS'y można dać na osobnych pinach uC-odpadnie problem adresów itp. Nawet po wymianie DS'a na nowy nic nie będzie trzeba robić.
A co do zasilania to można dać stabilizator 7805 i wykorzystać zasilacz 7-12V

Obrazek
Mój NetTemp mieszka w Raspberry Pi 3B na szynie DIN

swiezak
Posty: 1358
Rejestracja: ndz maja 04, 2014 12:19 pm
Lokalizacja: śląskie

Re: Sterownik C.W.U.

Post autor: swiezak » czw maja 19, 2016 1:18 pm

pimowo pisze:@swiezak ale słodzisz :D
Tak sobie jeszcze myślę... DS'y można dać na osobnych pinach uC-odpadnie problem adresów itp. Nawet po wymianie DS'a na nowy nic nie będzie trzeba robić.
A co do zasilania to można dać stabilizator 7805 i wykorzystać zasilacz 7-12V

Obrazek
w sumie dobry pomysł z tymi ds'ami
Z zasilaniem zostawie bezpośrednio na 5v dlatego że mam od groma ładowarek sieciowych 5v stabilizowanych:) projekt raczej mało komu będzie potrzebny tak więc zostawiłbym to tak jak jest:)

swiezak
Posty: 1358
Rejestracja: ndz maja 04, 2014 12:19 pm
Lokalizacja: śląskie

Re: Sterownik C.W.U.

Post autor: swiezak » pn sie 15, 2016 3:28 pm

@techfreak mam pytanie do Ciebie:
w jaki sposób wykonać komunikację wspomnianego sterownika aby można było w łatwy sposób go zadaptować do nettempa- chodzi mi o informację kiedy przekaźnik jest on a kiedy off.
Ogólnie jedno gpio będzie wykorzystane do podawania impulsu zwieranego do masy (jak bym przycisk nacisnął- wykorzystanie day/week plan z nettempa)z informacja do mikrokontrolera że ma sprawdzić warunki i jeżeli sapełnione to ma właczyć przekaźnik.

remont łazienki dobiega końca, w końcu mam dobrze zrobionącyrkulację c.w.u. i wypadało by się wziąć za sterownik:) oczywiście zaraz po stacji meteo;)

bynio
Posty: 79
Rejestracja: wt maja 13, 2014 6:32 am

Re: Sterownik C.W.U.

Post autor: bynio » czw sie 25, 2016 10:20 am

Jeśli jeszcze aktualne - http://www.e-politek.pl/product_info.ph ... cts_id=122. 27zł + 2 czujniki DS = po problemie.

Odnośnie termostatu na uC. Sam z 10 lat temu popełniłem termostat w bascomie na 4 czujniki (źródła ciepła - kolektor i piec - sterowanie różnicowe względem temp CWU, załączanie obiegu CO) kompilowany bezproblemowo przez wersję demo. Jeżeli nadal chcesz to robić samodzielnie mogę podesłać wsad który bez problemu mógłbyś dostosować dla siebie. Tego typu rzeczy nie powierza się bądź co bądź awaryjnemu softowi odpalanemu na równie awaryjnym sprzęcie (mówię tu głównie o żywotności karty SD, wrażliwości na przepięcia, etc).

Awatar użytkownika
pimowo
Betatester
Posty: 4313
Rejestracja: czw lut 19, 2015 9:17 am
Lokalizacja: Wołów

Re: Sterownik C.W.U.

Post autor: pimowo » czw sie 25, 2016 10:31 am

bynio pisze:Jeżeli nadal chcesz to robić samodzielnie mogę podesłać wsad który bez problemu mógłbyś dostosować dla siebie.
Ja chętnie zobaczyłbym kod ;)
Mój NetTemp mieszka w Raspberry Pi 3B na szynie DIN

swiezak
Posty: 1358
Rejestracja: ndz maja 04, 2014 12:19 pm
Lokalizacja: śląskie

Re: Sterownik C.W.U.

Post autor: swiezak » czw sie 25, 2016 2:12 pm

Dzieki kol. @bynio za podpowiedź.
Ja do sterowania pompka od solarow uzywam juz 3 rok wsadu z tej strony
http://www.rc-wheels.info/solary/index-solary.html
Ogolnie ten sterownik jest pod konkretne zadanie z określonymi parametrami a spowodowane to jest tym, ze od zasobnika do krany mam ok. 25m i sam stetownik roznicowy nie zda egzaminu poniewaz woda za bardzo by sie wychladzala (gonila w obiegu jak nikogo nie ma w domu)
@pimowo moze ty masz jakis pomysl bo admin nie odpisuje w jaki sposob najprosciej przygotowac ten sterownik zeby mozna z nettempem go pozenic w jakis prosty sposob. Albo nawet nie z nettempem tylko zeby mozna zerknac kiedy gpio sie zalacza i wylacza :)

Teraz mi przyszla na mysl opcja triger z nettempa. Moze w ten sposob mozna by to ugryźć?
Doczytalem- w triger nie rysuja sie wykresy. I znowu wracam do punktu wyjscia.

bynio
Posty: 79
Rejestracja: wt maja 13, 2014 6:32 am

Re: Sterownik C.W.U.

Post autor: bynio » pn sie 29, 2016 8:17 am

Były 2 wersje sterowników. Jedna sprzed ponad 10 lat, druga sprzed ok 5. Wartości kodowane na stałe w pamięci ze względu na rozmiar wynikowy wersji demo.
V1 działa do dziś, V2 zostało zastąpione innym rozwiązaniem (potrzeba chwili i tak już zostało)

V1

Kod: Zaznacz cały

$regfile = "m8def.DAT"
$baud = 9600
$crystal = 4000000


Dim T1(2) As Byte ' czujniki
Dim T2(2) As Byte
Dim T3(2) As Byte
Dim T4(2) As Byte
Dim D1 As Byte ' surowe dane przez konwersja na temperature, do sprawdzania ujemnej
Dim D2 As Byte
Dim D3 As Byte
Dim D4 As Byte
Dim E1 As Bit ' sygnalizacja bledu gdy brak czujnika'
Dim E2 As Bit
Dim E3 As Bit
Dim E4 As Bit
I As Byte

Dim T As Integer

Config 1wire = Portc.5                                      'czujnik 1
Config 1wire = Portc.4                                      'czujnik 2
Config 1wire = Portc.3                                      'czujnik3
Config 1wire = Portc.2                                      'czujnik 4

Config Pind.5 = Output                                      'p1
Config Pind.6 = Output                                      'p2
Config Pind.7 = Output                                      'p3
Config Pind.4 = Output                                      'p4
Config Pind.2 = Output                                      'rezerwa1
Config Pind.3 = Output                                      'rezerwa2

Config Pinc.1 = Input                                       'lato/zima


Speaker Alias Portc.0
P1 Alias Pind.5
P2 Alias Pind.6
P3 Alias Pind.7
P4 Alias Pind.4
Sw Alias Pinc.1



Config Lcd = 16 * 4
Config Lcdpin = Pin



Sub Odczyt

For I = 2 To 5                                              'Reset i rozkaz konwersji dla wszystkich czujnikow
  1wreset Pinc , I
  1wwrite &HCC , 1 , Pinb , I
  1wwrite &H44 , 1 , Pinb , I)
Next

Wait 1

For I = 2 To 5                                              'odczyt i konwersja z zapisem do zmiennych
  1wreset Pinc , I
  1wwrite &HCC , 1 , Pinb , I
  1wwrite &HBE , 1 , Pinb , I)

   If I = 2 Then                                            ' odczyt pierwszego czujnika
      T1(1) = 1wread(2)                                     ' odczyt 2 bajtow
      1wreset
         If Err = 0 Then                                    ' gdy jest uklad
            T = Makeint(T1(1),T1(2))
            D1=T                               
            T=Abs(t)
            T = T * 10 : T = T / 16
            T1(2) = T Mod 10                                        'przecinek otrzymuje wartość części dziesiętnych 
            T1(1) = T / 10                                            'to konwersja
            E1 = 0
         Else
            E1 = 1
         End If

   Elseif I = 3 Then
      T2(1) = 1wread(2)                                     ' odczyt 2 bajtow
      1wreset
         If Err = 0 Then                                    ' gdy jest uklad
            T = Makeint(T2(1),T2(2))
            D2=T                               ' czy ujemna, jesli tak
            T=Abs(t)
            T = T * 10 : T = T / 16
            T2(2) = T Mod 10                                        'przecinek otrzymuje wartość części dziesiętnych 
            T2(1) = T / 10                                            'to konwersja
            E2 = 0
         Else
            E2 = 1
         End If


   Elseif I = 4 Then
      T3(1) = 1wread(2)                                     ' odczyt 2 bajtow
      1wreset
         If Err = 0 Then                                    ' gdy jest uklad
            T = Makeint(T3(1),T3(2))
            D3=T                               ' czy ujemna, jesli tak
            T=Abs(t)
            T = T * 10 : T = T / 16
            T3(2) = T Mod 10                                        'przecinek otrzymuje wartość części dziesiętnych 
            T3(1) = T / 10                                            'to konwersja
            E3 = 0
         Else
            E3 = 1
         End If

   Elseif I = 5 Then
      If Err = 0 Then                                    ' gdy jest uklad
            T = Makeint(T1(1),T1(2))
            D4=T                               ' czy ujemna, jesli tak
            T=Abs(t)
            T = T * 10 : T = T / 16
            T4(2) = T Mod 10                                        'przecinek otrzymuje wartość części dziesiętnych 
            T4(1) = T / 10                                            'to konwersja
            E4 = 0
         Else
            E4 = 1
         End If
   End If
Next
End Sub

sub Lcd
Cursor Off                                                  'Wyłącza kursor
Cls
Lcd "Dach= "
if E1=0 then
  If D1 < 0 then
  lcd "-"
  else 
  lcd "+"
  end if
  Lcd T1(1) ; "," ; T1(2)
else
  Lcd "------"
end if

Lowerline
Lcd "CWU=  "
if E2 = 0 then
  If D2 < 0 then
  lcd "-"
  else 
  lcd "+"
  end if
  Lcd T2(1) ; "," ; T2(2)
else
  Lcd "------"
end if

Thirdline
Lcd "Piec= "
If E3 = 0 then
  If D3 < 0 then
  lcd "-"
  else 
  lcd "+"
  end if
  Lcd T3(1) ; "," ; T3(2)
else
  Lcd "------"
end if

Fourthline
Lcd "Dom=  "
If E4 = 0 then
  If D4 < 0 then
  lcd "-"
  else 
  lcd "+"
  end if
  Lcd T4(1) ; "," ; T4(2)
else
  Lcd "------"
End If
end sub

Sound Speaker , 329 , 63                                    ' nuta dzwiekowa
Sound Speaker , 369 , 99                                    ' nuta dziwekowa
V2 - bardziej rozbudowana, aczkolwiek robiąca praktycznie to samo.

Kod: Zaznacz cały

$regfile = "m8def.DAT"
$baud = 9600
$crystal = 4000000
Deflcdchar 0 , 8 , 20 , 8 , 7 , 8 , 8 , 8 , 7               ' stC
Deflcdchar 1 , 32 , 32 , 32 , 31 , 1 , 1 , 1 , 1            ' prawo i dol
Deflcdchar 2 , 1 , 1 , 1 , 31 , 32 , 32 , 32 , 32           ' prawo i gora
Deflcdchar 3 , 1 , 1 , 1 , 31 , 1 , 1 , 1 , 1               ' prawo gora i dol
Deflcdchar 4 , 1 , 5 , 13 , 31 , 13 , 5 , 1 , 1             ' strzalka gora dol
Deflcdchar 5 , 32 , 4 , 12 , 31 , 13 , 5 , 1 , 1            ' strzalka dol
Deflcdchar 6 , 1 , 5 , 13 , 31 , 12 , 4 , 32 , 32           ' strzalka gora

Dim B1 As Byte , B2 As Byte , R As Byte
Dim Tmp1 As Single
Dim Tmp2 As Single
Dim Tmp3 As Single
Dim Tmp4 As Single
Dim Z1 As Single , Z2 As Single                             ' zmienne do obliczen                                           ' zmienna pomocnicza do obliczen
Dim Tmp As String * 6
Dim Znak As String * 1
Dim X As Single
Dim I As Byte

Dim P1 As Bit
Dim P2 As Bit                                               ' Pompki
Dim P3 As Bit
Dim P4 As Bit

Config 1wire = Portc.5                                      'czujnik 1
Config 1wire = Portc.4                                      'czujnik 2
Config 1wire = Portc.3                                      'czujnik3
Config 1wire = Portc.2                                      'czujnik 4

Config Pind.5 = Output                                      'p1 cwu-dach
Config Pind.6 = Output                                      'p2 cwu-piec
Config Pind.7 = Output                                      'p3 piec-grzejniki
Config Pind.4 = Output                                      'p4
Config Pind.2 = Output                                      'rezerwa1
Config Pind.3 = Output                                      'rezerwa2

Speaker Alias Portc.0

Config Lcd = 16 * 4
Config Lcdmode = Port
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0
Config Lcdbus = 4
Cursor Off
Cls
Lcd "Witam"

Set Portd.6
Wait 1
Reset Portd.6


Do
Gosub Odczyt
Gosub Sterowanie
Gosub Piktogramy
Loop





Odczyt:

For I = 2 To 5
  1wreset Pinc , I
  1wwrite &HCC , 1 , Pinc , I
  1wwrite &H44 , 1 , Pinc , I
Next I

Wait 1

For I = 2 To 5
  1wreset Pinc , I
  1wwrite &HCC , 1 , Pinc , I
  1wwrite &HBE , 1 , Pinc , I
  R = &HFF

   B1 = 1wread(1 , Pinc , I)
   B2 = 1wread(1 , Pinc , I)
   1wreset Pinc , I

               If B2 >= 248 Then
                  B1 = R - B1                               'Od 255 Odejmujemy B1
                  B2 = R - B2                               'od 255 odejmujemy B2
                  Znak = "-"
               Else
                  Znak = "+"
               End If
            Z1 = B1 / 16                                    'Przesuniecie w pawo o 4 bajty
            Z2 = B2 * 16                                    'przesuniecie w lewo o 4 bajty
            Z1 = Z1 + Z2
               If I = 2 Then
                  Tmp1 = Z1 + 5
                  Locate 1 , 1
                  Lcd "Dach= " ; Znak ; Tmp1 ; Chr(0)
                Elseif I = 3 Then
                  Tmp2 = Z1 + 5
                  Locate 2 , 1
                  Lcd "CWU = " ; Znak ; Tmp2 ; Chr(0)
                Elseif I = 4 Then
                  Tmp3 = Z1 + 5
                  Locate 3 , 1
                  Lcd "Piec= " ; Znak ; Tmp3 ; Chr(0)
                Elseif I = 5 Then
                  Tmp4 = Z1 + 5
                  Locate 4 , 1
                  Lcd "Dom = " ; Znak ; Tmp4 ; Chr(0)
                End If
Next I
Return



Sterowanie:

X = Tmp1 - 20                                               'gdy dach jest o 2 st cieplejszy od wody
If X > Tmp2 Then
     Set Portd.5
     P1 = 1
Else
     Reset Portd.5
     P1 = 0
End If

                                                           'gdy piec jest o 2 st cieplejszy niz cwu
X = Tmp3 - 20
If X > Tmp2 Then
   Set Portd.6
   P2 = 1
Else
   Reset Portd.6
   P2 = 0
End If



If Tmp2 > 420 Then
   If Tmp3 > 300 Then
      Set Portd.7
      P3 = 1
    Else
      Reset Portd.7
      P3 = 0
    End If
Else
   If Tmp3 > 420 Then
      Set Portd.7
      P3 = 1
    Else
      Reset Portd.7
      P3 = 0
    End If
End If

P4 = 0

If Tmp3 > 800 Then
   Sound Speaker , 329 , 63                                 ' nuta dzwiekowa
   Sound Speaker , 369 , 99
End If

Print Tmp1 ; "," ; Tmp2 ; "," ; Tmp3 ; "," ; Tmp4 ; "," ; P1 ; "," ; P2 ; "," ; P3 ; "," ; P4

Return

Piktogramy:
Locate 1 , 16 : Lcd " "
Locate 3 , 16 : Lcd " "
Locate 4 , 16 : Lcd " "
Locate 2 , 16 : Lcd " "

If P1 = 1 Then
   If P2 = 1 Then
      Lcd Chr(4)
   Else
      Lcd Chr(6)
   End If
Locate 1 , 16 : Lcd Chr(1)
End If

If P2 = 1 Then
   If P3 = 1 Then
      Locate 3 , 16 : Lcd Chr(3)
      Locate 4 , 16 : Lcd Chr(6)
   Else
      Locate 3 , 16 : Lcd Chr(2)
   End If
Locate 2 , 16 : Lcd Chr(5)
End If

Return
Jest jeszcze V3 - ale nie doczekała się realizacji ze względu na to że musiałbym albo kupić albo crackować bascoma - a tego nie lubię. Może jednak komuś się przyda. Tu doszły już przyciski i menu ekranowe. Nie sprawdzałem poprawności logicznej ze względu na powyższe, ale może to służyć jako baza dla własnego rozwiązania.

Kod: Zaznacz cały

$regfile = "m8def.DAT"
$baud = 9600
$crystal = 4000000
Deflcdchar 0 , 8 , 20 , 8 , 7 , 8 , 8 , 8 , 7               ' stC
Deflcdchar 1 , 32 , 32 , 32 , 31 , 1 , 1 , 1 , 1            ' prawo i dol
Deflcdchar 2 , 1 , 1 , 1 , 31 , 32 , 32 , 32 , 32           ' prawo i gora
Deflcdchar 3 , 1 , 1 , 1 , 31 , 1 , 1 , 1 , 1               ' prawo gora i dol
Deflcdchar 4 , 1 , 5 , 13 , 31 , 13 , 5 , 1 , 1             ' strzalka gora dol
Deflcdchar 5 , 32 , 4 , 12 , 31 , 13 , 5 , 1 , 1            ' strzalka dol
Deflcdchar 6 , 1 , 5 , 13 , 31 , 12 , 4 , 32 , 32           ' strzalka gora
Deflcdchar 7 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32        'puste miejsce

Dim T(4) As Integer                                         't1 dach t2 cwu t3 piec t4 dom
Dim I As Byte , A As Byte
Dim Tmp(4) As String * 5
Dim G(2)as String * 4                                       'do ekranu info przy starcie
Dim X As Integer                                            ' tu przechowujemy wyniki pomiarow do sterowania
Dim Z(4) As Byte
Dim P1 As Bit
Dim P2 As Bit                                               ' Pompki
Dim P3 As Bit
Dim Sek As Bit                                              'zmienna ustawiana co sek.
Dim Sekundy As Byte                                         'lcznik sekund timera oobsugi pomiarow
Dim Ton As Integer                                          'temp wl cwu
Dim Toff As Integer                                         'temp wyl cwu
Dim Hcwu As Integer                                         'histereza piec - cwu
Dim Hdach As Integer                                        'histereza dach - cwu
Dim Tdoccwu As Integer                                      'temperatura docelowa cwu
Dim Hbyte(1) As Byte                                        'bit1  praca lato (1)/zima (0) (zalacza grzejniki tylko do schlodzenia pieca gdy sie zagotuje w lecie)
                                                              'bit2 czy ma dzialac pompka kolektora - jest w niej chlodziwo
Dim Prio As Bit                                             'priorytet cwu gdy 1
Dim Menu As Byte                                            'zmienna pozycji meny
Dim Znaki(2)as String * 1
Dim B As Byte                                               ' ustawienie do wyswietlania nastawy w menu

Config 1wire = Portc.5                                      'czujnik 1
Config 1wire = Portc.4                                      'czujnik 2
Config 1wire = Portc.3                                      'czujnik3
Config 1wire = Portc.2                                      'czujnik 4

Config Pind.5 = Output                                      'p1 cwu-dach
Config Pind.6 = Output                                      'p2 cwu-piec
Config Pind.7 = Output                                      'p3 piec-grzejniki
Config Pind.4 = Input                                       's1 +
Config Pind.3 = Input                                       's2 -
Config Pind.2 = Input                                       's3 enter

Speaker Alias Portc.1

Config Lcd = 16 * 4
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , Rs = Portb.1 , E = Portb.0
Sound Speaker , 1000 , 155

Readeeprom Ton , 1                                          'odczyt z eeproma ustawionych zmiennych
Readeeprom Toff , 3
Readeeprom Hcwu , 5
Readeeprom Hdach , 7
Readeeprom Tdoccwu , 9
Readeeprom Hbyte(1) , 11

Cursor Off
Cls
Locate 1 , 1 : Lcd "Temp wl pompki"
B = Ton / 10
Locate 2 , 1 : Lcd "C.O.: " ; B ; Chr(0)
Locate 3 , 1 : Lcd "Temp wyl pompki"
B = Toff / 10
Locate 4 , 1 : Lcd "C.O.: " ; B ; Chr(0)
Wait 3
Cls
Locate 1 , 1 : Lcd "Histereza"
B = Hcwu / 10
Locate 2 , 1 : Lcd "Piec - CWU: " ; B ; Chr(0)
Locate 3 , 1 : Lcd "Histereza"
B = Hdach / 10
Locate 4 , 1 : Lcd "Dach - CWU: " ; B ; Chr(0)
Wait 3
If Hbyte(1).1 = 1 Then
   G(1) = "lato"
Else
   G(1) = "zima"
End If
If Hbyte(1).2 = 1 Then
   G(2) = "wl"
Else
   G(2) = "wyl"
End If
Locate 1 , 1 : Lcd "Praca:" ; G(1)
Locate 2 , 1 : Lcd "Pompka dach:" ; G(2)
Locate 3 , 1 : Lcd "Temp doc prio"
B = Tdoccwu / 10
Locate 4 , 1 : Lcd "grzania cwu: " ; B ; Chr(0)
Wait 3


Config Timer1 = Timer , Prescale = 256                      'deklaracja timera 1 jako czasomierz
On Timer1 Przerwanie_co_1sek                                'deklaracja przerwania od przepełnienia timera 1
Enable Interrupts
Enable Timer1
Timer1 = 34286                                              'wpisanie wartości 34286 do timera

Sekundy = 0
Sek = 0
Prio = 0
Reset Portd.5
Reset Portd.6
Reset Portd.7

Do
                                                           'plus na ekr pomiarow zalacza priorytet cwu
If Pind.4 = 0 Then
   Prio = 1
   Cls
   Locate 1 , 1 : Lcd "Ok. Najpierw"
   Locate 2 , 1 : Lcd "zagrzeje cwu"
   B = Tdoccwu / 10
   Locate 3 , 1 : Lcd "do temp. " ; B ; Chr(0)
   Bitwait Portd.4 , Set
End If
                                                            'menu na ekr czuwania zalacza menu
If Pind.4 = 0 Then
   Bitwait Pind.4 , Set
      Menu = 1
     Gosub Menu
End If
                                                           'gdy timer zglosi sekunde
If Sek = 1 Then                                             'gdy to zerowa sekubda resetuj czjniki
   If Sekundy = 0 Then
         For I = 1 To 4
         T(i) = 0
         Next

         For I = 2 To 5
         1wreset Pinc , I
         1wwrite &HCC , 1 , Pinc , I
         1wwrite &H44 , 1 , Pinc , I
         Next
   End If


                                                              'gdy pierwsza sekunda odczytaj czujniki
   If Sekundy = 1 Then
         For I = 2 To 5
         1wreset Pinc , I
         1wwrite &HCC , 1 , Pinc , I
         1wwrite &HBE , 1 , Pinc , I

         T(a) = 1wread(2 , Pinc , I)
         If Err = 0 Then
         T(a) = T(a) * 10
         T(a) = T(a) / 16
         Tmp(a) = Str(t(a))
         If T(a) >= 0 Then
         Tmp(a) = Format(tmp(a) , "  0.0")
         Else
         Tmp(a) = Format(tmp(a) , " 0.0")
         End If
         Else
         Tmp(a) = "--X--"
         End If
         Next
   End If                                                   'Inkrementuj Sekundy I Do 10 Sekund Nie Rob Pomiarow

   Incr Sekundy
   If Sekundy = 10 Then
      Sekundy = 0
   End If
   Sek = 0                                                  'resetuj wskaznik dla timera

      If Hbyte(1).2 = 1 Then                                'gdy pompka wlaczona w menu
         X = T(1) + Hdach                                   'gdy dach jest cieplejszy od cwu
         If X > T(2) Then
            Set Portd.5
            P1 = 1
         Else
            Reset Portd.5
            P1 = 0
         End If
      Else
         Reset Portd.5
      End If


      X = T(3) + Hcwu                                       'temp pieca wyzsza od cwu o hcwu
      If X > T(2) Then
          Set Portd.6
          P2 = 1
      Else
          Reset Portd.6
          P2 = 0
      End If



      If T(2) > Tdoccwu Then                                ' jesli temp cwu osiagnela docelowa wartosc odblokuj pompke grzejnikow
         Prio = 0
      End If

                                                                   'jesli praca zima
   If Hbyte(1).1 = 0 Then
       If Prio = 0 Then
         If T(2) > Ton Then
           Set Portd.7
           P3 = 1
         Elseif T(2) < Toff Then
           Reset Portd.7
           P3 = 0
         End If
       End If
    Else                                                    ' praca lato -
      If T(3) > 800 Then
         Set Portd.7
         P2 = 1
      Else
         Reset Portd.7
         P2 = 0
      End If
   End If


Piktogramy:
   For I = 1 To 4
      Z(i) = 7
   Next

   If P1 = 1 Then
      If P2 = 1 Then
         Z(2) = 4
      Else
         Z(2) = 6
      End If
   Z(1) = 1
   End If

   If P2 = 1 Then
      If P3 = 1 Then
         Z(3) = 3
         Z(4) = 6
      Else
         Z(3) = 2
      End If
   Z(2) = 5
   End If

   If P3 = 1 And P2 = 0 And P1 = 0 Then
      Z(3) = 1
      Z(4) = 6
   End If
If Prio = 1 Then
   G(1) = "<<"
Else
   G(1) = "  "
End If

Locate 1 , 1 : Lcd "Dach=" ; Tmp(1) ; Chr(0) ; Chr(z(1)) ;
Locate 2 , 1 : Lcd "CWU =" ; Tmp(2) ; Chr(0) ; Chr(z(2)) ; G(1)
Locate 3 , 1 : Lcd "Piec=" ; Tmp(3) ; Chr(0) ; Chr(z(3)) ;
Locate 4 , 1 : Lcd "Dom =" ; Tmp(4) ; Chr(0) ; Chr(z(4)) ;

   If T(3) > 800 Then
      Sound Speaker , 1000 , 300
      Wait 2                                                ' nuta dzwiekowa
      Sound Speaker , 1000 , 300
   End If

Print T(1) ; "," ; T(2) ; "," ; T(3) ; "," ; T(4) ; "," ; P1 ; "," ; P2 ; "," ; P3

End If
Loop
                                                  'powrót z przerwania

End


Przerwanie_co_1sek:                                         'podprogram przerwania od przepełnienia timer1 'wywoływanego co 1 sekunde
Timer1 = Timer1 + 34286                                     'ustawienie początkowej wartości timera1 poprzez
Sek = 1
Return


Menu:
Do
If Portd.2 = 0 Then
   Bitwait Portd.2 , Set
      Incr Menu
End If


If Menu = 1 Then
    B = Ton / 10
    Locate 1 , 1 : Lcd "Temp wl. pompki"                    'to skacze do ustawiania wartości"Nastawa"
    Locate 2 , 1 : Lcd "grzejnikow:  " ; B ; Chr(0)
    If Portd.4 = 0 Then
        Ton = Ton + 10
        B = Ton / 10
        Locate 2 , 14 : Lcd B ; Chr(0)
        Bitwait Portd.4 , Set
    End If

    If Portd.3 = 0 Then
        Ton = Ton - 10
        B = Ton / 10
        Locate 2 , 14 : Lcd B ; Chr(0)
        Bitwait Portd.3 , Set
    End If

Elseif Menu = 2 Then
    Locate 1 , 1 : Lcd "Temp wyl. pompki"                   'to skacze do ustawiania wartości"Nastawa"
    Locate 2 , 1 : Lcd "grzejnikow:  " ; Toff ; Chr(0)
    If Portd.4 = 0 Then
        Toff = Toff + 10
        Locate 2 , 14 : Lcd Toff ; Chr(0)
        Bitwait Portd.4 , Set
    End If

    If Portd.3 = 0 Then
        Toff = Toff - 10
        B = Toff / 10
        Locate 2 , 14 : Lcd B ; Chr(0)
        Bitwait Portd.3 , Set
    End If

Elseif Menu = 3 Then
    Locate 1 , 1 : Lcd "Roznica temp."                      'to skacze do ustawiania wartości"Nastawa"
    Locate 2 , 1 : Lcd "PIEC - CWU:  " ; Hcwu ; Chr(0)
        If Portd.4 = 0 Then
        Hcwu = Hcwu + 10
        B = Hcwu / 10
        Locate 2 , 14 : Lcd B ; Chr(0)
        Bitwait Portd.4 , Set
    End If

    If Portd.3 = 0 Then
         Hcwu = Hcwu - 10
         Locate 2 , 14 : Lcd Hcwu ; Chr(0)
         Bitwait Portd.3 , Set
    End If

Elseif Menu = 4 Then
    Locate 1 , 1 : Lcd "Roznica temp"                       'to skacze do ustawiania wartości"Nastawa"
    Locate 2 , 1 : Lcd "DACH - CWU:  " ; Hdach ; Chr(0)
    If Portd.4 = 0 Then
         Hdach = Hdach + 10
         B = Hdach / 10
         Locate 2 , 14 : Lcd B ; Chr(0)
         Bitwait Portd.4 , Set
    End If

    If Portd.3 = 0 Then
         Hdach = Hdach - 10
         B = Hdach / 10
         Locate 2 , 14 : Lcd B ; Chr(0)
         Bitwait Portd.3 , Set
    End If

Elseif Menu = 5 Then
    If Hbyte(1).1 = 0 Then
       Znaki(1) = "<"
       Znaki(2) = " "
    Else
       Znaki(1) = " "
       Znaki(2) = "<"
    End If
    Locate 1 , 1 : Lcd "Grzanie z pieca:"                   'to skacze do ustawiania wartości"Nastawa"
    Locate 2 , 1 : Lcd "DOM + CWU" ; Znaki(1)
    Locate 3 , 1 : Lcd "TYLKO CWU" ; Znaki(2)
    If Portd.4 = 0 Then
         Toggle Hbyte(1).1
         Bitwait Portd.4 , Set
         If Hbyte(1).1 = 0 Then
            Znaki(1) = "<"
            Znaki(2) = " "
         Else
            Znaki(1) = " "
            Znaki(2) = "<"
         End If
         Locate 2 , 1 : Lcd "DOM + CWU" ; Znaki(1)
         Locate 3 , 1 : Lcd "TYLKO CWU" ; Znaki(2)
    End If

Elseif Menu = 6 Then
   If Hbyte(1).2 = 0 Then
       Znaki(1) = "<"
       Znaki(2) = " "
    Else
       Znaki(1) = " "
       Znaki(2) = "<"
    End If
    Locate 1 , 1 : Lcd "Grzanie z dachu:"                   'to skacze do ustawiania wartości"Nastawa"
    Locate 2 , 1 : Lcd "Wylaczone" ; Znaki(1)
    Locate 3 , 1 : Lcd "Wlaczone " ; Znaki(2)
    If Portd.4 = 0 Then
         Toggle Hbyte(1).2
         Bitwait Portd.4 , Set
         If Hbyte(1).2 = 0 Then
            Znaki(1) = "<"
            Znaki(2) = " "
         Else
            Znaki(1) = " "
            Znaki(2) = "<"
         End If
         Locate 2 , 1 : Lcd "Wylaczone" ; Znaki(1)
         Locate 3 , 1 : Lcd "Wlaczone " ; Znaki(2)
    End If

Elseif Menu = 7 Then
   Locate 1 , 1 : Lcd "Temperatura"                         'to skacze do ustawiania wartości"Nastawa"
   Locate 2 , 1 : Lcd "docelowa cwu:" ; Tdoccwu ; Chr(0)
      If Portd.4 = 0 Then
        Tdoccwu = Tdoccwu + 10
        B = Tdoccwu / 10
        Locate 2 , 14 : Lcd B ; Chr(0)
        Bitwait Portd.4 , Set
    End If

    If Portd.3 = 0 Then
        Tdoccwu = Tdoccwu - 10
        B = Tdoccwu / 10
        Locate 2 , 14 : Lcd B ; Chr(0)
        Bitwait Portd.3 , Set
    End If

Elseif Menu = 8 Then
   Locate 1 , 1 : Lcd "Wyjscie?"
     If Portd.4 = 0 Then
        Locate 2 , 1 : Lcd "Zapis ustawien"
        Writeeeprom Ton , 1                                 'odczyt z eeproma ustawionych zmiennych
        Writeeeprom Toff , 3
        Writeeeprom Hcwu , 5
        Writeeeprom Hdach , 7
        Writeeeprom Tdoccwu , 9
        Writeeeprom Hbyte(1) , 11
        Wait 1
        Return
     End If

End If
Loop

Awatar użytkownika
pimowo
Betatester
Posty: 4313
Rejestracja: czw lut 19, 2015 9:17 am
Lokalizacja: Wołów

Re: Sterownik C.W.U.

Post autor: pimowo » pn sie 29, 2016 8:50 am

Dzięki @bynio za kody. Teraz będzie mi łatwiej pomóc @swiezakowi :)
Mój NetTemp mieszka w Raspberry Pi 3B na szynie DIN

bynio
Posty: 79
Rejestracja: wt maja 13, 2014 6:32 am

Re: Sterownik C.W.U.

Post autor: bynio » pn sie 29, 2016 1:19 pm

Na upartego jak LCD niepotrzebny to i jakiś 8-pinowy kontroler dałby radę. Sam kod to niemal to samo co jest dostępne na elektrodzie czy innych portalach. Mój pomysł to umieszczenie obsługi DS-ów w pętli numerującej piny procesora z podłączonymi czujnikami (jedna procedura na 4 czujniki), oraz w konsekwencji wykluczenie konieczności numeracji i przypisywania czujników na jednym kablu jak to ma miejsce w większości listingów dostępnych w sieci. Miałem jeszcze pomysł umieszczeia czujników na jednym kablu i wybierania ich po programowanym ID (ds-y można zaprogramować i zamiast po fabrycznym id wyszukiwać na zaprogramowanej przez nas nazwie), ale brakło mi już chęci na zabawę

Szczerze powiem że jak miałbym 10 lat temu gotowy moduł za wartość porównywalną z obecnymi 27zł to odpuściłbym sobie własnoręczne klepanie sterownika.
Stąd też uważam że obecnie nie ma to większego sensu, chyba że autor tematu chciałby się czegoś sam nauczyć. Dostając "gotowca" od Ciebie @pimowo niewiele się nauczy, już lepiej pomyślcie jak zintegrować podany gotowy moduł z nettempem.

ODPOWIEDZ

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 3 gości