á á ááľ áá áľ á¨á¤áľ á ááśáá˝á á˛áľá°á ááá áĽá áá "áľáááľ á¤áľ" áĽá¨á°áŁá á¨áá áŤá á áŁá ááľ áľááá á áŁáá áá˝ áĽáť ááááá¸á áá áᢠáᏠá áá áŤá áá ááĽáŤáľáᣠáśáŹáśá˝áᣠá á¨á ááááťáᣠá¨áá á á ááŚáľá áĽá ááá˝ á¸áážá˝á ááááŁá á áľáááá á¨á ááľ áŞáśá˝á á¨á´áá°áŽá˝áŁ á ááŤáŽá˝/ááĽáŞáŤá ááĽááŤáá˝ ááááľ áá˝ááᢠáĽá á áŁá á ááá DIY-shnik áĽááłá áá áąá ááááá áĽá ááłáŞáŤáá˝á ááááá á¤áľ ááľ áŁááá áá áá°á áľáĽ áá˝ááá˘

áĽáá° á ááľ á°ááĽ, á¨áłááąáľ ááłáŞáŤáá˝ áłáłážá˝ ááá á áááłáážá˝ áá¸á. áĽáá° "á¨áĽáá
áľáá´ áłáłá˝ á˛áá ááĽáŤáąá áŤáĽáŠ" ááá "á áááŤá á á
áŤá˘áŤ áŤáá ááĽáŞáŤ / ááĽá፠á á á ááá á áááłá ááľáĽ ááĽáŤáąá áŤá áá" áŤá áááłáá˝á á°ááŁáŤá áááľá¨á ááá áŤá°áááłá. áá á áá ááአá á´áááľáŞ á áá°áŤáᢠá˘á áᣠáá
á¨áááľ áĽá áĽááĽá áľ ááŤá ááᣠááá á á ááľ á¨á°áá°á áá፠ááľáĽ áŤáá á
á˝á áłá áááá˘
á á áᥠá¨áá ááŁáŞáá˝á á pulse áá ááľ áŤááŠá˘ á ááŁáŞá ááľáĽ á á°á°áŤá á áĽáŤááłááą ááľá, á¨á¸áá áá ááá¨áŞáŤ áá áˇá áĽá áĽáááŤáá áááá. á¨ááá¨á áĽá¸áá ááá á á˝áŚááš áá á°áŁáĽá ááá¨áľ áĽá á¨áĽáą á¨á°áá°á áĽá á áááááľ ááá¨á áá. áááłá á¨áá áááłá á á°ááłáľ áĽá á áłáááą áááľ áá°ááľáᢠá°á á ᣠá á áááłá ááľáĽ áĽá á¨áá áááŁáŤáá˝ áŤá ᣠá áŁáľáŞ áĽááá áááľá¨áľ á áľá¸á᪠á¨áá áŚáłáá˝á á¨áááŁáľ ááá áááá á¨á ááá á áááŤážá˝ á á ááľ á፠áá˝ áá áá¨áľ á¨á áá ááš ááá˘
á¨áá ááŁáŞáá˝ á¨ááááŠáľá á¨áááĽá áĽá á MQTT á áŠá áá° áľáááľ áá á áááá ááŁáŚá˝á á¨ááá á ESP8266 áá á¨á°áá á¨á° á¨ááŁáŞáŤ á¨áĽá áľáŞáľ á ááᥠáľáᢠUasyncio á¤á°-áá˝áááľá á áá áá á ááááŽááśá ááŽááŤá áĽáá°ááááᢠfirmwareá á áááĽáŠá áľ áá áĽá á áľá°áłá˝ á˝ááŽá˝ á ááĽáááá ᣠá áá
á˝áá ááľáĽá áĽááááŤáá ᢠááľ!
áááááĽáŠ

á¨á á
ááá áá¨áł áἠá ESP8266 áááᎠáááŁá áŞáŤ áá áŤá ááá ááᢠESP-12 á ááááŞáŤ áłá
áś áá áᣠááá áá á¨áĽá ááľááľ áŤáá áľ áá á°áááˇáᢠá ESP-07 ááá á¨ááź ááá áá á¨áĽá, áĽáąá áááá. áĽáá° áĽáľá áá, áĽááą á áá°áá°á፠áĽá á á°ááŁáŤáááľ áááąá á°ááłáłá áá¸á, ááŠááą á á áá´á ááľáĽ áĽáť áá - ESP-12 á áĽáŽááἠá áá, ESP-07 áá ááŤá áá. ááá ááᣠáŤá áááá á áá´á áĽááłáᣠá ááłá á˘áŤ á¤á´ ááľáĽ áŤáá ááááľ á áá°á áááľ ááŤááá˘
á¨ááá áá°á áá°á á áááĄ-
- áłáá ááľááá ááá á áááľáľ áĽá á capacitor (ááá áĽááłá áááąá ááá ááľáĽ á˘ááá)
- á¨áá á˛ááá (CH_PD) áá° ááá á°ááľáˇáá˘
- GPIO15 áá° ááŹáľ á°áá áᢠáá ááááŞáŤ áá áĽáť áá á¨ááŤáľáááá, áá á ááá á¨áá áĽáá áá ááŁá á á áŤáľááááá
áááá áá° firmware áááł áááľá°ááá GPIO2 á áá° ááŹáľ ááááľ áŤáľáááááłá ᣠáĽá á¨á áá ááš áááľá¨á á¨áĄáľ á ááŤáŠá á°á áᢠá á°ááá°á áááł, áá áá áá° ááá ááłáŁá.
ᨠGPIO2 ááľáá áááł á¨ááá¨á á á áľáŤá ááááŞáŤ áá áĽáť áá - ááá á˛á°áá á ááá áĽáá°áá á¨á°ááᨠá áá áá˛áŤááᢠáľááá ááá áĽáá°á°ááá°á áááłá ááá áá° firmware áááł áááłáᢠá áá´ á¨á°áŤá áá áá áĽáá° áá°á á GPIO ááŤáááá áá˝ááᢠá°á á, áĽá፠ááľááá á ááľ á ááŤá áľáá, á ááłááľ á áá á°ááŁáŤáľá á áĽáą áá ááľáá áá˝áá.
áááŽááŤá áĽá ááá¨á áĽá áá° áá á áŞáŤá áŤááŁááľá UART áĽá ááááᢠá áľááá áá á˛áá á ááá áĽá፠á¨áŠá¤áľá˘-UART á áľááá áĽááááá. ááá á 3.3 ᪠á¨á°ááá á° áááá áĽáť ááľáłááľ áŤáľáááááłá. á áľáááá áá°áá áŽáá´á áááá¨á á¨á¨áą áĽá 5 áŽá á°ááŁáŤá áŤá°á¨á, ááá á áŁá ááá á áá˝áá.
á áá¸áłá á¤áľ ááľáĽ á á¤áááľáŞá ááá á˝áá á¨ááĽáá - áááŤá á¨ááľáŽá˝ á ááľ ááľá áŤá á áááá, áľááá ᨠ220 Ꭰááá á á°ááááá. áĽáá° á¨ááá ááá, áľáá˝ ááá¨áá á Tenstar Robot. á áá á¨á ááá áĽá á¨á¤áááľáŞá ááá á¤áááľáŽáááľ áá áĽá¸ááŤáá, áĽá áĽáá á áľáá˝ ááŤáŁ ááľáĽ ááá á¨áá á¨ááá á á ááŚáľ á á.
á¨ááá áááłáá˝á ááá áá á¨GPIO2 áá á¨á°ááá á¤áá˘á˛ á á áᤠáá áᢠááá áĽáá áĽá á áá¸áĽáŠáľá, ááááŤáąá. ᨠESP-07 ááá á áľááľá á¨á°ááłáłá GPIO2 áá á¨á°ááá LED á ááᢠáá á áŚááą áá ááá - á áľáááľ áá áá LED áá° ááłáŠ áááŁáľ áĽááááá.
áá° á áŁá á áľá°áłá˝ áá°ááá áĽáááľá˘ á¨áá ááŁáŞáá˝ ááá á áááᎠá¨áá¸áá, áá áá ááŁáĽ áá á¨á á áá˝áá. ááĽá áŤáá áĽá¸áá ááá áááśá˝ áá - á áĽáŤááłááą ááľá á¨á¸áá ááá áĽáááŤáá˝ ááááľá˘ á GPIO12/GPIO13 ááľáĽ á¨á¸áá á ááĽáŞáŤ áá ááľ á ááᢠá ááá ááľáĽ áá á á á°áááá á ááŽááŤáá ááááľ áĽá¨ááłááá˘
ááááŞáŤ áá, resistors R8 áĽá R9 á áá á¨áĽ á¨áłá áĽá á áĽá á¨áŚááľ áľáŞáľ ááľáĽ á áá°áá. áá áĽá áąá ááá á°á áĽáá˛áŤá¨á á áľááľá áľááá¨ááᣠáá á ááĽáĽá ááľá°áŤá¨á á°áᢠááᢠáá¨ááአá áľá¸á᪠á¨áá áĽá á áá áá á ááľ á ááľ áŤááá áá°áĄá áĽááłáŤááĽá á°ááááá˝ áŤáľáááá ᣠáĽá á¸áá áá áá áá ááľáá áá° ááŹáľ áŤáłááá (á á°ááá ᣠá˘á á 3.3 ᪠/ 1000Ί = 3.3mA áááľáłá) .
á¤áááľáŞá á¨á á áá ááľá¨á áĽááłáá áľ ááá°áĽ ááá á áá ááᢠá¨ááááŞáŤá á ááŤá á ááááŠá á áááť áá ááŁáŞááš á¨ááááŞáŤ áááá˝á áá á¨á ááᢠááá áá áá á¨áááἠááŽáśáŽáá ááá á¨áá ááľáĽáľáĽááľ áá áááᢠá¨áá á á áá á áá ááłá áá á¨ááłáŞáŤá á áááá á á áááአáááł áá á¨á°áá°á¨á° áá. ááĽáŤáąá áŤá á á áá á áááአáŤáááᨠ(ááá á áá áá á¨ááá¨á) á¨áá á¨áá ááŁáŞá á¨ááááŞáŤ áĽá´áśá˝á áá á¨á á áá˝áá áĽá á áľá á°áľ áá°áŤáá˘
áľááá á I2C á áŠá á á°ááá á¨ááľáłááť áşá ááľáĽ á¨ááŁáŞ áĽá´áśá˝á áá¨ááť ááá°áá á áá°áአᢠáááá˝ áá á°á¨ áľááľáł áá á ááá áአááľáááśá˝ á¨ááá - 2 ááĽáŽá˝á áĽáť ááľááἠáŤáľáááááłá (á áá áĽá á áááá áá ááŁáŞáá˝ áá á¨áľ á¨ááśá˝ áĽááľ)ᢠáľááš ááá áĽááłá áá áŤá. ááá áá áá˝á ááľ áá°áśá˝ áĽááľ áľáŠá¨áľ ááľá áľ á ááĽááľ. áá áĽááááš áááá˝ áá 100 áşá áá°áśá˝ áá ᣠáá ááłááśáš áĽáľá¨ á ááľ áááŽáá˘
á ááľ áááŽá áĽá á¨áááľá áááľááᢠááá áá á á áááłáᏠááľáĽ á 4 áááłáľ áŤá á ᨠ500 ááľá áŠáĽ á áá áá áĽá á áá á, áá 500 áşá ááľá áá! áĽá 500 áşá ááááŚá˝ á ááá˝. áĽá ፠áááá áá áĽáť áá. á áĽááἠá á¨áááľ áááą áşáá áĽáá°áá áá¸áĽ áá˝áááŁááá áá á¨FRAM áşááľ ááአáłááᢠá¨ááŽááŤá á á°áŤá á ááá ᣠáá á°ááłáłá I2C EEPROM áá ᣠá áŁá áĽá ááĽá áĽáá°áá á¨ááá áá°áśá˝ (á ááś áááŽá) áĽáťá˘ ፠áá áĽá á ááá áĽáá°áá ááááľ áááᎠá°ááŽá˝ ááłáá áąá ááľá¨áľ áĽáľáŤáá˝á áľá¨áľ ááᣠáľááá á áá á¨á°ááá°á 24LC512 ááááá˘
á¨áłá°á á¨áá¨áł á°ááł
ááááŞáŤ áá á¤áľ ááľáĽ á°ááł áááĽáŤáľ áĽá áľ áá á¨á. áľááá , áŚááą á ááľ-áá áá á°ááá áˇá. ááá áá áá ááľ á°ááľ áŤá á á ááá áĽá¨áľ áĽá á á°á¸á á áááĽá áŤáłááአá áá (áŤá áĽáą á áá ááááľ á áááŁá) ᣠá ááá á°ááłáá˝á á¨áťááááŤá áááá áá°ááŠá˘

áŚááąá á¨áááá á ááľ áááľ ááťáá á¨ááá˝ áá
á°á¨ áľááľáł áşá á á°á¨á᪠á I2C á ááśáĄáľ áá á áá ááá ááŤáŤá áĽáá°áá˝á á°ááááĽáŠ áŁ áááłá ᣠááłáŤá˘ á áľááá áá° áĽáą á¨áááŁá ááá á ááá áĽáŤá áá ᣠáá á áŚááą áá ááŤáŁáľ áŤáľáááááłáᢠá°á
á, á ááĽáŞáŤá ááľáĽ áŚááśá˝á áľáááá, áĽáŤá´á á á ááľ-áá á°ááł áá ááá°áĽ ááá áááł á¨ááá, áľááá
ᨠI2C ááľááŽá˝ á áŚááą ááᣠáá áĽáť áá¸á.
á ááľ áľáá ááἠáĽáá˛á á¨á ááľ-ááááľ á˝áŚ áá á°ááááˇáᢠááááŤáąá áŚááą á ááľ-áá á°áľáá, á¨ááŤá áľáŤáŽá˝ áĽá ᨠSMD áááá˝ á á ááľ á áŠá áĽáá˛ááᥠáłá áś áá á, áĽá á¨áá¤áľ á áŤááľ, áááááá˝ áĽá á¨ááá á á ááŚáśá˝ á áááá á áŠá. á¨á ááľ áá á áá áŚááśá˝á áľáá á á¨ááááŞáŤáá áĽá áľ á¨áłá áĽá áááá áááá˝ á ááľ áááľ á áŠá á¸áĽáŠ. áĽá á¨ááá á á ááŚáąá ááá¸áĽ á˛áᣠáĽáť áááľ áĽá á°áááś á¨á°ááąáľ á á°ááŤáá ááᢠá áááŁáá˝ áá¨áľ áá á¨áĽáᢠá áĽáá áá á¨áá áŁáá áĽáá áá á˝áŚáá áááŹáŤáá ᣠáá ááŹáą á¨áŚááą á ááľ ááá áá° áá á áĄáľ ááá áá á áŠá áá°áááá (ááá áĽááłá á ááá°áá á˝áá áá áľáŤá ááłá ááťá áá á)á˘
áĽáá˛á áá

áááŞáŤ á¤áľ
ááŁáŠ á°á¨á á áŤá áá. 3-á á áłá áŤáááľ áá á˝áá á áá°áá. áĽáá á áá°á¸áááŠá - áá áá á áŤáá áłáĽá áŁáአáĽá á áľááááá áŚáłáá˝ áá áááĽáá˝á á áŤáᢠá˝áá á á°áááľ áá á áľáá˝ á¨áŤáľ-áłá ááá˝áá˝ á°áŁáĽáá.

á áľááľá á¨áĄáľ á ááŤáŠ áĽáá° á á ááá ááá áá ááŤáááá áĽáá°áá˝á á°áááŹáŤáá - áľááá
áá° á¨ááľ ááá áĽáááŁáᢠáá
áá áááľá¨á, á ááŤáŠ á¨áááá áľ áአ"á°á
á" áŁááŠ.

áĽáá˛áá á áŚááą ááľáĽ áŚááą á¨á°áŤááŁá¸á áĽá á á ááľ M3 screw (á áŚááą áá ááá á°á¨á᪠áŚáł á ááá á¨á) á¨ááľá°áŤá¨áá ᾠᣠá áŚááą ááľáĽ áŤááľ áááĽáŤáŽá˝ á áá˘
á¨ááááŞáŤáá á°áľáá á¨áťááŁáá áĽáľá áłá°á ááłáŤá ááľááá á°ááá§á. áá°á á áŁá áááľ ááľáá á áłá á áá ááłá áá á áááŁá ᣠáá á ááá ááá áá OLED ááłáŤ SSD1306 128 Ă 32 áá áᢠáĽáą áľáá˝ áá ᣠáá á á¨áá á áá¨áá - ááá¨áŁááá˘
á áá ááááľ áĽá á áá ááááľ á ááááľ, á˝áŚááš á¨áĽáą áĽáá´áľ áĽáá°ááááĄ, ááłáŤáá á ááłáŠ ááŤá¨á áááá á áá°ááŠ. Ergonomics, á áĽáááĽ, á¨ááááľ á áłá˝ - á ááŤáŠ á¨áá áá, ááłáŤá á¨áłá˝ áá. ááá áá ááłáŤáá á¨áááŽáŤáŠáŠ ááłáĽ á áŁá ááááˇá áĽá áááá áááááłááľ áŚááąá áĽáá°áá á˝áŚ áááľá¨á á°áá áá ááŠá á˘
á¨á°ááŁá á ááłáŞáŤ. á¨ááłáŤá ááá á áááľ á፠áá° snot á°áŁáĽáá


á¨áá¨á¨áťá áá¤áľ á KDPV áá ááłá áá˝áá
Firmware
áá° áśááľáአááá áĽáááľá˘ ááĽáá°áá á áááľ áľááá˝ á¨áĽá áľáŤáá˝áŁ á¨áá˛á áááá áá áá á áŁá áĽááłááá˘) - áŽáą á áŁá á¨áłáá áĽá ááá¨áłáľ á¨ááťá áá. áĽáá° áĽáľá áá, áááᎠá°á¨ááľ ááááŁáľ áá° ááááŚá˝ á°á¨á ááá¨áľ á áŤáľáááá - ááá ááá á¨áááśá áá ፠áá˝áá.
ááá ááá ááá áá, áá á áŁá á áá°áá - ááŁáŞáŤá á ááŤáł áááá°á á°ááŁáŤáľ á ááľ.
- á°á ááá á ááľ á ááŤáá ááł áĽá ááłáŤáá áááá¨áłá
- ááľá á ááá˝ áá á°á¨ áľááľáł ááľáĽ áĽá´áśá˝á ááááľ áŤáľáá áĽá áŤááá
- ááá ᨠWiFi ááááľá áá¨áłá°áá áĽá á áľááá á¨áá áĽáá°áá ááááá
- á°á á ᣠáĽáá áľááá á¨áá á ááá á¨áá ᣠá ááŤá˝ á áá˝áá
áááá, á áá ááááŤáľ, áá á¨áá á ááľ á°ááŁá áĽááłáá°áŤ ááá á á ááťáá. á ááá˝ ááŽáááśá˝ ááľáĽ áŤáá˛á á ááťáá áĽá á áá á ááá âáá ááľá á áááŚáłá ááááŤáąá ááłáŤá á ááŤá áá áľááááâ ââááá âááá á¨áááá áá á˛ááá á°á ááá ááá ááľá¨á á áá˝ááâ á¨áá ááľááśá˝á áĽáŤá¨á ááᢠáĽááἠááᣠá ááłááľ áááŽá˝ á ááá¨áĽ áá¨ááá áá˝ááᣠááá áá á¨áááł áá áá°áĽáŁ á¨áĽáŞáá˝ ááá°áť ááá á¨á áśáá áŤááá á¨á°ááááŽá˝ ááἠááŤááĽáááľ áá˝ááᢠá°á á, áááá ááá á¨ááŤá¨áááá áŽáľ áĽá áá˛áŤáá á ááĽááľ áá° ááťáťááľ ááááŁá.
Đ ááá˛á ááŞááá˛á áŁááĽá á°ááŁá áĽá FreeRTOS á°á áááŠáŁ ááá áá á áá á ááŁá áá´á áá áἠá°áľáá áá á°áááˇáᢠ. á¨áá á á áá á¨áááá áľáá ፠áŚáἠáĽáť áá - ááá ááá áááŽááŤá á ááŞá ááá áĽá ááš áá. á¨áĽáŤáľáá á áááᎠáĽáť áááᣠá áá ááŤá¨á á¨áľ ááá¨á áĽáá°áá˝á áĽáť ááááŠáá˘
á á áľá ááá áľ áĽá á á°ááłáłáŞ áááἠáľáŤáá˝ ááŤá¨á áŤááá ááŠááľ áĽáá° á ááŤá áááĽááľ ááłáĽ á áááŁááᢠá áá á áá¨á¨áť áá° áŽáą áĽáááľá˘
#####################################
# 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
áĽáŤááłááą ááŁáŞ á ááŁáŞá ááá ááłá ááŤááᢠá ááááŞáŤ á°á¨á, á¨ááŁáŞá á¨ááááŞáŤ áá ᨠ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)
á¨áááááśá˝á áĽáĽáł áááŁáŤáľ ᨠ25ms áááá¨áľ áŤáľáááá, áĽá á á°ááłáłá áá áľáŤá áá áŤá á áá áĽáá°ááá áááŁá áŤá (áá á°ááŁá á áá°áá áľ áá, ááá˝ áľáŤáá˝ áĽá¨á°áŠ áá¸á). á ᨠ25 á.á, á°ááŁáŠ á¨áĽáá áá áááłá, ááá áááľáťá, áĽá á¨á¸áá áá ááĽáŞáŤ áĽáááŤáá˝ á¨á°áá, á¨ááŤá áá ááľá á ááŁáŞá ááľáĽ á ááá áĽá áá áá°á¨á á áá áľ.
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
á°á áᣠá áá á¨ááśáá áĽá á¨áĄá á˛áá á¤á°ááá ááľá áá áśá˝ áĽáá áá áĽá ááŁáŞá áĽáá˛áá áĽááľááá (áĽáá´áľ áá° áŠá˛áŤá áá°ááá áĽá˝ááá? á¨áá á áá?)
def __await__(self):
while not self._value_changed:
yield from asyncio.sleep(0)
return self.value()
__iter__ = __await__
áá á¨ááŁáŞá áĽá´áą áĽáľáŞááá áľá¨áľ á¨áá áĽá á áŁá ááš á°ááŁá áá - á°ááŁáŠ á¨áá áá° áá á¨áĽáá áá á˛áá áĽá á¨_áá_á¨á°áá¨á¨áá áŁáá˛áŤ áŤá¨áááŁáᢠá¨áá á°ááŁá áĽáááľ á¨áĽáŞ áŽáľ áá°áá á°ááŁá á áá°ááá áľ áá á°ááś áá°ááľ áĽá á á˛áľ áĽá´áľ áĽáľáŞáŤáá áľá¨áľ áá°ááľ áá˝ááá˘
áá áľá áááŤá¨áĽáľ?á áᣠá áá áá áĽáą áŤáą áľá áááŤá¨áŚá˝ á°áááŻá á áááľ áĽáá ááá¨áŁá¨áĽ áľá˝ááá˝áᣠááá áá á áĽáááą áĽáą á¨áá áá áá፠á ááá áˇáᢠá áĽáááą ááá¨áĽ á¨áá¨ááŠáľ á¨ááááŞáŤá ááá ááᢠá ESP8266 ááľ áááľ ááá¨áĽá áá°áŤááľ áĽá ááá áááŤá¨áĽ á áááśá áĽááłá ááá áá˝ááᢠá áá ááá¨áĽáŁ á¨á°áááá áĽá´áľá áááá áá˝ááᢠááááŁáľ, ááŁáŞá á¨áŁáŞáŤ ááŁáŞáŤ á¨áá áá á á ááá áá˝áá - áá áá áĽáľáŞá á¨á áľá¨áľ á¨áá áĽá .
áĽáá° á áááłá°á áá (ááá áĽáá° áĽáľá áá?) á¨áĽá ááŁáŞáŤ áá áá ᣠáĽáą áŤáą á MQTT ááŽáśáŽá á áŠá áááááśá˝á ááá áĽá ááἠáá° EEPROM ááá á áá áľá˘ áĽá áĽáá áá°áŚá˝ ááľááá ááĽá°áá - á ááá¨áĽ ááľáĽ áá á°á¨ áľááľáłá ááá°áĽ áĽá áľáá ááá áá áá á áá˝áá ᣠáá áááľ á á ááłá¨ áá¨áĄ áá áááĽááľ áľáááá áááłáľ áá˝ááᢠáĽáá° micropython.schedule () á ááľ ááááľ á°ááŁáá âáá˛áŤáá áĽá áá˛áŤááâ áĽáá˛áŤááą á¨ááá áą áłáŚáá˝ á áᣠááá áá áĽáŤáá á¨áááłá âáĽá á áááľáá?â ááᢠá áľáááľáŁ á áá á¨áá á áááľ áááĽááľ áĽá¨ááá ááᣠáĽá á¨á፠ááá¨áĽ áá° ááľáĽ ááĽáś á¨á°ááááŽá˝á áĽá´áśá˝ áŤá ááťáᢠáááᣠáááłáᣠá áŽááá áá áłááááἠáłá á á˛áľ ááŁáŞ áá á¨á áááአá°ááˇáᢠá á á ááá áááłá°áá áááľ ááá á áá ááááľ áááŁáľ áŤáľáááááłáá˘
áĽá á¨áá áá° áá Runtime áľá á°áľáĄ áá áĽáá˝áśá˝á áááááĽá áŤáľáá áĽá ááá áĽáá°áá áá áŤááá?
ááá˝ á áá á¨áľáá á á°áŁáĽ áĽá 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)
á áááśá ááľáĽ á ááĽáł á¨áŁááľ áá áááľáŤáľ á áľá¸á᪠áá, áĽá áá° áá á°á¨ áľááľáł á¨á°ááá áŁááľ áá. á¨áĄáľáľáŤááľ á¤á°-áá˝áááľá á áá áá á˘áá˛áá áĽá áŁááľ ááŤá¨á áŤááá á á¨áŤ áá á áá á¨áĽáá˘
á¨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. á áĽááááš ááŁáŞ á áá áśá˝ ááĽá áá°áŤáᣠáá áĽá á áá áśá˝ á ááá áááá á á ááŁá¸áᢠá ááĽáŽášá á ááĽáł á áŽáą ááľáĽ ááááá ᣠá á˝áá ááá 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_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)
á°ááŁáŠ á á áááľ á¨ááłáááš áááłáᢠá áá á ááŁáᣠá¨ááá¨áŚá˝ áĽááľ (á˘áá°áááľ_ááŁ) áĽá á¨áááł áááŤá¸áá áááĽáŤáᢠáááááą áá°áá á¨á áľ á˛áááľ á¨áľáŤ ááľ áá áá° á áááአáááŤáá˘
á áááŤá˝á áá á¨áá¨á¨áťá áĽáá áá á¨ááŤáľáááá á°ááŁáŠ á¨ááááłá°á áĽáá˛áá áĽáť áá - á á¤á°ááá ááľ ááľáĽ á áá áŁá á ááŁáá, áĽá áá á¨áá áŁá á á áŤá ááľáĽ áŤá á°ááŁáŤáľ áĽáť áá አáá˝áá.
á¨áááá áá á¨áááááľ á á°á¨á᪠á¨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 á°á¨ááľ áĽáá áľááá ááá. á áľááá á¨áá, ááá˝ á¨áĽáááł áá´áá˝ áĽáá áá°áá አáá˝áá.
ááá áá á¤áá˘á˛á á áŁá, á°áá¨áŁáŤá˘ áá. ááłáŤá ááá á°áááááá˘
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 utility á áá áá á°á áŤáá - áá° ááľáŁáá (á ESP-07 á áŤáą ááľáĽ áŤáá) ááá˝ á ááá áĽáá˛á°á á ááá áľáááłá áĽá á¨á፠áĽáá° áá°á á áááá˝ á¨ááŽááŤá áŤáááłáᢠáĽááŤá áĽá á¨á°á áááłá¸áá mqtt_asᣠuasyncioᣠssd1306 áĽá á¨áľáĽáľáĽ á¤á°-ááťáááľ á°á áŤáá (á mqtt_as ááľáĽ áĽá á áá áááá)á˘
áĽááááŤáá áĽá ... MemoryError áĽááá ááá. á¨áá á á áá áá á°á¨ áľááľáłá á¨áľ áĽáá°áááľ á áľááá ááá¨áłáľ á áá¨áአááĽá á áľááśá˝á áŁá¨áአááĽá áá áľá á°áľ áá°á áĽá á°á¨áľáˇá. á ááľ á áá ááá á áááᎠáááŁá áŞáŤ ááľáĽ á ááá á°á¨á 30 áŞáŁ áŽáľ (á¨áááĽá¨áŞáá˝ áá) á ááá ááአá¨ááááĽáá áľ 65 áŞ.ᣠáá á°á¨ áľááľáł áĽáť áĽááłá áĽááľá¨áł á áľááááá˘
áá áá፠ááááľ á á. ááááŽááśá áŽáľá á ááĽáł á¨.py ááá á áá°áŤá - áá ááá ááááŞáŤ á¨á°á ááᨠááᢠá¨áá á á áá á áááᎠáááŁá áŞáŤá áá á ááĽáł áá°á á°áŁá, áá° áŁááľáŽáľ ááááŁá, á¨ááŤá á ááľáłááť ááľáĽ áá¨ááťá. á°á áᣠá áááŁáŞá áááľáŤáľ á¨á°áá°á áá á áŤáá RAMá áŤáľáááááá˘
áá´á áááᎠáááŁá áŞáŤáá á¨ááĽá¨áľ-á°áŽá áľáĽáľáĽ ááłá áá. á á ááľ áľáá áŽáááá°á áá áááá˝á áá°áŁá°áĽ áĽá ááá á¨áá áŁááľ áŽáľ áá° áááᎠáááŁá áŞáŤá ááŤá áľá˝ááá ᢠáá áá áááľá¨á ááááŽááśá firmware á ááá¨áľ áĽá ááááŁáľ áŤáľáááááłá .
ááááá á ááťááŠá ᣠáá áĽáá á áá áááá á áľááá áááá˝ (á¤á°-áá˝áááľá á¨ááŽ) áĽáá°áá á áááľ á ááá áź áá á á˘
mpy-cross water_counter.py
ááááŞáŤ á°ááá .py áááá˝á á¨ááŁáŞáŤá á¨ááá áľáááľ ááľáááľá á ááľáłááľ áááá˝á á .mpy á áĽáŤ áááááľ áĽáť áááŤáá˘
á ááŽááŤá (IDE?) ESPlorer ááľáĽ áŤááľá áááá áĽáľááśá˝ á á°á¨áá. áľááŞááśá˝á áá° áááᎠáááŁá áŞáŤá áĽáá˛á°á á áĽá áá˛áŤáá áĽáá˛áá˝á ááá áľáááłá. á áĽá áááł, ááá á ááááŽáá˝ áĽá ááá áááŽá˝ ááá á á áá_ááŁáŞ.py (.mpy) ááá ááľáĽ áááá. ááá áá áá áá á á áá áá á áŤáľ-á°á áĽáá˛áááᣠáĽáá˛áá main.py á¨ááŁá ááá ááá á áá áľá˘ á á°á¨ááŞáᣠá áľááá .py ááá á áá áľáŁ áĽá á áľááľá áŤáá°á ááᨠ.mpy ááá á áá áľá˘ áĽáá áá áľáá˝ áááą ááá˘
import water_counter
áĽááááŤáá - ááá ááá áá°áŤá. ááá áá áá áá á°á¨ áľááľáł á á áľá áááł áľáá˝ áá - áá° 1 áŞ.áŁ. á ááá á¨ááłáŞáŤáá á°ááŁáŤáááľ áááľááľ áĽá áľ á áá, áĽá áá áŞááŁááľ ááĽá á á á áááá. áá áá፠ááááľ áĽááłá áłááá˘
áá ááአáá ááᢠááá áĽááłá ááááš á áŁáá´áŽáľ á¨á°á ááአáĽá á ááľáŁáá á¨ááá áľáááľ ááľáĽ á˘ááŠá, á áĽáááą áá° áŤá á°áááá áĽá áááááá á¨á፠ááá°áá. áá ááááŽáááśá áŁááľáŽáľ á ááĽáł á¨ááá˝ áá á°á¨ áľááľáł áá°áŤ áá˝áá ᣠáá ááá á ááĽáł áá° firmware ááľáĽ ááááŁáľ áŤáľáááááłáᢠááá áĽááłá á ááľáĄá áá áĽáŠ áá á˘ááľáľá (á á፠áĽáť ááááľ áá á¨á) á¨áŁáľ á áá°ááá˘
áľáá° ááá áĽáá°áá¨á°áá áá
- á áááľá áŤá . áá ááá á ESP8266 áľá áá ááŽááŤáá˝ á á áá᪠áĽá á¤á°ááťáááľ ááááŁáᢠá ááŽáááą áá áá˝ áá áŁáá áááŞáŤ áá°á¨áľ á°á°áĽáľá§á (ᨠSTANDALONE = á á ááźáąá áááŤáá)
- á áááľ
- á áľááááášá á¤á°-ááťáááľ á ááááŽááśá áá ááľáĽ áá°áŚá˝/esp8266/áááá˝ ááŁá
- á ááá ááľáĽ áŁáá áááŞáŤ áá°á¨áľ firmware áĽáá°á áľáŁáá
- áááá áá° áááᎠáááŁá áŞáŤá áľáá (ᨠESP8266Flasher ááŽááŤáá˝á ááá Python's esptoolá á áá áá á áááśááľ áá á á°ááááá)
ááá ááá ᣠá áá 'ssd1306 á áľááŁ' áŽáąá á ááĽáł ᨠfirmware á¨á áŤá°áááá áĽá RAM ááá á ááááᢠá áá áĽááᾠᣠá¨áááĽá¨áŞáá áŽáľ áĽáť áá° firmware á°á áŤáá ᣠááá á¨ááŽááŤá áŽáľ á¨ááá áľáááą áá á˛á°áá áᢠáá firmware á áĽáá°áá áłáŤá áá á ááŽááŤáá áááá¨á ááá áŤá°ááááᢠá á áá áá 8.5kb áŤá á áŤá á áá á ááᢠáá ááá°ááą á áŁá áĽá á¨á°ááŤáŠ á áá á°ááŁáŤáľá á°ááŁáŤá áááľá¨á áŤáľá˝ááá. á°á á ᣠá á áá á°á¨ áľááľáł á¨áá ᣠá¨á፠áááá ááŽááŤá áá° firmware ááŤá áá˝ááá˘
áĽá á áá áá áá°á¨á?
áĽáşáŁ á¨áĽá¨áą ááŤá á°á˝á§áᣠááááá á°á˝ááᣠáłáĽá áłáľááᣠááłáŞáŤá ááľááłá áá á°áŁáĽáá áĽá áĽááá á á°áľáł áĽáá áľááá áááᢠáá áĽáľáŤáá áľá¨áľ áá áá áĽáá áłáĽá áá (á áľááá áĽá á ááłááŤá á áááá) áĽá á¨áą á ááá áľáá˝ áľááľ á¨áá. áá° á áááአá ááአá¨MQTT áááĽááśá˝ á ááľ ááá áááľá¨á ááá á áá ááá˘
á¨áĽá "áľáááľ á¤áľ" áĽá¨á°á˝á¨á¨á¨á¨ ááᢠ. á¨MQTT ááá á¨áłáĽá áá áá ááá á ááá á¨á°á¨ááŞá áá ፠á°ááá - á¨á¨áľ áĽáá°áᣠá ááľáłááľáᢠMQTT áŤáąá á¨áťá ááá á áá°áá - á¨ááŁá ááá áŤáľáááááłáᢠá°áá - áááĽááśá˝á á¨ááá áᣠá¨ááá áĽá áá° MQTT á°áá áá˝ á¨ááŤáľá°ááá á ááááᢠáĽá (áĽáá° ááááśá) á á°ááłáłá ááľáĄá á¨áá°áŤáá áľáá áĽá ááááá˘
ááŁáŞáŤá á˘áŤááľ á ááľ áá áááĽááľ á¨áᨠá áá ááá áá˛áŤáá á áááአááľáĽ ááłáŤá.

áĽááá
áĽá´áśá˝ á áá á¨áľáááľ áááŽá˝ áá ááŁáአáá˝áá, á á ááśáá˝á áľááŞááśá˝ ááľáĽ áĽá
á áá ááá áĽá áá°ááŤáŠ áľááłááá˝ áá°á¨á áá˝áá - áá
áá á¨áá
á˝áá áá°á áá áá. ᨠmajordomo áĽáááľ ááááľ áŤáá áá áá, áĽá áĽááááŤáá áá˝áá - áá°áá áĽáἠá¤áľ áĽá¨ááᣠáá áĽá áľáááąá áľááááá á áĽá ἠááááŤáá˘
áááľ ááŤáá˝á áĽáť á áłááááᢠáá á áá ááá á¨áĽá´áśá˝ ááŤá ááá˘

á áááľ ááá á°á áááľ ááťáá áááá áĽááłáá°á áá áá¨áľ ááťáá. áááľ áá á ááľ á°á áá° áá¸áłá á¤áľ áá°áŁ áĽá á¨á°ááá˘áŚá˝ áŚáľáá˛áľ ááŁáŞáŤ á á ááľ áááľ áááľ ááľá á¨áá ᣠáááľááᢠá ááľ áá áááł á á¨áá°á áááł áá¨ááŤá. á áĽáááá áá áá á¨ááááŤá ááľáĽ áĽá áááá, ááá áá áá ááłá ἠááá áá á áĽá áááá áá° á¨á°á áá
áá ááᏠ- áá
á°áá á áłá˝áá ááŤá áá á ááá˝ ááłáŤá.
á¨áá áťááľ áá áá° áá¸áłá á¤áľ áááľ á¨6-7 ááľá ááᣠáťáá ááá°áľ á¨20-30 ááľáᣠáĽá áá ἠ20 ááľá áĽáá°áá áĽá áá ááłá ἠ160 ááľá áĽáá°ááŤáľááá á°á¨áľáťááᢠá áá ááľáĽ, á¤á°á°á¤ ᨠ500-600 ááľá á áŤáŁá˘ áá áá.
á á°áá á¨ááá áááľ ááá¸áᣠááĽáŤááłááą á¨áá áĽá´áľ ááááŚá˝á áááá¨áľ áá˝ááá˘

á¨áá
á áááłáľ á¨á§áá§á áááľ á áááá áľ áá áá á 1 á°á¨ááľ ááľáĽ á 5 ááľá á áŤáŁá˘ áĽáá°áááľ á°á¨áłá.
ááá áá á áá á á , áľáłá˛áľá˛ááľ ááááŁáľ ááááá¨áľ á áŁá á ááş áááá áá˝áá. majordomo á¨áááł áá áłáá˝á á ááᣠá áłáááľ áĽá á áá á¨áá¨áľ á˝ááł á ááᢠáĽáá , áááłá, á á ááśá˝ ááľáĽ á¨áááł ááŤá áá

áĽáľáŤáá á ááľ áłáááľ áĽáť áá¨á á ááᢠá á ááľ áá ááľáĽ, áá
ááŤá á¨á áá ááá áááá - á¨á°áᨠá ááľ á¨áĽáŤááłááą áá áá ááááłá. áľáá á áĽá
á ááŤáľááĄáľ á¨áĽá´áśá˝ ááľá°áŤá¨áŤ (áľáá á ááľ) áľáá˝ á°á áá˝áˇáᢠáĽá á¨ááááŞáŤáášá áááá˝ á á ááľ áŞáŠáĽ áŤáá° á áľááá áĽááłáľáááĽáŠ ááá áá
á firmware ááľáĽ áľá
á°áľ áĽáá°áá áĽá ááá ááľáŽá˝ á¨áááľ ááľáĽ áĽááłááᥠáĽáľáŤáá ááá
á áá°ááᢠá°á¨á᪠áá áááááá˘
á¨ááŤááš áĽáŤáłá¸á á áá, á ááá áá°áĽáá, áá ááľá¨á, áááŁáľ áŤáľáááááłá. ááááŁáľ ááá¨á ááááá˝ á¨áá á°á¨ áľááľáł áááł ááŤá áĽáááŁáá - á áľáááľ á¨áá ááá áĽá፠áĽá¨áá°á° ááᢠááááŁáľ á˘áá°áááľ áŤááá á¨áŁá¸áá áá áśá˝ áĽáá°ááá á áłááťááᢠáá áá á ááłáĄ á°á¨á áĽá¨á°á˝á¨á¨á¨á¨ ááá˘
áá°áá°ááŤ
áᏠá áááłáᏠáľáá˝ áĽáá ááá. á áĽáá°áá á áááľ áľáá˝ ááłáŞáŤ, á á¤áľ ááľáĽ áŤááá á¨áá áááł ááá¨áłá°á á¨á áá á ááş áááá. áá°á á˛á á°ááľá á¨áá âá á ááľ áá ááľáĽ áĽáá°áá áĽá áá á°á áâ ᣠá áá á¨áá á áááł ááá ááááľ áĽá˝áááá˘
á¨áŤáą ááľá áááľ áá á¨áá á ááľ á°á á áľááŞá áá áŤááá ááŁáĽ áááá¨áľ áĽáááł áááľááᢠááá áá áĽáá áŠá áŁááá áá ááľáĽ áá° áá á áááłá ááááľ áĽá áľ á áá, áĽááŤá áĽá á¨áá áááŁáŤáá˝ áááŤá, áĽá ááľáŽáš áĽáŤáłá¸á, ááááŁáľá, á áá¨ááŤá áá áááá. áľááá á¨áááľ ááŁáĽ ááŁáŞáŤ á áŁá ááš áááá.
áĽáá˛áá á¨ááłáŞáŤáá á°ááŁá áááľááľ áĽá áľ á áá. ááľááá á¨áá°á áŤááŽá˝ áĽá¨á°ááá¨áľáŠ ááᢠá ááᣠá¨áŚááá á¨á°ááá áá áááá¨áᣠáááľá¨áľ á áľá¸á᪠á áá áŚáł ááľáĽ 3 á§áá§áá˝á ááłá á á ááĽáᢠá°ááłá á áááŤá˝ áŁáá á ááľ á ááŤá áá á áááľá¨á á¨á áá á ááş áááá. á°á á ᣠá áĽááἠᣠá¨ááĽááľ áá¨áá¨áá áá°áá á á°áᢠááá˘
á á˝áá ááľáĽ, á ESP8266 áá á áááľá¨áľ á¨ááłáŞáŤáá áľáŞáľ áááŹá áá á. á áĽá á áľá°áŤá¨áľ, coroutines á áá áá á¨ááááŽááśá firmware á áŁá á áľá°áłá˝ áľáŞáľ á ááá - ááá áĽá áááᢠá áááťá áá áľ áŤáá ááá áĽá áľááá˝á áĽá áááŚá˝á ááááá˝ áá¨ááŠá˘ ááááŁáľ áááá ááá á áááá áááŹáááᣠáá á áá áĽáá° á ááŁá˘áŁ á áá áá áŤáá°ááá¨áá á¨áá°áĽ ááá áľááá ááŁá¨á ááááá˘
áĽáá° ááá áááᢠáľá˝áľ áááľ ááá˘
ááá: hab.com
