Skocz do zawartości

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


Pomocna odpowiedź

Napisano

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.

(edytowany)
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

@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ę.

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

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?

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

 

(edytowany)

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
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 🙂 

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 🙂

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.

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 🙂

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?

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.

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.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...