Fyzikální kabinet FyzKAB
Články Moduly ESP32 a ESP32-CAM ESP32 – čidla a periférie Vestavěné teplotní čidlo modulu ESP32

Vestavěné teplotní čidlo modulu ESP32

Aktualizováno: 28. 6. 2024 – přidány nové typy ESP32
Aktualizováno: 31. 10. 2021 – viz závěr

Zatímco v předešlém článku jsme si s vestavěnou Hallovou sondou pokusili užít trochu té „bastlířské legrace“, vestavěné teplotní čidlo modulu ESP32 nás asi trochu zklame. Jeho slabinou je to, že toto čidlo není určeno pro sledování vnějších podmínek, ale je zaměřeno na sledování teploty v procesoru. Takže pro nějaké měření vnější hodnoty, kupříkladu při použití jako teploměru nebo termostatu, se vlastně vůbec nehodí! 😕 Je hezké sledovat, jak se teplota jádra postupně zvětšuje, zejména pokud je zapnutý modul Wi-Fi, ale to je asi vše.

I když využití vnitřního teplotního čidla modulu ESP32 asi nebude patřit mezi těch TOP 10 projektů, které budete využívat, dovolíme si zde k tomuto čidlo uvést pár důležitých informací. Přeci jen co kdyby…

Na samém začátku je třeba zmínit, že desky ESP32 se dodávají v různých konfiguracích a typech. Takže ne všechny desky ESP32 jsou vybaveny stejnými periferiemi, jako je například vestavěném teplotní čidlo. V následujícím textu se budeme především zabývat staršími kity modulu ESP32, jako je původní čip řady ESP32, ESP32-WROOM nebo ESP32-WROVER. O těchto typech se někdy nesprávně uvádí, že nejsou interném čidlem teploty osazeny. Tak se na to podíváme!

Pro úplnost si v závěru ukážeme, jak načítat čidlo teploty u novějších typů, jako jsou ESP32-C2, ESP32-C3, ESP32-C6, ESP32-H2, ESP32-S2 nebo ESP32-S3.

Opět jdeme „proti proudu“?

První, co musíme říci, je fakt, že na internetu je o vestavěném teplotním čidle uvedeno několik nepravd.

Prvním takovou rozporuplnou informací je tvrzení, že u některých (prý novějších) vývojových desek je již teplotní čidlo programově nepřístupné, nebo snad dokonce již v čipu vůbec není přítomno. Píšeme „prý“, protože asi těžko dokážeme tyto informaci vyvrátit tím, že bychom všechny moduly ESP32 otevřeli a ukázali: „Hele, vidíte, je tam“. Ale naše osobní zkušenost se všemi vývojovými deskami (kity) s modulem ESP32, které se tu kolem povalují po stole, ukazují, že tam teplotní čidlo je, protože jej dokážeme načítat. Je pravda, že i když tu máme jak starší modely modulů ESP32 (např. DEV KIT rev. 1 – viz obr. 1a), tak i ty novější (např. ESP32 TTGO OLED – viz obr. 1b), tak to nelze zcela generalizovat – kdo ví? Za nás ale platí, co jsme vzali do ruky, to teplotu v procesoru dokázalo měřit!

ESP32-DEV-KIT ESP32-TTGO
Obrázek č. 1 – naše nejstarší (a) a nejmladší (b) vývojová deska s modulem ESP32

Možná předchozí informace tak trochu plyne z polopravdy druhé, které tvrdí, že nepřítomnost teplotního čidla je prokázána tím, že toto čidlo v následujícím programu vypisuje stále teplotu 128 °F (53.33 °C). Ta teplota se skutečně stále zobrazuje, to je pravda! Klidně si to zkuste…

/* ESP32 vnitrni cidlo teploty */

#ifdef __cplusplus
  extern "C" {
#endif

  uint8_t temprature_sens_read();
#ifdef __cplusplus
  }
#endif

uint8_t temprature_sens_read();

// funkce SETUP se spusti jednou pri stisknuti tlacitka reset nebo pri zapnuti desky.
void setup() {
  Serial.begin(115200);
}

// funkce LOOP bezi stale dokola.
void loop() {
  Serial.print("Teplota: ");
  Serial.print((temprature_sens_read() - 32) / 1.8);   // vypis teploty s prevodem z F na C
  Serial.println(" C");
  delay(1000);
}

Oproti kódům, které zde byly uváděny, se tento trochu v první části liší. Kromě standardního programovacího jazyka Wiring prostředí Arduino IDE jsou zde uvedeny i překladové direktivy překladače („odhašované“ části kódu) volající při překladu externí proceduru. Pro začátečníky spíše stojí za zmínku výpis výstupu získané teploty. Funkce temprature_sens_read() totiž vrací teplotu ve stupních Fahrenheita, které se pak převádějí na stupně Celsia.

Když překopírujete výše uvedený kód do prostředí Arduino IDE, přeložíte a spustíte ho, skutečně stále uvidíme (viz obr.  2) hodnotu 53.33 °C. Tento kód jednoduše vypisuje na sériový monitor teplotu jádra modulu dle vnitřního teplotního čidla – tento kód se dá najít na internetu a skutečně (jak uvidíme dále) načítá teplotu z vnitřního teplotního čidla. Proč tedy stále těch 53.33 °C?

vystupni teplota 53.33 C
Obrázek č. 2 – Výstup načtené teploty z vnitřního čidla modulu ESP32

K obrázku číslo 2 ještě doplníme, že stejného výsledku (53.33 °C) jsme docílili na všech našich různých vývojových kitech s modulem ESP32. Na jednom fóru dokonce jeden z „bastlířů“ ohříval pouzdro modulu ESP32 fénem a pak dokonce horkovzdušnou pistolí (!), aby se přesvědčil, zda čidlo skutečně pracuje. A co myslíte? Pořád tam bylo těch 53.33 °C! No,… I takové zážitky si s moduly ESP32 můžete užít!

Protože u jednoho z našich vývojových kitů s ESP32 jsme 100% věděli, že jsme teplotu pomocí funkce temprature_sens_read() v jednom z našich projektů úspěšně načítali, trochu nás teplota 53.33 °C u tohoto kitu zarazila. Co je tedy nyní jinak? Vysvětlení je jasné: V našem tehdejším projektu byla zapnuta Wi-Fi!

Je to prosté, milý Watsone!

Vzpomeneme-li si na informaci z jednoho z úvodních článků, kde jsme se seznamovali s modulem ESP32, zjistíme, že modul ESP32 je dvoujádrový procesor, ve kterém jedno z jader se především stará o provoz Wi-Fi modulu. A právě toto jádro, u kterého se díky provozu Wi-Fi počítá s velkým vytížením a výkonovou ztrátou, je tedy osazeno teplotním čidlem, které má „za úkol“ jej hlídat! Takže dokud v modulu ESP32 není zapnutá Wi-Fi, vnitřní čidlo není zapnuté a skutečně vrací stále stejnou hodnotu 128 Fahrenheitů, což odpovídá oněm zpropadeným 53.33 °C.

Jakmile v modulu ESP32 aktivujeme Wi-Fi, začnou se zobrazovat „rozumné“ teploty. Následující kód je úpravou předešlého. Modul ESP32 je zde kromě načítání vnitřního tepelného čidla ještě nastaven, aby zapnul Wi-Fi a vytvořil ze sebe měkký AP bod (červeně zdůrazněný kód). V tomto kódu nám jde jen o to, aby byla zapnutá Wi-Fi – kdo se chce dozvědět o možnostech Wi-Fi modulu v ESP32, doporučujeme následující článek: Wi-Fi přístup k modulu ESP32.

/* ESP32 test vnitrniho cidla teploty se zapnutou WiFi */

#include <WiFi.h>   // knihovny pro Wi-Fi

// --- puvodni kod
#ifdef __cplusplus
  extern "C" {
#endif

  uint8_t temprature_sens_read();
#ifdef __cplusplus
  }
#endif

uint8_t temprature_sens_read();

// --- pridane prikazy pro Wi-Fi
const char* ssid = "Pomocna sit";   // nastaveni jmena vytvorene WiFi
const char* password = "123456";   // zadani hesla pro mozny pristup

// funkce SETUP se spusti jednou pri stisknuti tlacitka reset nebo pri zapnuti desky.
void setup() {
  Serial.begin(115200);

  WiFi.softAP(ssid, password);   // zapnuti wifi a vytvoreni AP

}

// funkce LOOP bezi stale dokola.
void loop() {
  Serial.print("Temperature: ");
  Serial.print((temprature_sens_read() - 32) / 1.8);   // vypis teploty s prevodem z F na C
  Serial.println(" C");
  delay(1000);
}

Nyní, když kód v prostředí Adruino IDE zkompilujeme a nahrajeme do libovolného vývojového kitu s ESP32, získáme na sériovém monitoru výstup podobný tomu, který je zobrazen na obrázku 3. Jak vidíte, teplota 53.33 °C je pryč a teplotu cca 40 °C, která se postupně s provozem modulu ESP32 zvyšuje, lze asi za reálnou hodnotou považovat.

vystupni teplota OK
Obrázek č. 3 – Výstup načtené teploty z vnitřního čidla modulu ESP32 při zapnuté Wi-Fi

Stejný výstup jsme zaznamenali u všech námi použitých vývojových desek s ESP32, ať již to byly ty kity starší nebo i ten nejnovější TTGO.

Náš závěr tedy je následující: Všechny námi testované moduly ESP32 obsahovaly vnitřní teplotní čidlo, které však funguje jen při zapnuté Wi-Fi. „Záhada podivné teploty 53.33 °C (128 °F)“ je tedy způsobena nezapnutím vnitřního čidla a nikoliv jeho absencí!

Je pravda, že když modul běží delší dobu a využívá vestavěnou Wi-Fi, teplota jádra roste a pohybuje se až kolem 65 °C. Dokonce v rámci experimentů byl obvod se zapnutou Wi-Fi ponechán na přímém slunci, pak teplota dosahovala až k 80 °C. Ale tyto naše experimenty už trochu připomínají „hrátky“ toho kolegy s horkovzdušnou pistolí!

Závěr aneb „Co ještě nevíme?“

Ukázali jsme si, jak načítat vnitřní teplotní čidlo obsažené v modulu ESP32. Vysvětlili jsme si, proč v některých článcích se na internetu nepřesně uvádí, že modul ESP32, který zobrazuje teplotu 53.33 °C, údajně neobsahuje toto vnitřní teplotní čidlo. Na závěr jsme si ukázali, co je nutnou podmínkou pro použití vnitřního teplotního čidla.

Na druhou stranu se tím otevírá několik zatím nezodpovězených otázek, kterými bychom se rádi ještě v budoucnu zabývali. Je například skutečně nutné zapnutí Wi-Fi? Neboli je aktivace vnitřního teplotního čidla dána zapnutím Wi-Fi modulu nebo aktivitou druhého jádra? Modul ESP32 umožňuje nastavit, aby část vykonávaného kódu byla zpracovávána jedním či druhým jádrem. Pokud by aktivace vnitřního teplotního čidla byla dána pouze aktivitou daného jádra, nebylo by třeba zapínat Wi-Fi. Stačilo by totiž toto jádro aktivovat přenesením na něj části výkonného kódu a bylo by hotovo. Toto zatím nemáme vyzkoušené, ale je to výzva do budoucna. Jakmile získáme nějaké platné závěry, jistě tento článek ještě aktualizujeme – buďte nám tedy věrni a občas si to sem přijďte zkontrolovat! 😎

Aktualizace: (31. 10. 2021)
Na základě našeho pokusu s přenesením programu na druhé jádro, můžeme nyní potvrdit, že k aktivaci vestavěného teplotního čidla dochází POUZE zapnutím Wi-Fi a nikoliv aktivitou druhého jádra modulu ESP32.
 

Jak jsme slíbili, zaměřili jsme se na problém využití druhého jádra modulu ESP32 s ohledem na možnou aktivaci vnitřního teplotní čidla. Článek o přenesení kódu na druhé jádro procesoru modulu ESP32 jsme připravili zde: ESP32: Spuštění kódu na konkrétním jádře. Jak vidíme na obrázku č. 4, i když jsou aktivována obě jádra, objevuje se opět hodnota teploty 53.33 °C. Tedy vestavěné teplotní čidlo je neaktivní.

vystup - dve jadra
Obrázek č. 4 – Teplota z vnitřního čidla při aktiních obou jádrech modulu ESP32

Naopak, jakmile jsme v tomto „dvoujádrovém“ kódu zapnuli Wi-Fi, začalo vestavěné teplotní čidlo měřit – viz obrázek č. 5

vystup - dve jadra + wifi
Obrázek č. 5 – Teplota z vnitřního čidla při aktiních obou jádrech modulu ESP32 a zapnuté Wi-Fi

Vestavěné teplotní čidlo u kitů ESP32-Cx, ESP32-Sx a ESP32-H2

Jak jsme v úvodu uvedli, u novějších kitů modulu ESP32 je přístup k teplotnímu čidlo trochu jiný. Pro načítání interního teplotního čidla slouží funkce temp_sensor_read_celsius, která vrací na rozdíl od předešlé funkce starších modulů ESP32 ve stupních Celsia. Následující kód slouží pro načtení a vypsání teploty z interního čidla modulů: ESP32-C2, ESP32-C3, ESP32-C6, ESP32-H2, ESP32-S2 nebo ESP32-S3.

#include "driver/temp_sensor.h"

void initTempSensor() {
   temp_sensor_config_t temp_sensor = TSENS_CONFIG_DEFAULT();
   temp_sensor.dac_offset = TSENS_DAC_L2;    // TSENS_DAC_L2 is default; L4(-40°C ~ 20°C), L2(-10°C ~ 80°C), L1(20°C ~ 100°C), L0(50°C ~ 125°C)
   temp_sensor_set_config(temp_sensor);
   temp_sensor_start();
}

void setup() {
   Serial.begin(115200);
   initTempSensor();
}

void loop() {
   Serial.print("Temperature: ");
   float result = 0;
   temp_sensor_read_celsius(&result);
   Serial.print(result);
   Serial.println(" *C");
   delay(5000);
}

A je to! Úspěšně jsme nastavili vestavěný teplotní senzor na nových typech ESP32 s pomocí Arduino IDE. Sériový monitor by nyní měl zobrazovat teplotu ve stupních Celsia a aktualizovat každých pět sekund.

POZOR! Tento kód není určen pro starší typy ESP32, při pokusu o kompilaci dojde k chybě.

UPOZORNĚNÍ:
Nesouhlasíme s vyřazením Newtonových zákonů, Ohmova zákona a zákona zachování energie z učiva fyziky základních škol v České republice!