Toto je starší verze dokumentu!
Výroba Wi-Fi teploměru s ESP8266
Wi-Fi teploměr jsme skládal z těchto součástek:
Pro programování jsem na destičku esp8266 nahrál Micropython. Cílem je, aby se destička připojovala k Mosquitto a posílala tak zprávy skrze MQTT protokol.
Jako výborný zdroj posloužil článek ESP32 MQTT – Publish and Subscribe with Arduino IDE senzor BME280. Nicméně v článku nepoužívají Python - kód jsem čerpat tedy odjinud.
Připojení destičky k Wi-Fi
Micropython počítá se 2 soubory:
- boot.py
- main.py
Snažil jsem se pochopit na co který použít. Pochopil jsem, že nejprve se po startu načte boot.py a potom teprve main.py. V rámci best practises je doporučeno používat oba, ale vzápětí jsem se dočetl, že když se rozhodnu použít jenom main.py a do něj nahrát veškerý svůj kód, tak je to také ok.
Zatím jsem to tedy udělal tak, že nastavení a připojení Wi-Fi jsem nahrál do boot.py a čtení dat z čidla a obsluha MQTT je zase main.py.
Nyní tedy kód boot.py pro připojení k Wi-Fi:
# This file is executed on every boot (including wake-boot from deepsleep) #import esp #esp.osdebug(None) import uos, machine #uos.dupterm(None, 1) # disable REPL on UART(0) import gc #import webrepl #webrepl.start() gc.collect() SSID = 'Wi-fi' PASS = 'super_secret_password' def connect(): import network sta_if = network.WLAN(network.STA_IF) if not sta_if.isconnected(): sta_if.active(True) sta_if.connect(SSID, PASS) while not sta_if.isconnected(): pass # wait till connection print('network config:', sta_if.ifconfig()) connect()
První co mě napadlo je, jak ošetřit to, že se Wi-Fi odpojí - třeba spadne síť. Jak vyřešit opětovný reconnect. Dobrá zpráva je, že není potřeba dělat nic a současný kód stačí. Testoval jsem kód tak, že jsem vypínal a zapínal Wi-Fi na mém routeru a vždycky, když jsem Wi-Fi zapnul, tak se připojilo i zařízení ESP8266 aniž bych musel cokoli dělat. Což mě docela mile překvapilo.
Změna Wi-Fi sítě
Narazil jsem na zajímavý problém v kódu. Zdá se, že ESP8266 si po úspěšném připojení k Wi-Fi ukládá SSID sítě a heslo do paměti. Protože v rámci testování jsem vytvořil jinou síť, změnil jsem v kódu údaje a ESP8266 se ne a ne připojit k nové síti. Byl jsem v situaci, kdy obě sítě běžely a ESP8266 se připojovalo pořád k původní, i když v kódu po ní nic nezůstalo. A nepomohl mi ani reset zařízení či odpojení od napájení.
Nakonec jsem to vyřešil v kódu tak, že jsem na první spuštění upravil funkci connect() takto:
def connect(): import network sta_if = network.WLAN(network.STA_IF) sta_if.connect(SSID, PASS) if not sta_if.isconnected(): sta_if.active(True) sta_if.connect(SSID, PASS) while not sta_if.isconnected(): pass # wait till connection print('network config:', sta_if.ifconfig())
Jakmile jsme se připojil k nové Wi-Fi, tak jsem kód vrátil do původního stavu. Nechtělo se mi hlouběji zkoumat, jak to vlastně funguje a hledat elegantnější řešení, protože pro můj účel mi to stačilo.