Fyzikální kabinet FyzKAB
Články Moduly ESP32 a ESP32-CAM ESP32 + MicroPython Vnitřní senzory ESP32 a MicroPython

Vnitřní senzory modulu ESP32 a MicroPython (ale nejen to…)

Vývojová deska ESP32 je vybavena vestavěným Hallovým senzorem, který detekuje změny magnetického pole ve svém okolí a vestavěným čidlem teploty. Princip Hallova senzoru a jeho načítání v prostředí Arduino IDE jsme rozebírali dříve v obecném popisu modulu ESP32. Obdobně jsme se již dříve věnovali načítání vestavěného teplotního čidla modulu ESP32. Takže dnes se jen podíváme, jak oba tyto senzory načítat v MicroPythonu. Snad jen připomeneme, že vestavěný snímač Hallova efektu je umístěný pod kovovým víčkem čipu ESP32 a teplotní čidlo je především určeno pro načítání teploty čipu, takže umístěno tamtéž.

Pro načítání obou těchto senzorů se využívá funkcí, které musí být speciálně připravený pro modul ESP32. Tyto funkce tedy nebudeme hledat v obecném modulu machine, ale ve speciálním modulu (knihovně) nazvaném esp32, který je součástí MicroPythonu určeného pouze pro modul ESP32.

Tento modul obsahuje jen tři funkce:

esp32.hall_sensor()    # odečtěte vnitřní Hallův senzor
esp32.raw_temperature()    # odečtěte vnitřní teplotu MCU ve stupních Fahrenheita
esp32.ULP()    # přístup k Ultra-Low-Power Co-processoru
POZNÁMKA:
Novější moduly ESP32C3, ESP32S2 a ESP32S3 mají také k dispozici vnitřní teplotní senzor. Tento senzor je však implementován trochu jinak než u klasického modulu ESP32.
Pro načítání se jedná o následující funkci, která mimojiného vrací hodnotu teploty ve stupních Celsia:
esp32.mcu_temperature()     # odečtěte vnitřní teplotu MCU ve stupních Celsia

Pro naše další hrátky využijeme první dvě základní funkce.

Hallův senzor

Samotné načítání výstupní hodnoty Hallova senzoru je pak již velmi jednoduché, asi ji jej hned ukážeme na následujícím příkladu:

import esp32
import time

while True:
   hall = esp32.hall_sensor()
   print("halluv senzor = ", hall)
   time.sleep_ms(1000)

Jak vidíme, je do programu importován modul esp32 a modul time. První nám přináší pro funkci načítání Hallova senzoru, druhý pro nastavení vteřinové prodlevy na konci hlavní smyčky. V hlavní nekonečné smyčce je pak načítána hodnota magnetismu do proměnné hall, které je pak funkcí print vypsána na výstup. To je vše. Hodnota načtená z Hallova senzoru je uvedena v relativních jednotkách, které mohou být nejen kladné, ale i záporné (dle přiloženého pólu magnetu).

Vestavěný teploměr

Ani načítání vestavěného teplotního čidla nebude o nic těžší, i když zde si to asi ještě zaslouží několik poznámek.

import esp32
import time

while True:
   t_F = esp32.raw_temperature()
   t_C = (t_F - 32.0) / 1.8
   print("t = {0:4d} deg F nebo {1:5.1f} deg C".format(t_F,t_C))
   time.sleep_ms(1000)

Jak vidíme na výpisu programu výše, jedná se téměř o stejný kód jako v případě Hallova senzoru. Prvním rozdílem je přidání řádku, na kterém se hodnota proměnné t_F (teplota ve Fahrenheitech) přepočítává na teplotu ve stupních Celsia (proměnná t_C).

Druhou změnou je argument funkce print. Pojďme se na to podívat podrobněji, hned si tím ukážeme něco o možném formátování výstupů v jazyce Python.

Formátování výstupu

V Pythonu máte několik možností formátování řetězců. Nyní bychom se rádi podívali na formátované řetězcové literály a řetězce šablon.

Jedním ze základních (a starším) způsobem formátování řetězců v Pythonu bylo použití % operátoru.

Zde je základní syntaxe:

 "Toto je základní řetězec %s" % "řetězec, který se vloží do prvního" 

Můžeme používat symbol %s, který funguje jako zástupný symbol pro druhý řetězec, který bude vložen. Například:

print("Ahoj, já se jmenuji %s" % "FyzKAB")

Výsledkem bude hláška: Ahoj, já se jmenuji FyzKAB

str.format()

V Pythonu 3 byl zaveden jiný způsob práce s řetězci, a to metoda str.format() spolu s možnými formátovanými řetězcovými literály.

Zde je základní syntaxe metody str.format():

 "Nějaký řetězec šablony {}".format(argumenty) 

Uvnitř řetězce šablony můžeme použít, {} které fungují jako zástupné symboly pro argumenty. Argumenty jsou hodnoty, které se dosadí a zobrazí v řetězci.

V tomto na příklad chceme vytisknout hlášku: "Ahoj, já se jmenuji FyzKAB. Jsem webový portál o fyzice a trochu i o elektronice."

V základním řetězci budeme mít celkem tři {}, které budou sloužit jako zástupné symboly pro hodnoty FyzKAB, fyzice a elektronice. Říká se jim formátová pole.

"Ahoj, já se jmenuji {}. Jsem {} a trochu i o {}."

Do těchto závorek podle str.format() budeme chtít postupně dosadit hodnoty "FyzKAB", "fyzice" a "elektronice". To zapíšeme následovně: .format("FyzKAB", "fyzice", "elektronice")

Zde je úplný zápis příkazu print:

print("Ahoj, já se jmenuji {}. Jsem webový portál o {} a trochu i o {}.".format("FyzKAB", "fyzice", "elektronice"))

K hodnotám argumentů funkce format můžete přistupovat pomocí indexového čísla zapsaného uvnitř značek {}.

V našem příkladu máme uvnitř format() tři argumenty: "FyzKAB", "fyzice" a "elektronice". K těmto hodnotám můžeme uvnitř základního řetězce přistupovat odkazem na čísla indexu:

  • {0} odkazuje na první argument, tedy na "FyzKAB",
  • {1} odkazuje na "fyzice" a
  • argument {2} odkazuje na "elektronice".

Pokud použijeme následující příkaz:

print("Ahoj, já se jmenuji {0}. Jsem webový portál o {1} a trochu i o {2}.".format("FyzKAB", "fyzice", "elektronice"))

nic se oproti původnímu výstupu nezmění. Ale pokud u posledních dvou {} prohodíme čísla indexů:

print("Ahoj, já se jmenuji {0}. Jsem webový portál o {2} a trochu i o {1}.".format("FyzKAB", "fyzice", "elektronice"))

rázem dostaneme větu:

"Ahoj, já se jmenuji FyzKAB. Jsem webový portál o elektronice a trochu i o fyzice."

To je asi jasné, že?


Z důvodů čitelnosti kódu a vůbec celkové přehlednosti nemusíme argumenty číslovat je pomocí pořadových čísel. Můžeme je i pojmenovat, a to pomocí zápisu key=value. K hodnotě argumentu (value) se pak můžeme dostat pomocí pojmenování (key).

Raději si to opět ukážeme:

print("Ahoj, já se jmenuji {jmeno}. Jsem webový portál o {hlavni} a trochu i o {vedlejsi}.".format(jmeno="FyzKAB", hlavni="fyzice", vedlejsi="elektronice"))

Je asi jasné, že nyní se do věty dosazují slova podle pojmenování a nikoliv podle pořadí nebo zvolených indexů.

A aby byl Python opravdu univerzální, je třeba zmínit, že můžeme ve str.format() kombinovat klíčová slova a poziční argumenty. Například:

print("Ahoj, já se jmenuji {0}. Jsem webový portál o {hlavni} a trochu i o {vedlejsi}.".format("FyzKAB", hlavni="fyzice", vedlejsi="elektronice"))

Ještě by se slušelo zmínit, že se zde dá pracovat i hodnotami proměnných, které lze takto dosazovat do výstupních řetězců, třeba takto:

jmeno = "FyzKAB"
print("Ahoj, já se jmenuji {0}. Jsem webový portál o {hlavni} a trochu i o {vedlejsi}.".format(jmeno, hlavni="fyzice", vedlejsi="elektronice"))



Ale vraťme se k našemu příkladu s vytištěním teplot!

Pokud jsme pochopili základní princip práce s funkcí str.format(), asi již aspoň částečně chápeme i podstatu řádku:

print("t = {0:4d} deg F nebo {1:5.1f} deg C".format(t_F,t_C))

Ale asi nás též napadá: Co, v těch složených závorkách dělají ty dvojtečky a podivné argumenty za nimi?

Použití : za číslem argumentu říká něco o formátování výstupu. Číslo za dvojtečkou určuje, na kolik znaků se má daná hodnota zobrazit. V případě {0:4} by hodnota byla vypsána na čtyři znaky – takže před hodnotou 32 budou dvě mezery, před 123 jen jedna apod.

Symbol d v části {0:4d} odkazuje na celé desítkové číslo. Tedy na zobrazení v desítkovém formátu a bez desetinných míst. Tento formát využíváme při výpisu teploty ve Fahrenheitech.

A teď drobný test zdravého programátorského úsudku:

Copak asi bude znamenat zápis {1:5.1f} u výpisu teploty ve stupních Celsia?

Odpověď:
Číslo 1 odkazuje na druhý argument funkce format, tedy na proměnnou t_C.
Číslo 5 za dvojtečkou určuje počet zobrazených znaků.
1 za tečkou udává počet desetinných míst vypsaného čísla.
Znak f na konci odkazuje na float, tedy reálné číslo.
TEDY: Zvolený zápis určuje výpis reálného čísla na pět znaků s jedním desetinným místem.

vypis teplot

Na samý závěr si ještě ale neodpustíme jednu poznámku, která se týká vestavěného teplotního čidla modulu ESP32.

POZNÁMKA:
V článku, ve kterém jsme se věnovali načítání teplotního čidla v programovacím prostředí Arduino IDE, jsme objevili zajímavý jev. Vnitřní čidlo fungovalo pouze, pokud byl zapnut Wi-Fi modul obvodu ESP32 (tedy alespoň u námi testovaných modulů).
Je zajímavé, že v případě přístupu k vnitřnímu teplotnímu čidlu pomocí MicroPython lze načítat teploty normálně, tedy i bez zapnuté Wi-Fi. Upřímně řečeno, je to záhada. Bylo by možné asi spekulovat, čím je to způsobeno – možná běh jádra MicroPythonu toto čidlo aktivuje…
Zkrátka si budeme pamatovat, že se modul ESP32 prostě pod MicroPythonem chová takto. A hotovo! Pokud by se s nějakou další verzí MicroPythonu začal modul ESP32 chovat jinak, bude dobré zkusit přístup k teplotnímu čidlu se zapnutou Wi-Fi. A pak se uvidí!

Třeba pak o tom zase vznikne nějaký článek. 😉

A na co se podíváme příště?

Asi by se nyní slušelo trochu prozkoumat možnosti Wi-Fi připojení…

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!