แแแแกแฆแแช แกแแฎแแแก แแแขแแแแขแแแแชแแแก แกแแกแขแแแแแ, แแ แ แแแแ แช แแแ แฎแจแแ แแ แฃแฌแแแแแแแแ โแญแแแแแ แกแแฎแแกโ, แกแแจแแแแแ แซแแแ แ แฆแแ แแ แแ แแฎแแแแ แแแแแ แแแก แจแแแซแแแ แแแแ แจแแซแแแ. แแฆแแก แแแแแ แแ แจแแแแซแแแแ แแแแแแ แกแแแแแแ แแแคแ แแแแแแแฅแขแแแ แกแแแกแแ แแแแ, แฆแแแแแแแแ/แแแแแแ แแแแแแแแ แแ แแแซแ แแแแแแ แแแแแแแแแก, แกแแแแขแแแแก, แแแแขแแแแชแแแก, แฌแงแแแแแแแ แแแแแแก แแ แกแฎแแ แแแแฎแแแ แแแแแแแก แกแแแแ แแแแแ. แแ แงแแแแแแ แแแฎแแแฏ แฌแแ แแแแแ แแแแแแแแกแแช แแ แจแแฃแซแแแ แฉแแแ แแแก แกแแแแแแแแจแ แแ แแแฌแงแแก แแแฌแงแแแแแแแแแ แญแแแแแแ แกแแฎแแแกแแแแก แแแคแแ.
แ แแแแ แช แฌแแกแ, แจแแแแแแแแแแแฃแแ แแแฌแงแแแแแแแแแ แแ แแก แกแแแกแแ แแแ แแ แแฅแขแแแแขแแ แแแ. แแกแแแ แแแแแแแแแแ แแกแแแ แกแชแแแแ แแแแก แแแแฎแแ แชแแแแแแแก, แ แแแแ แแชแแ โแ แแแแกแแช แแแซแ แแแแแก แกแแแกแแ แ แแแแฅแแแแแ, แฉแแ แแแ แแแแแแแแโ แแ โแแแกแแกแแแแแแแ แแแแแแ แ แฉแแแ แแแแแ แแแจแแแก แแแแแแแแแก แแแแ แแแแแจแโ. แแแแ แแ แ แแฆแแชแแแแ แแ แงแแแแแคแแ แ แขแแแแแแขแ แแแ แแ แแแแแแแแ. แกแแฃแแแแแกแ แจแแแแฎแแแแแจแ, แแก แแ แแก แขแแแแแ แแขแฃแ แแกแ แแ แขแแแแแแแแแก แแ แแคแแแ, แแ แแงแแกแแแ แ แกแแแซแแแแ แ แแแแแ แแขแฃแ แแแแงแแคแแแแแแจแ.
แชแแขแ แฎแแแก แฌแแ แแแแแงแแแ แฌแงแแแก แแ แแชแฎแแแแแแ แแฃแแกแแก แแแแแแแแแแ. แงแแแแ แแแขแ แแ, แ แแแแแแช แแแแแก แแ แแชแฎแแแแแ, แแแ แฌแแแก แแแแแแ แแแแแ แแแแฅแขแแฃแ แแแฃแแแ แแ แฎแฃแ แแแก แแแแขแแฅแขแก. แแ แแแแแ แแ, แ แแช แฃแแแ แแแแแแแแ, แแ แแก แแแฏแแญแแ แแแแแฃแแฎแแแ แแแแแ แแ แกแชแแแแ แแแกแแแ แกแแ แแแแแแ แแแแฆแแ. แแแแแแแแแ, แแแแแแแแแแแ แฌแงแแแก แแแฎแแแ แแแ แกแแแแแกแ แแ แแแแ แแก แแฆแแก แแแฎแแแแแ. แแกแ, แแฃ แแแแแจแ แ แแแแแแแแ แฌแงแแแก แแแฌแแ, แแแจแแ แฃแคแ แ แแแกแแฎแแ แฎแแแแแแ แงแแแแ แแแแแแแแ แ แแแแแแแขแแ แแก แแแฎแแ แแ แ แแแ แแแแ, แแแแ แ แคแแแ แแ แซแแแแแ แแแกแแแแแ แแแจแแแจแ แแกแแแ.
แญแ แแแแก แฅแแแแแ แแ แแก ESP8266-แแ แแแคแฃแซแแแแฃแแ แแแฌแงแแแแแแแแก แฉแแแ แแแ แกแแ, แ แแแแแแช แแแแแแก แแแแฃแแกแแแก แฌแงแแแก แแ แแชแฎแแแแแแแแแ แแ แแแแแแแแก แแแแฎแแแก MQTT-แแก แกแแจแฃแแแแแแ แญแแแแแแ แกแแฎแแแก แกแแ แแแ แแ. แฉแแแ แแแแแ แแแ แแแแแ แแแแ แแแแแแแจแ uasyncio แแแแแแแแแแแก แแแแแงแแแแแแ. firmware-แแก แจแแฅแแแแกแแก แ แแแแแแแแ แกแแแแขแแ แแกแ แกแแ แแฃแแแก แฌแแแแฌแงแแ, แ แแแแแแแแช แแกแแแ แแแแแแฎแแแแ แแ แกแขแแขแแแจแ. แฌแแแ!
แกแฅแแแ
แแแแแ แแแแ แแกแฅแแแแก แแฃแแ แแ แแก แแแแฃแแ ESP8266 แแแแ แแแแแขแ แแแแ แแ. ESP-12 แแแแแแแแ แแแแแ แแงแ แแแแแแแแแ, แแแแ แแ แฉแแแ แแแคแแฅแขแฃแ แ แแฆแแแฉแแแ. แฉแแแ แฃแแแ แแแแแแแงแแคแแแแแ ESP-07 แแแแฃแแแ, แ แแแแแแช แฎแแแแแกแแฌแแแแแ แแงแ. แกแแแแแแแแ แแ, แแกแแแ แแ แแแแแ แแ แ แแแแ แช แฅแแแซแแกแแแแแแแ, แแกแแแ แคแฃแแฅแชแแแแแแฃแ แแแแ, แแแแกแฎแแแแแแ แแฎแแแแ แแแขแแแแจแแ - ESP-12-แก แแฅแแก แฉแแจแแแแแฃแแ, แฎแแแ ESP-07-แก แแฅแแก แแแ แ. แแฃแแชแ, WiFi แแแขแแแแก แแแ แแจแแช, แฉแแแก แแแแแแแแจแ แกแแแแแแ แฉแแแฃแแแแ แแ แแแแฆแแแ.
แกแขแแแแแ แขแฃแแ แแแแฃแแแก แแแงแแแแแแแแ:
- แแแแแขแแแ แแแแก แฆแแแแแ แแแแกแแงแแแแ แแ แแแแแแแกแแขแแ แแ (แแฃแแชแ แแ แแแ แฃแแแ แแแแฃแแแก แจแแแแแแแ)
- แฉแแ แแแแก แกแแแแแแ (CH_PD) แแแแแแแแ แแแแ
- GPIO15 แแแงแแแแแแแ แแแฌแแแ. แแก แแฎแแแแ แแแกแแฌแงแแกแจแแ แกแแญแแ แ, แแแแ แแ แแ แแแแแช แแ แแคแแ แ แแแฅแแก แแ แคแแฎแแ แแแกแแแแแ แแแแแ, แแฆแแ แแญแแ แแแแ
แแแแฃแแแก แแ แแแ แแแฃแแ แฃแแ แฃแแแแแงแแคแแก แ แแแแแจแ แแแแแกแแกแแแแแแ, แกแแญแแ แแ GPIO2-แแก แแแแแ แฉแแ แแแ แแแฌแแแ แแ แฃแคแ แ แแแกแแฎแแ แฎแแแแแ แ แแ แแงแแก, แแ แแแแแฌแแแ แฉแแขแแแ แแแแก แฆแแแแแ. แแแ แแแแฃแ แแแแแแแ แแแแแจแ, แแก แฅแแแซแแกแแแแ แแแแแงแแแแแแแ แซแแแแจแ.
GPIO2 แฎแแแแก แแแแแแแ แแแแ แแแฌแแแแแ แแฎแแแแ แแฃแจแแแแแก แแแกแแฌแงแแกแจแ - แแแแแก แแแแแงแแแแแแกแแก แแ แแแแแขแแแ แแแแกแแแแแแ. แแกแ แ แแ, แแแแฃแแ แแ แฉแแแขแแแ แแแแ แฉแแแฃแแแแแกแแแแแ , แแ แแแแแแแก firmware แ แแแแแจแ. แฉแแขแแแ แแแแก แจแแแแแ, แแก แแแแ แจแแแซแแแแ แแแแแงแแแแแฃแ แแฅแแแก แ แแแแ แช แฉแแแฃแแแแ แแแ GPIO. แแแ แแ, แ แแแแแ แแฅ แฃแแแ แแ แแก แฆแแแแแ, แจแแแแซแแแแ แแแฃแ แแแ แแแก แ แแแแ แกแแกแแ แแแแแ แคแฃแแฅแชแแ.
แแ แแแ แแแแ แแแแกแแแแก แแ แแแแแ แแแแกแแแแก แแแแแแแงแแแแ UART-แก, แ แแแแแแช แแแแแแแก แกแแแแ แชแฎแแแแ. แกแแญแแ แแแแแก แจแแแแฎแแแแแจแ, แแ แฃแแ แแแแ แแฃแแ แแแ แแฅ USB-UART แแแแแขแแ แก. แแฅแแแ แฃแแ แแแแ แฃแแแ แแแฎแกแแแแแ, แ แแ แแแแฃแแ แแแแแแแแ 3.3 แ. แแฃ แแแแแแแฌแงแแแ แแแแแขแแ แแก แแ แซแแแแแแ แแแแแ แแแ แแ 5 แ แแแฌแแแแแ, แแแแฃแแ แแแแ แแแแแแแแแ แแแแฌแแแแ.
แกแแแแแแแแแจแ แแแแแก แแ แแแแแแ แแ แแแฅแแก - แแแกแแกแแแแแ แแ แแชแฎแแแแแแแแแ แแแแฎแแแแแแ แแ แ แแแขแ แแแ, แแแแขแแ แแแแแแ 220 แแแแขแแ. แแแแแก แฌแงแแ แแ แแแฅแแแแ แแแขแแ แ
แแแแ แแชแแฃแแ แ แแแแแแแแก แกแแแแแแแแแชแแแกแแแแก, แแ แแแแแฌแแแ LED, แ แแแแแแช แแแแแแจแแ แแแฃแแแ GPIO2-แแแ. แแฃแแชแ, แแ แแ แแแแฎแกแแแแ, แ แแแแแ... ESP-07 แแแแฃแแก แฃแแแ แแฅแแก LED แแ แแก แแกแแแ แแแแแแจแแ แแแฃแแแ GPIO2-แแแ. แแฆแแแ แแแคแแแ แแงแแก, แแ แจแแแแฎแแแแแจแ, แแฃ แแกแฃแ แก แแ LED-แแก แแแแแงแแแแ แแแแกแแ.
แแแแแแแแแ แงแแแแแแ แกแแแแขแแ แแกแ แแแฌแแแแ. แฌแงแแแก แแ แแชแฎแแแแแแก แแ แแฅแแ แแแแแแ, แแแ แแแ แแแกแแฎแแแ แแแแแแแแ แ แแแฉแแแแแแแแแก. แแ แแแแแ แแ, แ แแช แฉแแแแแแแก แฎแแแแแกแแฌแแแแแแ, แแ แแก แแแแฃแแกแแแ - แแแ แฌแแแก แแแแแแ แแแแแแก แแแแขแแฅแขแแแแก แแแฎแฃแ แแ แงแแแแ แแแขแ แแ. แฉแแแ แ แแแแก แแแแแแ แแแแแ แแแแแแแแแแ แแแแแแจแแ แแแฃแแแ GPIO12/GPIO13-แแแ. แแ แฉแแแ แแแ แแแแกแแฌแแ แ แแแแกแขแแ แแก แแ แแแ แแแฃแแแ แแแแฃแแแก แจแแแแแ.
แแแแแแแ แแแแแแแฌแงแแ R8 แแ R9 แ แแแแกแขแแ แแแแก แแแฌแแแแแ แแ แแแคแแก แฉแแแก แแแ แกแแแก แแ แแฅแแก แแกแแแ. แแแแ แแ แ แแแแแ แแ แฃแแแ แแแแ แแแแแ แแแแก, แ แแ แงแแแแแ แแแฎแแก, แฆแแ แก แแ แฃแแฃแแแแแแงแแคแแก แแแแแกแฌแแ แแแ. แ แแแแกแขแแ แแแ แกแแญแแ แแ แแแแกแแแแแก, แ แแ แแ แแแแฌแแแก แแแ แขแ, แแฃ แแ แแแ แแแฃแแ แฃแแ แฃแแแแแงแแคแ แแแคแฃแญแแ แแ แแแแงแแแแแก แแแแก แแ แแแ, แฎแแแ แแแ แฌแแแก แแแแแแ แแแแแ แแ แฎแแแก แแแฌแแกแแแ แแจแแ แแแก (แ แแแแกแขแแ แแ แแแฅแกแแแฃแ 3.3V/1000Ohm = 3.3mA แจแแแแแ).
แแ แแ แแแคแแฅแ แแ แแแแแ, แแฃ แ แ แฃแแแ แแแแแแแแ, แแฃ แแแแฅแขแ แแแแแ แแแ แแแฅแ แแแ. แแแ แแแแ แแแ แแแแขแ แแ แแก แกแแ แแแ แแกแแแ แแแแแแแแ แแแแ แแ แแชแฎแแแแแก แแแแจแแแแแแแแแแก แแแแฎแแแแ แแแกแแฌแงแแกแจแ. แแแแ แแ แแก แแแแแฎแแแก แแแชแแแแก แแ แแขแแแแแแก แแแแจแแแแแแแแ แแแ แแฃแแแแแก. แฃแคแ แ แแแขแแช, แแแฌแงแแแแแแแแก แแฃแจแแแแ แแ แจแแแแฎแแแแแจแ แแแแแแแแแแฃแแแ แกแแ แแแ แแก แแแแแแแ แแแแแแ. แแฃ แกแแ แแแ แ แแ แแแแฌแงแ แแแแแก แแแแแ แแแแก (แแ แแแแแแแแแแแ แฉแแ แแแแก แจแแแแแ), แฌแงแแแก แแ แแชแฎแแแแ แแแ แจแแซแแแแก แกแแฌแงแแกแ แแแแจแแแแแแแแแแก แแแแฎแแแแแก แแ แแ แแแฃแจแแแแแก แกแฌแแ แแ.
แแแแขแแ, แแ แแแแแแฌแงแแแขแ แแ แแชแฎแแแแแก แแแแแแแแก แแแแจแแแแแแแแแแก แแแแแ แแแ แแแฎแกแแแ แแแแก แฉแแแจแ, แ แแแแแแช แแแแแแจแแ แแแฃแแแ I2C-แแ. แแ แแ แแแฅแแก แ แแแแ แแแแกแแแฃแแ แแแฃแแ แแแแฎแแแแแแ แคแแแจ แแแฎแกแแแ แแแแก แแแแแแ - แแฅแแแ แแฎแแแแ แฃแแแ แจแแแแแฎแแ 2 แแแแแ แ (แแแขแ แแก แ แแแแแแแแ แชแฎแแแ แแ แชแแแ แฌแงแแแก แแ แแชแฎแแแแแแแก แแแฎแแแแแ). แงแแแแแแ แแแขแแ แ แแแแฃแแแช แแ แแแแแแแแแ. แแแแ แแ แงแฃแ แแแฆแแแ แฃแแแ แแแแฅแชแแแ แฉแแฌแแ แแก แชแแแแแแแก แ แแแแแแแแแก. แแแแฃแแแแแก แฃแแแขแแกแแแแกแแแแก แแก แแ แแก 100 แแแแกแ แชแแแแ, แแแแแกแแแแก แแแแแแแแแแ.
แ แแแแ แช แฉแแแก, แแแแแแแ แแแแ แแ. แแแแ แแ แฉแแแก แแแแแจแ แชแฎแแแ แแแแก 4 แฌแแแก แแแแแแแแแแแจแ แแ แแแแแฎแแแ แ 500 แแฃแแฃแ แแแขแ แแ แชแแขแ แแแขแ แฌแงแแแ, แแก แแ แแก 500 แแแแกแ แแแขแ แ! แแ 500 แแแแกแ แฉแแแแฌแแ แ แคแแแจแจแ. แแ แแก แแฎแแแแ แชแแแ แฌแงแแแแ. แแฅแแแ, แ แ แแฅแแ แฃแแแ, แจแแแแซแแแแ แฉแแแแก แแแแแงแแแแ แงแแแแ แ แแแแแแแแ แฌแแแแฌแแแจแ, แแแแ แแ แแฆแแแฉแแแ, แ แแ แแ แกแแแแแก FRAM แฉแแแแแ. แแ แแแ แแแแ แแแแก แแแแแกแแแ แแกแแ, แแก แแ แแก แแแแแ I2C EEPROM, แแฎแแแแ แแแแแฌแแ แแก แชแแแแแแแก แซแแแแแ แแแแ แ แแแแแแแแแ (แแกแแแแ แแแแแแแ). แฃแแ แแแแ, แแกแแแ แแแแ แแกแฅแแแแแแ แแแแแช แแแ แแแแแแแแ แแแฆแแแแแจแ, แแกแ แ แแ, แฏแแ แฏแแ แแแแ แฉแแแฃแแแแ แแแ 24LC512 แแแแแแแ.
แแแญแแฃแ แ แแแแ แแกแฅแแแแก แแแคแ
แแแแแแแแ แแแแแ แแแคแแก แแแแแแแแ แกแแฎแแจแ แแแแแแแแแ. แแแแขแแ, แแแคแ แจแแแฅแแแ แ แแแแ แช แชแแแแฎแ แแแ. แแแแ แแ แแแก แจแแแแแ, แ แแช แแ แแ แกแแแแ แแแแแขแแ แ แแแแแ แฃแแ แ แแแแแ แแ แแแแแฏแแแกแแฆแแแแแ แแแฆแแแ (แแก แ แแขแแแฆแแช แแ แแ แแก comme il faut แแแก แแแ แแจแ), แแแแแช แแแแแแฌแงแแแขแ แแแคแแแ แจแแแแแแแแ แฉแแแแแแแแกแแแ.
แแแแฅแแแก แแแคแแก แจแแแแแแแแแ แแแแฎแแแ, แ แแ แแแ แแ แคแแแจ แแแฎแกแแแ แแแแก แฉแแแแกแ, แจแแแแซแแ แกแฎแแ แกแแกแแ แแแแแ แแแแแแก แแแแแแจแแ แแแ I2C แแแขแแแฃแกแแแ, แ แแแแ แแชแแ แแแกแแแแ. แแแแแ แแขแฃแแแ แ แ แฃแแแ แแแแแแแแแก แแแกแแ, แฏแแ แแแแแ แกแแแแแฎแแแแ, แแแแ แแ แแก แแแคแแแ แฃแแแ แแงแแก แแแแแขแแแแแ. แแแ แแ, แ แแแแแ แฅแแ แฎแแแแแ แแแคแแแแก แจแแแแแแแก แแแแแ แแแแ, แแแ แ แแ แฐแฅแแแแ แชแแแแฎแ แแแ แแแคแแ แจแแแแแฆแฃแแแแก, แแแแขแแ I2C แฎแแแแแ แแ แแแแแ แแแ แแแคแแก แฃแแแแ แแฎแแ แแก.
แแกแแแ แแงแ แแ แแ แแแแ แแ แแแแแแ แชแแแแฎแ แแแ แแแงแแแแแแแแแก แจแแกแแฎแแ. แแแแขแแ แ แแ แแแคแ แแแฎแแขแฃแแ แแงแ แชแแแแฎแ แแแแ, แแแแขแแ แขแ แแกแแแแก แแ SMD แแแแแแแแแขแแแแก แแแแแแแกแแแ แแงแ แแแแแแแแแ แแ แ แแฎแแ แแก, แฎแแแ แแแแแแแแแแ แแแแแแแแแขแแแแก, แแแแแฅแขแแ แแแแก แแ แแแแแแก แฌแงแแ แแก แแแแ แ แแฎแแ แแก. แ แแแแกแแช แแแคแแแ แแแแแฆแ แแ แแ แแแแก แจแแแแแ, แแแแแแแฌแงแแ แแแแแแแแ แแแแ แแแแแ แแ แงแแแแ แแแแแแแแแขแ แฌแแแ แแฎแแ แแก แแแแแแแแ แ. แแ แแฎแแแแ แแแจแแ, แ แแแแกแแช แกแแฅแแ แแแแฅแขแ แแแแแแ แแแแแแก แจแแแฃแฆแแแแก แแแฃแแฎแแแแแ, แแฆแแแฉแแแ, แ แแ แแแแฃแกแ แแ แแแแฃแกแ แกแแแแ แแกแแแ แ แแงแ แแแงแแแแแแ. แคแแ แแ แแแแแฌแแ แฏแแแแแ แแแแ. แแแแแ แกแฃแ แแแแ แแ แฃแแแ แจแแแชแแแแ แแแงแแแแแแแแ, แแแแ แแ แแแคแแก แแ แแ แแแฌแแแแแแ แแแแ แแแ แแแฌแ แแแแแแแก Boot แฆแแแแแแก แฅแแแซแแกแแแแแ (แแฃแแชแ แจแแกแแซแแแแแแ แแฅแแแแแแ แแแแ แ แคแแแแแ แขแ แแกแแก แแแฎแแขแแ).
แแกแ แแแแแแแแ
แกแแชแฎแแแ แแแแแ
แจแแแแแแ แแแแแฏแ แแ แแก แกแฎแแฃแแ. แแฃ แแฅแแแ แแแฅแแ 3D แแ แแแขแแ แ, แแก แแ แแ แแก แแ แแแแแแ. แซแแแแแ แแ แจแแแฌแฃแฎแแ - แฃแแ แแแแ แกแฌแแ แ แแแแแก แงแฃแแ แแแแฎแแขแ แแ แกแฌแแ แแแแแแแแจแ แแแแแแแแ แญแ แแแแแ. แกแแคแแ แ แแแแแแ แแแฃแแแ แกแฎแแฃแแแ แแชแแ แ แแแแแก แฎแ แแฎแแแแแ.
แแ แฃแแแ แแฆแแแแจแแ, แ แแ Boot แฆแแแแแ แจแแแซแแแแ แแแแแงแแแแแฃแ แแฅแแแก แ แแแแ แช แแแแแแ แแแแแจแแฃแแแแแก แฆแแแแแ - แแกแ แ แแ, แฉแแแ แแแแแแแฉแแแ แแแก แฌแแแ แแแแแแแ. แแแแกแแแแแก แแ แแแแฎแแขแ แกแแแชแแแแฃแ แ "แญแ", แกแแแแช แฆแแแแแ แชแฎแแแ แแแก.
แแแ แแฃแกแแก แจแแแแแ แแ แแก แแกแแแ แกแแแแแซแแแ, แ แแแแแแแแช แแแคแ แแแแแแขแแแแแฃแแแ แแ แแแแแแ แแแฃแแแ แแ แแ M3 แฎแ แแฎแแแ (แแแคแแแ แแแขแ แแแแแแ แแ แแงแ)
แแแกแแแแ แจแแแแ แฉแแ แฃแแแ แฅแแแกแแก แแแ แแแแ แแแแฃแจแแก แแแ แกแแแก แแแแแญแแแแกแแก. แกแขแแแแแ แขแฃแแ แแ แฎแแแแแแ แแแแแฎแแแแ แแ แจแแแแฎแแแแแจแ แแ แฏแแแแแแ, แแแแ แแ แแแแแจแ แแงแ OLED แแแกแแแแ SSD1306 128ร32. แชแแขแ แแแขแแ แแ, แแแแ แแ แแ แแแฌแแแก แงแแแแแแฆแ แแแแ แ - แแก แฉแแแแแแก แแแแแแขแแ.
แแ แแแแ แแ แแแแก แแแแแแแ, แแฃ แ แแแแ แแแแแแแแ แแแแแฃแแก แแแกแแแ, แแแแแแฌแงแแแขแ แแแกแแแแ แแแแแแแแ แแแแแ แแแ แแฃแกแแก แจแฃแแจแ. แแ แแแแแแแแ, แ แ แแฅแแ แฃแแแ, แแแแแแแ - แฆแแแแแ แแ แแก แแแแแ, แแแ แแแ แฅแแแแ. แแแแ แแ แแ แฃแแแ แแแฅแแ, แ แแ แแแกแแแแแก แแแแแแ แแแแก แแแแ แซแแแแแ แแแแแ แแแฉแแแ แแ แแ แซแแแแแ แแแแแ แแแแแ แแแคแแก แฎแแแแฎแแ แแแแแขแแแ แฆแแแแแแก แแแแแกแแขแแแแ.
แแแฌแงแแแแแแแ แแฌแงแแแแแแ. แแแกแแแแแก แแแแฃแแ แชแฎแแ แฌแแแแแ แแ แแก แแแแแแ แแแฃแแ แกแแแขแแ
แกแแแแแแ แจแแแแแ แจแแแแซแแแแ แแแฎแแ KDPV-แแ
แคแแ แแ
แแแแแ แแแแแแแแแ แแ แแแ แแแฃแแ แฃแแ แฃแแแแแงแแคแแก แแแฌแแแแ. แแกแแแแกแ แแแขแแ แ แฎแแแแแแแแแแแแแกแแแแก, แแ แแแแแแแแแ แแแแฌแแแก แแแแแแแก แแแแแงแแแแแ (
แ แแแแ แช แฉแแแก, แงแแแแแคแแ แ แแแ แขแแแแ, แแแแ แแ แแ แช แแกแ แแแ แขแแแ - แแแฌแงแแแแแแแแก แแฅแแก แ แแแแแแแแ แแแแแฃแแแแแแแแ แคแฃแแฅแชแแ:
- แแแแฎแแแ แแแแแ แแญแแ แก แฆแแแแแก แแ แฃแงแฃแ แแแก แแแ แแแก
- แแแขแ แ แแแแแจแแแ แแ แแแแแแฎแแแ แแแแจแแแแแแแแแ แคแแแจ แแแฎแกแแแ แแแแจแ
- แแแแฃแแ แแแแแขแ แแแแแก WiFi แกแแแแแแก แแ แกแแญแแ แแแแแก แจแแแแฎแแแแแจแ แฎแแแแฎแแ แแแแแจแแ แแแก
- แแกแ, แแแชแแแชแแแ แแแแฃแ แแก แแแ แแจแ แจแแฃแซแแแแแแแ
แแฅแแแ แแ แจแแแแซแแแแ แแแแแ แแฃแแแ, แ แแ แแ แแ แคแฃแแฅแชแแ แแ แแฃแจแแแแแ, แแฃ แแแแ แ แ แแแแ แแแแแแแ แแแแแแแแแแ. แแ แฃแแแ แแแแกแ แแแฅแขแฃแกแแแแ แกแฎแแ แแ แแแฅแขแแแจแ แแ แแฎแแ แแแแแช แแฎแแแแ แฎแแ แแแแแแก แกแขแแแจแ: โแแแแแ แแ แแ แแแขแ แ แแแแแแขแแแ, แ แแแแแ แแแ แแแ แแ แแแแแแขแจแ แแฎแแแแแแแโ แแ โแแแแฎแแแ แแแแแ แแแ แแคแแ แก แแแแแแแก, แกแแแแ แแแแฃแแ แฃแแ แแแแแ. แฒแแ - แคแแ." แ แ แแฅแแ แฃแแแ, แแแแแแ แแ แ แแ แจแแแซแแแแ แแแแแแแแก แจแแคแแ แฎแแแแแแก แกแแจแฃแแแแแแ, แแแแ แแ แจแแแซแแแแ แจแแแแฅแแแแ แจแแแฆแฃแแแแแ แฎแแแแ แซแแแแแแแก, แแแ แแแแก แฉแแแแแแก แแ แชแแแแแแแแก แแ แแแขแแแฃแ แ แชแแแแแแแแแแก แจแแกแแฎแแ. แแกแ, แแแแ, แ แแแแแแช แงแแแแแคแแ แก แแแแแแแก, แกแฌแ แแคแแ แแฅแชแแแ แแฃแจแแ.
ะ
แแ แแแแแแแแแ, แจแแแกแฌแแแแแ แแแแกแฎแแแแแแแแ แแ แแแแแชแแฃแ แแ แแแแแฃแ แแแขแฃแแแ แแแ แแ แแแแแแแแชแแแแก แจแแ แแก, แ แแแแ แช แกแฃแ แแแแแกแแแแแ . แแฎแแ แกแแแแแแแ แแแแแแแแแ แแแแแ.
#####################################
# Counter class - implements a single water counter on specified pin
#####################################
class Counter():
debounce_ms = const(25)
def __init__(self, pin_num, value_storage):
self._value_storage = value_storage
self._value = self._value_storage.read()
self._value_changed = False
self._pin = Pin(pin_num, Pin.IN, Pin.PULL_UP)
loop = asyncio.get_event_loop()
loop.create_task(self._switchcheck()) # Thread runs forever
แแแแแแฃแ แแ แแชแฎแแแแก แแแฃแจแแแแแก Counter แแแแกแแก แแแแแแแแ. แฃแแแ แแแแแก แงแแแแแกแ, แกแแฌแงแแกแ แแ แแชแฎแแแแแก แแแแจแแแแแแแ แแแแแแแแแฃแแแ EEPROM-แก (แแแแจแแแแแแแแก_แจแแแแฎแแ) - แแกแ แฎแแแแ แแฆแแแแแ แแแแแก แแแแแจแแแก แจแแแแแ.
แฅแแแซแแกแแแแแก แแแแชแแแแแแแชแแ แฎแแแแ แฉแแจแแแแแฃแแ แแแแกแแงแแแแแ แแแแฅแขแ แแแแแแ แแแแแแแแ: แแฃ แแแ แฌแแแก แฉแแแ แแแแแ แแแฎแฃแ แฃแแแ, แฎแแแ แแฃแแแก แขแแแแ, แแฃ แฎแแแ แฆแแแ, แแก แแแแจแแแ แแแแฅแขแ แแแแแแ แแแแแแแแ แแ แแแแขแ แแแแ แ แแแแฎแฃแแแแก แแ แแก.
แแฅ แแกแแแ แแฎแกแแแแ แชแแแแ แแแแแแแแ, แ แแแแแแช แแแแแแแแฎแแแก แแแแก. แแแแแแฃแแ แแ แแชแฎแแแแ แจแแแกแ แฃแแแแก แแแแแก แแแแแแแแแก. แแฅ แแ แแก แแแกแ แแแแ
""" Poll pin and advance value when another litre passed """
async def _switchcheck(self):
last_checked_pin_state = self._pin.value() # Get initial state
# Poll for a pin change
while True:
state = self._pin.value()
if state != last_checked_pin_state:
# State has changed: act on it now.
last_checked_pin_state = state
if state == 0:
self._another_litre_passed()
# Ignore further state changes until switch has settled
await asyncio.sleep_ms(Counter.debounce_ms)
25แแ-แแก แจแแคแแ แฎแแแแ แกแแญแแ แ แแแแขแแฅแขแแก แแแ แฃแแแแก แแแกแแคแแแขแ แแ แแ แแแแแแ แแฃแแแ แแก แแ แแแฃแแแ แแแก แ แแแแแแแ แฎแจแแ แแ แแฆแแแซแแแก แแแแแแแแ (แ แแแแกแแช แแก แแแแชแแแ แกแซแแแแแก, แกแฎแแ แแแแชแแแแแ แแแจแแแแฃแแแ). แงแแแแ 25ms-แจแ แคแฃแแฅแชแแ แแฆแแแซแแแก, แแแแฌแแแแก แฅแแแซแแกแแแแก แแ แแฃ แแแ แฌแแแก แแแแแแ แแแแแ แแแแขแแฅแขแแแ แแแฎแฃแ แฃแแแ, แแแจแแ แแแแแ แแ แแ แแแขแ แ แแแแแแ แแ แแชแฎแแแแจแ แแ แแก แฃแแแ แแแแฃแจแแแแแก.
def _another_litre_passed(self):
self._value += 1
self._value_changed = True
self._value_storage.write(self._value)
แจแแแแแแ แแแขแ แแก แแแแฃแจแแแแแ แขแ แแแแแแฃแ แแ - แแ แแชแฎแแแแ แฃแแ แแแแ แแแ แแแแ. แแแ แแ แแฅแแแแแแ แแฎแแแ แแแแจแแแแแแแแก แคแแแจ แแ แแแแแ แฉแแฌแแ แ.
แแแฎแแ แฎแแแฃแแแแแกแแแแก แแแฌแแแแแฃแแแ โแแฅแกแแกแแ แแแโ.
def value(self):
self._value_changed = False
return self._value
def set_value(self, value):
self._value = value
self._value_changed = False
แแฎแแ แแแแแ แแแกแแ แแแแแแ Python-แแก แแ uasync แแแแแแแแแแแก แกแแแแแแแแแแ แแ แจแแแฅแแแแ แแแกแแแแแแแแ แแ แแชแฎแแแแ แแแแแฅแขแ (แ แแแแ แจแแแแแซแแแ แแก แ แฃแกแฃแแแ แแแแ แแแแแ? แแก, แ แแกแ แแแแแแช แจแแแแซแแแแ?)
def __await__(self):
while not self._value_changed:
yield from asyncio.sleep(0)
return self.value()
__iter__ = __await__
แแก แแกแแแ แแแกแแฎแแ แฎแแแแแ แคแฃแแฅแชแแแ, แ แแแแแแช แแแแแแแ แแ แแชแฎแแแแแก แแแแจแแแแแแแแก แแแแแฎแแแแแก - แคแฃแแฅแชแแ แแ แแแแแ แ แแฆแแแซแแแก แแ แแแแฌแแแแก _value_changed แแ แแจแแก. แแ แคแฃแแฅแชแแแก แแแแแแ แ แแก แแ แแก, แ แแ แแแ แแก แแแแ แจแแแซแแแแ แแแแซแแแแก แแ แคแฃแแฅแชแแแก แแแแแซแแฎแแแแกแแก แแ แแแแซแแแแก แแฎแแแ แแแแจแแแแแแแแก แแแฆแแแแแแ.
แ แแช แจแแแฎแแแ แจแแคแแ แฎแแแแแก?แแแแฎ, แแ แแขแแแแ แจแแแแซแแแแ แขแ แแแ แแแแแฌแแแ แแ แแฅแแแ, แ แแ แแฅแแแ แแแแแแ แแฅแแแ แจแแคแแ แฎแแแแแแก แจแแกแแฎแแ, แแแแ แแ แกแแแแแแแแแแจแ แแฅแแแ แแแแแแแแ แกแฃแแแแฃแ แ แแแแแแแ. แคแแฅแขแแแ แแแแ, แจแแคแแ แฎแแแแแ แแ แแก แแแ แแแแ, แ แแช แแชแแแ. ESP8266-แจแ แจแแแแซแแแแ แแแแฌแงแแ แแแแแแแแก แจแแคแแ แฎแแแ แแ แแแฌแแ แแ แแ แจแแคแแ แฎแแแแก แแแแแฃแจแแแแแแแแช แแ แแแแแแจแ. แแ แจแแคแแ แฎแแแแกแแก แชแแแแแแก แแแแจแแแแแแแ แจแแแซแแแแ แแแแแฎแแแแก. แแแแแ, แแก แกแแแแแ แแกแ แแฅแแแแแแ, แแฃ แแ แแชแฎแแแแ แแฅแแแแแแ แแแแฃแ แ แแแฌแงแแแแแแแ - แ แแแแแแช แแแแแแแ, แกแแแแ แแ แแแแแฎแแแแแ แแก แแแแจแแแแแแแ.
แกแแแฌแฃแฎแแ แแ (แแฃ แกแแแแแแแแ แแ?) แฉแแแ แแแฌแงแแแแแแแ แแฅแขแแฃแ แแ, แแแ แแแแแ แฃแแแ แแแแแแแแแก แจแแขแงแแแแแแแแแ MQTT แแ แแขแแแแแแ แแ แฉแแฌแแ แแก แแแแแชแแแแแ EEPROM-แจแ. แแ แแฅ แแแฅแแแแแแก แจแแแฆแฃแแแแแ - แแฅแแแ แแ แจแแแแซแแแแ แแแฎแกแแแ แแแแก แแแแแงแแคแ แจแแคแแ แฎแแแแแจแ แแ แแแแแแงแแแแ แแแแ แแแกแขแ, แ แแช แแแจแแแแก, แ แแ แจแแแแซแแแแ แแแแแแฌแงแแ แจแแขแงแแแแแแแแแแก แแแแแแแแ แฅแกแแแจแ. แแ แกแแแแแก buns แ แแแแ แแชแแ micropython.schedule(), แ แแแแแแช แกแแจแฃแแแแแแก แแแซแแแแ แแแฃแจแแแ แแแ แแแแฃแแ แคแฃแแฅแชแแ "แ แแช แจแแแซแแแแ แแแแ", แแแแ แแ แฉแแแแแ แแแแฎแแ, "แ แ แแแ แ แแฅแแก?" แ แ แแแฎแแแแ, แแฃ แฉแแแ แแฎแแแแ แแแแแแแแแ แ แแแแ แกแแฎแแก แจแแขแงแแแแแแแแก แแ แจแแแแแ แแแแแก แจแแคแแ แฎแแแ แแ แแคแฃแญแแแก แชแแแแแแแแก แแแแจแแแแแแแแแก. แแ, แแแแแแแแแ, แแฎแแแ แแ แแชแฎแแแแแก แแแแจแแแแแแแ แแแแแแ แกแแ แแแ แแแแ, แ แแชแ แฏแแ แแ แแแฅแแแแ แฉแแฌแแ แแแ แซแแแแ. แแแแแแแ, แแฅแแแ แฃแแแ แแแแแแแแ แกแแแฅแ แแแแแแชแแ แแ แกแฎแแแแแแ แแ แแแแแฎแแแแแ แแแกแแแ.
แแ แแ แแแแแ แ RuntimeError: แแแแแแแแ แกแขแแแแก แกแ แฃแแ แแแแ แแ แแ แแแ แแชแแก แ แแขแแ?
แแจแแแ แ แแแแแแแแฎแแแ แแ uasync-แแ, แแ แจแแแแฎแแแแแจแ แ แแฆแแชแแแแ แแ แฃแคแ แ แแแแแแ แแ แกแแแแ แแแแแแแก
EEPROM-แแแ แแฃแจแแแแ แแชแแ แ แแแแกแจแ แแแแแขแแแ
class EEPROM():
i2c_addr = const(80)
def __init__(self, i2c):
self.i2c = i2c
self.i2c_buf = bytearray(4) # Avoid creation/destruction of the buffer on each call
def read(self, eeprom_addr):
self.i2c.readfrom_mem_into(self.i2c_addr, eeprom_addr, self.i2c_buf, addrsize=16)
return ustruct.unpack_from("<I", self.i2c_buf)[0]
def write(self, eeprom_addr, value):
ustruct.pack_into("<I", self.i2c_buf, 0, value)
self.i2c.writeto_mem(self.i2c_addr, eeprom_addr, self.i2c_buf, addrsize=16)
แแแแแแจแ แซแแแแแ แฃแจแฃแแแแ แแแแขแแแแแ แแฃแจแแแแ, แแแแ แแ แแก แแ แแก แแแแขแ, แ แแแแแแช แแฌแแ แแแ แแแฎแกแแแ แแแแจแ. แแแแ แ แแชแฎแแแแกแ แแ แแแแขแแแก แจแแ แแก แแแแแแ แขแแชแแแก แจแแแแฆแแแแ แแแแแฌแแ ustruct แแแแแแแแแแแก แแแแแงแแแแแแ.
แแแแกแแแแแก, แ แแ I2C แแแแแฅแขแ แแ แแแฎแกแแแ แแแแก แฃแฏแ แแแแก แแแกแแแแ แแ แงแแแแ แฏแแ แแ แแ แแแแแแแขแแแ, แแก แงแแแแแคแแ แ แแแขแแ แ แแ แแแกแแฎแแ แฎแแแแ แแแแกแแแแจแ แฉแแแแขแแ แ.
class EEPROMValue():
def __init__(self, i2c, eeprom_addr):
self._eeprom = EEPROM(i2c)
self._eeprom_addr = eeprom_addr
def read(self):
return self._eeprom.read(self._eeprom_addr)
def write(self, value):
self._eeprom.write(self._eeprom_addr, value)
แแแแแ I2C แแแแแฅแขแ แแฅแแแแแ แแ แแแ แแแแขแ แแแแ
i2c = I2C(freq=400000, scl=Pin(5), sda=Pin(4))
แแแแแแแ แงแแแแแแ แกแแแแขแแ แแกแ แแแฌแแแแแแ - แกแแ แแแ แแแ แแแแฃแแแแแชแแแก แแแแฎแแ แชแแแแแแ MQTT-แแก แกแแจแฃแแแแแแ. แแกแ, แแ แแ แแก แกแแญแแ แ แแแแแ แแ แแขแแแแแแก แแแแแ แแแ - แแแขแแ แแแขแจแ แแแแแแ
แงแแแแ แงแแแแแแ แกแแแแขแแ แแกแ แแแแแ แแ แแแแแแ CounterMQTTClient แแแแกแจแ, แ แแแแแแช แแแคแฃแซแแแแฃแแแ MQTTClient แแแแแแแแแแแแ. แแแแแฌแงแแ แแแ แแคแแ แแแแแ
#####################################
# Class handles both counters and sends their status to MQTT
#####################################
class CounterMQTTClient(MQTTClient):
blue_led = Pin(2, Pin.OUT, value = 1)
button = Pin(0, Pin.IN)
hot_counter = Counter(12, EEPROMValue(i2c, EEPROM_ADDR_HOT_VALUE))
cold_counter = Counter(13, EEPROMValue(i2c, EEPROM_ADDR_COLD_VALUE))
แแฅ แจแแแแซแแแแ แจแแฅแแแแ แแ แแแแแแแคแแแฃแ แแ แแ แแแแฃแ แแแแก แฅแแแซแแกแแแแแแ แแ แฆแแแแแแแ, แแกแแแ แชแแแ แแ แชแฎแแแ แฌแงแแแก แแ แแชแฎแแแแแก แแแแแฅแขแแแ.
แแแแชแแแแแแแชแแแก แจแแแแฎแแแแแจแ, แงแแแแแคแแ แ แแกแ แขแ แแแแแแฃแ แ แแ แแ แแก
def __init__(self):
self.internet_outage = True
self.internet_outages = 0
self.internet_outage_start = ticks_ms()
with open("config.txt") as config_file:
config['ssid'] = config_file.readline().rstrip()
config['wifi_pw'] = config_file.readline().rstrip()
config['server'] = config_file.readline().rstrip()
config['client_id'] = config_file.readline().rstrip()
self._mqtt_cold_water_theme = config_file.readline().rstrip()
self._mqtt_hot_water_theme = config_file.readline().rstrip()
self._mqtt_debug_water_theme = config_file.readline().rstrip()
config['subs_cb'] = self.mqtt_msg_handler
config['wifi_coro'] = self.wifi_connection_handler
config['connect_coro'] = self.mqtt_connection_handler
config['clean'] = False
config['clean_init'] = False
super().__init__(config)
loop = asyncio.get_event_loop()
loop.create_task(self._heartbeat())
loop.create_task(self._counter_coro(self.cold_counter, self._mqtt_cold_water_theme))
loop.create_task(self._counter_coro(self.hot_counter, self._mqtt_hot_water_theme))
loop.create_task(self._display_coro())
mqtt_as แแแแแแแแแแแก แแแแ แแชแแฃแแ แแแ แแแแขแ แแแแก แแแกแแงแแแแแแแ แแแแแแงแแแแแ แกแฎแแแแแกแฎแแ แแแ แแแแขแ แแแแก แแแแ แแแฅแกแแแแแ - แแแแคแแแฃแ แแชแแ. แแแแฃแแแกแฎแแแแ แแแ แแแแขแ แแแแก แฃแแแขแแกแแแ แฉแแแแแแแก แแแ แแแ, แแแแ แแ แแแแ แ แแแ แแแแขแ แ แแแแคแแแ แฃแแแ แแงแแก แแแงแแแแแฃแแ. แแแ แแแแขแ แแแ แ แแ แแแ แแแแแ แแแแจแ แแ แฉแแแฌแแ แ, แแแ แขแแฅแกแขแฃแ แคแแแแจแ config.txt แแแแแฎแแ. แแก แกแแจแฃแแแแแแก แแแซแแแแ แจแแชแแแแแ แแแแ แแแ แแแแขแ แแแแก แแแฃแฎแแแแแแ, แแกแแแ แแแแฌแแแแฃแแแ แ แแแแแแแแ แแแแแขแฃแ แ แแแฌแงแแแแแแแ แกแฎแแแแแกแฎแแ แแแ แแแแขแ แแ.
แแแแแก แแแแ แแแแแ แแฌแงแแแก แ แแแแแแแแ แแแ แฃแขแแแก แกแแกแขแแแแก แกแฎแแแแแกแฎแแ แคแฃแแฅแชแแแแแก แจแแกแแกแ แฃแแแแแแ. แแแแแแแแแ, แแฅ แแ แแก แแแ แฃแขแแแ, แ แแแแแกแแช แกแแ แแแกแแแ แฃแ แแชแฎแแแก
async def _counter_coro(self, counter, topic):
# Publish initial value
value = counter.value()
await self.publish(topic, str(value))
# Publish each new value
while True:
value = await counter
await self.publish_msg(topic, str(value))
แแแ แฃแขแแแ แแแ แงแฃแแจแ แแแแแแแ แแฎแแ แแ แแชแฎแแแแก แแ, แ แแแแ แช แแ แแแแแฉแแแแแ, แแแแแแแแก แจแแขแงแแแแแแแแก MQTT แแ แแขแแแแแแ. แแแแแก แแแ แแแแ แแแฌแแแ แแแแแแแแก แกแแฌแงแแก แแแแจแแแแแแแแก แแแจแแแแช แแ, แแฃ แฌแงแแแ แแ แแแแแแแแแ แแ แแชแฎแแแแจแ.
แกแแแแแ แแแแกแ MQTTClient แแแกแแฎแฃแ แแแ แแแแแก แแแแก, แแฌแงแแแก WiFi แแแแจแแ แก แแ แฎแแแแฎแแ แแแแแจแแ แแแก แแแแจแแ แแก แแแแแ แแแแกแแก. แ แแแแกแแช แฎแแแแ แชแแแแแแแแแ WiFi แแแแจแแ แแก แแแแแแแ แแแแแจแ, แแแแแแแแแแ แแแแขแงแแแแแแแก wifi_connection_handler-แแก แแแ แแแแแ
async def wifi_connection_handler(self, state):
self.internet_outage = not state
if state:
self.dprint('WiFi is up.')
duration = ticks_diff(ticks_ms(), self.internet_outage_start) // 1000
await self.publish_debug_msg('ReconnectedAfter', duration)
else:
self.internet_outages += 1
self.internet_outage_start = ticks_ms()
self.dprint('WiFi is down.')
await asyncio.sleep(0)
แคแฃแแฅแชแแ แแฃแแฌแ แคแแแแ แแ แแก แแแแแ แแแฃแแ แแแแแแแแแแแแแ. แแ แจแแแแฎแแแแแจแ, แแก แแแแแแก แแแแแจแแแก แ แแแแแแแแแก (แแแขแแ แแแข_แแแแแจแแ) แแ แแแ แฎแแแแ แซแแแแแแแก. แ แแแแกแแช แแแแจแแ แ แแฆแแแแแ, แฃแแแฅแแแแแแแก แแ แ แแแแแแแแแ แกแแ แแแ แก.
แกแฎแแแแ แจแแ แแก, แแแแ แซแแแ แแฎแแแแ แแแแกแแแแกแแ แกแแญแแ แ, แ แแ แคแฃแแฅแชแแ แแกแแแฅแ แแแฃแแ แแงแแก - แแแแแแแแแแแจแ แแแก แฃแฌแแแแแแ via await-แก แแ แจแแแซแแแแ แแแแแแซแแฎแแก แแฎแแแแ แคแฃแแฅแชแแแแ, แ แแแแแแ แกแฎแแฃแแ แจแแแชแแแก แกแฎแแ แแแแแแแแก.
WiFi-แแแ แแแแแแจแแ แแแแก แแแ แแ, แแฅแแแ แแกแแแ แแญแแ แแแแแ แแแแจแแ แแก แแแแงแแ แแแ MQTT แแ แแแแ แแแ (แกแแ แแแ แแแ). แแแแแแแแแแแช แแแแก แแแแแแแก แแ แแแแจแแ แแก แแแแงแแ แแแแกแแก แแแแฅแแก แจแแกแแซแแแแแแแ แแแแแแแแแ แ แแแแ แกแแกแแ แแแแแ
async def mqtt_connection_handler(self, client):
await client.subscribe(self._mqtt_cold_water_theme)
await client.subscribe(self._mqtt_hot_water_theme)
แแฅ แฉแแแ แแแแแแฌแแ แ แ แแแแแแแแ แจแแขแงแแแแแแแแก - แกแแ แแแ แก แแฎแแ แแฅแแก แจแแกแแซแแแแแแแ แแแแงแแแแก แแแแแแแแ แ แแ แแชแฎแแแแแก แแแแจแแแแแแแแแ แจแแกแแแแแแกแ แจแแขแงแแแแแแแแก แแแแแแแแแ.
def mqtt_msg_handler(self, topic, msg):
topicstr = str(topic, 'utf8')
self.dprint("Received MQTT message topic={}, msg={}".format(topicstr, msg))
if topicstr == self._mqtt_cold_water_theme:
self.cold_counter.set_value(int(msg))
if topicstr == self._mqtt_hot_water_theme:
self.hot_counter.set_value(int(msg))
แแก แคแฃแแฅแชแแ แแแฃแจแแแแแก แจแแแแกแฃแ แจแแขแงแแแแแแแแแก แแ แแแแแแแ แแแแแแแแแแ แ (แจแแขแงแแแแแแแแแแก แกแแแแฃแ แ), แแแแแฎแแแแแ แแ แ-แแ แแ แแ แแชแฎแแแแแก แแแแจแแแแแแแแแ.
แ แแแแแแแแ แแแแฎแแแ แ แคแฃแแฅแชแแ
# Publish a message if WiFi and broker is up, else discard
async def publish_msg(self, topic, msg):
self.dprint("Publishing message on topic {}: {}".format(topic, msg))
if not self.internet_outage:
await self.publish(topic, msg)
else:
self.dprint("Message was not published - no internet connection")
แแก แคแฃแแฅแชแแ แแแแแแแแก แจแแขแงแแแแแแแแก, แแฃ แแแแจแแ แ แแแแงแแ แแแฃแแแ. แแฃ แแแแจแแ แ แแ แแ แแก, แจแแขแงแแแแแแแ แแแแแ แแ แแแฃแแแ.
แแ แแก แแฎแแแแ แแแกแแฎแแ แฎแแแแแ แคแฃแแฅแชแแแ, แ แแแแแแช แฅแแแแก แแ แแแแแแแแก แแแแแ แแแแก แจแแขแงแแแแแแแแแก.
async def publish_debug_msg(self, subtopic, msg):
await self.publish_msg("{}/{}".format(self._mqtt_debug_water_theme, subtopic), str(msg))
แแแแแแ แขแแฅแกแขแ แแ แฉแแแ แฏแแ แแ แแแแฎแแแฎแแแแแก LED-แก. แฒแฅ
# Blink flash LED if WiFi down
async def _heartbeat(self):
while True:
if self.internet_outage:
self.blue_led(not self.blue_led()) # Fast blinking if no connection
await asyncio.sleep_ms(200)
else:
self.blue_led(0) # Rare blinking when connected
await asyncio.sleep_ms(50)
self.blue_led(1)
await asyncio.sleep_ms(5000)
แแ แแแแแฌแแแ 2 แแแชแแแชแแแ แ แแแแแ. แแฃ แแแแจแแ แ แแแแแแ แแแแ (แแ แแก แแฎแแแฎแแ แแแแงแแ แแแฃแแแ), แแแฌแงแแแแแแแ แกแฌแ แแคแแ แแชแแแชแแแแแแ. แแฃ แแแแจแแ แ แแแแงแแ แแ, แแแฌแงแแแแแแแ แงแแแแ 5 แฌแแแจแ แแ แแฎแแ แชแแแชแแแแแก. แกแแญแแ แแแแแก แจแแแแฎแแแแแจแ, แแแชแแแชแแแ แกแฎแแ แ แแแแแแแแก แแแแแ แแแ แจแแกแแซแแแแแแแ แแฅ.
แแแแ แแ LED แฃแแ แแแแ แแแแแแแแ แแแฃแแแ. แฉแแแแช แแฃแแแแแแแแแ แฉแแแแแแแก.
async def _display_coro(self):
display = SSD1306_I2C(128,32, i2c)
while True:
display.poweron()
display.fill(0)
display.text("COLD: {:.3f}".format(self.cold_counter.value() / 1000), 16, 4)
display.text("HOT: {:.3f}".format(self.hot_counter.value() / 1000), 16, 20)
display.show()
await asyncio.sleep(3)
display.poweroff()
while self.button():
await asyncio.sleep_ms(20)
แแ แ แแแแช แแกแแฃแแ แแแแ - แ แ แแแ แขแแแ แแ แแแกแแฎแแ แฎแแแแแแ แแก แแแ แฃแขแแแแแแ. แแก แแแขแแ แ แคแฃแแฅแชแแ แแฆแฌแแ แก แแแแฎแแแ แแแแแก แแแแ แแแแแชแแแแแแแก. แแแ แฃแขแแแ แฃแแ แแแแ แแแแแแแ แฆแแแแแแก แแแญแแ แแก แแ แแ แแแแแ แแแ แแแ 3 แฌแแแแก แแแแแแแแแแแจแ. แแแ แแแ แแฉแแแแแแก แแ แแชแฎแแแแแก แแแแแแแแ แ แฉแแแแแแแแก.
แฏแแ แแแแแ แ แแแแแแแแ แฌแแ แแแแแแ แแแ แฉแ. แแฅ แแ แแก แคแฃแแฅแชแแ, แ แแแแแแช (แฎแแแแฎแแ) แแฌแงแแแก แแ แกแแฌแแ แแแก. แแแแแแ แ แแแ แงแฃแแ แแฎแแแแ แฌแฃแแจแ แแ แแฎแแ แแแแแแแแก แกแฎแแแแแกแฎแแ แแแแแ แแแแก แแแคแแ แแแชแแแก. แแแแแแแ, แชแแขแแ แแแก แ แแแแ แช แแ แแก - แแคแแฅแ แแ, แแแแแแขแ แแแแแแขแแ แแก แแแแแแแแ แแ แแ แแก แกแแญแแ แ
async def main(self):
while True:
try:
await self._connect_to_WiFi()
await self._run_main_loop()
except Exception as e:
self.dprint('Global communication failure: ', e)
await asyncio.sleep(20)
async def _connect_to_WiFi(self):
self.dprint('Connecting to WiFi and MQTT')
sta_if = network.WLAN(network.STA_IF)
sta_if.connect(config['ssid'], config['wifi_pw'])
conn = False
while not conn:
await self.connect()
conn = True
self.dprint('Connected!')
self.internet_outage = False
async def _run_main_loop(self):
# Loop forever
mins = 0
while True:
gc.collect() # For RAM stats.
mem_free = gc.mem_free()
mem_alloc = gc.mem_alloc()
try:
await self.publish_debug_msg("Uptime", mins)
await self.publish_debug_msg("Repubs", self.REPUB_COUNT)
await self.publish_debug_msg("Outages", self.internet_outages)
await self.publish_debug_msg("MemFree", mem_free)
await self.publish_debug_msg("MemAlloc", mem_alloc)
except Exception as e:
self.dprint("Exception occurred: ", e)
mins += 1
await asyncio.sleep(60)
แแแแแ แ แแแแแแแแ แแแ แแแแขแ แ แแ แแฃแแแแแ แแฆแฌแแ แแแแแแก แแแกแแกแ แฃแแแแแแ
#####################################
# Constants and configuration
#####################################
config['keepalive'] = 60
config['clean'] = False
config['will'] = ('/ESP/Wemos/Water/LastWill', 'Goodbye cruel world!', False, 0)
MQTTClient.DEBUG = True
EEPROM_ADDR_HOT_VALUE = const(0)
EEPROM_ADDR_COLD_VALUE = const(4)
แงแแแแแคแแ แ แแกแ แแฌแงแแแ
client = CounterMQTTClient()
loop = asyncio.get_event_loop()
loop.run_until_complete(client.main())
แ แแฆแแช แแแฎแแ แฉแแแก แแแฎแกแแแ แแแแจแ
แแกแ แ แแ, แงแแแแ แแแแ แแฅ แแ แแก. แแ แแแขแแแ แแ แคแแแแแแ ampy แฃแขแแแแขแแก แแแแแงแแแแแแ - แแก แกแแจแฃแแแแแแก แแแซแแแแ แแขแแแ แแแ แแกแแแ แจแแแ (แแก ESP-07 แแแแแ) แคแแแจ แแ แแแแแ แแ แจแแแแแ แจแแฎแแแแแ แแแก แแ แแแ แแแแแแ, แ แแแแ แช แฉแแแฃแแแแ แแแ แคแแแแ. แแฅ แแกแแแ แแแขแแแ แแ mqtt_as, uasyncio, ssd1306 แแ แแแแแฅแชแแแแแก แแแแแแแแแแแแ, แ แแแแแแกแแช แแแงแแแแแแ (แแแแแแงแแแแแแแ mqtt_as-แจแ).
แฉแแแ แแแฌแแ แแแแแ แแแก แแ... แแแฆแแแ MemoryError-แก. แฃแคแ แ แแแขแแช, แ แแช แฃแคแ แ แแชแแแแแแแ แแแแแแ, แกแแ แแแแแแ แแฃแกแขแแ แแแฎแกแแแ แแแ, แ แแช แฃแคแ แ แแแข แแแแแ แแแแก แแ แแแขแก แแแแแแกแแแแ, แแแ แฃแคแ แ แแแ แ แฉแแแแแแแ แแก แจแแชแแแแ. Google-แแก แแแแแ แซแแแแแ แแแแแงแแแแ แแแแก แแแแแแแแแ, แ แแ แแแแ แแแแแขแ แแแแ แก แแฅแแก, แแ แแแชแแแจแ, แแฎแแแแ 30 แแ แแแฎแกแแแ แแแ, แ แแแแแจแแช 65 แแ แแแแ (แแแแแแแแแแแแแก แฉแแแแแแ) แฃแแ แแแแ แแแ แฏแแแแ.
แแแแ แแ แแ แแก แแแแแกแแแแแ. แแแแแแแก, แ แแ micropython แแ แแฎแแ แชแแแแแแก แแแแก แแแ แแแแแ .py แคแแแแแแแ - แแก แคแแแแ แฏแแ แแแแแแแแ แแแฃแแแ. แฃแคแ แ แแแขแแช, แแก แจแแแแแแแแแ แฃแจแฃแแแแ แแแแ แแแแแขแ แแแแ แแ, แแแแแแฅแชแแแ แแแแขแแแแแแ, แ แแแแแแช แจแแแแแ แแแแฎแแแ แแแฎแกแแแ แแแแจแ. แแกแ, แ แแ แแแแแแแแ แแ แแแฃแจแแแก, แแฅแแแ แแกแแแ แแญแแ แแแแแ แแแแ แแขแแฃแแ แแแฎแกแแแ แแแ.
แฎแ แแแ แแ แแก แแแแ แแแแแขแ แแแแ แแก แแแแแ แฉแแแ แ แแกแฃแ แกแแ แแแขแแแกแแฃแ แ แแแแแแแแชแแแกแแแ. แแฅแแแ แจแแแแซแแแแ แจแแแแแแแแ แคแแแแแแ แแแ แแแแแแฃแขแแ แแ แแ แแขแแแ แแแ แแแ แแแแขแแแแแ แแแแ แแแแแขแ แแแแ แจแ. แแแแกแแแแแก แแฅแแแ แฃแแแ แฉแแแแขแแแ แแแ micropython firmware แแ build
แแ แแ แแแแแฌแแ แแ Makefile, แแแแ แแ แฎแแแแ แแแแแแ แ แแ แจแแแแแแแแ แงแแแแ แกแแญแแ แ แคแแแแ (แแแแแแแแแแแแแก แฉแแแแแแ) แแกแแแแกแ แ แแ
mpy-cross water_counter.py
แ แฉแแแ แแฎแแแแ แคแแแแแแแก แแขแแแ แแแ .mpy แแแคแแ แแแแแแ, แแ แแแแแแแฌแงแแแ แฏแแ แจแแกแแแแแแกแ .py แฌแแจแแแแ แแแฌแงแแแแแแแแก แคแแแแฃแ แ แกแแกแขแแแแแแ.
แแ แแแแแแแแ แงแแแแ แแแแแแแแ แแแ แแ แแแ แแแแจแ (IDE?) ESPlorer. แแก แกแแจแฃแแแแแแก แแแซแแแแ แแขแแแ แแแ แกแแ แแแขแแแ แแแแ แแแแแขแ แแแแ แแ แแ แแแฃแงแแแแแแแแ แจแแแกแ แฃแแแ แแกแแแ. แฉแแแก แจแแแแฎแแแแแจแ, แงแแแแ แแแแแฅแขแแก แแแแแ แแแแแแ แแ แจแแฅแแแ แแแแแแ แแแแก water_counter.py (.mpy) แคแแแแจแ. แแแแ แแ แแแแกแแแแแก, แ แแ แแก แงแแแแแคแแ แ แแแขแแแแขแฃแ แแ แแแแฌแงแแก, แแแแแแแแแ แฃแแแ แแงแแก แคแแแแ แกแแฎแแแแ main.py. แฃแคแ แ แแแขแแช, แแก แฃแแแ แแงแแก แแฃแกแขแแ .py แแ แแ แ แฌแแแแกแฌแแ แจแแแแแแแแ .mpy. แแฅ แแ แแก แแแกแ แขแ แแแแแแฃแ แ แจแแแแแ แกแ
import water_counter
แฉแแแ แแแฌแงแแแ แแแก - แงแแแแแคแแ แ แแฃแจแแแแก. แแแแ แแ แแแแแกแฃแคแแแ แแแฎแกแแแ แแแ แกแแแแแแแจแ แแชแแ แแ - แแแแฎแแแแแแ 1 แแ. แแ แฏแแ แแแแแ แแแฅแแก แแแแแแแ แแแฌแงแแแแแแแแก แคแฃแแฅแชแแแแแ แแแแก แแแคแแ แแแแแแก แจแแกแแฎแแ แแ แแก แแแแแแแแขแ แแจแแแ แแ แแ แแ แแก แฉแแแแแแก แกแแแแแ แแกแ. แแแแ แแ แแฆแแแฉแแแ, แ แแ แแ แกแแฅแแแกแแช แแฅแแก แแแแแกแแแแแ.
แแ แกแแฅแแ. แแแฃแฎแแแแแแ แแแแกแ, แ แแ แคแแแแแแ แจแแแแแแแแแ แแแแขแแแแแจแ แแ แแแแแแ แแแแก แจแแแ แคแแแแฃแ แกแแกแขแแแแจแ, แกแแแแแแแแแแจแ แแกแแแ แแแแแช แแขแแแ แแแแ RAM-แจแ แแ แแฅแแแแ แกแ แฃแแแแแ. แแแแ แแ แแแแแแแก, แ แแ แแแแ แแแแแแแก แจแแฃแซแแแ แจแแแกแ แฃแแแก แแแแขแแแแแ แแแ แแแแแ แคแแแจ แแแฎแกแแแ แแแแแแ, แแแแ แแ แแแแกแแแแแก แแฅแแแ แฃแแแ แแแฌแงแแ แแแ แแแ แแแแแ แแ แแแ แแแฃแ แแ แแแ แแแแจแ. แแก แแ แแ แแก แ แแฃแแ, แแฃแแชแ แกแแแแแแ แแแแ แแ แ แแแกแญแแ แแ แฉแแแก แแแขแแฃแฅแก (แแฎแแแแ แแฅ แแฅแแแแ แแแแฃแฅแกแ).
แแแแแ แแแแ แแกแแแแ:
- แฉแแแแขแแแ แแแ แแ แแแแแแกแขแแแแ แแ
ESP แแแฎแกแแแแ SDK . แแก แแแแแ แแฌแงแแแก แจแแแแแแแแแก แแ แแแแแแแแแแแแก แแ แแแ แแแแแแกแแแแก ESP8266-แแกแแแแก. แแฌแงแแแแแแ แแ แแแฅแขแแก แแแแแแ แแแแ แแแ แแแกแขแ แฃแฅแชแแแก แแแฎแแแแแ (แแ แแแแ แฉแแ STANDALONE=แแ แแแ แแแแขแ แ) - Download
แแแแ แแแแแแแแก แฏแแจแแแ - แแแแแแแกแแ แกแแญแแ แ แแแแแแแแแแแแ แแแ แขแแแจแ/esp8266/แแแแฃแแแแจแ แแแแ แแแแแแแแก แฎแแก แจแแแแแ
- แฉแแแ แแแฌแงแแแ firmware-แก แคแแแแจแ แแแชแแแฃแแ แแแกแขแ แฃแฅแชแแแก แแแฎแแแแแ
ports/esp8266/README.md - แฉแแแ แแขแแแ แแแแ แแ แแแ แแแฃแ แฃแแ แฃแแแแแงแแคแแก แแแแ แแแแแขแ แแแแ แแ (แแแแก แแแแแแแ Windows-แแ ESP8266Flasher แแ แแแ แแแแแแก แแ Python esptool-แแก แแแแแงแแแแแแ)
แแกแ แแแ, แแฎแแ 'แแแแแ แขแ ssd1306' แแแแแฆแแแก แแแแก แแแ แแแแแ firmware-แแแ แแ RAM แแแแกแแแแก แแ แแแแฎแแแ แแแ. แแ แฎแ แแแแ แแ แแแขแแแ แแ แแฎแแแแ แแแแแแแแแแแก แแแแ firmware-แจแ, แฎแแแ แซแแ แแแแแ แแ แแแ แแแแก แแแแ แจแแกแ แฃแแแแฃแแแ แคแแแแฃแ แ แกแแกแขแแแแแแ. แแก แกแแจแฃแแแแแแก แแแซแแแแ แแแ แขแแแแ แจแแชแแแแแ แแ แแแ แแแ แแ แแแ แแแฃแแ แฃแแ แฃแแแแแงแแคแแก แฎแแแแฎแแแ แแแแแแแแชแแแก แแแ แแจแ. แแ แแ แแแกแแแแก แแแฅแแก แแแแฎแแแแแแ 8.5 แแ แแแแแกแฃแคแแแ แแแแ แแขแแฃแแ แแแฎแกแแแ แแแ. แแก แกแแจแฃแแแแแแก แแแแแชแแแก แแแแแแแแจแ แแแแแแฎแแ แชแแแแแ แกแแแแแแ แแแแ แ แแแแกแฎแแแแแแฃแแ แกแแกแแ แแแแแ แคแฃแแฅแชแแ. แแแ แแแ, แแฃ แกแแแ แแแ แแ แแ แแก แกแแแแแ แแกแ แแแฎแกแแแ แแแ, แแแจแแ แจแแแแซแแแแ แแแแงแแแแ แซแแ แแแแแ แแ แแแ แแแ firmware-แจแ.
แ แ แฃแแแ แแแแแแแแแ แแฎแแ แแแแแ?
แแ, แแแแ แแขแฃแ แ แจแแแฃแฆแแแฃแแแ, แคแแ แแแแ แ แแฌแแ แแ, แงแฃแแ แแแแแญแแแแแ, แแแฌแงแแแแแแแ แแแแแแแแ แแแแ แฃแแ แแ แฎแแแแกแแ แแชแแแชแแแแแก. แแแแ แแ แฏแแ -แฏแแ แแแแ แแก แงแแแแแคแแ แ แจแแแ แงแฃแแแ (แกแแขแงแแแกแแขแงแแแ แแ แแแแแขแแแแแ แแแแจแแแแแแแแ) แแ แแก แฏแแ แแแแแ แแชแแ แแ. แแ แแ แ แแฆแแช แแแแแแแแแ MQTT แจแแขแงแแแแแแแแแแ, แ แแแแแแแช แแแแแแแแแ แกแแ แแแ แแ.
แฉแแแ "แญแแแแแแ แกแแฎแแ" แขแ แแแแแแก
แแแก แจแแแแแ แ แแช แแแฌแงแแแแแแแ แแ แแฎแแ แแแแแช แแแแแแแแแก แจแแขแงแแแแแแแแก, แแแแจแแแแแแแ แแแฃแงแแแแแแแแ แแแแแฉแแแแแ แกแแแจแ.
แแก แแแแจแแแแแแแแแ แแฎแแ แจแแแซแแแแ แแแแแแจแแ แแแฃแแ แแงแแก แกแแกแขแแแแก แแแแแฅแขแแแแแ, แแแแ แแแแแงแแแแแ แจแแกแแซแแแแแแแ แแแขแแแแขแแแแชแแแก แกแแ แแแขแแแจแ แแ แแแแฅแแแแแแแแ แแก แกแฎแแแแแกแฎแแ แแแแแแแก - แแก แงแแแแแคแแ แ แกแชแแแแแแ แแ แกแขแแขแแแก แคแแ แแแแแก. แแ แจแแแแซแแแ แแฃแ แฉแแ majordomo แกแแกแขแแแ แแแแแกแแแแ แแกแฃแ แแแแก
แแ แแฎแแแแ แ แแแแแแแแ แแ แแคแแแก แแแฉแแแแแแ. แแก แแ แแก แงแแแแแแฆแแฃแ แ แแแแจแแแแแแแแแแก แแแ แขแแแ แแ แแคแแแ
แฉแแแก, แ แแ แฆแแแแ แฌแงแแแก แแแแฅแแแก แแ แแแแ แฎแแแ แแแแ. แ แแแแแแฏแแ แแ แแแฆแแช แฌแแแแแ แขแฃแแแแขแจแ แแ แ แแแแ แช แฉแแแก, แกแแแแ แแกแแแ แ แแกแแแกแแก แคแแแขแ แ แฆแแแแจแ แ แแแแแแแแ แแแขแ แก แแฌแแแก. แแแแแ, แแแฎแแแ แแแ แแแแจแแแแแแแแแ แแแ แแแแ. แฉแแแฃแแแแ แแ แฅแแแแแแแ แฌแงแแแก แแแงแแแแ, แแแแ แแ แจแแแแแ แแแแแแแ แแแแแแแ แแ แแ แแแแแ แแแแแแแแ แฅแแแแฅแแก แชแฎแแ แฌแงแแแแ - แแก แแกแแแ แแจแแแ แแ แฉแแแก แฅแแแแ แแ แแคแแแแ.
แแ แแ แแคแแแแแแ แแแแแแ, แ แแ แขแฃแแแแขแจแ แฌแแกแแกแแแแแแ แกแแญแแ แแ 6-7 แแแขแ แ แฌแงแแแ, แจแฎแแแแก แแแกแแฆแแแแ 20-30 แแแขแ แ, แญแฃแ แญแแแก แ แแชแฎแแ แแแแฎแแแแแแ 20 แแแขแ แ, แแแแแแแแก แแแกแแฆแแแแ แแ 160 แแแขแ แ. แฉแแแ แแฏแแฎแ แแฆแแจแ แกแแแฆแแช 500-600 แแแขแ แก แแแแฎแแแ แก.
แแแแแแแก, แแแกแแช แแแแกแแแฃแแ แแแแ แแแแขแแ แแกแแแก, แจแแแแซแแแแ แแแฎแแ แฉแแแแฌแแ แแแ แแแแแแฃแแ แแแแแแแแฃแแแฃแ แ แแแแจแแแแแแแแกแแแแก
แแฅแแแแ แแแแแแ, แ แแ แ แแแแกแแช แแแแแแ แฆแแแ, แฌแงแแแ แแแแแแแแแ แแแแฎแแแแแแ 1 แแแขแ แ แกแแฉแฅแแ แแ 5 แฌแแแจแ.
แแแแ แแ แแ แคแแ แแแ แกแขแแขแแกแขแแแ แแแแแ แแ แช แแกแ แแแกแแฎแแ แฎแแแแแแ แกแแงแฃแ แแแแแ. Majordomo-แก แแกแแแ แแฅแแก แจแแกแแซแแแแแแแ แแแฎแแก แแแฎแแแ แแแแก แกแฅแแแแแ แแฆแแก, แแแแ แแกแ แแ แแแแก แแแฎแแแแแ. แแแแแแแแแ, แแฅ แแ แแก แแแฎแแแ แแแแก แแ แแคแแแ แแแแแแแ
แฏแแ แฏแแ แแแแ แแฎแแแแ แแ แแ แแแแ แแก แแแแแชแแแแแ แแแฅแแก. แแ แ แแแแจแ แแก แแ แแคแแแ แฃแคแ แ แกแแฉแแแแแแแแ แแฅแแแแ - แแแแแแฃแ แแฆแแก แแฅแแแแ แชแแแแ แกแแแขแ. แกแฃแ แแแ แแแแแ แแแคแฃแญแแแฃแแแ แแ แแแแจแแแแแแแแแแก แแแ แแฅแขแแ แแแแ, แ แแแแแแกแแช แฎแแแแ แแฌแแ (แงแแแแแแ แแแแ แกแแแขแ). แแ แฏแแ แแ แแ แแก แแแแแแ, แแ แแกแฌแแ แแ แแแแแงแแแ แแแ แแแแแแ แแแแจแแแแแแแแแ, แแแแฅแแแก แแฃแแแแแ แแแแแแแ, แแฃ แแก แแ แแก แจแแชแแแแ firmware-แจแ แแ แงแแแแ แแแขแ แ แแ แแงแ แแแแแแแแ. แแแขแ แแ แ แกแญแแ แแแแ.
แแแแแ แแ แแคแแแแแก แแแแแช แกแญแแ แแแแ แ แแฆแแช แแแแแ, แแแแแแ แแแ, แจแแฆแแแแ. แจแแกแแซแแแ, แแ แแกแแแ แแแแจแแแแ แแแฎแกแแแ แแแแก แแแฎแแแ แแแแก แแ แแคแแแก แแแแแ แแแแก แแแแแแ - แแ แจแแแแฎแแแแแจแ, แแฃ แแฅ แ แแฆแแช แแแแแแแแก. แแแแแ แ แแแแ แแ แแแแแแแฉแแ แแแ แแแแแแก, แ แแชแ แแแขแแ แแแขแ แแ แแงแ. แฏแแ แฏแแ แแแแ แแก แงแแแแแคแแ แ แแแแแแแก แแแแแแแ.
แแแกแแแแ
แแฆแแก แฉแแแ แแแแ แชแแขแ แฃแคแ แ แญแแแแแแ แแแฎแแ. แแกแแแ แแแขแแ แ แแแฌแงแแแแแแแแ แฃแคแ แ แแแกแแฎแแ แฎแแแแแ แแฅแแแแ แกแแฎแแจแ แฌแงแแแก แแแฎแแแ แแแแก แแแแแขแแ แแแแ. แแฃ แแแ แ แแแ แแแแแแแแ โแแกแแ, แแ แ แแแแจแ แแแแ แฌแงแแแก แแฎแแแ แแแแแโ, แแฎแแ แจแแแแซแแแ แแ แแแฎแแแ แแแแก แฌแงแแ แแก แแแแแ.
แแแแแแ แแก แจแแแซแแแแ แฃแชแแแฃแ แแ แแแแฉแแแแแก แแแ แแแแ แแแแแกแแฎแฃแแแแแแแก แงแฃแ แแแ, แแฃ แแก แแแแแ แแ แแชแฎแแแแแกแแแ แแ แแ แแแขแ แแ แแ แแก แแแจแแ แแแฃแแ. แแแแ แแ แแ แช แแฃ แแกแ แจแแ แแฃแ แแแแแแแแจแ, แแ แแแแแแแ แกแฎแแ แแแแแจแ แแแแแกแแแแก, แกแแแแช แแฅแแแแ แ แแแแแแแแ แฌแงแแแก แแแฌแ แแ แแแแแ แแ แแชแฎแแแแแแ, แกแแแแ แแฃแแแ, แแแแแแแกแแแแ แกแแแแกแแแขแแแ. แแกแ แ แแ, แแแกแขแแแชแแฃแ แ แแแแฎแแแก แแแฌแงแแแแแแแ แซแแแแแ แกแแกแแ แแแแแ แแฅแแแแ.
แแกแแแ แแแแแแแ แแแฌแงแแแแแแแแก แคแฃแแฅแชแแแแแ แแแแก แแแคแแ แแแแแแก. แแ แฃแแแ แแฃแงแฃแ แแ แแแขแแ แแแแแฃแ แกแแ แฅแแแแแแก. แแฎแแ, แฅแแแแแก แฅแแแแฅแแก แฌแงแแแแ แแแแแกแแงแแแแแ, แซแแแแแ แแแกแแแแแ แแแจแจแ 3 แแแแแแ แฃแแแ แแแแแแ แฃแแ. แแแชแแแแแแ แแแกแแฎแแ แฎแแแแแ แแฅแแแแ แแแแก แแแแแแแแ แแ แแ แฆแแแแแแ แจแแกแแแแแแกแ แแแแแแแแแ. แ แ แแฅแแ แฃแแแ, แฆแแ แก แแแชแแ แแแแแแแแกแแแ.
แกแขแแขแแแจแ แแ แแฆแแฌแแ แ แแแฌแงแแแแแแแแก แฉแแแ แแแ แกแแ ESP8266-แแ แแแคแฃแซแแแแฃแแ. แฉแแแ แแแ แแ, แแ แแแแแคแแฅแ แ แแแแ แแแแแแแแก firmware-แแก แซแแแแแ แกแแแแขแแ แแกแ แแแ แกแแ แแแ แฃแขแแแแก แแแแแงแแแแแแ - แแแ แขแแแ แแ แกแแกแแแแแแแ. แจแแแแชแแแ แแฆแแแฌแแ แ แแแแ แ แแแฃแแแกแ แแ แแแแแแแแแแแ, แ แแช แจแแแฎแแแ แแแแแแแแแก แแ แแก. แจแแกแแซแแแ, แงแแแแแคแแ แ แซแแแแแ แแแขแแแฃแ แแ แแฆแแฌแแ แ; แแแ แแแแ, แ แแแแ แช แแแแแฎแแแแก, แฉแแแแแแก แฃแคแ แ แแแแแแแ แแแแแแขแ แแแแแแแแก แแแแแขแแแแแ, แแแแ แ แแแแแแแแแแแ แแแแแ แแแ, แ แแช แแแ แฉแ แฃแแฅแแแแ.
แ แแแแ แช แงแแแแแแแแก, แแ แฆแแ แแแ แแแแกแขแ แฃแฅแชแแฃแแ แแ แแขแแแแกแแแแก.
แฌแงแแ แ: www.habr.com