Powrót

DS18B20 inaczej

Tradycyjna obsługa termometru DS18B20 na Arduino ma poważną wadę – długi czas konwersji przez co reakcja na inne zdarzenia, na przykład naciśnięcie przycisku, jest bardzo opóźniona. Problem nasila się gdy termometrów jest kilkanaście lub więcej.

Artykuł ten jest związany z materiałem DS18B20 – oryginał czy podróbka? oraz jest kontynuacją idei „Arduino profesjonalnie?”. Pokazuje, że czasem trzeba odejść od szablonowych rozwiązań aby usunąć jakiś problem.

Problem obsługi DS18B20

We wcześniejszym artykule (U070) była mowa o obsłudze watchdoga (WDTWatchdog timer). W przypadku termometrów DS18B20 czas konwersji wynosi nawet 750 ms, co wymusza długie czasy dla WDT. Gdy termometrów jest dużo czas może przekroczyć maksymalny dopuszczalny przez WDT. Ponadto w czasie konwersji temperatury CPU nie robi nic innego jak czeka na jej koniec, pracują tylko przerwania. Z tego powodu dane przychodzące do UART mogą przepełnić jego bufor, przez co utracimy dane. W czasie konwersji nie działa ewentualna klawiatura, przez co reakcja na naciskanie przycisków jest bardzo opóźniona. W jaki sposób rozwiązać problem długiego czasu konwersji?

Rozwiązanie

Pierwsze co przychodzi do głowy to RTOS. Niestety, jest to zły kierunek! Dlaczego? Aby używać RTOS trzeba dobrze go znać, a ponadto, dobrze znać architekturę mikrokontrolera (uC), biegle posługiwać się przerwaniami, doskonale znać układy peryferyjne uC. Jest jeszcze jedna, bardzo duża przeszkoda – zapotrzebowanie na RAM, której w AVR jest bardzo mało. W przypadku AVR jest jeszcze problem braku timerów, dlatego RTOS dla AVR zazwyczaj korzysta z WDT do przełączania tasków co ma poważne wady, tracimy układ WDT i mamy niekonfigurowany czas przełączania tasków wykonujących się zbyt długo wynoszący około 16 ms, podczas gdy we współczesnych CPU normą jest czas 1 ms. I kolejny raz widać przewagę ARM nad AVR – duża liczba timerów i pojemność pamięci RAM. Kolejny problem, to ustawienie wielkości stosu dla poszczególnych tasków. Na forach często widzę wypowiedzi „użyj RTOS” ale nie widziałem ani jednej wypowiedzi wyjaśniającej, jaką wielkość stosu ustawić i dlaczego. Temat stosu tasków jest dosyć skomplikowany, zwłaszcza, gdy RAM jest mało. Wyjaśnienie jak sprawdzić zajętość stosu poszczególnych tasków to temat bardziej na książkę niż artykuł, a jest jeszcze problem skonfigurowania RTOS, aby działał tak, jak tego chcemy, dlatego odradzam RTOS osobom nie znających dobrze tego systemu i architektury uC.

Jak więc rozwiązać problem?

Zbudowałem prosty układ według rysunku 1, nazywanego błędnie przez arduinowców schematem.

Rysunek 1

Narysowałem schemat tego układu – rysunek 2.

Rysunek 2

Sami oceńcie, który jest czytelniejszy i jak wyglądałby skomplikowany pseudoschemat gdyby urządzenie było bardzo skomplikowane, z tysiącami połączeń.

Standardowa obsługa termometru znajduje się w pliku „Wielowatkowosc_DS18B20_L1”, którego istotne fragmenty pokazuje listing 1.

Listing 1
void loop() {
  uint32_t timPomiar = millis();
  // Requests sensor for measurement
  sensors.request(sensorAddress);

  // Waiting (block the program) for measurement reesults
  while (!sensors.available());

  // Reads the temperature from sensor
  float temperature = sensors.readTemperature(sensorAddress);
  timPomiar = millis() - timPomiar;
  // Prints the temperature on Serial Monitor
  //  Serial.print(temperature);
  //  Serial.println(F(" 'C"));
  char txt[10];
  uint16_t t = temperature * 100;
  sprintf(txt, "%d.%02d *C\r\ntimPomiar %dms", t / 100, abs(t % 100), timPomiar );
  Serial.println(txt);
}

Do programu dodałem pomiar czasu konwersji temperatury – zmienna „timPomiar”. Pod koniec kodu widać zakomentowany fragment odpowiedzialny za wysyłanie wyniku pomiaru przez UART.

(…)

——– ciach! ——–

To jest tylko fragment artykułu, którego pełna wersja ukazała się w numerze wrześniowym czasopisma Zrozumieć Elektronikę (ZE 9/2023). Pełna wersja czasopisma umieszczona jest pod tym linkiem. Natomiast niepełna, okrojona wersja, pozwalająca zapoznać się z zawartością numeru ZE 9/2023 znajduje się tutaj.

 

SaS, ZE
sas.ze@vp.pl

 

Uwaga! Osoby, które nie są (jeszcze) stałymi Patronami ZE, mogą nabyć PDF-y z pełną wersję tego numeru oraz wszystkich innych numerów czasopisma wydanych od stycznia 2023, „stawiając kawę” (Cappuccino = 10 złotych za jeden numer czasopisma w postaci pliku PDF).
W tym celu należy kliknąć link (https://buycoffee.to/piotr-gorecki), lub poniższy obrazek
Postaw mi kawę na buycoffee.to
Następnie wybrać:
– jeśli jeden numer ZE – CAPPUCINO (10 zł),
– jeśli kilka numerów ZE – WSPIERAM ZA. I tu wpisać kwotę zależną od liczby zamawianych numerów – wydań (N x 10zł),
Wpisać imię nazwisko.
Podać adres e-mail.
Koniecznie zaznaczyć: „Chcę dołączyć wiadomość dla Twórcy” i tu wpisać, który numer lub numery mamy wysłać na podany adres e-mailowy.