Π‘Π²ΡŠΡ€Π·Π²Π°ΠΌΠ΅ Π²ΠΎΠ΄ΠΎΠΌΠ΅Ρ€Π° към умния Π΄ΠΎΠΌ

Някога систСмитС Π·Π° домашна автоматизация, извСстни ΠΎΡ‰Π΅ ΠΊΠ°Ρ‚ΠΎ "умния Π΄ΠΎΠΌ", бяха ΠΈΠ·ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ скъпи ΠΈ само Π±ΠΎΠ³Π°Ρ‚ΠΈΡ‚Π΅ ΠΌΠΎΠΆΠ΅Ρ…Π° Π΄Π° си Π³ΠΈ позволят. ДнСс Π½Π° ΠΏΠ°Π·Π°Ρ€Π° ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС намСрят доста Π±ΡŽΠ΄ΠΆΠ΅Ρ‚Π½ΠΈ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚ΠΈ с Π΄Π°Ρ‚Ρ‡ΠΈΡ†ΠΈ, Π±ΡƒΡ‚ΠΎΠ½ΠΈ/ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅ ΠΈ ΠΈΠ·ΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ устройства Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° освСтлСниСто, ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚ΠΈ, вСнтилацията, водоснабдяванСто ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ. И Π΄ΠΎΡ€ΠΈ Π½Π°ΠΉ-нСспособният Π² 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.3V. Ако забравя Π΄Π° ΠΏΡ€Π΅Π²ΠΊΠ»ΡŽΡ‡Π° Π°Π΄Π°ΠΏΡ‚Π΅Ρ€Π° Π½Π° Ρ‚ΠΎΠ²Π° Π½Π°ΠΏΡ€Π΅ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠ΄Π°ΠΌ 5V, ΠΌΠΎΠ΄ΡƒΠ»ΡŠΡ‚ вСроятно Ρ‰Π΅ ΠΈΠ·Π³ΠΎΡ€Π΅.

Π‘ СлСктричСството Π² банята нямам ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ β€” ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Π° Π΅ Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ Π½Π° ΠΎΠΊΠΎΠ»ΠΎ ΠΌΠ΅Ρ‚ΡŠΡ€ ΠΎΡ‚ броячитС, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Ρ‰Π΅ Π³ΠΎ Π·Π°Ρ…Ρ€Π°Π½Π²Π°ΠΌ ΠΎΡ‚ 220V. ΠšΠ°Ρ‚ΠΎ ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ Π½Π° Π·Π°Ρ…Ρ€Π°Π½Π²Π°Π½Π΅ Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ малък Π±Π»ΠΎΠΊ HLK-PM03 ΠΎΡ‚ Tenstar Robot. Π›ΠΈΡ‡Π½ΠΎ Π·Π° ΠΌΠ΅Π½ Π΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ с Π°Π½Π°Π»ΠΎΠ³ΠΎΠ²Π°Ρ‚Π° ΠΈ силовата Π΅Π»Π΅ΠΊΡ‚Ρ€ΠΎΠ½ΠΈΠΊΠ°, Π° Ρ‚ΡƒΠΊ ΠΈΠΌΠ°ΠΌ Π³ΠΎΡ‚ΠΎΠ² Π·Π°Ρ…Ρ€Π°Π½Π²Π°Ρ‰ Π±Π»ΠΎΠΊ Π² малък корпус.

Π—Π° сигнализиранС Π½Π° Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΡ‚Π΅ Ρ€Π΅ΠΆΠΈΠΌΠΈ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ΠΈΡ… свСтодиод, ΡΠ²ΡŠΡ€Π·Π°Π½ към GPIO2. ВсС ΠΏΠ°ΠΊ Π½Π΅ Ρ€Π΅ΡˆΠΈΡ… Π΄Π° Π³ΠΎ ΡΠ²ΡŠΡ€Π·Π²Π°ΠΌ, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π² ΠΌΠΎΠ΄ΡƒΠ»Π° ESP-07 Π²Π΅Ρ‡Π΅ ΠΈΠΌΠ° свСтодиод, ΡΠ²ΡŠΡ€Π·Π°Π½ към ΡΡŠΡ‰ΠΈΡ GPIO2. Но Π½Π° ΠΏΠ»Π°Ρ‚ΠΊΠ°Ρ‚Π° Π½Π΅ΠΊΠ° Π³ΠΎ ΠΈΠΌΠ° β€” извСднъТ Π±ΠΈΡ… искал Π΄Π° ΠΈΠ·Π²Π΅Π΄Π° Ρ‚ΠΎΠ·ΠΈ свСтодиод Π½Π° корпуса.

ΠŸΡ€Π΅ΠΌΠΈΠ½Π°Π²Π°ΠΌΠ΅ към Π½Π°ΠΉ-интСрСсното. ΠŸΡ€ΠΈ Π²ΠΎΠ΄ΠΎΠΌΠ΅Ρ€ΠΈΡ‚Π΅ няма Π»ΠΎΠ³ΠΈΠΊΠ°, ΠΎΡ‚ която Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° искамС Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ‚Π΅ показания. ЕдинствСното, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΈΠΌΠ°ΠΌ Π½Π° Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, са импулситС β€” затварянС Π½Π° ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚ΠΈΡ‚Π΅ Π½Π° Ρ…Π΅Ρ€ΠΊΠΎΠ½Π° Π½Π° всСки Π»ΠΈΡ‚ΡŠΡ€. Π˜Π·Π²ΠΎΠ΄ΠΈΡ‚Π΅ Π½Π° Ρ…Π΅Ρ€ΠΊΠΎΠ½ΠΈΡ‚Π΅ са ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ с GPIO12/GPIO13. ΠŸΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρ‰ΠΈΡΡ‚ рСзистор Ρ‰Π΅ Π²ΠΊΠ»ΡŽΡ‡Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ½ΠΎ Π²ΡŠΡ‚Ρ€Π΅ Π² ΠΌΠΎΠ΄ΡƒΠ»Π°.

ΠŸΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΎ Π·Π°Π±Ρ€Π°Π²ΠΈΡ… Π΄Π° прСдвидя рСзисторитС R8 ΠΈ R9 ΠΈ Π² моя Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π½Π° ΠΏΠ»Π°Ρ‚ΠΊΠ°Ρ‚Π° Ρ‚Π΅ липсват. Но Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π²Π΅Ρ‡Π΅ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°ΠΌ схСмата Π½Π° общСствСно достояниС, Π΅ умСстно Π΄Π° поправя Ρ‚Π°Π·ΠΈ Π³Ρ€Π΅ΡˆΠΊΠ°. РСзисторитС са Π½ΡƒΠΆΠ½ΠΈ, Π·Π° Π΄Π° Π½Π΅ поврСдят ΠΏΠΎΡ€Ρ‚Π° Π² случай, Ρ‡Π΅ Ρ„Π»Π°ΡˆΠ²Π°Π½Π΅Ρ‚ΠΎ Π·Π°Π±ΠΈΠ΅ ΠΈ постави Π΅Π΄ΠΈΠ½ΠΈΡ†Π° Π½Π° ΠΏΠΈΠ½Π°, Π° Ρ…Π΅Ρ€ΠΊΠΎΠ½ΡŠΡ‚ Π·Π°Ρ‚Π²ΠΎΡ€ΠΈ Ρ‚Π°Π·ΠΈ линия с Π½ΡƒΠ»Π° (с рСзистора Ρ‰Π΅ ΠΏΡ€ΠΎΡ‚Π΅Ρ‡Π΅ максимум 3.3V/1000Ξ© = 3.3mA).

Π’Ρ€Π΅ΠΌΠ΅ Π΅ Π΄Π° помислим ΠΊΠ°ΠΊΠ²ΠΎ Π΄Π° ΠΏΡ€Π°Π²ΠΈΠΌ, Π°ΠΊΠΎ СлСктричСството ΠΈΠ·Ρ‡Π΅Π·Π½Π΅. ΠŸΡŠΡ€Π²ΠΈΡΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ - Π΄Π° Π·Π°ΠΏΠΈΡ‚Π°ΠΌΠ΅ ΡΡŠΡ€Π²ΡŠΡ€Π° Π·Π° Π½Π°Ρ‡Π°Π»Π½ΠΈ стойности Π½Π° ΠΈΠ·ΠΌΠ΅Ρ€Π²Π°Ρ‚Π΅Π»ΠΈΡ‚Π΅ ΠΏΡ€ΠΈ стартиранС. Но Ρ‚ΠΎΠ²Π° Π±ΠΈ изисквало ΡΡŠΡ‰Π΅ΡΡ‚Π²Π΅Π½ΠΎ услоТнСниС Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° Π·Π° ΠΎΠ±ΠΌΠ΅Π½. ОсвСн Ρ‚ΠΎΠ²Π°, работоспособността Π½Π° устройството Π² Ρ‚Π°ΠΊΡŠΠ² случай зависи ΠΎΡ‚ ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π°. Ако слСд ΠΏΡ€Π΅ΠΊΡŠΡΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° СлСктричСството ΡΡŠΡ€Π²ΡŠΡ€ΡŠΡ‚ Π½Π΅ сС стартира (ΠΈΠ»ΠΈ сС стартира ΠΏΠΎ-късно), измСрватСлят Π½Π° Π²ΠΎΠ΄Π° Π½Π΅ Π±ΠΈ могъл Π΄Π° поиска Π½Π°Ρ‡Π°Π»Π½ΠΈ стойности ΠΈ Ρ‰Π΅ΡˆΠ΅ Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ.

Π—Π°Ρ‚ΠΎΠ²Π° Ρ€Π΅ΡˆΠΈΡ… Π΄Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌ запамСтяванС Π½Π° стойноститС Π½Π° ΠΈΠ·ΠΌΠ΅Ρ€Π²Π°Ρ‚Π΅Π»ΠΈΡ‚Π΅ Π² ΠΌΠΈΠΊΡ€ΠΎΡ‡ΠΈΠΏ с ΠΏΠ°ΠΌΠ΅Ρ‚, ΡΠ²ΡŠΡ€Π·Π°Π½ ΠΏΠΎ I2C. Нямам особСни изисквания ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½Π° Ρ„Π»Π°Ρˆ ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° - Π½ΡƒΠΆΠ½ΠΎ Π΅ Π΄Π° сС запамСтят само 2 числа (количСството Π»ΠΈΡ‚Ρ€ΠΈ спорСд ΠΈΠ·ΠΌΠ΅Ρ€Π²Π°Ρ‚Π΅Π»ΠΈΡ‚Π΅ Π·Π° Ρ‚ΠΎΠΏΠ»Π° ΠΈ студСна Π²ΠΎΠ΄Π°). Π”ΠΎΡ€ΠΈ ΠΈ Π½Π°ΠΉ-малкият ΠΌΠΎΠ΄ΡƒΠ» става. Но трябва Π΄Π° сС ΠΎΠ±ΡŠΡ€Π½Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° броя Π½Π° Ρ†ΠΈΠΊΠ»ΠΈΡ‚Π΅ Π½Π° запис. ΠŸΡ€ΠΈ ΠΏΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Ρ‚ΠΎΠ²Π° са 100 хиляди Ρ†ΠΈΠΊΡŠΠ»Π°, Π° ΠΏΡ€ΠΈ някои - Π΄ΠΎ ΠΌΠΈΠ»ΠΈΠΎΠ½.

На ΠΏΡ€ΡŠΠ² ΠΏΠΎΠ³Π»Π΅Π΄ ΠΌΠΈΠ»ΠΈΠΎΠ½ΡŠΡ‚ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ. Но ΠΏΡ€Π΅Π· 4-Ρ‚Π΅ Π³ΠΎΠ΄ΠΈΠ½ΠΈ, Π² ΠΊΠΎΠΈΡ‚ΠΎ ТивСя Π² Π°ΠΏΠ°Ρ€Ρ‚Π°ΠΌΠ΅Π½Ρ‚Π° си, съм ΠΈΠ·Ρ€Π°Π·Ρ…ΠΎΠ΄Π²Π°Π» ΠΌΠ°Π»ΠΊΠΎ Π½Π°Π΄ 500 ΠΊΡƒΠ±ΠΈΠΊΠ° Π²ΠΎΠ΄Π°, Ρ‚ΠΎΠ²Π° са 500000 Π»ΠΈΡ‚Ρ€Π°! И 500000 записа във Ρ„Π»Π°Ρˆ ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π°. И Ρ‚ΠΎΠ²Π° Π΅ само студСна Π²ΠΎΠ΄Π°. Π Π°Π·Π±ΠΈΡ€Π° сС, ΠΌΠΎΠ³Π° Π΄Π° прСпоявам ΠΌΠΈΠΊΡ€ΠΎΡ‡ΠΈΠΏΠ° Π½Π° всСки Π΄Π²Π΅ Π³ΠΎΠ΄ΠΈΠ½ΠΈ, Π½ΠΎ сС ΠΎΠΊΠ°Π·Π°, Ρ‡Π΅ ΠΈΠΌΠ° ΠΌΠΈΠΊΡ€ΠΎΡ‡ΠΈΠΏΠΎΠ²Π΅ FRAM. ΠžΡ‚ Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ, Ρ‚ΠΎΠ²Π° Π΅ ΡΡŠΡ‰ΠΈΡΡ‚ I2C EEPROM, само с ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎ количСство Ρ†ΠΈΠΊΠ»ΠΈ Π½Π° прСзапис (стотици ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈ). Π‘Π°ΠΌΠΎ Ρ‡Π΅ досСга всС ΠΎΡ‰Π΅ Π½Π΅ съм успял Π΄Π° стигна Π΄ΠΎ ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° с Ρ‚Π°ΠΊΠΈΠ²Π° ΠΌΠΈΠΊΡ€ΠΎΡ‡ΠΈΠΏΠΎΠ²Π΅, Π·Π°Ρ‚ΠΎΠ²Π° Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½Π° 24LC512.

ΠŸΠ΅Ρ‡Π°Ρ‚Π½Π° ΠΏΠ»Π°Ρ‚ΠΊΠ°

ΠŸΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΎ ΠΏΠ»Π°Π½ΠΈΡ€Π°Ρ… Π΄Π° направя ΠΏΠ»Π°Ρ‚ΠΊΠ°Ρ‚Π° Π² домашни условия. Π—Π°Ρ‚ΠΎΠ²Π° ΠΏΠ»Π°Ρ‚ΠΊΠ°Ρ‚Π° бСшС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€Π°Π½Π° ΠΊΠ°Ρ‚ΠΎ Сдностранна. Но слСд ΠΊΠ°Ρ‚ΠΎ ΠΏΡ€Π΅ΠΊΠ°Ρ€Π°Ρ… час Π² ΠΎΠΏΠΈΡ‚ΠΈ с Π»Π°Π·Π΅Ρ€Π½Π° ΡŽΡ‚ΠΈΡ ΠΈ спойка (Π±Π΅Π· нСя Π½Π΅ Π΅ ΠΊΠ°Ρ‚ΠΎ Ρ…ΠΎΡ€Π°Ρ‚Π°), всС ΠΏΠ°ΠΊ Ρ€Π΅ΡˆΠΈΡ… Π΄Π° ΠΏΠΎΡ€ΡŠΡ‡Π°ΠΌ ΠΏΠ»Π°Ρ‚ΠΊΠΈΡ‚Π΅ ΠΎΡ‚ ΠΊΠΈΡ‚Π°ΠΉΡ†ΠΈ.

Π‘Π²ΡŠΡ€Π·Π²Π°ΠΌΠ΅ Π²ΠΎΠ΄ΠΎΠΌΠ΅Ρ€Π° към умния Π΄ΠΎΠΌ

ΠŸΠΎΡ‡Ρ‚ΠΈ ΠΏΡ€Π΅Π΄ΠΈ ΠΏΠΎΡ€ΡŠΡ‡ΠΊΠ°Ρ‚Π° Π½Π° ΠΏΠ»Π°Ρ‚ΠΊΠΈΡ‚Π΅ ΠΎΡΡŠΠ·Π½Π°Ρ…, Ρ‡Π΅ освСн ΠΌΠΈΠΊΡ€ΠΎΡ‡ΠΈΠΏΠ° с Ρ„Π»Π°Ρˆ ΠΏΠ°ΠΌΠ΅Ρ‚ Π½Π° шина I2C ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΡΠ²ΡŠΡ€ΠΆΠ΅ ΠΈ Π½Π΅Ρ‰ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ дисплСй. Какво Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‰Π΅ ΠΈΠ·Π²Π΅Π΄Π° Π½Π° Π½Π΅Π³ΠΎ - ΠΎΡ‰Π΅ Π΅ Π²ΡŠΠΏΡ€ΠΎΡ, Π½ΠΎ трябва Π΄Π° сС ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈ Π½Π° ΠΏΠ»Π°Ρ‚ΠΊΠ°Ρ‚Π°. А Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ смятам Π΄Π° ΠΏΠΎΡ€ΡŠΡ‡Π°ΠΌ ΠΏΠ»Π°Ρ‚ΠΊΠΈΡ‚Π΅ ΠΎΡ‚ Ρ„Π°Π±Ρ€ΠΈΠΊΠ°, нямашС смисъл Π΄Π° сС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π° Π΄ΠΎ Сдностранна ΠΏΠ»Π°Ρ‚ΠΊΠ°, Π·Π°Ρ‚ΠΎΠ²Π° Π»ΠΈΠ½ΠΈΠΈΡ‚Π΅ Π½Π° I2C - са СдинствСнитС ΠΎΡ‚ Π·Π°Π΄Π½Π°Ρ‚Π° страна Π½Π° ΠΏΠ»Π°Ρ‚ΠΊΠ°Ρ‚Π°.

Π‘Π²ΡŠΡ€Π·Π°Π½ с Сдностранно Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ имашС ΠΈ Π΅Π΄ΠΈΠ½ голям ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. Въй ΠΊΠ°Ρ‚ΠΎ ΠΏΠ»Π°Ρ‚ΠΊΠ°Ρ‚Π° бСшС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€Π°Π½Π° Сдностранно, ΠΏΠ»Π°Π½ΠΈΡ€Π°Π½ΠΎ бСшС Π΄Π° сС Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ°Ρ‚ ΠΏΡŠΡ‚Π΅ΠΊΠΈΡ‚Π΅ ΠΈ SMD ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈΡ‚Π΅ ΠΎΡ‚ Π΅Π΄Π½Π°Ρ‚Π° страна, Π° ΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅, ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡ‚Π΅ ΠΈ Π·Π°Ρ…Ρ€Π°Π½Π²Π°Π½Π΅Ρ‚ΠΎ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°Ρ‚Π°. ΠšΠΎΠ³Π°Ρ‚ΠΎ слСд мСсСц ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ… ΠΏΠ»Π°Ρ‚ΠΊΠΈΡ‚Π΅, Π·Π°Π±Ρ€Π°Π²ΠΈΡ… Π·Π° ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΈΡ ΠΏΠ»Π°Π½ ΠΈ Π·Π°ΠΏΠΎΠΈΡ… всичкитС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ ΠΎΡ‚ Π»ΠΈΡ†Π΅Π²Π°Ρ‚Π° страна. И Π΅Π΄Π²Π° ΠΊΠΎΠ³Π°Ρ‚ΠΎ стигнах Π΄ΠΎ запояванСто Π½Π° захранващия Π±Π»ΠΎΠΊ, Ρ€Π°Π·Π±Ρ€Π°Ρ…, Ρ‡Π΅ полоТитСлният ΠΈ отрицатСлният ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚ са ΠΎΠ±ΡŠΡ€Π½Π°Ρ‚ΠΈ. НалоТи сС Π΄Π° ΠΈΠΌΠΏΡ€ΠΎΠ²ΠΈΠ·ΠΈΡ€Π°ΠΌ с jumper-ΠΈ. На снимката ΠΏΠΎ-Π³ΠΎΡ€Π΅ Π²Π΅Ρ‡Π΅ съм ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΠ» Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅Ρ‚ΠΎ, Π½ΠΎ зСмята сС ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»Ρ ΠΎΡ‚ Π΅Π΄Π½Π° част Π½Π° ΠΏΠ»Π°Ρ‚ΠΊΠ°Ρ‚Π° Π² Π΄Ρ€ΡƒΠ³Π° ΠΏΡ€Π΅Π· ΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅ Π½Π° Π±ΡƒΡ‚ΠΎΠ½Π° Boot (Π²ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ моТСшС Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ ΠΏΡŠΡ‚Π΅Ρ‡ΠΊΠ° Π½Π° втория слой).

Π‘Ρ‚Π°Π½Π°Ρ…Π° Ρ‚Π°ΠΊΠ°

Π‘Π²ΡŠΡ€Π·Π²Π°ΠΌΠ΅ Π²ΠΎΠ΄ΠΎΠΌΠ΅Ρ€Π° към умния Π΄ΠΎΠΌ

ΠšΠ°Π»ΡŠΡ„

Π‘Π»Π΅Π΄Π²Π°Ρ‰Π°Ρ‚Π° ΡΡ‚ΡŠΠΏΠΊΠ° - корпус. ΠŸΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅Ρ‚ΠΎ Π½Π° 3D ΠΏΡ€ΠΈΠ½Ρ‚Π΅Ρ€, Ρ‚ΠΎΠ²Π° Π½Π΅ Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. НС сС замислих особСно - просто нарисувах кутия с нСобходимия Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ… ΠΈΠ·Ρ€Π΅Π·ΠΈ Π½Π° Π½ΡƒΠΆΠ½ΠΈΡ‚Π΅ мСста. ΠšΠ°ΠΏΠ°ΠΊΡŠΡ‚ сС Π·Π°ΠΊΡ€Π΅ΠΏΠ²Π° към корпуса с ΠΌΠ°Π»ΠΊΠΈ саморСзи.

Π‘Π²ΡŠΡ€Π·Π²Π°ΠΌΠ΅ Π²ΠΎΠ΄ΠΎΠΌΠ΅Ρ€Π° към умния Π΄ΠΎΠΌ

Π’Π΅Ρ‡Π΅ спомСнах, Ρ‡Π΅ Π±ΡƒΡ‚ΠΎΠ½ΡŠΡ‚ Boot ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ°Ρ‚ΠΎ Π±ΡƒΡ‚ΠΎΠ½ с ΠΎΠ±Ρ‰ΠΎ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ - Π΅Ρ‚ΠΎ Π³ΠΎ ΠΈ Π½Π΅Π³ΠΎ Π½Π° прСдния ΠΏΠ°Π½Π΅Π». Π—Π° Ρ†Π΅Π»Ρ‚Π° нарисувах спСциалСн 'ΠΊΠΎΠ»ΠΎΠ΄Π΅Ρ†', ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ сС Π½Π°ΠΌΠΈΡ€Π° Π±ΡƒΡ‚ΠΎΠ½Π°.

Π‘Π²ΡŠΡ€Π·Π²Π°ΠΌΠ΅ Π²ΠΎΠ΄ΠΎΠΌΠ΅Ρ€Π° към умния Π΄ΠΎΠΌ

Π’ΡŠΡ‚Ρ€Π΅ Π² корпуса ΡΡŠΡ‰ΠΎ са Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈ пСньки, Π½Π° ΠΊΠΎΠΈΡ‚ΠΎ сС поставя ΠΏΠ»Π°Ρ‚ΠΊΠ°Ρ‚Π° ΠΈ сС фиксира с Π΅Π΄ΠΈΠ½ Π²ΠΈΠ½Ρ‚ М3 (Π½Π΅ остана ΠΏΠΎΠ²Π΅Ρ‡Π΅ място Π½Π° ΠΏΠ»Π°Ρ‚ΠΊΠ°Ρ‚Π°).

ДисплСят ΠΏΠΎΠ΄Π±Ρ€Π°Ρ…, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π²Π΅Ρ‡Π΅ бях ΠΎΡ‚ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π» ΠΏΡŠΡ€Π²ΠΈΡ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅Π½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π½Π° корпуса. Бтандартният двустрочСн дисплСй Π½Π΅ сС ΡΡŠΠ±ΠΈΡ€Π°ΡˆΠ΅ Π² Ρ‚ΠΎΠ·ΠΈ корпус, Π½ΠΎ Π² запаситС ΠΎΡ‚ΠΊΡ€ΠΈΡ… OLED дисплСй SSD1306 128Γ—32. Малко Π΅, Π½ΠΎ Π½Π΅ трябва Π΄Π° Π³ΠΎ Π³Π»Π΅Π΄Π°ΠΌ всСки Π΄Π΅Π½ - става.

ΠŸΡ€Π΅Ρ†Π΅Π½ΡΠ²Π°ΠΉΠΊΠΈ ΠΊΠ°ΠΊ Ρ‰Π΅ сС ΠΏΡ€ΠΎΠΊΠ°Ρ€Π°Ρ‚ ΠΊΠ°Π±Π΅Π»ΠΈΡ‚Π΅, Ρ€Π΅ΡˆΠΈΡ… Π΄Π° залСпя дисплСя Π² срСдата Π½Π° корпуса. Ергономията, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, Π΅ ΠΏΠΎΠ΄ всякаква ΠΊΡ€ΠΈΡ‚ΠΈΠΊΠ° - Π±ΡƒΡ‚ΠΎΠ½ΡŠΡ‚ Π΅ ΠΎΡ‚Π³ΠΎΡ€Π΅, дисплСят - ΠΎΡ‚Π΄ΠΎΠ»Ρƒ. Но Π²Π΅Ρ‡Π΅ ΠΊΠ°Π·Π°Ρ…, Ρ‡Π΅ идСята Π·Π° ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ²Π°Π½Π΅ Π½Π° дисплСя Π΄ΠΎΠΉΠ΄Π΅ Ρ‚Π²ΡŠΡ€Π΄Π΅ късно ΠΈ нямашС ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ Π΄Π° ΠΏΡ€Π΅Ρ€Π°Π±ΠΎΡ‚Π²Π°ΠΌ ΠΏΠ»Π°Ρ‚ΠΊΠ°Ρ‚Π°, Π·Π° Π΄Π° прСмСстя Π±ΡƒΡ‚ΠΎΠ½Π°.

Устройството Π² сбор. ДисплСйният ΠΌΠΎΠ΄ΡƒΠ» Π΅ Π·Π°Π»Π΅ΠΏΠ΅Π½ с Ρ‚Π΅Ρ€ΠΌΠΎΠΊΠ»Π΅ΠΉ.

Π‘Π²ΡŠΡ€Π·Π²Π°ΠΌΠ΅ Π²ΠΎΠ΄ΠΎΠΌΠ΅Ρ€Π° към умния Π΄ΠΎΠΌ

Π‘Π²ΡŠΡ€Π·Π²Π°ΠΌΠ΅ Π²ΠΎΠ΄ΠΎΠΌΠ΅Ρ€Π° към умния Π΄ΠΎΠΌ

ΠšΡ€Π°ΠΉΠ½ΠΈΡΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π²ΠΈΠ΄ΠΈ Π½Π° ΠšΠ”ΠŸΠ’.

ΠŸΡ€ΠΎΡˆΠΈΠ²ΠΊΠ°

ΠŸΡ€Π΅ΠΌΠΈΠ½Π°Π²Π°ΠΌΠ΅ към софтуСрната част. Π—Π° Ρ‚Π°ΠΊΠΈΠ²Π° ΠΌΠ°Π»ΠΊΠΈ издСлия ΠΌΠ½ΠΎΠ³ΠΎ харСсвам Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ Π΅Π·ΠΈΠΊΠ° Python (micropython)- ΠΊΠΎΠ΄ΡŠΡ‚ сС ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π° ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π΅Π½ ΠΈ Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅ΠΌ. Π—Π° щастиС, няма Π½ΡƒΠΆΠ΄Π° Π΄Π° сС спускам Π΄ΠΎ Π½ΠΈΠ²ΠΎ рСгистри, Π·Π° Π΄Π° изстискам микросСкунди - всичко ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ ΠΎΡ‚ Python.

ИзглСТда всичко Π΅ просто, Π½ΠΎ Π½Π΅ съвсСм β€” устройството Π²ΠΊΠ»ΡŽΡ‡Π²Π° няколко нСзависими Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

  • ΠŸΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡΡ‚ натиска Π±ΡƒΡ‚ΠΎΠ½Π° ΠΈ Π³Π»Π΅Π΄Π° дисплСя
  • Π›ΠΈΡ‚Ρ€ΠΈΡ‚Π΅ Ρ‚ΠΈΠΊΠ°Ρ‚ ΠΈ обновяват стойноститС във Ρ„Π»Π°Ρˆ ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π°
  • ΠœΠΎΠ΄ΡƒΠ»ΡŠΡ‚ слСди сигнала Π½Π° WiFi ΠΈ сС ΠΏΡ€Π΅ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΈΡ€Π°, Π°ΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ
  • А Π±Π΅Π· ΠΌΠΈΠ³Π°Ρ‰Π° Π»Π°ΠΌΠΏΠΈΡ‡ΠΊΠ° просто Π½Π΅ ΠΌΠΎΠΆΠ΅

НС ΠΌΠΎΠΆΠ΅ Π΄Π° сС допуснС, Ρ‡Π΅ Π΅Π΄Π½Π° функция Π½Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ, Π°ΠΊΠΎ Π΄Ρ€ΡƒΠ³Π° ΠΏΠΎ някаква ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° забавя. Π’Π΅Ρ‡Π΅ съм сС Π½Π°Ρ‚ΡŠΠΊΠ½Π°Π» Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ ΠΈ Π²Π΅Ρ‡Π΅ Π²ΠΈΠΆΠ΄Π°ΠΌ глюковС Π² стил "пропуснат Π»ΠΈΡ‚ΡŠΡ€, Π·Π°Ρ‰ΠΎΡ‚ΠΎ Π² Ρ‚ΠΎΠ·ΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ‚ сС обновявашС дисплСят" ΠΈΠ»ΠΈ "потрСбитСлят Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈ Π½ΠΈΡ‰ΠΎ, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŠΡ‚ сС ΡΠ²ΡŠΡ€Π·Π²Π° с WiFi". Π Π°Π·Π±ΠΈΡ€Π° сС, някои Π½Π΅Ρ‰Π° ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚ Ρ‡Ρ€Π΅Π· ΠΏΡ€Π΅ΠΊΡŠΡΠ²Π°Π½ΠΈΡ, Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС сблъскаш с ограничСния ΠΏΠΎ дълТина, влоТСност Π½Π° ΠΈΠ·Π²ΠΈΠΊΠ°Π½ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ Π½Π΅Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ. А ΠΊΠΎΠ΄ΡŠΡ‚, ΠΊΠΎΠΉΡ‚ΠΎ сС Π·Π°Π½ΠΈΠΌΠ°Π²Π° с всичко навСднъТ, Π±ΡŠΡ€Π·ΠΎ сС ΠΏΡ€Π΅Π²Ρ€ΡŠΡ‰Π° Π² каша.

Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, ΠΏΠΎ-сСриозСн ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ… класичСска вытСсняваща многозадачност ΠΈ FreeRTOS, Π½ΠΎ Π² Ρ‚ΠΎΠ·ΠΈ случай ΠΌΠΎΠ΄Π΅Π»ΡŠΡ‚ Π½Π° сопрограми (coroutines) ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° uasync Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-подходящ. ΠŸΠΈΡ‚ΠΎΠ½ΠΎΠ²Π°Ρ‚Π° рСализация Π½Π° ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½ΠΈΡ‚Π΅ Π΅ нСвСроятна β€” Π·Π° програмиста Π΅ всичко Π½Π°ΠΏΡ€Π°Π²Π΅Π½ΠΎ просто ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎ. ΠŸΡ€ΠΎΡΡ‚ΠΎ Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Π»ΠΎΠ³ΠΈΠΊΠ°Ρ‚Π° си, само ΠΊΠ°ΠΆΠ΅Ρ‚Π΅ къдС ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€Π΅Π²ΠΊΠ»ΡŽΡ‡Π²Π°Ρ‚Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΡˆΠΊΠΈΡ‚Π΅.

Π Π°Π·Π»ΠΈΠΊΠΈΡ‚Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ вытСсняващата ΠΈ ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½Π°Ρ‚Π° многозадачност ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΠΌ Π΄Π° ΠΏΡ€ΠΎΡƒΡ‡ΠΈΡ‚Π΅ Π² Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΈ. А сСга Π½Π΅ΠΊΠ°, Π½Π°ΠΉ-накрая, Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ΠΌ към ΠΊΠΎΠ΄Π°.

#####################################
# 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) сС Ρ‡Π΅Ρ‚Π΅ Π½Π°Ρ‡Π°Π»Π½Π°Ρ‚Π° стойност Π½Π° брояча β€” Ρ‚Π°ΠΊΠ° сС Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π° Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ слСд Π·Π°Π³ΡƒΠ±Π° Π½Π° Π·Π°Ρ…Ρ€Π°Π½Π²Π°Π½Π΅.

ΠŸΠΈΠ½ΡŠΡ‚ сС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π° със Π²Π³Ρ€Π°Π΄Π΅Π½Π° подтягиванС към Π·Π°Ρ…Ρ€Π°Π½Π²Π°Π½Π΅Ρ‚ΠΎ: Π°ΠΊΠΎ Ρ…Π΅Ρ€ΠΊΠΎΠ½ΡŠΡ‚ Π΅ Π·Π°ΠΌΠΊΠ½Π°Ρ‚ β€” Π½Π° линията Π΅ Π½ΡƒΠ»Π°, Π°ΠΊΠΎ Π΅ Ρ€Π°Π·ΠΎΠΌΠΊΠ½Π°Ρ‚, линията сС подтягива към Π·Π°Ρ…Ρ€Π°Π½Π²Π°Π½Π΅Ρ‚ΠΎ ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€ΡŠΡ‚ Ρ‡Π΅Ρ‚Π΅ Π΅Π΄ΠΈΠ½ΠΈΡ†Π°.

Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Ρ‚ΡƒΠΊ стартира ΠΎΡ‚Π΄Π΅Π»Π½Π° Π·Π°Π΄Π°Ρ‡Π°, която Ρ‰Π΅ ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° ΠΎΠΏΠΈΡ‚ Π½Π° ΠΏΠΈΠ½Π°. ВсСки брояч Ρ‰Π΅ стартира своя Π·Π°Π΄Π°Ρ‡Π°. Π•Ρ‚ΠΎ нСйния ΠΊΠΎΠ΄

    """ ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ²Π° ΠΏΠΈΠ½Π° ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π°Π²Π° стойността, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ ΠΎΡ‰Π΅ Π΅Π΄ΠΈΠ½ Π»ΠΈΡ‚ΡŠΡ€ """
    async def _switchcheck(self):
        last_checked_pin_state = self._pin.value()  # ΠŸΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° Π½Π°Ρ‡Π°Π»Π½ΠΎΡ‚ΠΎ ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅

        # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π·Π° промяна Π½Π° ΠΏΠΈΠ½Π°
        while True:
            state = self._pin.value()
            if state != last_checked_pin_state:
                # Π‘ΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅Ρ‚ΠΎ сС Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΠ»ΠΎ: дСйствайтС Π²Π΅Π΄Π½Π°Π³Π°.
                last_checked_pin_state = state
                if state == 0:
                    self._another_litre_passed()

            # Π˜Π³Π½ΠΎΡ€ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΏΠΎ-Π½Π°Ρ‚Π°Ρ‚ΡŠΡˆΠ½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π½Π° ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅Ρ‚ΠΎ, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ ΠΊΠ»ΡŽΡ‡ΡŠΡ‚ Π½Π΅ сС установи
            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 ΠΈ Ρ‰Π΅ Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ ΠΎΠ±Π΅ΠΊΡ‚ΡŠΡ‚ Π½Π° брояча ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ (ΠΊΠ°ΠΊ Π΄Π° Π³ΠΎ ΠΏΡ€Π΅Π²Π΅Π΄Π΅ΠΌ Π½Π° Π±ΡŠΠ»Π³Π°Ρ€ΡΠΊΠΈ? Вакъв, ΠΊΠΎΠΉΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·Ρ‡Π°ΠΊΠ²Π°?)

    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) # Π˜Π·Π±ΡΠ³Π²Π°ΠΉΡ‚Π΅ ΡΡŠΠ·Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ/ΡƒΠ½ΠΈΡ‰ΠΎΠΆΠ°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π±ΡƒΡ„Π΅Ρ€Π° ΠΏΡ€ΠΈ всяко ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅


    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):
        # ΠŸΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°ΠΉ Π½Π°Ρ‡Π°Π»Π½Π°Ρ‚Π° стойност
        value = counter.value()
        await self.publish(topic, str(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 Π΅ Π°ΠΊΡ‚ΠΈΠ²Π΅Π½.')
            duration = ticks_diff(ticks_ms(), self.internet_outage_start) // 1000
            await self.publish_debug_msg('Π’ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²Π΅Π½Π‘Π»Π΅Π΄', duration)
        else:
            self.internet_outages += 1
            self.internet_outage_start = ticks_ms()
            self.dprint('WiFi Π΅ Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π΅Π½.')
            
        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("ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ MQTT ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ 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('Π“Π»ΠΎΠ±Π°Π»Π½Π° ΠΊΠΎΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Π° Π³Ρ€Π΅ΡˆΠΊΠ°: ', e)
                await asyncio.sleep(20)

    async def _connect_to_WiFi(self):
        self.dprint('Π‘Π²ΡŠΡ€Π·Π²Π°Π½Π΅ с WiFi ΠΈ 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('Π‘Π²ΡŠΡ€Π·Π°Π½ΠΎ!')
        self.internet_outage = False

    async def _run_main_loop(self):
        # Цикъл Π²Π΅Ρ‡Π½ΠΎ
        mins = 0
        while True:
            gc.collect()  # Π—Π° Π΄Π°Π½Π½ΠΈ Π·Π° RAM.
            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("Появи сС ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅: ", 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. И с всСки ΠΎΠΏΠΈΡ‚ Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π° къдС Ρ‚ΠΎΡ‡Π½ΠΎ ΠΈΠ·Ρ‚ΠΈΡ‡Π° ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π°, с всСки слСдващ дСбъг ΠΏΡ€ΠΈΠ½Ρ‚, Ρ‚Π°Π·ΠΈ Π³Ρ€Π΅ΡˆΠΊΠ° сС появявашС всС ΠΏΠΎ-Ρ€Π°Π½ΠΎ. ΠšΡ€Π°Ρ‚ΠΊΠΎ Ρ‚ΡŠΡ€ΡΠ΅Π½Π΅ Π² Google ΠΌΠΈ ΠΏΠΎΠΊΠ°Π·Π°, Ρ‡Π΅ Π² ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€Π° ΠΈΠΌΠ° само 30kB ΠΏΠ°ΠΌΠ΅Ρ‚, Π² която 65kB ΠΊΠΎΠ΄ (Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈΡ‚Π΅) Π½Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΏΠΎΠ±Π΅Ρ€Π°Ρ‚.

Но ΠΈΠ·Ρ…ΠΎΠ΄ΡŠΡ‚ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°. Оказва сС, Ρ‡Π΅ micropython Π½Π΅ изпълнява ΠΊΠΎΠ΄Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΡ‚ .py Ρ„Π°ΠΉΠ»Π° β€” Ρ‚ΠΎΠ·ΠΈ Ρ„Π°ΠΉΠ» ΠΏΡŠΡ€Π²ΠΎ сС ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°. ОсвСн Ρ‚ΠΎΠ²Π°, Ρ‚ΠΎΠΉ сС ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π½Π° ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€Π°, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π° сС Π² Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄, ΠΊΠΎΠΉΡ‚ΠΎ слСд Ρ‚ΠΎΠ²Π° сС ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° Π² ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π°. И Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€Π° ΡΡŠΡ‰ΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΎΠ±Π΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚.

Π’Ρ€ΠΈΠΊΡŠΡ‚ Π΅ Π΄Π° сС ΠΈΠ·Π±Π°Π²ΠΈΠΌ ΠΎΡ‚ рСсурсоСмката компилация Π½Π° ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€Π°. МоТС Π΄Π° сС ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Ρ‚ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅Ρ‚Π΅ Π½Π° голям ΠΊΠΎΠΌΠΏΡŽΡ‚ΡŠΡ€, Π° Π² ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€Π° Π΄Π° сС Π·Π°Ρ€Π΅Π΄ΠΈ Π²Π΅Ρ‡Π΅ готовият Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄. Π—Π° Ρ†Π΅Π»Ρ‚Π° Π΅ Π½ΡƒΠΆΠ½ΠΎ Π΄Π° свалим Ρ„ΡŠΡ€ΠΌΡƒΠ΅Ρ€Π° Π½Π° micropython ΠΈ Π΄Π° Π³ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°ΠΌΠ΅. Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° mpy-cross..

НС написах 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.
  • ΠšΠ°Ρ‡Π²Π°ΠΌΠ΅ Ρ„ΡŠΡ€ΠΌΡƒΠ΅Ρ€Π° Π² ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€Π° (Π°Π· Π³ΠΎ правя Π½Π° Windows с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ‚Π΅ ESP8266Flasher ΠΈΠ»ΠΈ Python esptool)

Всичко, сСга β€˜import ssd1306’ Ρ‰Π΅ Π·Π°Ρ€Π΅ΠΆΠ΄Π° ΠΊΠΎΠ΄Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΡ‚ Ρ„ΡŠΡ€ΠΌΡƒΠ΅Ρ€Π° ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Π°Ρ‚Π° ΠΏΠ°ΠΌΠ΅Ρ‚ няма Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° Ρ‚ΠΎΠ²Π°. Π‘ Ρ‚ΠΎΠ·ΠΈ Ρ‚Ρ€ΠΈΠΊ Π·Π°Ρ€Π΅Π΄ΠΈΡ… във Ρ„ΡŠΡ€ΠΌΡƒΠ΅Ρ€Π° само ΠΊΠΎΠ΄Π° Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈΡ‚Π΅, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ основният ΠΊΠΎΠ΄ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° сС изпълнява ΠΎΡ‚ Ρ„Π°ΠΉΠ»ΠΎΠ²Π°Ρ‚Π° систСма. Π’ΠΎΠ²Π° позволява лСсна модификация Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° Π±Π΅Π· ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Π° компилация Π½Π° Ρ„ΡŠΡ€ΠΌΡƒΠ΅Ρ€Π°. Π’ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° ΠΈΠΌΠ°ΠΌ ΠΎΠΊΠΎΠ»ΠΎ 8.5kB свободна RAM. Π’ΠΎΠ²Π° Ρ‰Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΎΡ‰Π΅ доста ΠΏΠΎΠ»Π΅Π·Π½Π° функционалност Π² Π±ΡŠΠ΄Π΅Ρ‰Π΅. А Π°ΠΊΠΎ ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° станС съвсСм Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½Π°, ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π²ΠΊΠ»ΡŽΡ‡ΠΈ ΠΈ основната ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° във Ρ„ΡŠΡ€ΠΌΡƒΠ΅Ρ€Π°.

И ΠΊΠ°ΠΊΠ²ΠΎ Π΄Π° ΠΏΡ€Π°Π²ΠΈΠΌ сСга?

Ок, Ρ…Π°Ρ€Π΄ΡƒΠ΅Ρ€ΡŠΡ‚ Π΅ сглобСн, Ρ„ΡŠΡ€ΠΌΡƒΠ΅Ρ€ΡŠΡ‚ Π΅ написан, кутията Π΅ ΠΎΡ‚ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π½Π°, устройството Π΅ ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ΅Π½ΠΎ Π½Π° стСната ΠΈ радостно ΠΌΠΈΠ³Π° с Π»Π°ΠΌΠΏΠΈΡ‡ΠΊΠ°. Но всС ΠΎΡ‰Π΅ Ρ‚ΠΎΠ²Π° Π΅ Ρ‡Π΅Ρ€Π΅Π½ кутия (Π² Π±ΡƒΠΊΠ²Π°Π»Π΅Π½ ΠΈ прСносСн смисъл) ΠΈ ΠΏΠΎΠ»Π·Π°Ρ‚Π° ΠΎΡ‚ Π½Π΅Π³ΠΎ Π΅ ΠΌΠ°Π»ΠΊΠ°. Π’Ρ€Π΅ΠΌΠ΅ Π΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ Π½Π΅Ρ‰ΠΎ с MQTT ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡΡ‚Π°, ΠΊΠΎΠΈΡ‚ΠΎ сС ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Ρ‚ Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π°.

ΠœΠΎΡΡ‚ β€œΡƒΠΌΠ΅Π½ дом” Ρ€Π°Π±ΠΎΡ‚ΠΈ Π½Π° систСмата Majordomo. MQTT ΠΌΠΎΠ΄ΡƒΠ» ΠΈΠ»ΠΈ Π΅ Π½Π°Π»ΠΈΡ‡Π΅Π½ ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅, ΠΈΠ»ΠΈ лСсно сС инсталира ΠΎΡ‚ ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° Π·Π° Π΄ΠΎΠ±Π°Π²ΠΊΠΈ β€” Π²Π΅Ρ‡Π΅ Π½Π΅ помня ΠΎΡ‚ΠΊΡŠΠ΄Π΅ Π³ΠΎ Π²Π·Π΅Ρ…. MQTT Π½Π΅ Π΅ самостоятСлно Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ β€” Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ Π΅ Ρ‚.Π½. Π±Ρ€ΠΎΠΊΠ΅Ρ€ β€” ΡΡŠΡ€Π²ΡŠΡ€, ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΡ€ΠΈΠ΅ΠΌΠ°, сортира ΠΈ прСнасочва ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΈΡ‚Π΅ MQTT ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ. Аз ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ mosquitto, ΠΊΠΎΠΉΡ‚ΠΎ (ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ majordomo) Ρ€Π°Π±ΠΎΡ‚ΠΈ Π½Π° ΡΡŠΡ‰ΠΈΡ Π½Π΅Ρ‚Π±ΡƒΠΊ.

Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ устройството ΠΈΠ·ΠΏΡ€Π°Ρ‚ΠΈ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅, стойността Π²Π΅Π΄Π½Π°Π³Π° Ρ‰Π΅ сС появи Π² списъка.

Π‘Π²ΡŠΡ€Π·Π²Π°ΠΌΠ΅ Π²ΠΎΠ΄ΠΎΠΌΠ΅Ρ€Π° към умния Π΄ΠΎΠΌ

Π’Π΅Π·ΠΈ стойности сСга ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΡΠ²ΡŠΡ€ΠΆΠ°Ρ‚ с ΠΎΠ±Π΅ΠΊΡ‚ΠΈΡ‚Π΅ Π½Π° систСмата, Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π² Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ сцСнарии ΠΈ Π΄Π° ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ‚ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½ Π°Π½Π°Π»ΠΈΠ· β€” всичко Ρ‚ΠΎΠ²Π° Π΅ извън ΠΎΠ±Ρ…Π²Π°Ρ‚Π° Π½Π° Ρ‚Π°Π·ΠΈ статия. На заинтСрСсованитС ΠΎΡ‚ систСмата majordomo ΠΌΠΎΠ³Π° Π΄Π° ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π°ΠΌ ΠΊΠ°Π½Π°Π»Π° "Π•Π»Π΅ΠΊΡ‚Ρ€ΠΎΠ½ΠΈΠΊΠ° Π’ ΠžΠ±Π΅ΠΊΡ‚ΠΈΠ²Π΅" β€” другарят ΡΡŠΡ‰ΠΎ строи ΡƒΠΌΠ΅Π½ Π΄ΠΎΠΌ ΠΈ обяснява ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΊΠ°ΠΊ Π΄Π° настроитС систСмата.

Π©Π΅ ΠΏΠΎΠΊΠ°ΠΆΠ° само няколко Π³Ρ€Π°Ρ„ΠΈΠΊΠ°. Π’ΠΎΠ²Π° Π΅ прост Π³Ρ€Π°Ρ„ΠΈΠΊ Π½Π° стойноститС Π·Π° Π΅Π΄ΠΈΠ½ Π΄Π΅Π½

Π‘Π²ΡŠΡ€Π·Π²Π°ΠΌΠ΅ Π²ΠΎΠ΄ΠΎΠΌΠ΅Ρ€Π° към умния Π΄ΠΎΠΌ
ЛСсно Π΅ Π΄Π° сС Π²ΠΈΠ΄ΠΈ, Ρ‡Π΅ ΠΏΡ€Π΅Π· Π½ΠΎΡ‰Ρ‚Π° ΠΏΠΎΡ‡Ρ‚ΠΈ Π½ΠΈΠΊΠΎΠΉ Π½Π΅ Π΅ ΠΏΠΎΠ»Π·Π²Π°Π» Π²ΠΎΠ΄Π°. Няколко ΠΏΡŠΡ‚ΠΈ някой Π΅ Ρ…ΠΎΠ΄ΠΈΠ» Π΄ΠΎ Ρ‚ΠΎΠ°Π»Π΅Ρ‚Π½Π°Ρ‚Π° ΠΈ, ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°, Ρ„ΠΈΠ»Ρ‚ΡŠΡ€ΡŠΡ‚ Π·Π° ΠΎΠ±Ρ€Π°Ρ‚Π½Π° осмоза Π΅ изсмукал няколко Π»ΠΈΡ‚Ρ€Π° ΠΏΡ€Π΅Π· Π½ΠΎΡ‰Ρ‚Π°. Π‘ΡƒΡ‚Ρ€ΠΈΠ½Ρ‚Π° ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ нараства. ОбикновСно ΠΏΠΎΠ»Π·Π²Π°ΠΌ Π²ΠΎΠ΄Π° ΠΎΡ‚ Π±ΠΎΠΉΠ»Π΅Ρ€Π°, Π½ΠΎ Ρ‚ΡƒΠΊ Ρ€Π΅ΡˆΠΈΡ… Π΄Π° Π²Π·Π΅ΠΌΠ° Π²Π°Π½Π° ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Ρ… Π½Π° градска Ρ‚ΠΎΠΏΠ»Π° Π²ΠΎΠ΄Π° β€” Ρ‚ΠΎΠ²Π° ΡΡŠΡ‰ΠΎ Π΅ Π΄ΠΎΠ±Ρ€Π΅ Π²ΠΈΠ΄ΠΈΠΌΠΎ Π½Π° долния Π³Ρ€Π°Ρ„ΠΈΠΊ.

ΠžΡ‚ Ρ‚Π°Π·ΠΈ Π³Ρ€Π°Ρ„ΠΈΠΊΠ° Ρ€Π°Π·Π±Ρ€Π°Ρ…, Ρ‡Π΅ Π·Π° Ρ…ΠΎΠ΄Π΅Π½Π΅ Π΄ΠΎ Ρ‚ΠΎΠ°Π»Π΅Ρ‚Π½Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ 6-7Π» Π²ΠΎΠ΄Π°, Π·Π° Π΄ΡƒΡˆ β€” 20-30Π», Π·Π° ΠΌΠΈΠ΅Π½Π΅ Π½Π° съдовС ΠΎΠΊΠΎΠ»ΠΎ 20Π», Π° Π·Π° Π²Π°Π½Π° са Π½ΡƒΠΆΠ½ΠΈ 160Π». ΠŸΡ€Π΅Π· дСня ΠΌΠΎΠ΅Ρ‚ΠΎ сСмСйство консумира ΠΎΠΊΠΎΠ»ΠΎ 500-600Π».

Π—Π° особСно Π»ΡŽΠ±ΠΎΠΏΠΈΡ‚Π½ΠΈΡ‚Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° сС Π·Π°ΠΏΠΎΠ·Π½Π°Π΅Ρ‚Π΅ с записитС Π·Π° всяка ΠΎΡ‚Π΄Π΅Π»Π½Π° стойност

Π‘Π²ΡŠΡ€Π·Π²Π°ΠΌΠ΅ Π²ΠΎΠ΄ΠΎΠΌΠ΅Ρ€Π° към умния Π΄ΠΎΠΌ

ΠžΡ‚Ρ‚ΡƒΠΊ Ρ€Π°Π·Π±Ρ€Π°Ρ…, Ρ‡Π΅ ΠΏΡ€ΠΈ ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ ΠΊΡ€Π°Π½ Π²ΠΎΠ΄Π°Ρ‚Π° Ρ‚Π΅Ρ‡Π΅ със скорост ΠΎΡ‚ ΠΎΠΊΠΎΠ»ΠΎ 1Π» Π·Π° 5с.

Но Π² Ρ‚ΠΎΠ·ΠΈ Π²ΠΈΠ΄ статистиката, вСроятно, Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠ΄ΠΎΠ±Π½Π° Π·Π° ΠΏΡ€Π΅Π³Π»Π΅Π΄. Π’ majordomo ΠΈΠΌΠ° ΠΎΡ‰Π΅ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ Π΄Π° сС Π³Π»Π΅Π΄Π°Ρ‚ Π³Ρ€Π°Ρ„ΠΈΡ†ΠΈ Π½Π° консумацията ΠΏΠΎ Π΄Π½ΠΈ, сСдмици ΠΈ мСсСци. НапримСр, Ρ‚ΠΎΠ²Π° Π΅ Π³Ρ€Π°Ρ„ΠΈΠΊ Π½Π° консумацията Π² ΠΊΠΎΠ»ΠΎΠ½ΠΈ.

Π‘Π²ΡŠΡ€Π·Π²Π°ΠΌΠ΅ Π²ΠΎΠ΄ΠΎΠΌΠ΅Ρ€Π° към умния Π΄ΠΎΠΌ

Π’ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° ΠΈΠΌΠ°ΠΌ Π΄Π°Π½Π½ΠΈ само Π·Π° сСдмица. Π‘Π»Π΅Π΄ мСсСц Ρ‚ΠΎΠ·ΠΈ Π³Ρ€Π°Ρ„ΠΈΠΊ Ρ‰Π΅ бъдС ΠΏΠΎ-ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅Π½ β€” всСки Π΄Π΅Π½ Ρ‰Π΅ бъдС прСдставСн с ΠΎΡ‚Π΄Π΅Π»Π½Π° ΠΊΠΎΠ»ΠΎΠ½Π°. Малко ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Π°Ρ‚Π° развалят ΠΊΠΎΡ€Π΅ΠΊΡ†ΠΈΠΈΡ‚Π΅ Π½Π° стойноститС, ΠΊΠΎΠΈΡ‚ΠΎ въвСТдам Ρ€ΡŠΡ‡Π½ΠΎ (Π½Π°ΠΉ-голямата ΠΊΠΎΠ»ΠΎΠ½Π°). И всС ΠΎΡ‰Π΅ Π½Π΅ Π΅ ясно, Π΄Π°Π»ΠΈ Π°Π· Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ Π·Π°Π΄Π°Π΄ΠΎΡ… Π½Π°ΠΉ-ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΈΡ‚Π΅ стойности ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π° ΠΊΡƒΠ± ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ, ΠΈΠ»ΠΈ Ρ‚ΠΎΠ²Π° Π΅ бъг Π² Ρ„ΡŠΡ€ΠΌΡƒΠ΅Ρ€Π° ΠΈ Π½Π΅ всички Π»ΠΈΡ‚Ρ€ΠΈ са ΠΎΡ‚Ρ‡Π΅Ρ‚Π΅Π½ΠΈ. НуТдавам сС ΠΎΡ‚ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π²Ρ€Π΅ΠΌΠ΅.

ΠžΡ‰Π΅ трябва Π΄Π° поработя Π²ΡŠΡ€Ρ…Ρƒ самитС Π³Ρ€Π°Ρ„ΠΈΡ†ΠΈ, Π΄Π° Π³ΠΈ ΠΈΠ·Π±Π΅Π»Π²Π°ΠΌ, боядисвам. МоТС Π±ΠΈ ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Ρ‰Π΅ изградя Π³Ρ€Π°Ρ„ΠΈΠΊ Π½Π° консумацията Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚ Π·Π° отстраняванС Π½Π° трудности β€” ΠΌΠΎΠΆΠ΅ Π±ΠΈ Ρ‚Π°ΠΌ Π½Π΅Ρ‰ΠΎ ΠΈΠ·Ρ‚ΠΈΡ‡Π°. Π’ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° всичко Ρ‚ΠΎΠ²Π° Π΅ Π½Π° Π΅Ρ‚Π°ΠΏ идСя.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ДнСс моят Π°ΠΏΠ°Ρ€Ρ‚Π°ΠΌΠ΅Π½Ρ‚ стана ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΡƒΠΌΠ΅Π½. Π‘ Ρ‚ΠΎΠ²Π° ΠΌΠ°Π»ΠΊΠΎ устройство Ρ‰Π΅ ΠΌΠΈ бъдС ΠΏΠΎ-ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π΄Π° слСдя консумацията Π½Π° Π²ΠΎΠ΄Π° Π² Π΄ΠΎΠΌΠ°. Ако ΠΏΡ€Π΅Π΄ΠΈ Ρ‚ΠΎΠ²Π° съм сС ΡƒΡ‡ΡƒΠ΄Π²Π°Π» β€œΠΎΡ‚Π½ΠΎΠ²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΠΎΠ΄Π° ΠΏΠΎΡ…Π°Ρ€Ρ‡ΠΈΡ…ΠΌΠ΅ Π·Π° мСсСца”, сСга Ρ‰Π΅ ΠΌΠΎΠ³Π° Π΄Π° намСря ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΠ° Π½Π° Ρ‚Π°Π·ΠΈ консумация.

Някои ΠΌΠΎΠΆΠ΅ Π΄Π° намСрят странно Π΄Π° Π³Π»Π΅Π΄Π°Ρ‚ показания Π½Π° Π΅ΠΊΡ€Π°Π½Π°, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Ρ‚ΠΎΠΉ Π΅ Π½Π° ΠΌΠ΅Ρ‚ΡŠΡ€ разстояниС ΠΎΡ‚ самия ΠΈΠ·ΠΌΠ΅Ρ€Π²Π°Ρ‚Π΅Π». Но Π² Π½Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π°Π»Π΅Ρ‡Π½ΠΎΡ‚ΠΎ Π±ΡŠΠ΄Π΅Ρ‰Π΅ ΠΏΠ»Π°Π½ΠΈΡ€Π°ΠΌ Π΄Π° сС прСмСстя Π² Π΄Ρ€ΡƒΠ³ Π°ΠΏΠ°Ρ€Ρ‚Π°ΠΌΠ΅Π½Ρ‚, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ Ρ‰Π΅ ΠΈΠΌΠ° няколко Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»Π½ΠΈ Ρ‚Ρ€ΡŠΠ±ΠΈ Π·Π° Π²ΠΎΠ΄Π°, Π° самитС ΠΈΠ·ΠΌΠ΅Ρ€Π²Π°Ρ‚Π΅Π»Π½ΠΈ ΡƒΡ€Π΅Π΄ΠΈ, вСроятно, Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈ Π½Π° ΡΡ‚ΡŠΠ»Π±ΠΈΡ‰Π½Π°Ρ‚Π° ΠΏΠ»ΠΎΡ‰Π°Π΄ΠΊΠ°. Π’Π°ΠΊΠ° Ρ‡Π΅ устройството Π·Π° дистанционно ΠΈΠ·ΠΌΠ΅Ρ€Π²Π°Π½Π΅ Π½Π° показанията Ρ‰Π΅ бъдС ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠ΄Π°Ρ‡Π½ΠΎ.

Ѐункционалността Π½Π° устройството ΡΡŠΡ‰ΠΎ ΠΏΠ»Π°Π½ΠΈΡ€Π°ΠΌ Π΄Π° Ρ€Π°Π·ΡˆΠΈΡ€Ρ. Π’Π΅Ρ‡Π΅ Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌ ΠΌΠΎΡ‚ΠΎΡ€ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ Π²Π΅Π½Ρ‚ΠΈΠ»ΠΈ. Π’ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π·Π° ΠΏΡ€Π΅Π²ΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π±ΠΎΠΉΠ»Π΅Ρ€-общинска Π²ΠΎΠ΄Π° ΠΌΠΈ сС Π½Π°Π»Π°Π³Π° Π΄Π° Π·Π°Π²ΡŠΡ€Ρ‚Π°ΠΌ 3 ΠΊΡ€Π°Π½Π° Π² Ρ‚Ρ€ΡƒΠ΄Π½ΠΎΠ΄ΠΎΡΡ‚ΡŠΠΏΠ΅Π½ ъгъл. ЩСшС Π΄Π° Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π΄Π° Π³ΠΎ правя с Π΅Π΄ΠΈΠ½ Π±ΡƒΡ‚ΠΎΠ½ с подходяща индикация. И, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, Π±ΠΈ Π±ΠΈΠ»ΠΎ Π΄ΠΎΠ±Ρ€Π΅ Π΄Π° внСдря Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ ΠΏΡ€ΠΎΡ‚Π΅Ρ‡ΠΊΠΈ.

Π’ статията описах ΠΌΠΎΠ΅Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° ESP8266. Π‘ΠΏΠΎΡ€Π΅Π΄ ΠΌΠ΅Π½, ΠΏΠΎΠ»ΡƒΡ‡ΠΈ сС доста интСрСсСн Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π½Π° Ρ„ΡŠΡ€ΠΌΡƒΠ΅Ρ€ Π½Π° micropython с ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½ΠΈ - просто ΠΈ приятно. ΠžΠΏΠΈΡ‚Π°Ρ… сС Π΄Π° опиша мноТСство нюанси ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ, с ΠΊΠΎΠΈΡ‚ΠΎ сС срСщнах ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π°. МоТС Π±ΠΈ съм описал всичко Ρ‚Π²ΡŠΡ€Π΄Π΅ Π΄Π΅Ρ‚Π°ΠΉΠ»Π½ΠΎ; Π·Π° ΠΌΠ΅Π½, ΠΊΠ°Ρ‚ΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π», Π΅ ΠΏΠΎ-лСсно Π΄Π° ΠΏΡ€Π΅Π³Π»Π΅Π΄Π°ΠΌ Π½Π΅Π½ΡƒΠΆΠ½ΠΎΡ‚ΠΎ, ΠΎΡ‚ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ Π΄Π° сС ΠΎΠΏΠΈΡ‚Π²Π°ΠΌ Π΄Π° допълня Π½Π΅Ρ‰Π°Ρ‚Π°, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ са Π±ΠΈΠ»ΠΈ спомСнати.

ΠšΠ°ΠΊΡ‚ΠΎ Π²ΠΈΠ½Π°Π³ΠΈ, съм ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ Π·Π° конструктивна ΠΊΡ€ΠΈΡ‚ΠΈΠΊΠ°.

Π˜Π·Ρ…ΠΎΠ΄Π΅Π½ ΠΊΠΎΠ΄
Π‘Ρ…Π΅ΠΌΠ° ΠΈ ΠΏΠ»Π°Ρ‚ΠΊΠ°
МодСл Π½Π° корпуса

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster