ΠΠΎΠ³Π΄Π°-ΡΠΎ ΡΠΈΡΡΠ΅ΠΌΡ Π΄ΠΎΠΌΠ°ΡΠ½Π΅ΠΉ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ, ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ ΠΈΡ ΡΠ°ΡΡΠΎ Π½Π°Π·ΡΠ²Π°ΡΡ βΡΠΌΠ½ΡΠΉ Π΄ΠΎΠΌβ, Π±ΡΠ»ΠΈ ΠΆΡΡΠΊΠΎ Π΄ΠΎΡΠΎΠ³ΠΈΠΌΠΈ ΠΈ ΠΈΡ ΠΌΠΎΠ³Π»ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΡ ΡΠ΅Π±Π΅ Π»ΠΈΡΡ Π±ΠΎΠ³Π°ΡΠΈ. Π‘Π΅Π³ΠΎΠ΄Π½Ρ Π½Π° ΡΡΠ½ΠΊΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π±ΡΠ΄ΠΆΠ΅ΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡΡ Ρ Π΄Π°ΡΡΠΈΠΊΠ°ΠΌΠΈ, ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ/Π²ΡΠΊΠ»ΡΡΠ°ΡΠ΅Π»ΡΠΌΠΈ ΠΈ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΌΠΈ ΡΡΡΡΠΎΠΉΡΡΠ²Π°ΠΌΠΈ Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΎΡΠ²Π΅ΡΠ΅Π½ΠΈΠ΅ΠΌ, ΡΠΎΠ·Π΅ΡΠΊΠ°ΠΌΠΈ, Π²Π΅Π½ΡΠΈΠ»ΡΡΠΈΠ΅ΠΉ, Π²ΠΎΠ΄ΠΎΡΠ½Π°Π±ΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΌΠΈ. Π Π΄Π°ΠΆΠ΅ ΡΠ°ΠΌΡΠΉ ΠΊΡΠΈΠ²ΠΎΡΡΠΊΠΈΠΉ DIY-ΡΠ½ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠΎΠ±ΡΠΈΡΡΡΡ ΠΊ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΠΎΠΌΡ ΠΈ Π·Π° Π½Π΅Π΄ΠΎΡΠΎΠ³ΠΎ ΡΠΎΠ±ΠΈΡΠ°ΡΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π° Π΄Π»Ρ ΡΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ°.
ΠΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΠΌΡΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΡΡΠΎ Π»ΠΈΠ±ΠΎ Π΄Π°ΡΡΠΈΠΊΠΈ, Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌΡ. ΠΠ½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π»Π΅Π³ΠΊΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ΅Π½Π°ΡΠΈΠΈ Π²ΡΠΎΠ΄Π΅ βΠΏΡΠΈ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π½ΠΈΠΈ Π΄Π°ΡΡΠΈΠΊΠ° Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ Π²ΠΊΠ»ΡΡΠΈΡΡ ΡΠ²Π΅Ρβ ΠΈΠ»ΠΈ βΠ²ΡΠΊΠ»ΡΡΠ°ΡΠ΅Π»Ρ Π²ΠΎΠ·Π»Π΅ Π²ΡΡ
ΠΎΠ΄Π° ΡΡΡΠΈΡ ΡΠ²Π΅Ρ Π²ΠΎ Π²ΡΠ΅ΠΉ ΠΊΠ²Π°ΡΡΠΈΡΠ΅β. ΠΠΎ Π²ΠΎΡ Ρ ΡΠ΅Π»Π΅ΠΌΠ΅ΡΡΠΈΠ΅ΠΉ ΠΊΠ°ΠΊ-ΡΠΎ Π½Π΅ ΡΠ»ΠΎΠΆΠΈΠ»ΠΎΡΡ. Π Π»ΡΡΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ Π³ΡΠ°ΡΠΈΠΊ ΡΠ΅ΠΌΠΏΠ΅ΡΠ°ΡΡΡΡ ΠΈ Π²Π»Π°ΠΆΠ½ΠΎΡΡΠΈ, ΠΈΠ»ΠΈ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½Π°Ρ ΠΌΠΎΡΠ½ΠΎΡΡΡ Π² ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΉ ΡΠΎΠ·Π΅ΡΠΊΠ΅.
ΠΠ΅Π΄Π°Π²Π½ΠΎ Ρ ΡΠ΅Π±Π΅ ΠΏΠΎΡΡΠ°Π²ΠΈΠ» ΡΡΠ΅ΡΡΠΈΠΊΠΈ Π²ΠΎΠ΄Ρ Ρ ΠΈΠΌΠΏΡΠ»ΡΡΠ½ΡΠΌ Π²ΡΡ ΠΎΠ΄ΠΎΠΌ. Π§Π΅ΡΠ΅Π· ΠΊΠ°ΠΆΠ΄ΡΠΉ Π»ΠΈΡΡ ΠΏΡΠΎΠ±Π΅ΠΆΠ°Π²ΡΠΈΠΉ ΡΠ΅ΡΠ΅Π· ΡΡΠ΅ΡΡΠΈΠΊ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ Π³Π΅ΡΠΊΠΎΠ½ ΠΈ Π·Π°ΠΌΡΠΊΠ°Π΅Ρ ΠΊΠΎΠ½ΡΠ°ΠΊΡ. ΠΡΡΠ°Π»ΠΎΡΡ Π΄Π΅Π»ΠΎ Π·Π° ΠΌΠ°Π»ΡΠΌ β ΠΏΡΠΈΡΠ΅ΠΏΠΈΡΡΡΡ ΠΊ ΠΏΡΠΎΠ²ΠΎΠ΄Π°ΠΌ ΠΈ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΠΎΠ»ΡΠ·Ρ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠ΅ Π²ΠΎΠ΄Ρ ΠΏΠΎ ΡΠ°ΡΠ°ΠΌ ΠΈ Π΄Π½ΡΠΌ Π½Π΅Π΄Π΅Π»ΠΈ. ΠΡ Π° Π΅ΡΠ»ΠΈ ΡΡΠΎΡΠΊΠΎΠ² Π΄Π»Ρ Π²ΠΎΠ΄Ρ Π² ΠΊΠ²Π°ΡΡΠΈΡΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ, ΡΠΎ ΡΠ΄ΠΎΠ±Π½Π΅Π΅ Π²ΠΈΠ΄Π΅ΡΡ Π²ΡΠ΅ ΡΠ΅ΠΊΡΡΠΈΠ΅ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΡΠΊΡΠ°Π½Π΅, ΡΠ΅ΠΌ Π»Π°Π·ΠΈΡΡ ΠΏΠΎ ΡΡΡΠ΄Π½ΠΎΠ΄ΠΎΡΡΡΠΏΠ½ΡΠΌ Π½ΠΈΡΠ°ΠΌ Ρ ΡΠΎΠ½Π°ΡΠΈΠΊΠΎΠΌ.
ΠΠΎΠ΄ ΠΊΠ°ΡΠΎΠΌ ΠΌΠΎΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΡΡΡΡΠΎΠΉΡΡΠ²Π° Π½Π° Π±Π°Π·Π΅ ESP8266, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΡΠΈΡΠ°Π΅Ρ ΠΈΠΌΠΏΡΠ»ΡΡΡ ΡΠΎ ΡΡΠ΅ΡΡΠΈΠΊΠΎΠ² Π²ΠΎΠ΄Ρ ΠΈ ΠΏΠΎ MQTT ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΈΡ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ ΡΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ°. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°ΡΡ Π±ΡΠ΄Π΅ΠΌ Π½Π° micropython Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ uasyncio. ΠΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ Ρ Π½Π°ΡΠΊΠ½ΡΠ»ΡΡ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΡ
ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ, ΠΎ ΠΊΠΎΡΠΎΡΡΡ
ΡΠ°ΠΊΠΆΠ΅ ΡΠ°ΡΡΠΊΠ°ΠΆΡ Π² ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅. ΠΠΎΠ΅Ρ
Π°Π»ΠΈ!
Π‘Ρ Π΅ΠΌΠ°
Π‘Π΅ΡΠ΄ΡΠ΅ΠΌ Π²ΡΠ΅ΠΉ ΡΡ
Π΅ΠΌΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ Π½Π° ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ΅ ESP8266. ΠΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π»ΡΡ ESP-12, Π½ΠΎ ΠΌΠΎΠΉ ΠΎΠΊΠ°Π·Π°Π»ΡΡ Π±ΡΠ°ΠΊΠΎΠ²Π°Π½Π½ΡΠΉ. ΠΡΠΈΡΠ»ΠΎΡΡ Π΄ΠΎΠ²ΠΎΠ»ΡΡΡΠ²ΠΎΠ²Π°ΡΡΡΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ ESP-07, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ» Π² Π½Π°Π»ΠΈΡΠΈΠΈ. ΠΠ»Π°Π³ΠΎ ΠΎΠ½ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠ΅ ΠΈ ΠΏΠΎ Π²ΡΠ²ΠΎΠ΄Π°ΠΌ, ΠΈ ΠΏΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Ρ, ΡΠ°Π·Π½ΠΈΡΠ° ΡΠΎΠ»ΡΠΊΠΎ Π² Π°Π½ΡΠ΅Π½Π½Π΅ β Ρ ESP-12 ΠΎΠ½Π° Π²ΡΡΡΠΎΠ΅Π½Π½Π°Ρ, Π° Ρ ESP-07 β Π²Π½Π΅ΡΠ½ΡΡ. ΠΠΏΡΠΎΡΠ΅ΠΌ, Π΄Π°ΠΆΠ΅ Π±Π΅Π· Π°Π½ΡΠ΅Π½Π½Ρ WiFi ΡΠΈΠ³Π½Π°Π» Π² ΠΌΠΎΠ΅ΠΉ Π²Π°Π½Π½ΠΎΠΉ Π»ΠΎΠ²ΠΈΡΡΡ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ.
ΠΠ±Π²ΡΠ·ΠΊΠ° ΠΌΠΎΠ΄ΡΠ»Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ:
- ΠΊΠ½ΠΎΠΏΠΊΠ° ΡΠ΅ΡΠ΅Ρ Ρ ΠΏΠΎΠ΄ΡΡΠΆΠΊΠΎΠΉ ΠΈ ΠΊΠΎΠ½Π΄Π΅Π½ΡΠ°ΡΠΎΡΠΎΠΌ (Ρ ΠΎΡΡ ΠΈ ΡΠΎ ΠΈ Π΄ΡΡΠ³ΠΎΠ΅ ΡΠΆΠ΅ Π΅ΡΡΡ Π²Π½ΡΡΡΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ)
- Π‘ΠΈΠ³Π½Π°Π» enable (CH_PD) ΠΏΠΎΠ΄ΡΡΠ½ΡΡ ΠΊ ΠΏΠΈΡΠ°Π½ΠΈΡ
- GPIO15 ΠΏΠΎΠ΄ΡΡΠ½ΡΡ ΠΊ Π·Π΅ΠΌΠ»Π΅. ΠΡΠΎ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π½Π° ΡΡΠ°ΡΡΠ΅, Π½ΠΎ ΠΌΠ½Π΅ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ Π½Π΅ΡΠ΅Π³ΠΎ Π½Π° ΡΡΡ Π½ΠΎΠ³Ρ ΡΠ΅ΠΏΠ»ΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π½ΡΠΆΠ½ΠΎ
ΠΠ»Ρ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° ΠΌΠΎΠ΄ΡΠ»Ρ Π² ΡΠ΅ΠΆΠΈΠΌ ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ Π½ΡΠΆΠ½ΠΎ Π·Π°ΠΌΠΊΠ½ΡΡΡ GPIO2 Π½Π° Π·Π΅ΠΌΠ»Ρ, Π° ΡΡΠΎΠ±Ρ Π±ΡΠ»ΠΎ ΡΠ΄ΠΎΠ±Π½Π΅Π΅ Ρ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π» ΠΊΠ½ΠΎΠΏΠΊΡ Boot. Π Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΡΡΠΎΡ ΠΏΠΈΠ½ ΠΏΠΎΠ΄ΡΡΠ³ΠΈΠ²Π°Π΅ΡΡΡ ΠΊ ΠΏΠΈΡΠ°Π½ΠΈΡ.
Π‘ΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π»ΠΈΠ½ΠΈΠΈ GPIO2 ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π²Π½Π°ΡΠ°Π»Π΅ ΡΠ°Π±ΠΎΡΡ β ΠΏΡΠΈ ΠΏΠΎΠ΄Π°ΡΠ΅ ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΈΠ»ΠΈ ΡΡΠ°Π·Ρ ΠΏΠΎΡΠ»Π΅ ΡΠ΅ΡΠ΅ΡΠ°. Π’Π°ΠΊ ΠΌΠΎΠ΄ΡΠ»Ρ Π»ΠΈΠ±ΠΎ Π·Π°Π³ΡΡΠΆΠ°Π΅ΡΡΡ ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΠΎ, Π»ΠΈΠ±ΠΎ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡ Π² ΡΠ΅ΠΆΠΈΠΌ ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ. ΠΠΎΡΠ»Π΅ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΡΠΎΡ Π²ΡΠ²ΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΡΠΉ GPIO. ΠΡ Π° ΡΠ°Π· ΡΠ°ΠΌ ΡΠΆΠ΅ Π΅ΡΡΡ ΠΊΠ½ΠΎΠΏΠΊΠ°, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ²Π΅ΡΠΈΡΡ Π½Π° Π½Π΅Π΅ ΠΊΠ°ΠΊΡΡ Π½ΠΈΠ±ΡΠ΄Ρ ΠΏΠΎΠ»Π΅Π·Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ.
ΠΠ»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΎΡΠ»Π°Π΄ΠΊΠΈ Ρ Π±ΡΠ΄Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ UART, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ²Π΅Π» Π½Π° Π³ΡΠ΅Π±Π΅Π½ΠΊΡ. ΠΠΎΠ³Π΄Π° Π½ΡΠΆΠ½ΠΎ β Ρ ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Ρ ΡΡΠ΄Π° USB-UART ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π½ΠΈΠΊ. ΠΡΠΆΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ Π·Π°Π±ΡΠ²Π°ΡΡ, ΡΡΠΎ ΠΏΠΈΡΠ°Π΅ΡΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΎΡ 3.3Π. ΠΡΠ»ΠΈ Π·Π°Π±ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠΈΡΡ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π½ΠΈΠΊ Π½Π° ΡΡΠΎ Π½Π°ΠΏΡΡΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠ΄Π°ΡΡ 5Π, ΡΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ ΡΠ³ΠΎΡΠΈΡ.
Π‘ ΡΠ»Π΅ΠΊΡΡΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ Π² Π²Π°Π½Π½ΠΎΠΉ Ρ ΠΌΠ΅Π½Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π½Π΅Ρ β ΡΠΎΠ·Π΅ΡΠΊΠ° ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ Π² ΠΌΠ΅ΡΡΠ΅ ΠΎΡ ΡΡΠ΅ΡΡΠΈΠΊΠΎΠ², ΡΠ°ΠΊ ΡΡΠΎ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ Π±ΡΠ΄Ρ ΠΎΡ 220Π. Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° ΠΏΠΈΡΠ°Π½ΠΈΡ Ρ ΠΌΠ΅Π½Ρ Π±ΡΠ΄Π΅Ρ ΡΡΡΠ΄ΠΈΡΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ
ΠΠ»Ρ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ΅ΠΆΠΈΠΌΠΎΠ² ΡΠ°Π±ΠΎΡΡ Ρ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π» ΡΠ²Π΅ΡΠΎΠ΄ΠΈΠΎΠ΄, ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½Π½ΡΠΉ ΠΊ GPIO2. ΠΠΏΡΠΎΡΠ΅ΠΌ ΡΠ°ΡΠΏΠ°ΠΈΠ²Π°ΡΡ Ρ Π΅Π³ΠΎ Π½Π΅ ΡΡΠ°Π», Ρ.ΠΊ. Π² ΠΌΠΎΠ΄ΡΠ»Π΅ ESP-07 ΡΠΆΠ΅ Π΅ΡΡΡ ΡΠ²Π΅ΡΠΎΠ΄ΠΈΠΎΠ΄, ΠΏΡΠΈΡΠ΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½Π½ΡΠΉ ΠΊ ΡΠΎΠΌΡ ΠΆΠ΅ GPIO2. ΠΠΎ Π½Π° ΠΏΠ»Π°ΡΠ΅ ΠΏΡΡΠΊΠ°ΠΉ Π±ΡΠ΄Π΅Ρ β Π²Π΄ΡΡΠ³ Ρ Π·Π°Ρ ΠΎΡΡ Π²ΡΠ²Π΅ΡΡΠΈ ΡΡΠΎΡ ΡΠ²Π΅ΡΠΎΠ΄ΠΈΠΎΠ΄ Π½Π° ΠΊΠΎΡΠΏΡΡ.
ΠΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠΌ ΠΊ ΡΠ°ΠΌΠΎΠΌΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΠΌΡ. Π£ ΡΡΠ΅ΡΡΠΈΠΊΠΎΠ² Π²ΠΎΠ΄Ρ Π½Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ, Ρ Π½ΠΈΡ Π½Π΅Π»ΡΠ·Ρ ΡΠΏΡΠΎΡΠΈΡΡ ΡΠ΅ΠΊΡΡΠΈΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΈΡ. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΡΡΠΎ Π½Π°ΠΌ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ ΡΡΠΎ ΠΈΠΌΠΏΡΠ»ΡΡΡ β Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ°ΠΊΡΠΎΠ² Π³Π΅ΡΠΊΠΎΠ½Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ Π»ΠΈΡΡ. ΠΡΠ²ΠΎΠ΄Ρ Π³Π΅ΡΠΊΠΎΠ½ΠΎΠ² Ρ ΠΌΠ΅Π½Ρ Π·Π°Π²Π΅Π΄Π΅Π½Ρ Π² GPIO12/GPIO13. ΠΠΎΠ΄ΡΡΠ³ΠΈΠ²Π°ΡΡΠΈΠΉ ΡΠ΅Π·ΠΈΡΡΠΎΡ Ρ Π±ΡΠ΄Ρ Π²ΠΊΠ»ΡΡΠ°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎ Π²Π½ΡΡΡΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ.
ΠΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ Ρ Π·Π°Π±ΡΠ» ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅ΡΡ ΡΠ΅Π·ΠΈΡΡΠΎΡΡ R8 ΠΈ R9 ΠΈ Π² ΠΌΠΎΠ΅ΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠ΅ ΠΏΠ»Π°ΡΡ ΠΈΡ Π½Π΅Ρ. ΠΠΎ ΡΠ°Π· Ρ ΡΠΆΠ΅ Π²ΡΠΊΠ»Π°Π΄ΡΠ²Π°Ρ ΡΡ Π΅ΠΌΡ Π½Π° Π²ΡΠ΅ΠΎΠ±ΡΠ΅Π΅ ΠΎΠ±ΠΎΠ·ΡΠ΅Π½ΠΈΠ΅, ΡΠΎ ΡΡΠΠΈΡ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΡΡΡ ΠΎΠΏΠ»ΠΎΡΠ½ΠΎΡΡΡ. Π Π΅Π·ΠΈΡΡΠΎΡΡ Π½ΡΠΆΠ½Ρ, ΡΡΠΎΠ±Ρ Π½Π΅ ΡΠΏΠ°Π»ΠΈΡΡ ΠΏΠΎΡΡ Π² ΡΠ»ΡΡΠ°Π΅ Π΅ΡΠ»ΠΈ ΠΏΡΠΎΡΠΈΠ²ΠΊΠ° Π³Π»ΡΠΊΠ°Π½Π΅Ρ ΠΈ Π²ΡΡΡΠ°Π²ΠΈΡ Π΅Π΄ΠΈΠ½ΠΈΡΡ Π½Π° ΠΏΠΈΠ½Π΅, Π° Π³Π΅ΡΠΊΠΎΠ½ Π·Π°ΠΊΠΎΡΠΎΡΠΈΡ ΡΡΡ Π»ΠΈΠ½ΠΈΡ Π½Π° Π·Π΅ΠΌΠ»Ρ (Ρ ΡΠ΅Π·ΠΈΡΡΠΎΡΠΎΠΌ ΠΏΠΎΡΠ΅ΡΠ΅Ρ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ 3.3Π/1000ΠΠΌ = 3.3ΠΌΠ).
ΠΠΎΡΠ° ΠΏΠΎΠ΄ΡΠΌΠ°ΡΡ ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ Π΅ΡΠ»ΠΈ ΠΏΡΠΎΠΏΠ°Π΄Π΅Ρ ΡΠ»Π΅ΠΊΡΡΠΈΡΠ΅ΡΡΠ²ΠΎ. ΠΠ΅ΡΠ²ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ β Π½Π° ΡΡΠ°ΡΡΠ΅ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°ΡΡ Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° Π½Π°ΡΠ°Π»ΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΡΠ΅ΡΡΠΈΠΊΠΎΠ². ΠΠΎ ΡΡΠΎ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°Π»ΠΎ Π±Ρ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΡΡΠ»ΠΎΠΆΠ½Π΅Π½ΠΈΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° ΠΎΠ±ΠΌΠ΅Π½Π°. ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π° Π² ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΡΠ΅ΡΠ²Π΅ΡΠ°. ΠΡΠ»ΠΈ Π±Ρ ΠΏΠΎΡΠ»Π΅ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ²Π΅ΡΠ° ΡΠ΅ΡΠ²Π΅Ρ Π½Π΅ Π·Π°Π²Π΅Π»ΡΡ (ΠΈΠ»ΠΈ Π·Π°Π²Π΅Π»ΡΡ ΠΏΠΎΠ·ΠΆΠ΅), ΡΠΎ ΡΡΠ΅ΡΡΠΈΠΊ Π²ΠΎΠ΄Ρ Π½Π΅ ΡΠΌΠΎΠ³ Π±Ρ Π·Π°ΠΏΡΠΎΡΠΈΡΡ Π½Π°ΡΠ°Π»ΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈ ΡΠ°Π±ΠΎΡΠ°Π» Π±Ρ Π½Π΅Π²Π΅ΡΠ½ΠΎ.
ΠΠΎΡΡΠΎΠΌΡ Ρ ΡΠ΅ΡΠΈΠ» ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΡΡΠ΅ΡΡΠΈΠΊΠΎΠ² Π² ΠΌΠΈΠΊΡΠΎΡΡ Π΅ΠΌΠ΅ ΠΏΠ°ΠΌΡΡΠΈ, ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½Π½ΠΎΠΉ ΠΏΠΎ I2C. ΠΡΠΎΠ±ΡΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΏΠΎ ΡΠ°Π·ΠΌΠ΅ΡΡ ΡΠ»Π΅Ρ ΠΏΠ°ΠΌΡΡΠΈ Ρ ΠΌΠ΅Π½Ρ Π½Π΅Ρ β Π½ΡΠΆΠ½ΠΎ ΡΠΎΡ ΡΠ°Π½ΡΡΡ Π²ΡΠ΅Π³ΠΎ 2 ΡΠΈΡΠ»Π° (ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π»ΠΈΡΡΠΎΠ² ΠΏΠΎ ΡΡΠ΅ΡΡΠΈΠΊΠ°ΠΌ Π³ΠΎΡΡΡΠ΅ΠΉ ΠΈ Ρ ΠΎΠ»ΠΎΠ΄Π½ΠΎΠΉ Π²ΠΎΠ΄Ρ). ΠΠ°ΠΆΠ΅ ΡΠ°ΠΌΡΠΉ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΈΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ. Π Π²ΠΎΡ Π½Π° ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠΈΠΊΠ»ΠΎΠ² Π·Π°ΠΏΠΈΡΠΈ Π½ΡΠΆΠ½ΠΎ ΠΎΠ±ΡΠ°ΡΠΈΡΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅. Π£ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π° ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ ΡΡΠΎ 100 ΡΡΡ ΡΠΈΠΊΠ»ΠΎΠ², Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ Π΄ΠΎ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π°.
ΠΠ°Π·Π°Π»ΠΎΡΡ Π±Ρ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ ΡΡΠΎ ΠΌΠ½ΠΎΠ³ΠΎ. ΠΠΎ Ρ Π·Π° 4 Π³ΠΎΠ΄Π° ΠΏΡΠΎΠΆΠΈΠ²Π°Π½ΠΈΡ Π² ΡΠ²ΠΎΠ΅ΠΉ ΠΊΠ²Π°ΡΡΠΈΡΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈΠ» ΡΡΡΡ Π±ΠΎΠ»Π΅Π΅ 500 ΠΊΡΠ±ΠΎΠ² Π²ΠΎΠ΄Ρ, ΡΡΠΎ 500 ΡΡΡ Π»ΠΈΡΡΠΎΠ²! Π 500 ΡΡΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π²ΠΎ ΡΠ»Π΅Ρ. Π ΡΡΠΎ ΡΠΎΠ»ΡΠΊΠΎ Ρ ΠΎΠ»ΠΎΠ΄Π½Π°Ρ Π²ΠΎΠ΄Π°. ΠΠΎΠΆΠ½ΠΎ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΏΠ΅ΡΠ΅ΠΏΠ°ΠΈΠ²Π°ΡΡ ΠΌΠΈΠΊΡΠΎΡΡ Π΅ΠΌΡ ΠΊΠ°ΠΆΠ΄ΡΠ΅ ΠΏΠ°ΡΡ Π»Π΅Ρ, Π½ΠΎ ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ Π΅ΡΡΡ ΠΌΠΈΠΊΡΠΎΡΡ Π΅ΠΌΡ FRAM. Π‘ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΡΠΎ ΡΠΎΡ ΠΆΠ΅ ΡΠ°ΠΌΡΠΉ I2C EEPROM, ΡΠΎΠ»ΡΠΊΠΎ Ρ ΠΎΠΎΠΎΠΎΠΎΡΠ΅Π½Ρ Π±ΠΎΠ»ΡΡΠΈΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΡΠΈΠΊΠ»ΠΎΠ² ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΠΈΡΠΈ (ΡΠΎΡΠ½ΠΈ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ²). ΠΠΎΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠΊΠ° Π²ΡΠ΅ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ Π΄ΠΎΠ΅Π΄Ρ Π΄ΠΎ ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° Ρ ΡΠ°ΠΊΠΈΠΌΠΈ ΠΌΠΈΠΊΡΠΎΡΡ Π΅ΠΌΠ°ΠΌΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΠΎΠΊΠ° ΠΏΠΎΡΡΠΎΠΈΡ ΠΎΠ±ΡΡΠ½Π°Ρ 24LC512.
ΠΠ΅ΡΠ°ΡΠ½Π°Ρ ΠΏΠ»Π°ΡΠ°
ΠΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ Ρ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π» Π΄Π΅Π»Π°ΡΡ ΠΏΠ»Π°ΡΡ Π² Π΄ΠΎΠΌΠ°ΡΠ½ΠΈΡ ΡΡΠ»ΠΎΠ²ΠΈΡΡ . ΠΠΎΡΠΎΠΌΡ ΠΏΠ»Π°ΡΠ° ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π»Π°ΡΡ ΠΊΠ°ΠΊ ΠΎΠ΄Π½ΠΎΡΡΠΎΡΠΎΠ½Π½ΡΡ. ΠΠΎ ΠΏΡΠΎΠ΄ΠΎΠ»Π±Π°Π²ΡΠΈΡΡ Π±ΠΈΡΡΠΉ ΡΠ°Ρ Ρ c Π»Π°Π·Π΅ΡΠ½ΡΠΌ ΡΡΡΠ³ΠΎΠΌ ΠΈ ΠΏΠ°ΡΠ»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΊΠΎΠΉ (Π±Π΅Π· Π½Π΅Π΅ ΠΊΠ°ΠΊ-ΡΠΎ Π½Π΅ comme il faut), Ρ Π²ΡΠ΅ ΠΆΠ΅ ΡΠ΅ΡΠΈΠ» Π·Π°ΠΊΠ°Π·Π°ΡΡ ΠΏΠ»Π°ΡΡ Ρ ΠΊΠΈΡΠ°ΠΉΡΠ΅Π².
Π£ΠΆΠ΅ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠ΅ΡΠ΅Π΄ Π·Π°ΠΊΠ°Π·ΠΎΠΌ ΠΏΠ»Π°ΡΡ Ρ ΡΠΎΠΎΠ±ΡΠ°Π·ΠΈΠ», ΡΡΠΎ ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΌΠΈΠΊΡΠΎΡΡ
Π΅ΠΌΡ ΡΠ»Π΅Ρ ΠΏΠ°ΠΌΡΡΠΈ Π½Π° ΡΠΈΠ½Ρ I2C ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡΠ΅ΠΏΠΈΡΡ ΡΡΠΎ Π½ΠΈΠ±ΡΠ΄Ρ Π΅ΡΠ΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π΄ΠΈΡΠΏΠ»Π΅ΠΉ. Π§ΡΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° Π½Π΅Π³ΠΎ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ β ΠΏΠΎΠΊΠ° Π΅ΡΠ΅ Π²ΠΎΠΏΡΠΎΡ, Π½ΠΎ ΡΠ°Π·Π²Π΅ΡΡΠΈ Π½Π° ΠΏΠ»Π°ΡΠ΅ Π½ΡΠΆΠ½ΠΎ. ΠΡ Π° ΡΠ°Π· Ρ ΡΠΎΠ±ΡΠ°Π»ΡΡ ΠΏΠ»Π°ΡΡ Π·Π°ΠΊΠ°Π·ΡΠ²Π°ΡΡ Π½Π° ΡΠ°Π±ΡΠΈΠΊΠ΅, ΡΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°ΡΡ ΡΠ΅Π±Ρ ΠΎΠ΄Π½ΠΎΡΡΠΎΡΠΎΠ½Π½Π΅ΠΉ ΠΏΠ»Π°ΡΠΎΠΉ ΡΠΆΠ΅ Π½Π΅ Π±ΡΠ»ΠΎ ΡΠΌΡΡΠ»Π°, ΠΏΠΎΡΡΠΎΠΌΡ Π»ΠΈΠ½ΠΈΠΈ Π½Π° I2C β Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠ΅ Π½Π° Π·Π°Π΄Π½Π΅ΠΉ ΡΡΠΎΡΠΎΠ½Π΅ ΠΏΠ»Π°ΡΡ.
Π‘ ΠΎΠ΄Π½ΠΎΡΡΠΎΡΠΎΠ½Π½Π΅ΠΉ ΡΠ°Π·Π²ΠΎΠ΄ΠΊΠΎΠΉ ΡΠ°ΠΊΠΆΠ΅ ΡΠ²ΡΠ·Π°Π½ Π±ΡΠ» ΠΎΠ΄ΠΈΠ½ Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΊΠΎΡΡΠΊ. Π’.ΠΊ. ΠΏΠ»Π°ΡΠ° ΡΠΈΡΠΎΠ²Π°Π»Π°ΡΡ ΠΎΠ΄Π½ΠΎΡΡΠΎΡΠΎΠ½Π½ΡΡ, ΡΠΎ Π΄ΠΎΡΠΎΠΆΠΊΠΈ ΠΈ SMD ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π»ΠΎΡΡ ΡΠ°Π·ΠΌΠ΅ΡΠ°ΡΡ Ρ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, Π° Π²ΡΠ²ΠΎΠ΄Π½ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ, ΡΠ°Π·ΡΠ΅ΠΌΡ ΠΈ Π±Π»ΠΎΠΊ ΠΏΠΈΡΠ°Π½ΠΈΡ Ρ Π΄ΡΡΠ³ΠΎΠΉ. ΠΠΎΠ³Π΄Π° ΡΠ΅ΡΠ΅Π· ΠΌΠ΅ΡΡΡ Ρ ΠΏΠΎΠ»ΡΡΠΈΠ» ΠΏΠ»Π°ΡΡ, ΡΠΎ Π·Π°Π±ΡΠ» ΠΏΡΠΎ ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΡΠΉ ΠΏΠ»Π°Π½ ΠΈ ΡΠ°ΡΠΏΠ°ΡΠ» Π²ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π½Π° Π»ΠΈΡΠ΅Π²ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Π΅. Π ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ³Π΄Π° Π΄Π΅Π»ΠΎ Π΄ΠΎΡΠ»ΠΎ Π΄ΠΎ ΠΏΡΠΈΠΏΠ°ΠΈΠ²Π°Π½ΠΈΡ Π±Π»ΠΎΠΊΠ° ΠΏΠΈΡΠ°Π½ΠΈΡ Π²ΡΡΡΠ½ΠΈΠ»ΠΎΡΡ, ΡΡΠΎ ΠΏΠ»ΡΡ ΠΈ ΠΌΠΈΠ½ΡΡ ΡΠ°Π·Π²Π΅Π΄Π΅Π½Ρ Π½Π°ΠΎΠ±ΠΎΡΠΎΡ. ΠΡΠΈΡΠ»ΠΎΡΡ ΠΊΠΎΠ»Ρ ΠΎΠ·ΠΈΡΡ ΠΏΠ΅ΡΠ΅ΠΌΡΡΠΊΠ°ΠΌΠΈ. ΠΠ° ΠΊΠ°ΡΡΠΈΠ½ΠΊΠ΅ Π²ΡΡΠ΅ Ρ ΡΠΆΠ΅ ΠΏΠΎΠΌΠ΅Π½ΡΠ» ΡΠ°Π·Π²ΠΎΠ΄ΠΊΡ, Π½ΠΎ Π·Π΅ΠΌΠ»Ρ ΠΏΠ΅ΡΠ΅ΠΊΠΈΠ΄ΡΠ²Π°Π΅ΡΡΡ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ ΡΠ°ΡΡΠΈ ΠΏΠ»Π°ΡΡ Π² Π΄ΡΡΠ³ΡΡ ΡΠ΅ΡΠ΅Π· Π²ΡΠ²ΠΎΠ΄Ρ ΠΊΠ½ΠΎΠΏΠΊΠΈ Boot (Ρ ΠΎΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ ΠΈ Π½Π° Π²ΡΠΎΡΠΎΠΌ ΡΠ»ΠΎΠ΅ Π΄ΠΎΡΠΎΠΆΠΊΡ ΠΏΡΠΎΠ²Π΅ΡΡΠΈ).
ΠΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ Π²ΠΎΡ ΡΠ°ΠΊ
ΠΠΎΡΠΏΡΡ
Π‘Π»Π΅Π΄ΡΡΠΈΠΉ ΡΠ°Π³ β ΠΊΠΎΡΠΏΡΡ. ΠΡΠΈ Π½Π°Π»ΠΈΡΠΈΠΈ 3D ΠΏΡΠΈΠ½ΡΠ΅ΡΠ° ΡΡΠΎ Π½Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°. ΠΡΠΎΠ±ΠΎ Π½Π΅ Π·Π°ΠΌΠΎΡΠ°ΡΠΈΠ²Π°Π»ΡΡ β ΠΏΡΠΎΡΡΠΎ Π½Π°ΡΠΈΡΠΎΠ²Π°Π» ΠΊΠΎΡΠΎΠ±ΠΊΡ Π½ΡΠΆΠ½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΈ ΡΠ΄Π΅Π»Π°Π» Π²ΡΡΠ΅Π·Ρ Π² Π½ΡΠΆΠ½ΡΡ ΠΌΠ΅ΡΡΠ°Ρ . ΠΡΡΡΠΊΠ° ΠΊΡΠ΅ΠΏΠΈΡΡΡ ΠΊ ΠΊΠΎΡΠΏΡΡΡ Π½Π° ΠΌΠ°Π»Π΅Π½ΡΠΊΠΈΡ ΡΠ°ΠΌΠΎΡΠ΅Π·Π°Ρ .
Π― ΡΠΆΠ΅ ΡΠΏΠΎΠΌΠΈΠ½Π°Π», ΡΡΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ° Boot ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π° ΠΊΠ°ΠΊ ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΎΠ±ΡΠ΅Π³ΠΎ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΡ β Π²ΠΎΡ Π΅Π΅ ΠΈ Π²ΡΠ²Π΅Π΄Π΅ΠΌ Π½Π° ΠΏΠ΅ΡΠ΅Π΄Π½ΡΡ ΠΏΠ°Π½Π΅Π»Ρ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Ρ Π½Π°ΡΠΈΡΠΎΠ²Π°Π» ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ βΠΊΠΎΠ»ΠΎΠ΄Π΅Ρβ Π³Π΄Π΅ ΠΆΠΈΠ²Π΅Ρ ΠΊΠ½ΠΎΠΏΠΊΠ°.
ΠΠ½ΡΡΡΠΈ ΠΊΠΎΡΠΏΡΡΠ° ΡΠ°ΠΊΠΆΠ΅ ΡΠ°ΡΠΏΠΎΠ»Π°Π³Π°ΡΡΡΡ ΠΏΠ΅Π½ΡΠΊΠΈ, Π½Π° ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΠΏΠ»Π°ΡΠ° ΠΈ ΡΠΈΠΊΡΠΈΡΡΠ΅ΡΡΡ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΌ Π²ΠΈΠ½ΡΠΎΠΌ Π3 (Π½Π° ΠΏΠ»Π°ΡΠ΅ Π±ΠΎΠ»ΡΡΠ΅ ΠΌΠ΅ΡΡΠ° Π½Π΅ ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ)
ΠΠΈΡΠΏΠ»Π΅ΠΉ ΠΏΠΎΠ΄Π±ΠΈΡΠ°Π» ΡΠΆΠ΅ ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΏΠ΅ΡΠ°ΡΠ°Π» ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΡΠΈΠΌΠ΅ΡΠΎΡΠ½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΠΊΠΎΡΠΏΡΡΠ°. Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ Π΄Π²ΡΡ ΡΡΡΠΎΡΠ½ΠΈΠΊ Π² ΡΡΠΎΡ ΠΊΠΎΡΠΏΡΡ Π½Π΅ Π²Π»Π°Π·ΠΈΠ», Π·Π°ΡΠΎ Π² ΡΡΡΠ΅ΠΊΠ°Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ»ΡΡ OLED Π΄ΠΈΡΠΏΠ»Π΅ΠΉ SSD1306 128×32. ΠΠ°Π»ΠΎΠ²Π°Ρ, Π½ΠΎ ΠΌΠ½Π΅ Π½Π° Π½Π΅Π³ΠΎ Π½Π΅ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π΄Π΅Π½Ρ Π³Π»Π°Π·Π΅ΡΡ β ΠΏΠΎΠΊΠ°ΡΠΈΡ.
ΠΡΠΈΠΊΠΈΠ΄ΡΠ²Π°Ρ ΠΈ ΡΠ°ΠΊ ΠΈ ΡΠ΄Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΡ Π½Π΅Π³ΠΎ Π±ΡΠ΄ΡΡ ΠΏΡΠΎΠ»ΠΎΠΆΠ΅Π½Ρ ΠΏΡΠΎΠ²ΠΎΠ΄Π° ΡΠ΅ΡΠΈΠ» ΠΏΡΠΈΠ»Π΅ΠΏΠΈΡΡ Π΄ΠΈΡΠΏΠ»Π΅ΠΉ ΠΏΠΎΡΡΠ΅Π΄ΠΈ ΠΊΠΎΡΠΏΡΡΠ°. ΠΡΠ³ΠΎΠ½ΠΎΠΌΠΈΠΊΠ°, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, Π½ΠΈΠΆΠ΅ ΠΏΠ»ΠΈΠ½ΡΡΡΠ° β ΠΊΠ½ΠΎΠΏΠΊΠ° ΡΠ²Π΅ΡΡ Ρ, Π΄ΠΈΡΠΏΠ»Π΅ΠΉ ΡΠ½ΠΈΠ·Ρ. ΠΠΎ Ρ ΡΠΆΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠ», ΡΡΠΎ ΠΈΠ΄Π΅Ρ ΠΏΡΠΈΠΊΡΡΡΠΈΡΡ Π΄ΠΈΡΠΏΠ»Π΅ΠΉ ΠΏΡΠΈΡΠ»Π° ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΏΠΎΠ·Π΄Π½ΠΎ ΠΈ Π»Π΅Π½Ρ Π±ΡΠ»ΠΎ ΠΏΠ΅ΡΠ΅ΡΠ°Π·Π²ΠΎΠ΄ΠΈΡΡ ΠΏΠ»Π°ΡΡ, ΡΡΠΎΠ±Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΡΡ ΠΊΠ½ΠΎΠΏΠΊΡ.
Π£ΡΡΡΠΎΠΉΡΡΠ²ΠΎ Π² ΡΠ±ΠΎΡΠ΅. ΠΠΈΡΠΏΠ»Π΅ΠΉΠ½ΡΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΏΡΠΈΠΊΠ»Π΅Π΅Π½ Π½Π° ΡΠΎΠΏΠ»ΠΈ ΡΠ΅ΡΠΌΠΎΠΊΠ»Π΅ΠΉ
ΠΠΎΠ½Π΅ΡΠ½ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ Π½Π° ΠΠΠΠ
ΠΡΠΎΡΠΈΠ²ΠΊΠ°
ΠΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠΉ ΡΠ°ΡΡΠΈ. ΠΠ»Ρ Π²ΠΎΡ ΡΠ°ΠΊΠΈΡ
Π½Π΅Π±ΠΎΠ»ΡΡΠΈΡ
ΠΏΠΎΠ΄Π΅Π»ΠΎΠΊ ΠΌΠ½Π΅ ΠΎΡΠ΅Π½Ρ Π½ΡΠ°Π²ΠΈΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ·ΡΠΊ Python (
ΠΡΠΎΠ΄Π΅ Π±Ρ Π²ΡΠ΅ ΠΏΡΠΎΡΡΠΎ, Π΄Π° Π½Π΅ ΠΎΡΠ΅Π½Ρ β Π² ΡΡΡΡΠΎΠΉΡΡΠ²Π΅ Π½Π°ΠΌΠ΅ΡΠ°Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ:
- ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΡΠΊΠ°Π΅Ρ Π² ΠΊΠ½ΠΎΠΏΠΊΡ ΠΈ ΡΠΌΠΎΡΡΠΈΡ Π½Π° Π΄ΠΈΡΠΏΠ»Π΅ΠΉ
- ΠΠΈΡΡΡ ΡΠΈΠΊΠ°ΡΡ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π²ΠΎ ΡΠ»Π΅Ρ ΠΏΠ°ΠΌΡΡΠΈ
- ΠΠΎΠ΄ΡΠ»Ρ ΡΠ»Π΅Π΄ΠΈΡ Π·Π° ΡΠΈΠ³Π½Π°Π»ΠΎΠΌ WiFi ΠΈ ΠΏΠ΅ΡΠ΅ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΈΠ²Π°Π΅ΡΡΡ Π΅ΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ
- ΠΡ Π° Π±Π΅Π· ΠΌΠΎΡΠ³Π°ΡΡΠ΅ΠΉ Π»Π°ΠΌΠΏΠΎΡΠΊΠΈ Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅Π»ΡΠ·Ρ
ΠΠ΅Π»ΡΠ·Ρ Π΄ΠΎΠΏΡΡΡΠΈΡΡ ΡΡΠΎ ΠΎΠ΄Π½Π° ΡΡΠ½ΠΊΡΠΈΡ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π»Π°, Π΅ΡΠ»ΠΈ Π΄ΡΡΠ³Π°Ρ ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΏΡΠΈΡΠΈΠ½Π΅ ΡΡΠΏΠΈΡ. Π― ΡΠΆΠ΅ Π½Π°Π΅Π»ΡΡ ΠΊΠ°ΠΊΡΡΡΠΎΠ² Π² Π΄ΡΡΠ³ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ ΠΈ ΡΠ΅ΠΏΠ΅ΡΡ ΡΠ°ΠΊ ΠΈ Π²ΠΈΠΆΡ Π³Π»ΡΠΊΠΈ Π² ΡΡΠΈΠ»Π΅ βΠΏΡΠΎΠΏΡΡΡΠΈΠ»ΠΈ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠΉ Π»ΠΈΡΡ, ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ Π² ΡΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ»ΡΡ Π΄ΠΈΡΠΏΠ»Π΅ΠΉβ ΠΈΠ»ΠΈ βΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΠΏΠΎΠΊΠ° ΠΌΠΎΠ΄ΡΠ»Ρ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΈΡΡΡ ΠΊ 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 (value_storage) Π²ΡΡΠΈΡΡΠ²Π°Π΅ΡΡΡ Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ΅ΡΡΠΈΠΊΠ° β ΡΠ°ΠΊ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠ»Π΅ ΠΏΡΠΎΠΏΠ°Π΄Π°Π½ΠΈΡ ΠΏΠΈΡΠ°Π½ΠΈΡ.
ΠΠΈΠ½ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ ΡΠΎ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠΉ ΠΏΠΎΠ΄ΡΡΠΆΠΊΠΎΠΉ ΠΊ ΠΏΠΈΡΠ°Π½ΠΈΡ: Π΅ΡΠ»ΠΈ Π³Π΅ΡΠΊΠΎΠ½ Π·Π°ΠΌΠΊΠ½ΡΡ β Π½Π° Π»ΠΈΠ½ΠΈΠΈ Π½ΠΎΠ»Ρ, Π΅ΡΠ»ΠΈ ΡΠ°Π·ΠΎΠΌΠΊΠ½ΡΡ Π»ΠΈΠ½ΠΈΡ ΠΏΠΎΠ΄ΡΡΠ³ΠΈΠ²Π°Π΅ΡΡΡ ΠΊ ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ ΡΠΈΡΠ°Π΅Ρ Π΅Π΄ΠΈΠ½ΠΈΡΡ.
Π’Π°ΠΊΠΆΠ΅ ΡΡΡ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½Π°Ρ Π·Π°Π΄Π°ΡΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡ ΠΎΠΏΡΠΎΡ ΠΏΠΈΠ½Π°. ΠΠ°ΠΆΠ΄ΡΠΉ ΡΡΠ΅ΡΡΠΈΠΊ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΡΠ²ΠΎΡ Π·Π°Π΄Π°ΡΡ. ΠΠΎΡ Π΅Π΅ ΠΊΠΎΠ΄
""" 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ΠΌΡ Π½ΡΠΆΠ½Π° Π΄Π»Ρ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠΈ Π΄ΡΠ΅Π±Π΅Π·Π³Π° ΠΊΠΎΠ½ΡΠ°ΠΊΡΠΎΠ², Π° Π·Π°ΠΎΠ΄Π½ΠΎ ΠΎΠ½Π° ΡΠ΅Π³ΡΠ»ΠΈΡΡΠ΅Ρ ΠΊΠ°ΠΊ ΡΠ°ΡΡΠΎ ΠΏΡΠΎΡΡΠΏΠ°Π΅ΡΡΡ Π·Π°Π΄Π°ΡΠ° (ΠΏΠΎΠΊΠ° ΡΡΠ° Π·Π°Π΄Π°ΡΠ° ΡΠΏΠΈΡ β ΡΠ°Π±ΠΎΡΠ°ΡΡ Π΄ΡΡΠ³ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ). ΠΠ°ΠΆΠ΄ΡΠ΅ 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
ΠΡ Π° ΡΠ΅ΠΏΠ΅ΡΡ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΏΡΠ΅Π»Π΅ΡΡΡΠΌΠΈ ΠΏΠΈΡΠΎΠ½Π° ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ uasync ΠΈ ΡΠ΄Π΅Π»Π°Π΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΡΠ΅ΡΡΠΈΠΊΠ° waitable (ΠΊΠ°ΠΊ ΡΡΠΎ Π½Π° ΡΡΡΡΠΊΠΈΠΉ ΠΏΠ΅ΡΠ΅Π²Π΅ΡΡΠΈ-ΡΠΎ? Π’ΠΎΡ, ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΆΠΈΠ΄Π°ΡΡ?)
def __await__(self):
while not self._value_changed:
yield from asyncio.sleep(0)
return self.value()
__iter__ = __await__
ΠΡΠΎ ΡΠ°ΠΊΠ°Ρ ΡΠ΄ΠΎΠ±Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΆΠ΄Π΅Ρ ΠΏΠΎΠΊΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ΅ΡΡΠΈΠΊΠ° Π½Π΅ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡΡ β ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΠ΅ΠΌΡ ΠΎΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΏΡΠΎΡΡΠΏΠ°Π΅ΡΡΡ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΡΠ»Π°ΠΆΠΎΠΊ _value_changed. ΠΡΠΈΠΊΠΎΠ» ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΡΠΎΠΌ, ΡΡΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠ½ΡΡΡ Π½Π° Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ ΡΠΏΠ°ΡΡ Π΄ΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ.
Π ΠΊΠ°ΠΊ ΠΆΠ΅ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ?ΠΠ°, Π² ΡΡΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ Π²Ρ ΠΌΠ΅Π½Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΡΡΠΎΠ»Π»ΠΈΡΡ, ΠΌΠΎΠ» ΡΠ°ΠΌ ΠΆΠ΅ ΡΠΊΠ°Π·Π°Π» ΠΏΡΠΎ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ, Π° Π½Π° Π΄Π΅Π»Π΅ ΡΡΡΡΠΎΠΈΠ» ΡΡΠΏΠΎΠΉ ΠΎΠΏΡΠΎΡ ΠΏΠΈΠ½Π°. ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ ΡΡΠΎ ΠΏΠ΅ΡΠ²ΠΎΠ΅, ΡΡΠΎ Ρ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°Π». Π ESP8266 ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ ΡΡΠΎΠ½ΡΡ, ΠΈ Π΄Π°ΠΆΠ΅ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΡΠΎΠ³ΠΎ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ Π½Π° ΠΏΠΈΡΠΎΠ½Π΅. Π ΡΡΠΎΠΌ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ. ΠΠ°Π²Π΅ΡΠ½ΠΎΠ΅, ΡΡΠΎΠ³ΠΎ Π±Ρ Ρ Π²Π°ΡΠΈΠ»ΠΎ Π±ΡΠ΄Ρ ΡΡΠ΅ΡΡΠΈΠΊ Π²Π΅Π΄ΠΎΠΌΡΠΌ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΠΌ β ΡΠ°ΠΊΠΈΠΌ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΆΠ΄Π΅Ρ, ΠΏΠΎΠΊΠ° Ρ Π½Π΅Π³ΠΎ Π½Π΅ ΡΠΏΡΠΎΡΡΡ ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅.
Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ (ΠΈΠ»ΠΈ ΠΊ ΡΡΠ°ΡΡΡΡ?) ΠΌΠΎΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ Π°ΠΊΡΠΈΠ²Π½ΠΎΠ΅, ΠΎΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠ°ΠΌΠΎ ΡΠ»Π°ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ MQTT ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ Π² EEPROM. Π ΡΡΡ ΡΠΆΠ΅ Π²ΡΡΡΠΏΠ°ΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ β Π² ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡΡ Π½Π΅Π»ΡΠ·Ρ Π²ΡΠ΄Π΅Π»ΡΡΡ ΠΏΠ°ΠΌΡΡΡ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΡΠ΅ΠΊ, Π° Π·Π½Π°ΡΠΈΡ ΠΎΠ± ΠΎΡΠΏΡΠ°Π²ΠΊΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΏΠΎ ΡΠ΅ΡΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π±ΡΡΡ. ΠΡΡΡ ΠΏΠ»ΡΡΠΊΠΈ ΡΠΈΠΏΠ° micropython.schedule(), ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΊΠ°ΠΊΡΡ Π½ΠΈΠ±ΡΠ΄Ρ ΡΡΠ½ΠΊΡΠΈΡ βΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΊ ΠΈ ΡΡΠ°Π·Ρβ, Π½ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Π²ΠΎΠΏΡΠΎΡ βΠ° ΡΠΎΠ»ΠΊΡ-ΡΠΎ?β. ΠΠ΄ΡΡΠ³ ΠΌΡ ΠΏΡΡΠΌΠΎ ΡΠ΅ΠΉΡΠ°Ρ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ ΠΊΠ°ΠΊΠΎΠ΅ Π½ΠΈΠ±ΡΠ΄Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅, Π° ΡΡΡ Π²ΠΊΠ»ΠΈΠ½ΠΈΠ²Π°Π΅ΡΡΡ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΡΡΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ . ΠΠ»ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΏΡΠΈΠ΅Ρ Π°Π»ΠΎ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ΅ΡΡΠΈΠΊΠ° ΠΏΠΎΠΊΠ° ΠΌΡ Π΅ΡΠ΅ ΡΡΠ°ΡΠΎΠ΅ Π½Π΅Π΄ΠΎΠ·Π°ΠΏΠΈΡΠ°Π»ΠΈ. Π ΠΎΠ±ΡΠ΅ΠΌ, Π½ΡΠΆΠ½ΠΎ Π³ΠΎΡΠΎΠ΄ΠΈΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ ΠΈΠ»ΠΈ Π²ΡΠΊΡΡΡΠΈΠ²Π°ΡΡΡΡ ΠΊΠ°ΠΊ-ΡΠΎ ΠΏΠΎ Π΄ΡΡΠ³ΠΎΠΌΡ.
Π Π΅ΡΠ΅ Π²ΡΠ΅ΠΌΡ ΠΎΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΡΠ»Π΅ΡΠ°Π΅Ρ RuntimeError: schedule stack full ΠΈ ΠΊΡΠΎ Π΅Π³ΠΎ Π·Π½Π°Π΅Ρ ΠΏΠΎΡΠ΅ΠΌΡ?
Π‘ ΡΠ²Π½ΡΠΌ ΠΎΠΏΡΠΎΡΠΎΠΌ ΠΈ 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. ΠΠΎΠ»ΡΡΠ°Ρ ΡΠ°ΡΡΡ Π½Π°ΡΡΡΠΎΠ΅ΠΊ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π½Π°ΠΌ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ, Π½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Π½Π°ΡΡΡΠΎΠ΅ΠΊ Π½ΡΠΆΠ½ΠΎ Π·Π°Π΄Π°ΡΡ ΡΠ²Π½ΠΎ. Π§ΡΠΎΠ±Ρ Π½Π΅ ΠΏΡΠΎΠΏΠΈΡΡΠ²Π°ΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΡΡΠΌΠΎ Π² ΠΊΠΎΠ΄Π΅ Ρ ΠΈΡ Ρ ΡΠ°Π½Ρ Π² ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ 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)
Π€ΡΠ½ΠΊΡΠΈΡ ΡΠ΅ΡΡΠ½ΠΎ ΡΠ»ΠΈΠ·Π°Π½Π° ΠΈΠ· ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ². Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΠ½Π° ΡΡΠΈΡΠ°Π΅Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ (internet_outages) ΠΈ ΠΈΡ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ. ΠΡΠΈ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π²ΡΠ΅ΠΌΡ ΠΏΡΠΎΡΡΠΎΡ.
ΠΡΡΠ°ΡΠΈ Π³ΠΎΠ²ΠΎΡΡ, ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ sleep Π½ΡΠΆΠ΅Π½ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΡΠ½ΠΊΡΠΈΡ ΡΡΠ°Π»Π° Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠΉ β Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ ΠΎΠ½Π° Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΠ΅ΡΠ΅Π· await, Π° ΡΠ°ΠΊ ΠΌΠΎΠ³ΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΡΠ΅Π»Π΅ ΠΊΠΎΡΠΎΡΡΡ Π΅ΡΡΡ Π΄ΡΡΠ³ΠΎΠΉ 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))
Π’Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΊΡΡΠ°, Π° ΠΌΡ Π΅ΡΠ΅ Π½Π΅ ΠΌΠΎΡΠ³Π°Π»ΠΈ ΡΠ²Π΅ΡΠΎΠ΄ΠΈΠΎΠ΄ΠΎΠΌ. ΠΠΎΡ
# 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 β ΠΎΠ½Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π·Π°Π»ΠΈΠ²Π°ΡΡ ΠΈΡ Π½Π° Π²Π½ΡΡΡΠ΅Π½Π½ΡΡ (ΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π² ΡΠ°ΠΌΠΎΠΌ ESP-07) ΡΠ»Π΅ΡΠΊΡ ΠΈ ΠΏΠΎΡΠΎΠΌ Π΄ΠΎΡΡΡΠΏΠ°ΡΡΡΡ ΠΈΠ· ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΊΠ°ΠΊ ΠΊ ΠΎΠ±ΡΡΠ½ΡΠΌ ΡΠ°ΠΉΠ»Π°ΠΌ. Π’ΡΠ΄Π° ΠΆΠ΅ Ρ Π·Π°Π»ΠΈΠ» ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΠΌΠ½ΠΎΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ mqtt_as, uasyncio, ssd1306 ΠΈ collections (ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π²Π½ΡΡΡΠΈ mqtt_as).
ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΈβ¦ ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ MemoryError. ΠΡΠΈΡΠ΅ΠΌ ΡΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠ΅ Ρ ΠΏΡΡΠ°Π»ΡΡ ΠΏΠΎΠ½ΡΡΡ Π³Π΄Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡΠ΅ΠΊΠ°Π΅Ρ ΠΏΠ°ΠΌΡΡΡ, ΡΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠ΅ Ρ ΡΠ°ΡΡΡΠ°Π²Π»ΡΠ» Π΄Π΅Π±Π°Π³ ΠΏΡΠΈΠ½ΡΠΎΠ², ΡΠ΅ΠΌ ΡΠ°Π½ΡΡΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»Π° ΡΡΠ° ΠΎΡΠΈΠ±ΠΊΠ°. ΠΠΎΡΠΎΡΠΊΠΈΠΉ Π³ΡΠ³Π»Π΅ΠΆ ΠΏΡΠΈΠ²Π΅Π» ΠΌΠ΅Π½Ρ ΠΊ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ, ΡΡΠΎ Π² ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ΅ Π² ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅ Π²ΡΠ΅Π³ΠΎ 30ΠΊΠ± ΠΏΠ°ΠΌΡΡΠΈ Π² ΠΊΠΎΡΠΎΡΡΠ΅ 65 ΠΊΠ± ΠΊΠΎΠ΄Π° (Π²ΠΌΠ΅ΡΡΠ΅ Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΠΌΠΈ) Π½Ρ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡΡΡ.
ΠΠΎ Π²ΡΡ ΠΎΠ΄ Π΅ΡΡΡ. ΠΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ micropython Π½Π΅ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΊΠΎΠ΄ Π½Π°ΠΏΡΡΠΌΡΡ ΠΈΠ· .py ΡΠ°ΠΉΠ»Π° β ΡΡΠΎΡ ΡΠ°ΠΉΠ» ΡΠ½Π°ΡΠ°Π»Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ. ΠΡΠΈΡΠ΅ΠΌ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ ΠΎΠ½ ΠΏΡΡΠΌΠΎ Π½Π° ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ΅, ΠΏΡΠ΅Π²ΡΠ°ΡΠ°Π΅ΡΡΡ Π² Π±Π°ΠΉΡΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΡΠΎΠΌ Ρ ΡΠ°Π½ΠΈΡΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ. ΠΡ ΠΈ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° ΡΠΎΠΆΠ΅ Π½ΡΠΆΠ΅Π½ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²ΠΊΠΈ.
Π’ΡΡΠΊ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΈΠ·Π±Π°Π²ΠΈΡΡ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ ΠΎΡ ΡΠ΅ΡΡΡΡΠΎΠ΅ΠΌΠΊΠΎΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ. ΠΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΠΉΠ»Ρ Π½Π° Π±ΠΎΠ»ΡΡΠΎΠΌ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ΅, Π° Π² ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ Π·Π°Π»ΠΈΡΡ ΡΠΆΠ΅ Π³ΠΎΡΠΎΠ²ΡΠΉ Π±Π°ΠΉΡΠΊΠΎΠ΄. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π½ΡΠΆΠ½ΠΎ ΡΠΊΠ°ΡΠ°ΡΡ ΠΏΡΠΎΡΠΈΠ²ΠΊΡ micropython ΠΈ ΡΠΎΠ±ΡΠ°ΡΡ
Π― Π½Π΅ ΡΡΠ°Π» ΠΏΠΈΡΠ°ΡΡ Makefile, Π° Π²ΡΡΡΠ½ΡΡ ΠΏΡΠΎΡΠ΅Π»ΡΡ ΠΈ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π» Π²ΡΠ΅ Π½ΡΠΆΠ½ΡΠ΅ ΡΠ°ΠΉΠ»ΠΈΠΊΠΈ (Π²ΠΊΠ»ΡΡΠ°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ) ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊ
mpy-cross water_counter.py
ΠΡΡΠ°Π»ΠΎΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π·Π°Π»ΠΈΡΡ ΡΠ°ΠΉΠ»ΠΈΠΊΠΈ Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ .mpy, Π½Π΅ Π·Π°Π±ΡΠ² ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ .py Ρ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π°.
ΠΡΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ Ρ Π²Π΅Π» Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ (IDE?) ESPlorer. ΠΠ½Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π·Π°Π»ΠΈΠ²Π°ΡΡ ΡΠΊΡΠΈΠΏΡΡ Π² ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ ΠΈ ΡΡΡ ΠΆΠ΅ ΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ. Π ΠΌΠΎΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Π²ΡΡ Π»ΠΎΠ³ΠΈΠΊΠ° ΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π²ΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠ°ΠΉΠ»Π΅ water_counter.py (.mpy). ΠΠΎ ΡΡΠΎΠ±Ρ Π²ΡΠ΅ ΡΡΠΎ Π·Π°ΠΏΡΡΠΊΠ°Π»ΠΎΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π½Π° ΡΡΠ°ΡΡΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π΅ΡΠ΅ ΡΠ°ΠΉΠ» Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ main.py. ΠΡΠΈΡΠ΅ΠΌ ΡΡΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ .py, Π° Π½Π΅ ΠΏΡΠ΅Π΄-ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ .mpy. ΠΠΎΡ Π΅Π³ΠΎ ΡΡΠΈΠ²ΠΈΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅
import water_counter
ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ β Π²ΡΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ. ΠΠΎ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ ΡΠ³ΡΠΎΠΆΠ°ΡΡΠ΅ ΠΌΠ°Π»ΠΎ β ΠΏΠΎΡΡΠ΄ΠΊΠ° 1ΠΊΠ±. Π£ ΠΌΠ΅Π½Ρ Π΅ΡΠ΅ Π΅ΡΡΡ ΠΏΠ»Π°Π½Ρ ΠΏΠΎ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ ΡΡΡΡΠΎΠΉΡΡΠ²Π°, ΠΈ ΡΡΠΎΠ³ΠΎ ΠΊΠΈΠ»ΠΎΠ±Π°ΠΉΡΠ° ΠΌΠ½Π΅ ΡΠ²Π½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΌΠ°Π»ΠΎΠ²Π°ΡΠΎ. ΠΠΎ ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ ΠΈ Π½Π° ΡΡΠΎΡ ΡΠ»ΡΡΠ°ΠΉ Π΅ΡΡΡ Π²ΡΡ ΠΎΠ΄.
ΠΠ΅Π»ΠΎ Π²ΠΎΡ Π² ΡΠ΅ΠΌ. ΠΠ°ΠΆΠ΅ ΠΏΡΠΈ ΡΠΎΠΌ, ΡΡΠΎ ΡΠ°ΠΉΠ»Ρ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½Ρ Π² Π±Π°ΠΉΡΠΊΠΎΠ΄ ΠΈ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π½Π° Π²Π½ΡΡΡΠ΅Π½Π½Π΅ΠΉ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅, Π½Π° Π΄Π΅Π»Π΅ ΠΎΠ½ΠΈ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ Π·Π°Π³ΡΡΠΆΠ°ΡΡΡΡ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΡΡ ΠΏΠ°ΠΌΡΡΡ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΎΡΡΡΠ΄Π°. ΠΠΎ ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ micropython ΡΠΌΠ΅Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π±Π°ΠΉΡΠΊΠΎΠ΄ ΠΏΡΡΠΌΠΎ ΠΈΠ· ΡΠ»Π΅Ρ ΠΏΠ°ΠΌΡΡΠΈ, Π½ΠΎ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π½ΡΠΆΠ½ΠΎ Π²ΡΡΡΠΎΠΈΡΡ Π΅Π³ΠΎ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π² ΠΏΡΠΎΡΠΈΠ²ΠΊΡ. ΠΡΠΎ Π½Π΅ ΡΠ»ΠΎΠΆΠ½ΠΎ, Ρ ΠΎΡΡ Π½Π° ΠΌΠΎΠ΅ΠΌ Π½Π΅ΡΠ±ΡΠΊΠ΅ ΡΡΠΎ Π·Π°Π½ΡΠ»ΠΎ ΠΏΡΠΈΠ»ΠΈΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ (ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΌ Ρ ΠΌΠ΅Π½Ρ ΠΎΠΊΠ°Π·Π°Π»ΡΡ Π»ΠΈΠ½ΡΠΊΡ).
ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΡΠ°ΠΊΠΎΠΉ:
- Π‘ΠΊΠ°ΡΠ°ΡΡ ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ
ESP Open SDK . ΠΡΠ° ΡΡΡΠΊΠ° ΡΠΎΠ±ΠΈΡΠ°Π΅Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π΄Π»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ ΠΏΠΎΠ΄ ESP8266. Π‘ΠΎΠ±ΠΈΡΠ°Π΅ΡΡΡ ΠΏΠΎ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π½Π° Π³Π»Π°Π²Π½ΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΠΊΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ° (Ρ Π²ΡΠ±ΠΈΡΠ°Π» ΡΡΡΠ°Π½ΠΎΠ²ΠΊΡ STANDALONE=yes) - Π‘ΠΊΠ°ΡΠ°ΡΡ
ΡΠΎΡΡΡ micropython - ΠΡΠΆΠ½ΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π·Π°ΠΊΠΈΠ½ΡΡΡ Π² ports/esp8266/modules Π²Π½ΡΡΡΠΈ Π΄Π΅ΡΠ΅Π²Π° micropython
- Π‘ΠΎΠ±ΠΈΡΠ°Π΅ΠΌ ΠΏΡΠΎΡΠΈΠ²ΠΊΡ ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π² ΡΠ°ΠΉΠ»Π΅
ports/esp8266/README.md - ΠΠ°Π»ΠΈΠ²Π°Π΅ΠΌ ΠΏΡΠΎΡΠΈΠ²ΠΊΡ Π² ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ (Ρ ΡΡΠΎ Π΄Π΅Π»Π°Ρ Π½Π° Π²ΠΈΠ½Π΄Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°ΠΌΠΈ ESP8266Flasher ΠΈΠ»ΠΈ ΠΏΠΈΡΠΎΠ½ΠΎΠ²ΡΠΊΠΈΠΌ esptoolβΠΎΠΌ)
ΠΡΠ΅, ΡΠ΅ΠΏΠ΅ΡΡ ‘import ssd1306’ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°ΡΡ ΠΊΠΎΠ΄ Π½Π°ΠΏΡΡΠΌΡΡ ΠΈΠ· ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½Π°Ρ ΠΏΠ°ΠΌΡΡΡ ΠΏΠΎΠ΄ ΡΡΠΎ ΡΠ°ΡΡ ΠΎΠ΄ΠΎΠ²Π°ΡΡΡΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ. Π’Π°ΠΊΠΈΠΌ ΡΡΡΠΊΠΎΠΌ Ρ Π·Π°Π»ΠΈΠ» Π² ΠΏΡΠΎΡΠΈΠ²ΠΊΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ΄ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ, ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΊΠΎΠ΄ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Ρ ΠΌΠ΅Π½Ρ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Ρ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π΅ ΠΏΠ΅ΡΠ΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΡ ΠΏΡΠΎΡΠΈΠ²ΠΊΡ. ΠΠ° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Ρ ΠΌΠ΅Π½Ρ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎ ΠΎΠΊΠΎΠ»ΠΎ 8.5ΠΊΠ± ΠΠΠ£. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π΅ΡΠ΅ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π·Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ³ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π° Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ. ΠΡ Π° Π΅ΡΠ»ΠΈ ΠΏΠ°ΠΌΡΡΠΈ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ Ρ Π²Π°ΡΠ°ΡΡ, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π·Π°ΡΠΎΠ»ΠΊΠ°ΡΡ Π² ΠΏΡΠΎΡΠΈΠ²ΠΊΡ.
Π ΡΡΠΎ Ρ ΡΡΠΈΠΌ ΡΠ΅ΠΏΠ΅ΡΡ Π΄Π΅Π»Π°ΡΡ?
ΠΠΊ, ΠΆΠ΅Π»Π΅Π·ΠΊΠ° ΡΠΏΠ°ΡΠ½Π°, ΠΏΡΠΎΡΠΈΠ²ΠΊΠ° Π½Π°ΠΏΠΈΡΠ°Π½Π°, ΠΊΠΎΡΠΎΠ±ΠΊΠ° Π½Π°ΠΏΠ΅ΡΠ°ΡΠ°Π½Π°, ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ ΠΏΡΠΈΠ»Π΅ΠΏΠ»Π΅Π½ΠΎ Π½Π° ΡΡΠ΅Π½Ρ ΠΈ ΡΠ°Π΄ΠΎΡΡΠ½ΠΎ ΠΌΠΎΡΠ³Π°Π΅Ρ Π»Π°ΠΌΠΏΠΎΡΠΊΠΎΠΉ. ΠΠΎ ΠΏΠΎΠΊΠ° ΡΡΠΎ Π²ΡΠ΅ ΡΠ΅ΡΠ½ΡΠΉ ΡΡΠΈΠΊ (Π² ΠΏΡΡΠΌΠΎΠΌ ΠΈ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠ½ΠΎΠΌ ΡΠΌΡΡΠ»Π΅) ΠΈ ΡΠΎΠ»ΠΊΡ ΠΎΡ Π½Π΅Π³ΠΎ Π΅ΡΠ΅ ΠΌΠ°Π»ΠΎΠ²Π°ΡΠΎ. ΠΠΎΡΠ° ΡΡΠΎ Π½ΠΈΠ±ΡΠ΄Ρ ΡΠ΄Π΅Π»Π°ΡΡ Ρ MQTT ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ»ΡΡΡΡ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ.
ΠΠΎΠΉ βΡΠΌΠ½ΡΠΉ Π΄ΠΎΠΌβ ΠΊΡΡΡΠΈΡΡΡ Π½Π°
ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ Ρ ΠΎΡΡ ΡΠ°Π· ΠΎΡΠΏΡΠ°Π²ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΡ ΠΆΠ΅ ΠΏΠΎΡΠ²ΠΈΡΡΡ Π² ΡΠΏΠΈΡΠΊΠ΅.
ΠΡΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΡΠ·Π°ΡΡ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ ΡΠΈΡΡΠ΅ΠΌΡ, ΠΈΡ
ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΡΡΠ΅Π½Π°ΡΠΈΡΡ
Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΠΏΠΎΠ΄Π²Π΅ΡΠ³Π°ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΎΠΌΡ Π°Π½Π°Π»ΠΈΠ·Ρ β Π²ΡΠ΅ ΡΡΠΎ out of scope ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠΈ. ΠΠΎΠΌΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π° ΡΠΈΡΡΠ΅ΠΌΠ° majordomo ΠΌΠΎΠ³Ρ ΠΏΠΎΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°ΡΡ
ΠΠΎΠΊΠ°ΠΆΡ Π»ΠΈΡΡ ΠΏΠ°ΡΡ Π³ΡΠ°ΡΠΈΠΊΠΎΠ². ΠΡΠΎ ΠΏΡΠΎΡΡΠΎΠΉ Π³ΡΠ°ΡΠΈΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π·Π° ΡΡΡΠΊΠΈ
ΠΠΈΠ΄Π½ΠΎ, ΡΡΠΎ Π½ΠΎΡΡΡ Π²ΠΎΠ΄ΠΎΠΉ ΠΏΠΎΡΡΠΈ Π½ΠΈΠΊΡΠΎ Π½Π΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΡΡ. ΠΠ°ΡΡ ΡΠ°Π· ΠΊΡΠΎ-ΡΠΎ ΡΡ
ΠΎΠ΄ΠΈΠ» Π² ΡΡΠ°Π»Π΅Ρ, ΠΈ, ΠΏΠΎΡ
ΠΎΠΆΠ΅ ΡΠΈΠ»ΡΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΎΡΠΌΠΎΡΠ° ΠΏΠ°ΡΡ Π»ΠΈΡΡΠΎΠ² Π·Π° Π½ΠΎΡΡ ΠΏΠΎΡΠ°ΡΡΠ²Π°Π΅Ρ. Π£ΡΡΠΎΠΌ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠ΅ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ Π²ΠΎΠ·ΡΠ°ΡΡΠ°Π΅Ρ. ΠΠ±ΡΡΠ½ΠΎ Ρ ΠΏΠΎΠ»ΡΠ·ΡΡΡΡ Π²ΠΎΠ΄ΠΎΠΉ ΠΈΠ· Π±ΠΎΠΉΠ»Π΅ΡΠ°, Π½ΠΎ ΡΡΡ Ρ Π·Π°Ρ
ΠΎΡΠ΅Π» ΠΏΡΠΈΠ½ΡΡΡ Π²Π°Π½Π½ΡΡ ΠΈ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠΈΠ» Π½Π° Π³ΠΎΡΠΎΠ΄ΡΠΊΡΡ Π³ΠΎΡΡΡΡΡ Π²ΠΎΠ΄Ρ β ΡΡΠΎ ΡΠ°ΠΊΠΆΠ΅ Ρ
ΠΎΡΠΎΡΠΎ Π·Π°ΠΌΠ΅ΡΠ½ΠΎ Π½Π° Π½ΠΈΠΆΠ½Π΅ΠΌ Π³ΡΠ°ΡΠΈΠΊΠ΅.
ΠΠ· ΡΡΠΎΠ³ΠΎ Π³ΡΠ°ΡΠΈΠΊΠ° Ρ ΡΠ·Π½Π°Π», ΡΡΠΎ ΡΡ ΠΎΠ΄ΠΈΡΡ Π² ΡΡΠ°Π»Π΅Ρ ΡΡΠΎ 6-7Π» Π²ΠΎΠ΄Ρ, ΠΏΡΠΈΠ½ΡΡΡ Π΄ΡΡ β 20-30Π», ΠΏΠΎΠΌΡΡΡ ΠΏΠΎΡΡΠ΄Ρ ΠΎΠΊΠΎΠ»ΠΎ 20Π», Π° ΡΡΠΎΠ±Ρ ΠΏΡΠΈΠ½ΡΡΡ Π²Π°Π½Π½ΡΡ Π½ΡΠΆΠ½ΠΎ 160Π». ΠΠ° Π΄Π΅Π½Ρ ΠΌΠΎΡ ΡΠ΅ΠΌΡΡ ΠΏΠΎΡΡΠ΅Π±Π»ΡΠ΅Ρ Π³Π΄Π΅-ΡΠΎ ΠΎΠΊΠΎΠ»ΠΎ 500-600Π».
ΠΠ»Ρ ΠΎΡΠΎΠ±ΠΎ Π»ΡΠ±ΠΎΠ·Π½Π°ΡΠ΅Π»ΡΠ½ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³Π»ΡΠ½ΡΡΡ Π² Π·Π°ΠΏΠΈΡΠΈ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
ΠΡΡΡΠ΄Π° Ρ ΡΠ·Π½Π°Π» ΡΡΠΎ ΠΏΡΠΈ ΠΎΡΠΊΡΡΡΠΎΠΌ ΠΊΡΠ°Π½Π΅ Π²ΠΎΠ΄Π° ΡΠ΅ΡΠ΅Ρ ΡΠΎ ΡΠΊΠΎΡΠΎΡΡΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ 1Π» Π·Π° 5Ρ.
ΠΠΎ Π² ΡΠ°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ, Π½Π°Π²Π΅ΡΠ½ΠΎΠ΅, Π½Π΅ ΠΎΡΠ΅Π½Ρ ΡΠ΄ΠΎΠ±Π½ΠΎ ΡΠΌΠΎΡΡΠ΅ΡΡ. Π majordomo Π΅ΡΡΡ Π΅ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠΌΠΎΡΡΠ΅ΡΡ Π³ΡΠ°ΡΠΈΠΊΠΈ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΡ ΠΏΠΎ Π΄Π½ΡΠΌ, Π½Π΅Π΄Π΅Π»ΡΠΌ ΠΈ ΠΌΠ΅ΡΡΡΠ°ΠΌ. ΠΠΎΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π³ΡΠ°ΡΠΈΠΊ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΡ Π² ΡΡΠΎΠ»Π±ΠΈΠΊΠ°Ρ
ΠΠΎΠΊΠ° Ρ ΠΌΠ΅Π½Ρ Π΄Π°Π½Π½ΡΡ
ΡΠΎΠ»ΡΠΊΠΎ Π·Π° Π½Π΅Π΄Π΅Π»Ρ. Π§Π΅ΡΠ΅Π· ΠΌΠ΅ΡΡΡ ΡΡΠΎΡ Π³ΡΠ°ΡΠΈΠΊ Π±ΡΠ΄Π΅Ρ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΠ½ΡΠΌ β ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ Π΄Π½Ρ Π±ΡΠ΄Π΅Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΡΠΎΠ»Π±ΠΈΠΊ. ΠΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠ°ΡΡΠΈΠ½Ρ ΠΏΠΎΡΡΡΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠΈΡΠΎΠ²ΠΊΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Ρ Π²Π²ΠΎΠΆΡ Π²ΡΡΡΠ½ΡΡ (ΡΠ°ΠΌΡΠΉ Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΡΠΎΠ»Π±ΠΈΠΊ). Π ΠΏΠΎΠΊΠ° Π½Π΅ ΡΡΠ½ΠΎ, ΡΠΎ Π»ΠΈ Ρ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π·Π°Π΄Π°Π» ΡΠ°ΠΌΡΠ΅ ΠΏΠ΅ΡΠ²ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΡΠΈ Π½Π° ΠΊΡΠ± ΠΌΠ΅Π½ΡΡΠ΅, ΡΠΎ Π»ΠΈ ΡΡΠΎ Π±Π°Π³ Π² ΠΏΡΠΎΡΠΈΠ²ΠΊΠ΅ ΠΈ Π½Π΅ Π²ΡΠ΅ Π»ΠΈΡΡΡ ΠΏΠΎΡΠ»ΠΈ Π² Π·Π°ΡΠ΅Ρ. ΠΡΠΆΠ½ΠΎ Π±ΠΎΠ»ΡΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
ΠΠ°Π΄ ΡΠ°ΠΌΠΈΠΌΠΈ Π³ΡΠ°ΡΠΈΠΊΠ°ΠΌΠΈ Π΅ΡΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΄ΠΎΠ²Π°ΡΡ Π½ΡΠΆΠ½ΠΎ, ΠΏΠΎΠ±Π΅Π»ΠΈΡΡ, ΠΏΠΎΠΊΡΠ°ΡΠΈΡΡ. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ ΡΠ°ΠΊΠΆΠ΅ Π±ΡΠ΄Ρ Π² ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΡΡ ΡΠ΅Π»ΡΡ ΡΡΡΠΎΠΈΡΡ Π³ΡΠ°ΡΠΈΠΊ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ β Π²Π΄ΡΡΠ³ ΡΠ°ΠΌ ΡΡΠΎ-ΡΠΎ ΡΡΠ΅ΠΊΠ°Π΅Ρ. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ΄Ρ ΠΊΠ°ΠΊ-ΡΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡ ΠΏΠ΅ΡΠΈΠΎΠ΄Ρ, ΠΊΠΎΠ³Π΄Π° ΠΎΡΡΡΡΡΡΠ²ΠΎΠ²Π°Π» ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ. ΠΠΎΠΊΠ° Π²ΡΠ΅ ΡΡΠΎ ΠΊΡΡΡΠΈΡΡΡ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΠΈΠ΄Π΅ΠΈ.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π‘Π΅Π³ΠΎΠ΄Π½Ρ ΠΌΠΎΡ ΠΊΠ²Π°ΡΡΠΈΡΠ° ΡΡΠ°Π»Π° ΡΡΡΠΎΡΠΊΡ ΡΠΌΠ½Π΅Π΅. Π‘ ΡΠ°ΠΊΠΈΠΌ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠΌ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΠΌ ΠΌΠ½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ΄ΠΎΠ±Π½Π΅Π΅ ΡΠ»Π΅Π΄ΠΈΡΡ Π·Π° ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠ΅ΠΌ Π²ΠΎΠ΄Ρ Π² Π΄ΠΎΠΌΠ΅. ΠΡΠ»ΠΈ ΡΠ°Π½ΡΡΠ΅ Ρ Π²ΠΎΠ·ΠΌΡΡΠ°Π»ΡΡ βΠΎΠΏΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΠΎΠ΄Ρ Π·Π° ΠΌΠ΅ΡΡΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΠ»ΠΈβ, ΡΠΎ ΡΠ΅ΠΏΠ΅ΡΡ Ρ ΡΠΌΠΎΠ³Ρ Π½Π°ΠΉΡΠΈ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΡ.
ΠΠΎΠΌΡ-ΡΠΎ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΡΡΡ ΡΡΡΠ°Π½Π½ΡΠΌ ΡΠΌΠΎΡΡΠ΅ΡΡ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΈΡ Π½Π° ΡΠΊΡΠ°Π½Π΅, Π΅ΡΠ»ΠΈ ΠΎΠ½ Π² ΠΌΠ΅ΡΡΠ΅ ΠΎΡ ΡΠ°ΠΌΠΎΠ³ΠΎ ΡΡΠ΅ΡΡΠΈΠΊΠ°. ΠΠΎ Π² Π½Π΅ ΠΎΡΠ΅Π½Ρ ΠΎΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌ Π±ΡΠ΄ΡΡΠ΅ΠΌ Ρ ΠΏΠ»Π°Π½ΠΈΡΡΡ ΠΏΠ΅ΡΠ΅ΡΠ΅Π»ΠΈΡΡΡΡ Π² Π΄ΡΡΠ³ΡΡ ΠΊΠ²Π°ΡΡΠΈΡΡ, Π³Π΄Π΅ Π±ΡΠ΄Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠΎΡΠΊΠΎΠ² Π²ΠΎΠ΄Ρ, Π° ΡΠ°ΠΌΠΈ ΡΡΠ΅ΡΡΠΈΠΊΠΈ, ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ, Π±ΡΠ΄ΡΡ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Ρ Π½Π° Π»Π΅ΡΡΠ½ΠΈΡΠ½ΠΎΠΉ ΠΏΠ»ΠΎΡΠ°Π΄ΠΊΠ΅. Π’Π°ΠΊ ΡΡΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠ½ΡΡΠΈΡ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΈΠΉ Π±ΡΠ΄Π΅Ρ Π²Π΅ΡΡΠΌΠ° ΠΊΡΡΠ°ΡΠΈ.
Π€ΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π° Ρ ΡΠΎΠΆΠ΅ ΠΏΠ»Π°Π½ΠΈΡΡΡ ΡΠ°ΡΡΠΈΡΡΡΡ. Π― ΡΠΆΠ΅ ΠΏΡΠΈΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡ ΠΊ ΠΌΠΎΡΠΎΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΌ Π²Π΅Π½ΡΠΈΠ»ΡΠΌ. Π‘Π΅ΠΉΡΠ°Ρ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π±ΠΎΠΉΠ»Π΅Ρ-Π³ΠΎΡΠΎΠ΄ΡΠΊΠ°Ρ Π²ΠΎΠ΄Π° ΠΌΠ½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ²ΠΎΡΠ°ΡΠΈΠ²Π°ΡΡ 3 ΠΊΡΠ°Π½Π° Π² ΡΡΡΠ΄Π½ΠΎΠ΄ΠΎΡΡΡΠΏΠ½ΠΎΠΉ Π½ΠΈΡΠ΅. ΠΡΠ»ΠΎ Π±Ρ Π³ΠΎΡΠ°Π·Π΄ΠΎ ΡΠ΄ΠΎΠ±Π½Π΅Π΅ Π΄Π΅Π»Π°ΡΡ ΡΡΠΎ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΉ ΠΈΠ½Π΄ΠΈΠΊΠ°ΡΠΈΠ΅ΠΉ. ΠΡ ΠΈ, ΡΠ°ΠΌΠΎ ΡΠΎΠ±ΠΎΠΉ, Π·Π°ΡΠΈΡΡ ΠΎΡ ΠΏΡΠΎΡΠ΅ΡΠ΅ΠΊ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΠΈΡ.
Π ΡΡΠ°ΡΡΠ΅ Ρ ΡΠ°ΡΡΠΊΠ°Π·Π°Π» ΡΠ²ΠΎΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΡΡΡΡΠΎΠΉΡΡΠ²Π° Π½Π° Π±Π°Π·Π΅ ESP8266. ΠΠ° ΠΌΠΎΠΉ Π²Π·Π³Π»ΡΠ΄ Ρ ΠΌΠ΅Π½Ρ ΠΏΠΎΠ»ΡΡΠΈΠ»ΡΡ Π²Π΅ΡΡΠΌΠ° ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΠΏΡΠΎΡΠΈΠ²ΠΊΠΈ Π½Π° micropython Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠΎΡΡΡΠΈΠ½ β ΠΏΡΠΎΡΡΠΎ ΠΈ ΡΠΈΠΌΠΏΠ°ΡΠΈΡΠ½ΠΎ. Π― ΠΏΠΎΡΡΠ°ΡΠ°Π»ΡΡ ΠΎΠΏΠΈΡΠ°ΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π½ΡΠ°Π½ΡΠΎΠ² ΠΈ ΠΊΠΎΡΡΠΊΠΎΠ², Ρ ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ ΠΏΠΎΡ ΠΎΠ΄Ρ. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎ Π²ΡΠ΅ ΠΎΠΏΠΈΡΡΠ²Π°Π», Π»ΠΈΡΠ½ΠΎ ΠΌΠ½Π΅ ΠΊΠ°ΠΊ ΡΠΈΡΠ°ΡΠ΅Π»Ρ ΠΏΡΠΎΡΠ΅ ΠΏΡΠΎΠΌΠΎΡΠ°ΡΡ Π»ΠΈΡΠ½Π΅Π΅, ΡΠ΅ΠΌ ΠΏΠΎΡΠΎΠΌ Π΄ΠΎΠ΄ΡΠΌΡΠ²Π°ΡΡ ΡΠΎ, ΡΡΠΎ Π±ΡΠ»ΠΎ Π½Π΅Π΄ΠΎΡΠΊΠ°Π·Π°Π½ΠΎ.
ΠΠ°ΠΊ Π²ΡΠ΅Π³Π΄Π° Ρ ΠΎΡΠΊΡΡΡ Π΄Π»Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠ²Π½ΠΎΠΉ ΠΊΡΠΈΡΠΈΠΊΠΈ.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com