ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ счСтчик Π²ΠΎΠ΄Ρ‹ ΠΊ ΡƒΠΌΠ½ΠΎΠΌΡƒ Π΄ΠΎΠΌΡƒ

Когда-Ρ‚ΠΎ систСмы домашнСй Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ ΠΈΡ… часто Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ β€œΡƒΠΌΠ½Ρ‹ΠΉ дом”, Π±Ρ‹Π»ΠΈ ΠΆΡƒΡ‚ΠΊΠΎ Π΄ΠΎΡ€ΠΎΠ³ΠΈΠΌΠΈ ΠΈ ΠΈΡ… ΠΌΠΎΠ³Π»ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ сСбС лишь Π±ΠΎΠ³Π°Ρ‡ΠΈ. БСгодня Π½Π° Ρ€Ρ‹Π½ΠΊΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ достаточно Π±ΡŽΠ΄ΠΆΠ΅Ρ‚Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Ρ‹ с Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ, ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ/Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡΠΌΠΈ ΠΈ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ устройствами для ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ освСщСниСм, Ρ€ΠΎΠ·Π΅Ρ‚ΠΊΠ°ΠΌΠΈ, вСнтиляциСй, водоснабТСниСм ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ потрСбитСлями. И Π΄Π°ΠΆΠ΅ самый ΠΊΡ€ΠΈΠ²ΠΎΡ€ΡƒΠΊΠΈΠΉ 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Π’. Π’ качСствС источника питания Ρƒ мСня Π±ΡƒΠ΄Π΅Ρ‚ трудится нСбольшой Π±Π»ΠΎΡ‡ΠΎΠΊ HLK-PM03 ΠΎΡ‚ Tenstar Robot. Π›ΠΈΡ‡Π½ΠΎ Ρƒ мСня Ρ‚ΡƒΠ³ΠΎ с Π°Π½Π°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΉ ΠΈ силовой элСктроникой, Π° Ρ‚ΡƒΡ‚ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ Π±Π»ΠΎΠΊ питания Π² малСньком корпусС.

Для сигнализации Ρ€Π΅ΠΆΠΈΠΌΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Ρ‹ я прСдусмотрСл свСтодиод, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΊ 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 (micropython)- ΠΊΠΎΠ΄ получаСтся ΠΎΡ‡Π΅Π½ΡŒ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹ΠΉ ΠΈ понятный. Π‘Π»Π°Π³ΠΎ Ρ‚ΡƒΡ‚ Π½Π΅Ρ‚ нСобходимости ΡΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ Π½Π° ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ рСгистров с Ρ†Π΅Π»ΡŒΡŽ Π²Ρ‹ΠΆΠΈΠΌΠ°Ρ‚ΡŒ микросСкунды β€” всС ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΠ· ΠΏΠΈΡ‚ΠΎΠ½Π°.

Π’Ρ€ΠΎΠ΄Π΅ Π±Ρ‹ всС просто, Π΄Π° Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ β€” Π² устройствС намСчаСтся нСсколько нСзависимых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ:

  • ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Ρ‚Ρ‹ΠΊΠ°Π΅Ρ‚ Π² ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΈ смотрит Π½Π° дисплСй
  • Π›ΠΈΡ‚Ρ€Ρ‹ Ρ‚ΠΈΠΊΠ°ΡŽΡ‚ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ значСния Π²ΠΎ Ρ„Π»Π΅Ρˆ памяти
  • ΠœΠΎΠ΄ΡƒΠ»ΡŒ слСдит Π·Π° сигналом 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) вычитываСтся Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика β€” Ρ‚Π°ΠΊ рСализуСтся восстановлСниС послС пропадания питания.

Пин инициализируСтся со встроСнной подтяТкой ΠΊ питания: Ссли Π³Π΅Ρ€ΠΊΠΎΠ½ Π·Π°ΠΌΠΊΠ½ΡƒΡ‚ β€” Π½Π° Π»ΠΈΠ½ΠΈΠΈ ноль, Ссли Ρ€Π°Π·ΠΎΠΌΠΊΠ½ΡƒΡ‚ линия подтягиваСтся ΠΊ ΠΏΠΈΡ‚Π°Π½ΠΈΡŽ ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ.

Π’Π°ΠΊΠΆΠ΅ Ρ‚ΡƒΡ‚ запускаСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ Π·Π°Π΄Π°Ρ‡Π°, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ опрос ΠΏΠΈΠ½Π°. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ счСтчик Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ свою Π·Π°Π΄Π°Ρ‡Ρƒ. Π’ΠΎΡ‚ Π΅Π΅ ΠΊΠΎΠ΄

    """ 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 ΠΈ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ 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
  • Π—Π°Π»ΠΈΠ²Π°Π΅ΠΌ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ (я это дСлаю Π½Π° Π²ΠΈΠ½Π΄Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ ESP8266Flasher ΠΈΠ»ΠΈ питоновским esptool’ом)

ВсС, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ‘import ssd1306’ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΈΠ· ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ ΠΈ опСративная ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎΠ΄ это Ρ€Π°ΡΡ…ΠΎΠ΄ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. Π’Π°ΠΊΠΈΠΌ Ρ‚Ρ€ΡŽΠΊΠΎΠΌ я Π·Π°Π»ΠΈΠ» Π² ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ΄ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ основной ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρƒ мСня выполняСтся с Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы. Π­Ρ‚ΠΎ позволяСт Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π΅ пСрСкомпилируя ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ. На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρƒ мСня свободно ΠΎΠΊΠΎΠ»ΠΎ 8.5ΠΊΠ± ΠžΠ—Π£. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ довольно ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π° Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ. Ну Π° Ссли памяти Π±ΡƒΠ΄Π΅Ρ‚ совсСм Π½Π΅ Ρ…Π²Π°Ρ‚Π°Ρ‚ΡŒ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π·Π°Ρ‚ΠΎΠ»ΠΊΠ°Ρ‚ΡŒ Π² ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ.

И Ρ‡Ρ‚ΠΎ с этим Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π΅Π»Π°Ρ‚ΡŒ?

Ок, ΠΆΠ΅Π»Π΅Π·ΠΊΠ° спаяна, ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠ° написана, ΠΊΠΎΡ€ΠΎΠ±ΠΊΠ° Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π½Π°, устройство ΠΏΡ€ΠΈΠ»Π΅ΠΏΠ»Π΅Π½ΠΎ Π½Π° стСну ΠΈ радостно ΠΌΠΎΡ€Π³Π°Π΅Ρ‚ Π»Π°ΠΌΠΏΠΎΡ‡ΠΊΠΎΠΉ. Но ΠΏΠΎΠΊΠ° это всС Ρ‡Π΅Ρ€Π½Ρ‹ΠΉ ящик (Π² прямом ΠΈ пСрСносном смыслС) ΠΈ Ρ‚ΠΎΠ»ΠΊΡƒ ΠΎΡ‚ Π½Π΅Π³ΠΎ Π΅Ρ‰Π΅ ΠΌΠ°Π»ΠΎΠ²Π°Ρ‚ΠΎ. ΠŸΠΎΡ€Π° Ρ‡Ρ‚ΠΎ Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с MQTT сообщСниями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡˆΠ»ΡŽΡ‚ΡΡ Π½Π° сСрвСр.

Мой β€œΡƒΠΌΠ½Ρ‹ΠΉ дом” крутится Π½Π° систСмС Majordomo. ΠœΠΎΠ΄ΡƒΠ»ΡŒ MQTT Ρ‚ΠΎ Π»ΠΈ Π΅ΡΡ‚ΡŒ ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ, Ρ‚ΠΎ Π»ΠΈ Π»Π΅Π³ΠΊΠΎ устанавливаСтся ΠΈΠ· ΠΌΠ°Ρ€ΠΊΠ΅Ρ‚Π° Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ β€” ΡƒΠΆΠ΅ Π½Π΅ помню ΠΎΡ‚ΠΊΡƒΠ΄Π° ΠΎΠ½ Ρƒ мСня взялся. MQTT ΡˆΡ‚ΡƒΠΊΠ° Π½Π΅ самодостаточная β€” Π½ΡƒΠΆΠ΅Π½ Ρ‚.Π½. Π±Ρ€ΠΎΠΊΠ΅Ρ€ β€” сСрвСр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚, сортируСт ΠΈ пСрСнаправляСт ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ MQTT сообщСния. Π― ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ mosquitto, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ (ΠΊΠ°ΠΊ ΠΈ majordomo) крутится всС Π½Π° Ρ‚ΠΎΠΌ ΠΆΠ΅ Π½Π΅Ρ‚Π±ΡƒΠΊΠ΅.

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ устройство Ρ…ΠΎΡ‚ΡŒ Ρ€Π°Π· ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ сообщСниС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΡƒΡ‚ ΠΆΠ΅ появится Π² спискС.

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ счСтчик Π²ΠΎΠ΄Ρ‹ ΠΊ ΡƒΠΌΠ½ΠΎΠΌΡƒ Π΄ΠΎΠΌΡƒ

Π­Ρ‚ΠΈ значСния Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ систСмы, ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² сцСнариях Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ ΠΏΠΎΠ΄Π²Π΅Ρ€Π³Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠΌΡƒ Π°Π½Π°Π»ΠΈΠ·Ρƒ β€” всС это out of scope этой ΡΡ‚Π°Ρ‚ΡŒΠΈ. ΠšΠΎΠΌΡƒ интСрСсна систСма majordomo ΠΌΠΎΠ³Ρƒ ΠΏΠΎΡ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°Π½Π°Π» Π­Π»Π΅ΠΊΡ‚Ρ€ΠΎΠ½ΠΈΠΊΠ° Π’ ΠžΠ±ΡŠΠ΅ΠΊΡ‚ΠΈΠ²Π΅ β€” Ρ‚ΠΎΠ²Π°Ρ€ΠΈΡ‰ Ρ‚ΠΎΠΆΠ΅ строит ΡƒΠΌΠ½Ρ‹ΠΉ Π΄ΠΎΠΌ ΠΈ Π΄ΠΎΡ…ΠΎΠ΄Ρ‡ΠΈΠ²ΠΎ рассказываСт ΠΏΡ€ΠΎ настройку систСмы.

ΠŸΠΎΠΊΠ°ΠΆΡƒ лишь ΠΏΠ°Ρ€Ρƒ Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ². Π­Ρ‚ΠΎ простой Π³Ρ€Π°Ρ„ΠΈΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π·Π° сутки

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ счСтчик Π²ΠΎΠ΄Ρ‹ ΠΊ ΡƒΠΌΠ½ΠΎΠΌΡƒ Π΄ΠΎΠΌΡƒ
Π’ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π½ΠΎΡ‡ΡŒΡŽ Π²ΠΎΠ΄ΠΎΠΉ ΠΏΠΎΡ‡Ρ‚ΠΈ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ пользовался. ΠŸΠ°Ρ€Ρƒ Ρ€Π°Π· ΠΊΡ‚ΠΎ-Ρ‚ΠΎ сходил Π² Ρ‚ΡƒΠ°Π»Π΅Ρ‚, ΠΈ, ΠΏΠΎΡ…ΠΎΠΆΠ΅ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ осмоса ΠΏΠ°Ρ€Ρƒ Π»ΠΈΡ‚Ρ€ΠΎΠ² Π·Π° Π½ΠΎΡ‡ΡŒ посасываСт. Π£Ρ‚Ρ€ΠΎΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ сущСствСнно возрастаСт. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ я ΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡΡŒ Π²ΠΎΠ΄ΠΎΠΉ ΠΈΠ· Π±ΠΎΠΉΠ»Π΅Ρ€Π°, Π½ΠΎ Ρ‚ΡƒΡ‚ я Π·Π°Ρ…ΠΎΡ‚Π΅Π» ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ Π²Π°Π½Π½ΡƒΡŽ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΠ» Π½Π° Π³ΠΎΡ€ΠΎΠ΄ΡΠΊΡƒΡŽ Π³ΠΎΡ€ΡΡ‡ΡƒΡŽ Π²ΠΎΠ΄Ρƒ β€” это Ρ‚Π°ΠΊΠΆΠ΅ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ Π½Π° Π½ΠΈΠΆΠ½Π΅ΠΌ Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅.

Из этого Π³Ρ€Π°Ρ„ΠΈΠΊΠ° я ΡƒΠ·Π½Π°Π», Ρ‡Ρ‚ΠΎ ΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² Ρ‚ΡƒΠ°Π»Π΅Ρ‚ это 6-7Π» Π²ΠΎΠ΄Ρ‹, ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ Π΄ΡƒΡˆ β€” 20-30Π», ΠΏΠΎΠΌΡ‹Ρ‚ΡŒ посуду ΠΎΠΊΠΎΠ»ΠΎ 20Π», Π° Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ Π²Π°Π½Π½ΡƒΡŽ Π½ΡƒΠΆΠ½ΠΎ 160Π». Π—Π° дСнь моя сСмья потрСбляСт Π³Π΄Π΅-Ρ‚ΠΎ ΠΎΠΊΠΎΠ»ΠΎ 500-600Π».

Для особо Π»ΡŽΠ±ΠΎΠ·Π½Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π² записи ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ счСтчик Π²ΠΎΠ΄Ρ‹ ΠΊ ΡƒΠΌΠ½ΠΎΠΌΡƒ Π΄ΠΎΠΌΡƒ

ΠžΡ‚ΡΡŽΠ΄Π° я ΡƒΠ·Π½Π°Π» Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΌ ΠΊΡ€Π°Π½Π΅ Π²ΠΎΠ΄Π° Ρ‚Π΅Ρ‡Π΅Ρ‚ со ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 1Π» Π·Π° 5с.

Но Π² Ρ‚Π°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅ статистику, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ. Π’ majordomo Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ возмоТности ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ потрСблСния ΠΏΠΎ дням, нСдСлям ΠΈ мСсяцам. Π’ΠΎΡ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π³Ρ€Π°Ρ„ΠΈΠΊ потрСблСния Π² столбиках

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ счСтчик Π²ΠΎΠ΄Ρ‹ ΠΊ ΡƒΠΌΠ½ΠΎΠΌΡƒ Π΄ΠΎΠΌΡƒ

Пока Ρƒ мСня Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π° нСдСлю. Π§Π΅Ρ€Π΅Π· мСсяц этот Π³Ρ€Π°Ρ„ΠΈΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ β€” ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ дню Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ столбик. НСмного ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Ρƒ портят ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²ΠΊΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я Π²Π²ΠΎΠΆΡƒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ (самый большой столбик). И ΠΏΠΎΠΊΠ° Π½Π΅ ясно, Ρ‚ΠΎ Π»ΠΈ я Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π·Π°Π΄Π°Π» самыС ΠΏΠ΅Ρ€Π²Ρ‹Π΅ значСния ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π° ΠΊΡƒΠ± мСньшС, Ρ‚ΠΎ Π»ΠΈ это Π±Π°Π³ Π² ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠ΅ ΠΈ Π½Π΅ всС Π»ΠΈΡ‚Ρ€Ρ‹ пошли Π² Π·Π°Ρ‡Π΅Ρ‚. НуТно большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Над самими Π³Ρ€Π°Ρ„ΠΈΠΊΠ°ΠΌΠΈ Π΅Ρ‰Π΅ ΠΏΠΎΠΊΠΎΠ»Π΄ΠΎΠ²Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½ΠΎ, ΠΏΠΎΠ±Π΅Π»ΠΈΡ‚ΡŒ, ΠΏΠΎΠΊΡ€Π°ΡΠΈΡ‚ΡŒ. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ я Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Ρƒ Π² ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹Ρ… цСлях ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π³Ρ€Π°Ρ„ΠΈΠΊ потрСблСния памяти β€” Π²Π΄Ρ€ΡƒΠ³ Ρ‚Π°ΠΌ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΡƒΡ‚Π΅ΠΊΠ°Π΅Ρ‚. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Ρƒ ΠΊΠ°ΠΊ-Ρ‚ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Ρ‹, ΠΊΠΎΠ³Π΄Π° отсутствовал ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚. Пока всС это крутится Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΈΠ΄Π΅ΠΈ.

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

БСгодня моя ΠΊΠ²Π°Ρ€Ρ‚ΠΈΡ€Π° стала Ρ‡ΡƒΡ‚ΠΎΡ‡ΠΊΡƒ ΡƒΠΌΠ½Π΅Π΅. Π‘ Ρ‚Π°ΠΊΠΈΠΌ нСбольшим устройством ΠΌΠ½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ΠΌ Π²ΠΎΠ΄Ρ‹ Π² Π΄ΠΎΠΌΠ΅. Если Ρ€Π°Π½ΡŒΡˆΠ΅ я возмущался β€œΠΎΠΏΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΠΎΠ΄Ρ‹ Π·Π° мСсяц потрСбили”, Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ я смогу Π½Π°ΠΉΡ‚ΠΈ источник этого потрСблСния.

ΠšΠΎΠΌΡƒ-Ρ‚ΠΎ покаТСтся странным ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ показания Π½Π° экранС, Ссли ΠΎΠ½ Π² ΠΌΠ΅Ρ‚Ρ€Π΅ ΠΎΡ‚ самого счСтчика. Но Π² Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΠΎΡ‚Π΄Π°Π»Π΅Π½Π½ΠΎΠΌ Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ я ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΡΠ΅Π»ΠΈΡ‚ΡŒΡΡ Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΊΠ²Π°Ρ€Ρ‚ΠΈΡ€Ρƒ, Π³Π΄Π΅ Π±ΡƒΠ΄Π΅Ρ‚ нСсколько стояков Π²ΠΎΠ΄Ρ‹, Π° сами счСтчики, скорСС всСго, Π±ΡƒΠ΄ΡƒΡ‚ располоТСны Π½Π° лСстничной ΠΏΠ»ΠΎΡ‰Π°Π΄ΠΊΠ΅. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ устройство ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ снятия ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΈΠΉ Π±ΡƒΠ΄Π΅Ρ‚ вСсьма кстати.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ устройства я Ρ‚ΠΎΠΆΠ΅ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΡŽ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ. Π― ΡƒΠΆΠ΅ ΠΏΡ€ΠΈΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡΡŒ ΠΊ ΠΌΠΎΡ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ вСнтилям. БСйчас для ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±ΠΎΠΉΠ»Π΅Ρ€-городская Π²ΠΎΠ΄Π° ΠΌΠ½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ 3 ΠΊΡ€Π°Π½Π° Π² труднодоступной нишС. Π‘Ρ‹Π»ΠΎ Π±Ρ‹ Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ это ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ. Ну ΠΈ, само собой, Π·Π°Ρ‰ΠΈΡ‚Ρƒ ΠΎΡ‚ ΠΏΡ€ΠΎΡ‚Π΅Ρ‡Π΅ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΡ‚ΠžΠΈΡ‚.

Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ я рассказал свой Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ устройства Π½Π° Π±Π°Π·Π΅ ESP8266. На ΠΌΠΎΠΉ взгляд Ρƒ мСня получился вСсьма интСрСсный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ Π½Π° micropython с использованиСм ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½ β€” просто ΠΈ симпатично. Π― постарался ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ мноТСство нюансов ΠΈ косяков, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ столкнулся ΠΏΠΎΡ…ΠΎΠ΄Ρƒ. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ я слишком Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ всС описывал, Π»ΠΈΡ‡Π½ΠΎ ΠΌΠ½Π΅ ΠΊΠ°ΠΊ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŽ ΠΏΡ€ΠΎΡ‰Π΅ ΠΏΡ€ΠΎΠΌΠΎΡ‚Π°Ρ‚ΡŒ лишнСС, Ρ‡Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΌ Π΄ΠΎΠ΄ΡƒΠΌΡ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ нСдосказано.

Как всСгда я ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ для конструктивной ΠΊΡ€ΠΈΡ‚ΠΈΠΊΠΈ.

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

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

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ