it:iot:esp8266:vyroba-wifi-teplomeru

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.

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.

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.

  • it/iot/esp8266/vyroba-wifi-teplomeru.1672839500.txt.gz
  • Poslední úprava: 2023/01/04 13:38
  • autor: Petr Nosek