Termostat


Witam
Bardzo proszę o sprawdzenie schematu jaki stworzyłem.

/files/user_img/u43/termostat.JPG

Jest to termostat. Jego działanie miałoby polegać na ustawianiu temperatury za pomocą dwóch switchy(góra "+", dół "-"). Po przekroczeniu ustawionej temperatury ma przełączyć się przekaźnik.
Histereza będzie ustawiona programowo na 5 stopni C.
Natomiast po przekroczeniu 100 stopni ma zadziałać buzzer.

Na wyświetlaczu ma się pokazywać temperatura aktualna oraz nastawiona.
Proszę powiedzieć czy nie popełniłem gdzieś błędu? Krytyka jak najbardziej wskazana.

Z góry dziękuję za pomoc.
Pozdrawiam!




Portret użytkownika kaktus

Jeśli termostat ma "pilnować"

Jeśli termostat ma "pilnować" podgrzewacza wody w zamkniętym zbiorniku, to jak dla mnie to 100 stopni, to już o wiele za późno na alarm.
Co do schematu to polecę Ci dwie witrynki z artykułami po przeczytaniu których sam błędy/nieprawidłowości znajdziesz (-;

linka 1 -> o przekaźniku
linka 2 -> zasilanie ?C i nie tylko

Mówi się też że stan aktywny na porcie ?C to logiczne zero, więc ja bym leda zapiął do Vcc - to tylko sugestia.
Może też nie potrzebujesz rezonatora i możesz skorzystać z wewnętrznego oscylatora, mniej elementów będzie na PCB i może płytka będzie mniejsza.

Powodzenia (-;

kaktus

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika Chester

Skorzystałem z linków które

Skorzystałem z linków które podałeś i zmieniłem cały swój schemat. Teraz proszę o ocenę :)

/files/user_img/u43/Termostat.png

Portret użytkownika gosc

Chyba parę filmów jeszcze

Chyba parę filmów jeszcze obejrzałeś edukacyjnych, efekt piorunujący ((-;

Przypatrz się co wyszło z dławikiem.

kaktus

Portret użytkownika Chester

Kurcze masz rację jaka wpadka

Kurcze masz rację jaka wpadka :) już poprawione oraz pozmieniałem trochę z wyświetlaczem bo postanowiłem połączyć na przewodach.

/files/user_img/u43/Termostat_1.png

Jeszcze jest jeden problem: program. Posiadam program do mierzenia temperatury i pokazaniu wyniku na wyświetlaczu. Jeszcze nie testowałem czy działa.

$regfile = "m8def.DAT"                                      'deklaracja procesora, w tym wypadku Atmega8
$crystal = 8000000                                          'deklaracja cześtotlwiości pracy
'Deklaracja portów od wyświetlacza LCD
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
Cursor Off
 
'**** Termometr ****
Config 1wire = Portb.0
Dim I1 As Integer , Ss As String * 6
Dim I2 As Integer
Dim Dsid1(8) As Byte
Dim W As Byte
Dim B As Byte
W = 1wirecount()
Cls
Locate 1 , 1
Lcd W
Wait 1
Cls
 
 
If Dsid1(8) = Crc8(dsid1(1) , 7) Then
 Cls
 Lcd "  Czujnik 1 OK  "
 Wait 2
 Locate 1 , 1
 For B = 1 To 8
 Lcd Hex(dsid1(b))
 Next
 Wait 2
 End If
 
Cls
 
Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32             'znak stopnia Celsjusza
 
Do
 
   1wreset
   1wwrite &H55
   1wverify Dsid1(1)                                        'wysyłamy adres pierwszego czujnika
   1wwrite &HBE
   I1 = 1wread(2)
'---------------------------------
'--------konwersja temp dla wszystkich dsow
   1wreset
   1wwrite &HCC
   1wwrite &H44
 
   Wait 1
 
   I1 = I1 * 10
   I1 = I1 / 16
   'If I1 > 0 Then Cls         'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
   Ss = Str(i1)
   Ss = Format(ss , " 0.0")                                 'Pozycja wyświetlania nazwy i temperatury (1.1 -> 1 linia 1 kolumna, 2.10 -> 2 linia 10 kolumna itd)
   Locate 2 , 1
   Lcd "1" ; Chr(7) ; ": " ; Ss ; Chr(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ą
   Ss = Str(i2)
   Ss = Format(ss , " 0.0")                                 'Pozycja wyświetlania nazwy i temperatury (1.1 -> 1 linia 1 kolumna, 2.10 -> 2 linia 10 kolumna itd)
   Locate 2 , 1
   Lcd "2" ; Chr(7) ; ": " ; Ss ; Chr(0)
 
   Loop

Ale jeszcze trzeba wpisać histerezę 5 stopni i alarm oraz co jest najważniejsze możliwość nastawiania temperatury.
Czy posiada ktoś z Was jakiś programik na którym mógłbym się wzorować. Podpatrywałem program Mirka dotycząca wytrawiarki aby pojąć histerezę ale mam jeszcze z tym problem.
Proszę o pomoc i wskazówki.

Pozdrawiam :)

Portret użytkownika kaktus

Do tinny też powinno się

Do tinny też powinno się zmieścić. Co za różnica czy wyświetlacz na kabelku czy bezpośrednio przylutowany na PCB? Te same dziury musisz wiercić.

Z tą histerezą to chodzi o margines załączania wyłączania, żebyś grajka z przekaźnika nie zrobił.
Np. ustawiasz sobie temperaturę załączenia na 20 stopni, więc niech załącza jak jest poniżej czyli np 19,
a temperaturę wyłączenia na 30 stopni więc niech wyłącza powyżej np gdy będzie 31 stopni. Ważne aby przeciągnąć czas grzania ponad próg 30 stopni, o ileś tam stopni. I dogrzewać gdy temperatura będzie poniżej zakresu - progu.
To tylko mój przykład dla zobrazowania o co chodzi, chyba nie pogmatwałem

Sam coś napisz bo to nie jest skomplikowane.
powodzenia

kaktus

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika Chester

Mniej więcej wiem o co chodzi

Mniej więcej wiem o co chodzi z histerezą ale nie mam pojęcia jak to programowo rozwiązać.

Proszę o sprawdzenie programu, ponieważ wgrałem do procka i wyświetla mi temperaturę 0 stopni C, gdzie mam błąd?:

$regfile = "m8def.dat"
$crystal = 8000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config 1wire = Portb.0
Dim Temp(2) As Integer
Declare Sub Od
Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32
Cls
Do
Cursor Off
Locate 1 , 1
Lcd "TERMOMETR"
Call Od
If Temp(2) > 0 Then
Locate 2 , 1
Lcd "                "
Locate 2 , 1
Lcd "TEMP: -" ; Temp(1) ; Chr(0) ; "C"
Else
Locate 2 , 1
Lcd "                "
Locate 2 , 1
Lcd "TEMP: " ; Temp(1) ; Chr(0) ; "C"
End If
Wait 1
Loop
End
Sub Od
1wreset
1wwrite &HCC
1wwrite &H44
Waitms 750
1wreset
1wwrite &HCC
1wwrite &HBE
Temp(1) = 1wread(2)
1wreset
If Temp(2) > 0 Then
Temp(1) = 256 - Temp(1)
End If
Temp(1) = Temp(1) / 16
End Sub

Fusebity ustawione na wewnętrzny oscylator 8MHz.

Portret użytkownika kaktus

Jak dla mnie to zgwałciłeś

Jak dla mnie to zgwałciłeś DS-a bez gry wstępnej i ostrzeżenia, na siłę.
Teraz się dziwisz że ma krzywą minę ((-;

Opowiedz mi szczegółowo jak teoretycznie ma wyglądać komunikacja - odpytywanie tego układu scalonego.
Jak nie wiesz to pewno mirlej gdzieś to tu opisał, ewentualnie nota katalogowa i teraz wiesz czemu noty są takie ważne - to przepisy postępowania na "udany seks" ze scalakami.

Opisz jak ma działać Twój termostat.

kaktus

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika Chester

Czyli DS "kaput"? Chciałem

Czyli DS "kaput"?

Chciałem sprawdzić i nauczyć się pomiaru temperatury oraz wyświetlania jej na wyświetlaczu. Tylko z tym pomiarem jest coś nie tak :(
DS'a podłączyłem jak na moim schemacie tylko testowo do nóżki PB.0, i niestety program pokazuję non stop "0" stopni.

Termostat:
W pierwszej linii wyświetlacza chciałem aby się wyświetlała zmierzona przez czujnik temperatura np: TEMP: 25,0 C
W drugiej linii wyświetlacza chciałem aby się wyświetlała ustawiona temperatura np: NAST: 28,0 C

Gdy temperatura mierzona osiągnie zadaną zmienia sie stan na jednej z nóżek procesora, przekaźnik przełącza styki i zapala się dioda led. Histereza 5 stopni czyli temperatura musi spać 5 stopni mniej niż zadana wtedy przekaźnik wraca do pozycji pierwotnej.

Dodatkowa funkcja to buzer który się włącza po określonej programowo temperaturze.

Portret użytkownika kaktus

Czujnik cyfrowy pewno

Czujnik cyfrowy pewno sprawny.

Problem polega na tym że nie wiesz jak go obsłużyć.
Aby z powodzeniem uruchomić projekt, musisz posiadać wiedzę teoretyczną na temat tego cyfrowego układu scalonego.
Czyli musisz nauczyć się "gadać" za pomocą ?C, z tym scalonym czujnikiem. BEZ TEGO ANI RUSZ.

Dlatego ponawiam prośbę: Opowiedz mi szczegółowo jak teoretycznie ma wyglądać komunikacja - odpytywanie tego układu scalonego.

A na święta przyjmij ode mnie życzenia -> Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.

((-;

kaktus

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika Chester

Dziękuję za życzenia mistrzu

Dziękuję za życzenia mistrzu YODA:)
Tobie również życzę Wszystkiego Dobrego i jeszcze więcej cierpliwości w nauczaniu i pomocy innym :)

Napisałem nowy program :) niestety temperatura jaką wskazuję to: -0,06 C. Wzorowałem się na opisie: http://mirley.firlej.org/obsluga_ds18x20

Gdzie popełniam błąd bo nie rozumiem :(

$regfile = "m8def.dat"
$crystal = 8000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config 1wire = Portb.0
Deflcdchar 0 , 14 , 10 , 14 , 32 , 32 , 32 , 32 , 32
Cls
Cursor Off Noblink
 
Dim Lsb As Byte
Dim Msb As Byte
Dim T As Single
Dim Tekst As String * 6
 
 
Do
 1wreset
   1wwrite &HCC
   1wwrite &H44
   Waitms 250
   Waitms 250
 
   1wreset
 
   1wwrite &HCC
   1wwrite &HBE
 
   Lsb = 1wread():
   Msb = 1wread():
   T = Msb * 256
   T = T + Lsb
   T = T / 16
   If Msb.7 = 1 Then T = T - 4096
   Tekst = Fusing(t , "#.##")
 
   Cls
   Lcd "TEMP: " ; Tekst ; Chr(0) ; "C"
Loop

Portret użytkownika kaktus

chymmmm, nie masz się

chymmmm, nie masz się wzorować tylko zrozumieć co i z czego wynika a jak już będziesz wiedział to wtedy możesz spróbować się wzorować, ale podejrzewam że nie będzie to już konieczne.

No więc skoro nie chcesz mi teoretycznie opowiedzieć to może ja trochę zacznę ;-ppp

aby 1wire działało to szyna musi mieć pull-up i to tyle jeśli chodzi o hardware. Czujnik musisz zasilić odpowiednim (prawidłowym) napięciem.

Cyfrowy czujnik DS może pracować nazwijmy to w dwóch "konfiguracjach sprzętowych" - pasożytniczej (podłączenie na dwóch kablach) i zwykłej (podłączenie na trzech kablach). Jak będziesz chciał wiedzieć jakie są konsekwencje jednego i drugiego podłączenia to poczytaj, bo różnice są duże.

Teraz trochu o samym czujniku scalonym.
Po pierwsze, musisz z czujnikiem dogadać się aby zmierzył i prze konwertował dla Ciebie temperaturę na wartość którą jesteś w stanie przetworzyć w swoim systemie ?C. I powiedzmy że to jest pierwszy etap. Tu musisz wiedzieć że zajmuje to odpowiednią ilość czasu i dla ?C to wcale nie jest mało, bo można powiedzieć że trwa prawie jedną sekundę.
Po drugie, gdy DS już upora się z tymi obliczeniami, może już odesłać konkretne dane pomiarowe.
Więc znowu możesz się z nim dogadać za pośrednictwem ?C i "zażądać" wysłania tych danych, po czym je odebrać. Jak już je odbierzesz to możesz z nimi robić co uznasz za stosowne. ((-; Czyli np przystąpić do konwersji temperatury na wartości, do jakich jesteśmy przyzwyczajeni.

Najważniejsze naświetliłem szczegóły DOCZYTAJ, a gwarantuję że termometr będzie działał bezproblemowo i rewelacyjnie, i będziesz miał w dodatku satysfakcję z samodzielnej pracy, która zaowocuje w przyszłości.
Mogę jeszcze poradzić aby odczytów nie wykonywać zbyt często, być może unikniesz wtedy problemów.

Mam nadzieję że nie byłeś "leniuchem" i poczytałeś co mirley ładnie opisał w artykule -> o tutaj
jego znalezienie zajęło mi a właściwie wujowi google (0,25 s), przy okazji znalazł jeszcze Około 16,300 wyników obsługując moje zapytanie "zasada działania ds18b20"

owocnej pracy

kaktus

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika Chester

Czy do wyświetlania

Czy do wyświetlania temperatury nie jest potrzebne podłączenie nóżki wyświetlacza nr 15 z jedną z nóżek procesora z wykorzystaniem tranzystora? Obecnie mam to połączone do zasilania poprzez rezystor. Czy to nie przeszkadza?

Portret użytkownika kaktus

Odpowiem byle jak, znaczy tak

Odpowiem byle jak, znaczy tak jak się nie powinno - pytaniem.

co to jest nóżka nr 15 wyświetlacza?
Pytanie 2
jaki ma związek ten pin z temperaturą?

kaktus

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika Chester

hehe wiedziałem że to głupie

hehe wiedziałem że to głupie pytanie no ale sprecyzuje nóżka 15 i 16 w moim wyświetlaczu jest odpowiedzialna za podświetlenie tyle że masz rację co to na wspólnego z wyświetlaniem temperatury :) zapomnijmy o tym idę się bardziej dokształcać z ds18b20

Portret użytkownika kaktus

I tak trzymaj. ps żadne

I tak trzymaj.

ps
żadne pytanie nie jest głupie, niekiedy wynika z niewiedzy pytającego.

kaktus

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika Chester

Masakra z tym

Masakra z tym DS'em.

Nauczyłem się tyle, że wysyłam polecenie do ds'a żeby zmierzył temperaturę i prze konwertował, później odczekuję 750 ms i wysyłam aby odczytać temperaturę, miejscami odpowiednio resetując ds'a:

1wreset
 
   1wwrite &HCC
   1wwrite &H44
   Waitms 750
 
 1wreset
 
   1wwrite &HCC
   1wwrite &HBE

wiem, że do odczytu potrzebuję tylko dwóch bajtów. Ale za cholerę nie mogę rozkminić jak zrobić te wszystkie obliczenia dla temperatur mając ustawiony wewnętrzny oscylator na 8MHz oraz jak uporać się z ujemną temperaturą. Czy mogę prosić o jakąś wskazówkę? Napisałem już 6 programów. W niektórych wyświetla mi temperaturę 0,5C albo -0,1C albo 4095,9C. Gdzie popełniam błąd?
Fuse Bity ustawiam tak: http://mirley.firlej.org/files/ART_fuseM8_03B.gif

Portret użytkownika kaktus

A czy zapoznałeś się z

A czy zapoznałeś się z linkiem zawierającym opis tego wszystkiego, z mojej poprzedniej wypowiedzi. Mirley to wszystko ładnie wytłumaczył.
Po za tym nie resetujesz układu scalonego tylko magistralę. (-;

Dobrze Ci idzie, już prawie skończyłeś.

kaktus

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika Chester

Dobra czegoś tu nie rozumiem

Dobra czegoś tu nie rozumiem :(
Przepisałem program z książki M.Wiązania:

$regfile = "m8def.dat"
$crystal = 8000000
 
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
 
Config 1wire = Portb.0
 
Declare Sub Odcz_temp
Dim Temperatura(2) As Byte
Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32
 
Do
   Call Odcz_temp
   Cls
   If Temperatura(2) = 0 Then
 
      Lcd "Temp: " ; Temperatura(1) ; Chr(0) ; "C"
   Else
 
      Lcd "Temp: -" ; Temperatura(1) ; Chr(0) ; "C"
   End If
Loop
End
 
Sub Odcz_temp
 
   1wreset
   1wwrite &HCC
   1wwrite &H44
   Waitms 750
   1wreset
   1wwrite &HCC
   1wwrite &HBE
 
   Temperatura(1) = 1wread(2)
 
   1wreset
   If Temperatura(2) > 0 Then
 
      Temperatura(1) = 256 - Temperatura(1)
   End If
   Temperatura(1) = Temperatura(1) / 2
 
End Sub

Wyświetlacz pokazuję że nie mam układu podpiętego :( Jeżeli obrócę o 180 stopni czujnik czyli gnd podepnę do +5V to wtedy wyświetla się temperatura -1205 stopni.

Natomiast gdy wgram program:

$regfile = "m8def.dat"
$crystal = 8000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config 1wire = Portb.0
Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32
Cls
Cursor Off Noblink
 
Dim Lsb As Byte
Dim Msb As Byte
Dim T As Single
Dim Tekst As String * 8
 
 
Do
 1wreset
 
   1wwrite &HCC
   1wwrite &H44
   Waitms 750
 
 1wreset
 
   1wwrite &HCC
   1wwrite &HBE
 
   Lsb = 1wread(2)
   Msb = 1wread(2)
 
 1wreset
 
   T = Msb * 256
   T = T + Lsb
   T = T / 16
 
 If Msb = 0 Then
   T = Lsb / 2
 End If
 
   Tekst = Fusing(t , "#.#")
 
 
   Cls
   Locate 1 , 1
   Lcd "TERMOMETR"
   Locate 2 , 1
   Lcd "TEMP: " ; Tekst ; Chr(0) ; "C"
   Waitms 750
Loop
End

To wyświetla się temperatura 4095 C. Natomiast gdy obrócę dallasa o 180 stopni to wyświetla 1207 stopni C i spada natomiast po dotknięciu palcami temperatura rośnie i są zauważalne jakieś reakcje.
Zgłupiałem :(

Portret użytkownika kaktus

Nie kombinuj tylko czytaj i

Nie kombinuj tylko czytaj i myśl to nie boli.
Te listingi do tego zmuszają jak bezmyślnie przepiszesz i dobrze to zrobiłeś to drugi źle temperaturę wyliczy (choć zastosowany algorytm jest poprawny), i po co tyle tych 1wirereset, poczytaj kiedy i poco się je stosuje.
z helpa avr

Quote:
1WRESET
Action
This statement brings the 1wire pin to the correct state, and sends a reset to the bus.

ponieważ nie odpowiedziałeś zapytam ponownie, czytałeś artykuł mirleya?

kaktus

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika Chester

KOD $regfile =

KOD

$regfile = "m8def.dat"
$crystal = 8000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config 1wire = Portb.0
Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32
Cls
Cursor Off Noblink
 
Dim Lsb As Byte
Dim Msb As Byte
Dim T As Single
Dim Tekst As String * 8
 
 
Do
 1wreset
 
   1wwrite &HCC
   1wwrite &H44
   Waitms 750
 
 1wreset
 
   1wwrite &HCC
   1wwrite &HBE
 
   Lsb = 1wread()
   Msb = 1wread()
 
   T = Msb * 256
   T = T + Lsb
   T = T / 16
 
 If Msb = 0 Then
   T = Lsb / 2
 End If
 
   Tekst = Fusing(t , "#.#")
 
 
   Cls
   Locate 1 , 1
   Lcd "TERMOMETR"
   Locate 2 , 1
   Lcd "TEMP: " ; Tekst ; Chr(0) ; "C"
   Waitms 750
Loop
End

Portret użytkownika Chester

2xDS18B20

Witam Wszystkich!

Do swojego programu dodałem drugi czujnik Ds'a ale nie potrafię ogarnąć tego programowo.

Proszę o pomoc i wskazówkę gdzie robię błąd.

KOD:

$regfile = "m8def.dat"                                      'deklaracja procesora, w tym wypadku Atmega8
$crystal = 8000000                                          'deklaracja cześtotlwiości pracy (wew oscylator 1MHz w zupełności wystarcza)
 
'*******************************************************************************
 
Config Lcd = 16 * 2
Config Lcdpin = Pin , Rs = Portc.5 , E = Portc.4 , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0
Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32
 
'*************************************WAŻNE*************************************
 
Config Portb.1 = Input
Portb.1 = 1
Config Portb.2 = Input
Portb.2 = 1
Config Portb.3 = Input
Portb.3 = 1
Config Portb.4 = Output
Portb.4 = 0
Config Portb.5 = Output
Portb.5 = 0
Config Portd.6 = Output
Portd.6 = 1
Config Portd.7 = Output
Portd.7 = 0
Config 1wire = Portb.0                                      'deklaracja portu na którym będą podpięte DS18b20
 
'*******************************************************************************
 
Dim Liczba As Single
Dim Eliczba As Eram Single At 2
Dim Buzz As Single
Dim Ebuzz As Eram Single At 8
Dim Hist As Single
Dim Tmin As Single
 
Dim Lsb As Byte
Dim Msb As Byte
Dim Tempa1 As Single
Dim Tempa2 As Single
Dim Tekst1 As String * 4
Dim Tekst2 As String * 4
 
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
 
Dim B As Byte                                               'deklaracja zmiennej do odczytu kodów ID
Dim W As Byte                                               'deklaracja zmiennej do odczytu ilośc czujników
 
Led1 Alias Portb.4
Led2 Alias Portb.5
Przek Alias Portd.7
Buzzer Alias Portd.6
 
Declare Sub Menu
Declare Sub Zapis
 
Hist = 5
 
Cls
Cursor Off
 
Lcd "   Termostat    "
Lowerline
Lcd "  do pieca C.O. "
Wait 2
 
Cls
 
W = 1wirecount()
Lcd "Ilosc czujnikow:"                                      'Informuje ile czujników jest podpiętych do układu (pojawia się tylko podczas włączania urządzenia)
Waitms 500
Lowerline
Lcd W
Wait 3
Cls
Dsid1(1) = 1wsearchfirst()                                  'Znajdź pierwszy czujnik podpięty do portu
Dsid2(1) = 1wsearchnext()                                   'Znajdź kolejny czujnik podpięty do portu
 
 
'*******************Odczyt numerów ID czujników temperatury*********************
 
If Dsid1(8) = Crc8(dsid1(1) , 7) Then                       'ta opcja pojawia się tylko przy włączaniu urządzenia
 Locate 1 , 1
 Lcd "OK Czujnik 1 ID:"
 Wait 1
 Locate 1 , 1
 For B = 1 To 8
 Lcd Hex(dsid1(b))
 Next
End If
Wait 2
 
If Dsid2(8) = Crc8(dsid2(1) , 7) Then
 Locate 2 , 1
 Lcd "OK Czujnik 2 ID:"
 Wait 1
 Locate 2 , 1
 For B = 1 To 8
 Lcd Hex(dsid2(b))
 Next
End If
Wait 2
 
 
Cls
 
'*******************koniec odczytu ID czujników temperatury*********************
 
Do
 
'****************** Program sterownika *****************************************
 
         Locate 1 , 1
         Lcd "PIEC: " ; Tempa1 ; Chr(0) ; "C"
         Locate 2 , 1
         Lcd "BOJLER: " ; Tempa2 ; Chr(0) ; "C"
         Waitms 100
 
   1wreset
   1wwrite &HCC
   1wwrite &H44
   Waitms 250
   Waitms 250
 
   1wreset
   1wwrite &H55
   1wwrite Dsid1(1) , 8
   1wwrite &HBE
 
   Lsb = 1wread():
   Msb = 1wread():
 
   Tempa1 = Msb * 256
   Tempa1 = Tempa1 + Lsb
   Tempa1 = Tempa1 / 16
 
   Tekst1 = Fusing(tempa1 , "#.#")
 
'---------------------------------
   1wreset
   1wwrite &H55
   1wwrite Dsid2(1) , 8
   1wwrite &HBE
 
   Lsb = 1wread():
   Msb = 1wread():
 
   Tempa2 = Msb * 256
   Tempa2 = Tempa2 + Lsb
   Tempa2 = Tempa2 / 16
 
   Tekst2 = Fusing(tempa2 , "#.#")
 
'*******************************************************************************
 
Tmin = Liczba - Hist
 
Readeeprom Liczba , Eliczba
Readeeprom Buzz , Ebuzz
 
If Tempa1 > Liczba Then
             Przek = 1
                Led1 = 1
                Led2 = 0
End If
 
 
If Tempa1 < Tmin Then
             Przek = 0
               Led1 = 0
               Led2 = 1
End If
 
 
If Tempa1 > Buzz Then
            Buzzer = 0
End If
 
 
If Tempa1 < Buzz Then
            Buzzer = 1
End If
 
'*******************************************************************************
 
If Pinb.3 = 0 Then
      Waitms 200
      Gosub Menu
End If
 
Loop
 
End
 
'****************** Ustawienie MENU  *******************************************
 
Menu:
 
         Locate 1 , 1
         Lcd "  GRANICA TEMP "
         Locate 2 , 1
         Lcd "USTAW: " ; Liczba ; Chr(0) ; "C"
         Waitms 200
 
     Do
 
         Locate 2 , 1
         Lcd "USTAW: " ; Liczba ; Chr(0) ; "C"
 
     If Pinb.1 = 0 Then
         Incr Liczba
         Waitms 200
     End If
 
     If Pinb.2 = 0 Then
         Decr Liczba
         Waitms 200
     End If
 
     If Liczba > 80 Then Liczba = 80
     If Liczba < 20 Then Liczba = 20
 
     If Pinb.3 = 0 Then
          Waitms 200
          Exit Do
     End If
 
     Loop
 
 
         Locate 1 , 1
         Lcd "     ALARM!     "
         Locate 2 , 1
         Lcd "USTAW: " ; Buzz ; Chr(0) ; "C"
         Waitms 200
 
     Do
 
         Locate 2 , 1
         Lcd "USTAW: " ; Buzz ; Chr(0) ; "C"
 
     If Pinb.1 = 0 Then
         Incr Buzz
         Waitms 200
     End If
 
     If Pinb.2 = 0 Then
         Decr Buzz
         Waitms 200
     End If
 
     If Buzz > 100 Then Buzz = 100
     If Buzz < 30 Then Buzz = 30
 
 
     If Pinb.3 = 0 Then
          Gosub Zapis
          Waitms 200
          Exit Do
     End If
 
     Loop
 
Return
 
'****************** Zapis danych ***********************************************
 
Zapis:
 
     Writeeeprom Liczba , Eliczba
     Writeeeprom Buzz , Ebuzz
     Cls
Return
 
'*******************************************************************************

Jak program rusza sprawdza numery ds'ów. Jak mogę je wykorzystać?
DS1: 2824945304000012
DS2: 2895CCAE0300001F

Z góry wielkie dzięki za pomoc :)

Pozdrawiam!

Portret użytkownika gosc

trochę teorii

nie oglądałem programu, zafunduję Tobie trochę z grubsza partię teorii do wykorzystania.
Otóż jak wiesz 1wire to magistrala dwukierunkowa, na której mogą pracować różne "węzły" (urządzenia). Aby był ład ?C za każdym razem musi wysyłać adres do tego z którym chce "pogadać" aby reszta "nie przeszkadzała". I tak masz dwa układy scalone podległe ?C. Tu pamiętaj że aby ?C odczytał temperaturę z DS robimy to dwuetapowo z zachowaniem wymaganej odpowiedniej przerwy.
Teraz musisz się zdecydować czy chcesz mieć jedną magistralę 1wire (tak pewno wybrałeś) i na niej dwa układy podległe, wtedy musisz posługiwać się ich identyfikatorami. ID możesz po ich odczytaniu i identyfikacji wpisać w kodzie na "sztywno" bądź stworzyć "inteligentny" kawałek programu.
Odmiennym rozwiązaniem być może dla Ciebie na tym etapie wygodniejszym, jest zrobienie dwóch magistral 1wire z pojedynczymi układami wykonawczymi, odpada wtedy adresowanie i identyfikacja ID.
Składnia polecenia

Quote:
1WWRITE var1 , bytes , port , pin
umożliwia taką pracę. Scalaki DS podpinasz wtedy do osobnych pinów GPIO.
Ot z grubsza cała tajemnica sukcesu.

Mirley opracował helpa z podstawowymi "zagadnieniami" obsługi DS-a na 1wire, w rozwiązaniu które najprawdopodobniej zastosowałeś - jedna magistrala.

kaktus