Kilka DS18B20 na kilku pinach AVR

Pytania, kody i porady dotyczące nie tylko Bascom.
ODPOWIEDZ
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Kilka DS18B20 na kilku pinach AVR

Post autor: pimowo » 29 maja 2016, 19:20

Chciałbym sobie zrobić odczyt kilku temperatur na AVR (ATmega328P) i mam mały problem bo wszędzie są przykłady jak to zrobić w BASCOM, ale na jednym pinie AVR jest kilka DS18B20. Ja chciałbym zrobić tak, że każdy DS ma swój osobny pin w AVR.
Nie wiem czy dobrze myślę, ale takim sposobem odpadnie problem adresowaniem i tym podobne. Nawet jak któryś DS padnie to nic się nie rozjedzie.

Czy da się coś takiego zrobić czy to jest jakiś dziwny, chory pomysł i dlatego nie mogę znaleźć przykładów jak to się robi? ;)
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Kilka DS18B20 na kilku pinach AVR

Post autor: niveasoft » 29 maja 2016, 19:32

Przykład jest na mojej stronie pod przyciskiem "Kody różne" i tam jest kod do czterokanałowego termometru z każdym DS`em na oddzielnym pinie. Słabo się rozglądasz ;)
Jest "wygodniej" kiedy DS`y są obok siebie, po kolei w jednym porcie.
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Kilka DS18B20 na kilku pinach AVR

Post autor: pimowo » 29 maja 2016, 19:43

niveasoft pisze:Przykład jest na mojej stronie pod przyciskiem "Kody różne" i tam jest kod do czterokanałowego termometru z każdym DS`em na oddzielnym pinie. Słabo się rozglądasz ;)
Jest "wygodniej" kiedy DS`y są obok siebie, po kolei w jednym porcie.
Jest! Jakoś go przeoczyłem ;)

Masz może coś takiego sprytnego dla DHT11/22?
Tzn. jeden DHT, jeden pin ;)
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Kilka DS18B20 na kilku pinach AVR

Post autor: pimowo » 29 maja 2016, 23:55

Zmajstrowałem kod według Twoich wskazówek dla DS18B20 i znalazłem kod dla DHT u @kaktusa. Wydaje się być wszystko OK, ale czy na pewno takie jest? :) $regfile = "m328pdef.dat" $crystal = 11059200 $baud = 19200 $hwstack = 128 $swstack = 64 $framesize = 64 Config Submode = New Config Timer0 = Timer , Prescale = 1024 , Compare A = Disconnect , Compare B = Disconnect , Clear Timer = 1 Enable Compare0a : On Compare0a Int_10ms Nosave : Compare0a = 107 '10ms @11MHz 107 Dim 10ms As Byte , 100ms As Byte , 1s As Byte Dim T As Integer , S As String * 5 Dim Temp_slonce As String * 5 , Temp_zew As String * 5 , Temp_grunt As String * 5 Dim Humid As Byte , Sensor_data As String * 40 , Tmp_str8 As String * 8 , Count As Byte Config Portb.0 = Output : Portb.0 = 0 : Esp_zasilanie Alias Pinb.0 '-- Temperatura Sub Temperatura(byval N As Byte) 1wreset Pind , N 1wwrite &HCC , 1 , Pind , N 1wwrite &HBE , 1 , Pind , N T = 1wread(2 , Pind , N) T = T * 10 T = T / 16 S = Str(t) S = Format(s , "##.#") Select Case N Case 4 Temp_slonce = S Case 5 Temp_zew = S Case 6 Temp_grunt = S End Select 1wreset Pind , N 1wwrite &HCC , 1 , Pind , N 1wwrite &H44 , 1 , Pind , N End Sub '-- Wilgotnoœæ Dht_put Alias Portd.7 Dht_get Alias Pind.7 Dht_io_set Alias Ddrd.7 Sub Dht Count = 0 Sensor_data = "" Set Dht_io_set Reset Dht_put Waitms 25 Set Dht_put Waitus 40 Reset Dht_io_set Waitus 40 If Dht_get = 1 Then Humid = 1 Exit Sub End If Waitus 80 If Dht_get = 0 Then Humid = 2 Exit Sub End If While Dht_get = 1 : Wend Do While Dht_get = 0 : Wend Waitus 30 If Dht_get = 1 Then Sensor_data = Sensor_data + "1" While Dht_get = 1 : Wend Else Sensor_data = Sensor_data + "0" End If Incr Count Loop Until Count = 40 Set Dht_io_set Set Dht_put Tmp_str8 = Left(sensor_data , 8) Humid = Binval(tmp_str8) End Sub Enable Interrupts Print "START" Do If 10ms = 1 Then 10ms = 0 If 100ms < 100 Then Incr 100ms Else 100ms = 0 If 1s < 59 Then Incr 1s Else 1s = 0 Set Esp_zasilanie Call Temperatura(4) Call Temperatura(5) Call Temperatura(6) Call Dht Print Temp_slonce ; " " ; Temp_zew ; " " ; Temp_grunt ; " " ; Humid Waitms 1000 Reset Esp_zasilanie End If End If End If Loop End Int_10ms: $asm PUSH R24 !in R24, sreg PUSH R24 $end Asm 10ms = 1 'Tuned with NoSave Tool $asm POP R24 !out sreg, r24 POP R24 $end Asm Return EDYTA
Jednak mam coś nie tak...
Gdy odłączę AVR od prądu i za chwilę znów podłączę to wszystkie temperatury mam 85st a wilgotność 0% ;(
Drugi i każdy następny odczyt jest już OK.
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Kilka DS18B20 na kilku pinach AVR

Post autor: niveasoft » 30 maja 2016, 22:58

Pierwszy pomiar i tak uruchamiasz dopiero po 1 sekundzie więc możesz dopisać prosty Sub który uruchomisz przed wejściem do tej głównej petli.
Dallasy przygotuja już odczyty i kiedy je zapytasz po sekundzie wyniki będą gotowe. Dim Dallas As Byte Sub Init_pomiar(byval N As Byte) 1wreset Pind , N 1wwrite &HCC , 1 , Pind , N 1wwrite &H44 , 1 , Pind , N End Sub For Dallas = 4 To 6 Call Init_pomiar(Dallas) Next N Nie rozumiem tylko po co zostawiłeś te Waitms 1000 skoro używasz już Timera
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Kilka DS18B20 na kilku pinach AVR

Post autor: pimowo » 31 maja 2016, 8:40

niveasoft pisze:Nie rozumiem tylko po co zostawiłeś te Waitms 1000 skoro używasz już Timera
Zrobiłem tak ponieważ AVR ma działać tak:
1. ciągłe zbieranie impulsów z sensorów wiatru i deszczu
2. co minutę:
- włącz ESP
- zrób pomiary
- wyślij do ESP
- odczekaj aż ESP wyśle dane (Waitms 1000)
- wyłącz ESP

Analizowałem Twój projekt ESP + ThingSpeak-pomysł super bo wszystkim zajmuje się AVR, ale mój mały rozumek tego nie ogarnia :(
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Kilka DS18B20 na kilku pinach AVR

Post autor: niveasoft » 31 maja 2016, 9:04

No to po to tu klikamy żeby ludzie nauczyli się inaczej patrzeć na sprawy programowania. Trzeba się nauczyć trochę sprytu.
Nie chcemy by program tam utknął na sekundę bo potem bedzie to na pewno przeszkadzać w jego rozbudowie.
Masz tak podzielone programowe odmierzanie czasu że możesz przecież te sekundę odliczyć gdzie indziej.

Na dodatek przerobiłem program tak, by odczyty były sprzed sekundy, świeże ;)
Tak więc jeśli w 60 sekundzie sprawdzamy odczyty to dlaczego nie zainicjować pomiarów w 59 sekundzie ;)
Tak wiec też zrobiłem.
Dodatkowo ustawiam jedną zmienną do odmierzenia czasu do wyłączenia ESP.
Równie dobrze mogłoby tam pisać "Odczekaj = 2" i wtedy tylko tam gdzie program jest co sekundę napisałbym "If Odczekaj > 0 Then Decr Odczekaj" itd.. $regfile = "m328pdef.dat" $crystal = 11059200 $baud = 19200 $hwstack = 128 $swstack = 64 $framesize = 64 Config Submode = New Config Timer0 = Timer , Prescale = 1024 , Compare A = Disconnect , Compare B = Disconnect , Clear Timer = 1 Enable Compare0a : On Compare0a Int_10ms Nosave : Compare0a = 107 '10ms @11MHz 107 Dim 10ms As Byte , 100ms As Byte , 1s As Byte Dim T As Integer , S As String * 5 Dim Temp_slonce As String * 5 , Temp_zew As String * 5 , Temp_grunt As String * 5 Dim Humid As Byte , Sensor_data As String * 40 , Tmp_str8 As String * 8 , Count As Byte Dim Odczekaj As Byte Config Portb.0 = Output : Portb.0 = 0 : Esp_zasilanie Alias Pinb.0 '-- Temperatura Sub Temperatura(byval N As Byte) 1wreset Pind , N 1wwrite &HCC , 1 , Pind , N 1wwrite &HBE , 1 , Pind , N T = 1wread(2 , Pind , N) T = T * 10 T = T / 16 S = Str(t) S = Format(s , "##.#") Select Case N Case 4 Temp_slonce = S Case 5 Temp_zew = S Case 6 Temp_grunt = S End Select '## Pomiary bedą uruchamiane na 1s przed odczytem '1wreset Pind , N '1wwrite &HCC , 1 , Pind , N '1wwrite &H44 , 1 , Pind , N End Sub '-- Wilgotno?a Dht_put Alias Portd.7 Dht_get Alias Pind.7 Dht_io_set Alias Ddrd.7 Sub Dht Count = 0 Sensor_data = "" Set Dht_io_set Reset Dht_put Waitms 25 Set Dht_put Waitus 40 Reset Dht_io_set Waitus 40 If Dht_get = 1 Then Humid = 1 Exit Sub End If Waitus 80 If Dht_get = 0 Then Humid = 2 Exit Sub End If While Dht_get = 1 : Wend Do While Dht_get = 0 : Wend Waitus 30 If Dht_get = 1 Then Sensor_data = Sensor_data + "1" While Dht_get = 1 : Wend Else Sensor_data = Sensor_data + "0" End If Incr Count Loop Until Count = 40 Set Dht_io_set Set Dht_put Tmp_str8 = Left(sensor_data , 8) Humid = Binval(tmp_str8) End Sub Sub Init_pomiar Local Dallas As Byte For Dallas = 4 To 6 1wreset Pind , Dallas 1wwrite &HCC , 1 , Pind , Dallas 1wwrite &H44 , 1 , Pind , Dallas Next End Sub Enable Interrupts Print "START" Do If 10ms = 1 Then 10ms = 0 If 100ms < 100 Then Incr 100ms Else 100ms = 0 If 1s < 59 Then Incr 1s If 1s = 59 Then Call Init_pomiar 'uruchomienie świeżych pomiarów na sekundę przed odczytem If Odczekaj = 1 Then Odczekaj = 0 Reset Esp_zasilanie End If Else 1s = 0 Set Esp_zasilanie Call Temperatura(4) Call Temperatura(5) Call Temperatura(6) Call Dht Print Temp_slonce ; " " ; Temp_zew ; " " ; Temp_grunt ; " " ; Humid Odczekaj = 1 End If End If End If Loop End Int_10ms: $asm PUSH R24 !in R24, sreg PUSH R24 $end Asm 10ms = 1 'Tuned with NoSave Tool $asm POP R24 !out sreg, r24 POP R24 $end Asm Return Udanego dnia :D
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Kilka DS18B20 na kilku pinach AVR

Post autor: pimowo » 31 maja 2016, 9:44

Z Tobą pisanie programów staje się po prostu przyjemnością ;)

Mam w sumie jeszcze kilka pytań:
1. po podłączeniu zasilania mam odczyty z DS'ów 85st (problem już rozwiązany) i odczyt z DHT 0% i teraz
czy ten kawałek kodu: Sub Init_pomiar Local Dallas As Byte For Dallas = 4 To 6 1wreset Pind , Dallas 1wwrite &HCC , 1 , Pind , Dallas 1wwrite &H44 , 1 , Pind , Dallas Next End Sub mogę wymienić na: Call Temperatura(4) Call Temperatura(5) Call Temperatura(6) Call Dht przed pętlą główną?

2. Jak się zabrać za to aby AVR wysyłał dane bezpośrednio do NetTemp, a nie tak jak jest teraz, że AVR przekazuje dane do ESP, a ESP dopiero wysyła dane?

W ESP (LUA) zrobiłem tak:
- połącz się z siecią WiFi
- odbierz dane z UART
- "pokrój" dane na kawałki
- wyślij do NetTemp

O ESP(LUA) + NetTemp pisałem TUTAJ w temacie obok.

3. Czy moja ATmega to "udźwignie"? :)
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Kilka DS18B20 na kilku pinach AVR

Post autor: niveasoft » 31 maja 2016, 9:59

Nie narzucam nikomu mojego sposobu pisania programów i nie mówię który jest słuszny. Pokazuje tylko możliwości.

Jeśli chodzi o Twoje pytanie czy możesz podmienić.
Jeśli nie przeszkadza to w niczym że tym zmiennym Temp_slonce itp. nadasz wartości 85 (bo niby wysyłać je będziesz dopiero za minutę) to możesz.

Z tym stylem programowania chodziło mi o to, że stworzenie pętli For-Next na pewno kosztuje trochę czasu, ale kod wynikowy, jeśli operacji do powtórzenia jest więcej, się zmniejsza.
Tak więc nie stosuję już For-Next w przerwaniach i tym podobnych czasowo zależnych procedurach, ale kiedy program jest czasowo luźny i zależy nam na miejscu we flash uC to For-Next pozwala trochę oszczędzić :D
Są jeszcze pętle While-Wend i Do-Loop Until :D

Na początek jednak pisałbym sobie, na luzie, jak mi wygodnie a o optymalizacji myślał jak, ewentualnie, zacznie się robić ciasno :P
...a tak w ogóle to lepiej samemu sprawdzić "czy można" niż czekać na odpowiedź na forum jesli sprawa jest błaha :D
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Kilka DS18B20 na kilku pinach AVR

Post autor: pimowo » 31 maja 2016, 10:19

niveasoft pisze:Nie narzucam nikomu mojego sposobu pisania programów i nie mówię który jest słuszny. Pokazuje tylko możliwości.
Oczywiście, że nie narzucasz... Twoje podpowiedzi są całkiem inne niż się czyta na różnych forach. Twoje wskazówki pokazują, że można wiele ciekawych rzeczy zrobić na kilka różnych sposobów :)
niveasoft pisze:Jeśli chodzi o Twoje pytanie czy możesz podmienić.
Jeśli nie przeszkadza to w niczym że tym zmiennym Temp_slonce itp. nadasz wartości 85 (bo niby wysyłać je będziesz dopiero za minutę) to możesz.
niveasoft pisze:...a tak w ogóle to lepiej samemu sprawdzić "czy można" niż czekać na odpowiedź na forum jesli sprawa jest błaha :D
Ten sposób działa, ale chciałem tylko dopytać fachowca czy jest OK ;)
niveasoft pisze:Na początek jednak pisałbym sobie, na luzie, jak mi wygodnie a o optymalizacji myślał jak, ewentualnie, zacznie się robić ciasno :P
Kiedyś z Twoją pomocą zrobiłem "sterownik podwórkowy" lampy, brama, furtka, czujnik zmierzchu, RS485 i jeszcze milion różnych rzeczy na ATtiny2313-tam to dopiero było ciasno... Pokazałeś tak sprytne rozwiązania, że stwierdziłem, że nie ma rzeczy niemożliwych :)
ODPOWIEDZ