Skocz do zawartości

Problem częstszego sterowania SSR-ami przy użyciu czujnika temperatury DS18B20


MisiekD

Pomocna odpowiedź

Mam problem z ogrzewaczem wody, który naprawiam. Wykorzystuję ESP8266 do sterowanie trzema grzałkami 400V (przy użyciu 3 SSR-ów). Do odczytu temperatury wykorzystuję sensor DS18B20. Problemem jest natomiast czujnik temperatury DS18B20, który "wstrzymuje" działanie ESP8266 w celu odczytu temperatury (na ok. 100ms). Czas ten jest dość duży i uniemożliwia mi częstsze włączanie/wyłączanie SSR-ów w celu lepszej kontroli temperatury grzałek. Z innego posta otrzymałem informację, że można odczytywać temperaturę ze scratchpada, a nie czekać na świeży odczyt temperatury (co podobno jest o wiele szybsze). Jednak wciąż nie wiem czy to zadziała i jak taki kod zbudować. Rozmyślam też czy nie dobrym wyjściem jest wybór ESP32 (dwa rdzenie - jeden do SSR-ów, drugi do temperatury).
Ktoś może mi doradzi jak to lepiej rozwiązać? Wolałbym wybrać ESP8266 niż zmieniać (układ już mam gotowy), jednak gdy nie będzie innego wyjścia to porozmyślam i nad tym rozwiązaniem.

Link do komentarza
Share on other sites

9 minut temu, MisiekD napisał:

Mam problem z ogrzewaczem wody, który naprawiam. Wykorzystuję ESP8266 do sterowanie trzema grzałkami 400V (przy użyciu 3 SSR-ów). Do odczytu temperatury wykorzystuję sensor DS18B20. Problemem jest natomiast czujnik temperatury DS18B20, który "wstrzymuje" działanie ESP8266 w celu odczytu temperatury (na ok. 100ms). Czas ten jest dość duży i uniemożliwia mi częstsze włączanie/wyłączanie SSR-ów w celu lepszej kontroli temperatury grzałek. Z innego posta otrzymałem informację, że można odczytywać temperaturę ze scratchpada, a nie czekać na świeży odczyt temperatury (co podobno jest o wiele szybsze). 

Bo w kwestii ds'a prosisz o odczyt i nie czekasz, jak obliczenie się pojawi dopiero wtedy czytasz...w przykładach powinno być...druga kwestia to to że coś musi być nie tak skoro chcesz pstrykać ssr'ami co 100ms...przecież ogrzewanie wody to taki dosyć bezwładny proces...w sensie że zmiany następują bardzo powoli 

void setup() {
  // Serial port setup
  while(!Serial);
  Serial.begin(9600);
  
  // DS18B20 sensors setup
  sensors.begin();
  
  // The first requests sensor for measurement
  sensors.request(sensorAddress);
}

void loop() {
  // If the sesor measurement is ready, prnt the results
  if (sensors.available())
  {
    // Reads the temperature from sensor
    float temperature = sensors.readTemperature(sensorAddress);
    
    Serial.print(temperature);
    Serial.println(F(" 'C"));
    
    // Another requests sensor for measurement
    sensors.request(sensorAddress);
  }
  
  // Here, put your code performs without delay
}

request() wysyła info do czujnika żeby ten rozpoczął obliczanie i wysłał temp

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

@farmaceuta zarzucę też swój dotychczasowy kod. Mam to u siebie tak zrobione i do tego potrzebuję ok. 100ms, żeby uzyskać temperaturę.

void loop() {
  
  sensors.requestTemperatures();
  float temperaturaC_DS18B20 = sensors.getTempCByIndex(0);
  
  if (temperaturaC_DS18B20 != DEVICE_DISCONNECTED_C) {
    // ...
  }
}

Coś byś w tym kodzie zmienił, by to poprawić?

 

24 minuty temu, farmaceuta napisał:

druga kwestia to to że coś musi być nie tak skoro chcesz pstrykać ssr'ami co 100ms...przecież ogrzewanie wody to taki dosyć bezwładny proces...w sensie że zmiany następują bardzo powoli 

Zależy, ja mam przepływowy ogrzewacz wody 22kW, dlatego w nim nawet 20ms zrobiłoby dużą różnicę.

Link do komentarza
Share on other sites

Ty teraz używasz request i odrazy po tym chcesz przeczytać temp a to chwilę schodzi...na pewno masz taką funkcję jak available() lub coś podobnego w libsie od ds...to jest to co ciebie interesuje...a wrzuć jeszcze link do swojej biblioteki to zerkne

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

9 minut temu, farmaceuta napisał:

a wrzuć jeszcze link do swojej biblioteki to zerkne

Jasne, proszę: https://github.com/milesburton/Arduino-Temperature-Control-Library

9 minut temu, farmaceuta napisał:

Ty teraz używasz request i odrazy po tym chcesz przeczytać temp a to chwilę schodzi...na pewno masz taką funkcję jak available() lub coś podobnego w libsie od ds

Ahhh, no to ma duży sens. A jak często mógłbym używać tego requesta? Aktualnie mam go zdefiniowanego w pętli loop i on się wysyła praktycznie cały czas.

Chyba, że najpierw powinienem odczytać temperaturę, a dopiero potem wysłać requesta?

Link do komentarza
Share on other sites

Spróbuj tej biblioteki bo w twojej nie widzę available()... https://github.com/nettigo/DS18B20 

Ten kod który wkleiłem wyżej to jeden z przykładów tej biblioteki...

W setup() wywolujesz request, w loop() sprawdzasz czy już temp jest do odczytu, jeśli tak to odczytujesz wartość i znów wysyłasz requesta...i tak w kółko bez blokowania

 

Link do komentarza
Share on other sites

Przede wszystkim pomiar i tak będzie trwać tyle ile trzeba (np. 100 msec, w dokumentacji którą oczywiście czytałeś jest tabelka czas przetwarzania/rozdzielczość) i nie pomoże tu żadne częstsze czytanie.

A co do dwóch rdzeni... może jakbyś potrzebował czashu reakcji rzędu kilku nanosekundd miałoby to jakieś znaczenie - ale dla ESP 100 msec to wieczność. Wystarczy ATTiny z zegarkiem 8 MHz.

Edytowano przez ethanak
Link do komentarza
Share on other sites

1 godzinę temu, farmaceuta napisał:

Spróbuj tej biblioteki bo w twojej nie widzę available()... https://github.com/nettigo/DS18B20 

Ten kod który wkleiłem wyżej to jeden z przykładów tej biblioteki...

W setup() wywolujesz request, w loop() sprawdzasz czy już temp jest do odczytu, jeśli tak to odczytujesz wartość i znów wysyłasz requesta...i tak w kółko bez blokowania

 

 

6 minut temu, ethanak napisał:

Przede wszystkim pomiar i tak będzie trwać tyle ile trzeba (np. 100 msec, w dokumentacji którą oczywiście czytałeś jest tabelka czas przetwarzania/rozdzielczość) i nie pomoże tu żadne częstsze czytanie.

A co do dwóch rdzeni... może jakbyś potrzebował czashu reakcji rzędu kilku nanosekundd miałoby to jakieś znaczenie - ale dla ESP 100 msec to wieczność. Wystarczy ATTiny z zegarkiem 8 MHz.

Sprawa rozwiązana, z tej biblioteki wystarczyło użyć:

sensors.setWaitForConversion(false);

Teraz pętla nie jest w żaden sposób blokowana. Można ustawić rozdzielczość nawet i 12, a czas będzie nadal minimalny 🙂 

Link do komentarza
Share on other sites

22 minuty temu, ethanak napisał:

Przy 12 czas to prawie sekunda 🙂

Zgadza się, ale dzięki tej komendzie, mikrokontroler nie będzie czekał na konwersję. Po prostu odbierze dane jak czujnik je będzie już w pełni miał, więc z tej "sekundy" czekania robi się kilkanaście ms (lub mniej) 😉

Sprawdzałem przed chwilą z rozdzielczością 12 - program nie przekracza 30ms, na czym mi zależało 🙂

Link do komentarza
Share on other sites

Tyle że to bez sensu - co z tego że czytasz temperaturę co 30 msec, jeśli odczyt i tak zmienia się co sekundę?

Moja teściowa (to ta, o której te kawały wymyślili) codziennie łazi do banku i sprawdza czy emerytura nie przyszła zamiast po prostu przyjść dziesiątego i pobrać kasę. Ty robisz dokładnie to samo.

Zrób tak jak pisał @farmaceuta.

Link do komentarza
Share on other sites

28 minut temu, ethanak napisał:

Tyle że to bez sensu - co z tego że czytasz temperaturę co 30 msec, jeśli odczyt i tak zmienia się co sekundę?

Moja teściowa (to ta, o której te kawały wymyślili) codziennie łazi do banku i sprawdza czy emerytura nie przyszła zamiast po prostu przyjść dziesiątego i pobrać kasę. Ty robisz dokładnie to samo.

Zrób tak jak pisał @farmaceuta.

Można i tak jak @farmaceuta, ale równie dobrze możesz zrobić funkcję z millis, która będzie Ci cały czas odświeżała temperaturę i nie będzie blokowała czasem funkcji loop, to główny cel tej komendy wyżej. I o to chodziło mnie w moich zastosowaniach 🙂

Link do komentarza
Share on other sites

2 minuty temu, MisiekD napisał:

nie będzie blokowała czasem funkcji loop

A co ta funkcja loop ma mianowicie robić w czasie oczekiwania na następny pomiar? Odpowiedz, bo to bardzo interesujące.

Rozumiem, że gdybyś miał tam jakąś ekstrapolację mógłbyś oszacować moment włączenia/wyłączenia grzałki między kolejnymi pomiarami. Ale nie masz.

4 minuty temu, MisiekD napisał:

możesz zrobić funkcję z millis, która będzie Ci cały czas odświeżała temperaturę

W jaki sposób mianowicie ma odświeżać temperaturę jeśli nie ma danych z termometru?

Link do komentarza
Share on other sites

20 minut temu, ethanak napisał:

A co ta funkcja loop ma mianowicie robić w czasie oczekiwania na następny pomiar?

Chociażby sterować SSR-ami, co 20ms 🙂 DotDotychczas tego nie dało się zrobić, teraz już działa idealnie.

Link do komentarza
Share on other sites

44 minuty temu, ethanak napisał:

W jaki sposób mianowicie ma odświeżać temperaturę jeśli nie ma danych z termometru?

No to odświeży przy kolejnym odczyvie te dane 😉 Pewnie komenda "available" inaczej się w tej jakoś nazywa.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.