αž™αžΎαž„αž—αŸ’αž‡αžΆαž”αŸ‹αž˜αŸ‰αŸ‚αžαŸ’αžšαž‘αžΉαž€αž‘αŸ…αž“αžΉαž„αž•αŸ’αž‘αŸ‡αž†αŸ’αž›αžΆαžαžœαŸƒ

αž˜αŸ’αžαž„αž“αŸαŸ‡ αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž€αž˜αŸ’αž˜αžαžΆαž˜αž•αŸ’αž‘αŸ‡ ឬ "αž•αŸ’αž‘αŸ‡αž†αŸ’αž›αžΆαž" αžŠαžΌαž…αžŠαŸ‚αž›αž‚αŸαž αŸ…αž‡αžΆαž‰αžΉαž€αž‰αžΆαž”αŸ‹ αž˜αžΆαž“αžαž˜αŸ’αž›αŸƒαžαŸ’αž›αŸƒαžŽαžΆαžŸαŸ‹ αž αžΎαž™αž˜αžΆαž“αžαŸ‚αž’αŸ’αž“αž€αž˜αžΆαž“αž‘αŸαžŠαŸ‚αž›αž’αžΆαž…αž‘αž·αž‰αžœαžΆαž”αžΆαž“αŸ” αžŸαž–αŸ’αžœαžαŸ’αž„αŸƒαž“αŸαŸ‡αž“αŸ…αž›αžΎαž‘αžΈαž•αŸ’αžŸαžΆαžš αž’αŸ’αž“αž€αž’αžΆαž…αžšαž€αžƒαžΎαž‰αž§αž”αž€αžšαžŽαŸαžŠαŸ‚αž›αž˜αžΆαž“αžαž˜αŸ’αž›αŸƒαžαŸ„αž€αžŸαž˜αžšαž˜αŸ’αž™αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž§αž”αž€αžšαžŽαŸαž…αžΆαž”αŸ‹αžŸαž‰αŸ’αž‰αžΆ αž”αŸŠαžΌαžαž»αž„/αž€αž»αž„αžαžΆαž€αŸ‹ αž“αž·αž„αž§αž”αž€αžšαžŽαŸαž…αžΆαž”αŸ‹αžŸαž‰αŸ’αž‰αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž–αž“αŸ’αž›αžΊ αžšαž“αŸ’αž’ αžαŸ’αž™αž›αŸ‹ αž€αžΆαžšαž•αŸ’αž‚αžαŸ‹αž•αŸ’αž‚αž„αŸ‹αž‘αžΉαž€ αž“αž·αž„αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ” αž αžΎαž™αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αž˜αž“αž»αžŸαŸ’αžŸ DIY αžŠαŸαž…αŸ’αžšαž›αŸ†αž”αŸ†αž•αž»αžαž€αŸαž’αžΆαž…αž…αžΌαž›αžšαž½αž˜αž€αŸ’αž“αž»αž„αž—αžΆαž–αžŸαŸ’αžšαžŸαŸ‹αžŸαŸ’αž’αžΆαž αž“αž·αž„αž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ†αž§αž”αž€αžšαžŽαŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž•αŸ’αž‘αŸ‡αž†αŸ’αž›αžΆαžαžœαŸƒαž€αŸ’αž“αž»αž„αžαž˜αŸ’αž›αŸƒαžŸαž˜αžšαž˜αŸ’αž™αŸ”

αž™αžΎαž„αž—αŸ’αž‡αžΆαž”αŸ‹αž˜αŸ‰αŸ‚αžαŸ’αžšαž‘αžΉαž€αž‘αŸ…αž“αžΉαž„αž•αŸ’αž‘αŸ‡αž†αŸ’αž›αžΆαžαžœαŸƒ

αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆ αž§αž”αž€αžšαžŽαŸαžŠαŸ‚αž›αž”αžΆαž“αžŸαŸ’αž“αžΎαž‘αžΎαž„αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαž…αžΆαž”αŸ‹αžŸαž‰αŸ’αž‰αžΆ αž¬αž§αž”αž€αžšαžŽαŸαž…αžΆαž”αŸ‹αžŸαž‰αŸ’αž‰αžΆαŸ” αž–αž½αž€αž‚αŸαž’αŸ’αžœαžΎαž±αŸ’αž™αž˜αžΆαž“αž—αžΆαž–αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžŸαŸαžŽαžΆαžšαžΈαž™αŸ‰αžΌαžŠαžΌαž…αž‡αžΆ "αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž§αž”αž€αžšαžŽαŸαž…αžΆαž”αŸ‹αžŸαž‰αŸ’αž‰αžΆαž…αž›αž“αžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸαŸ‡ αž”αžΎαž€αž—αŸ’αž›αžΎαž„" ឬ "αž€αž»αž„αžαžΆαž€αŸ‹αž“αŸ…αž‡αž·αžαž…αŸ’αžšαž€αž…αŸαž‰αž“αžΉαž„αž”αž·αž‘αž—αŸ’αž›αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž‘αŸ‡αž›αŸ’αžœαŸ‚αž„αž‘αžΆαŸ†αž„αž˜αžΌαž›"αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αž’αŸ’αžœαžΈβ€‹αŸ—β€‹αž˜αž·αž“β€‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšβ€‹αž‡αžΆαž˜αž½αž™β€‹αž“αžΉαž„β€‹αžαŸαž‘αŸαž˜αŸ‰αŸ‚αžαŸ’αžšβ€‹αž‘αŸαŸ” αž›αŸ’αž’αž”αŸ†αž•αž»αž αžœαžΆαž‡αžΆαž€αŸ’αžšαžΆαž αŸ’αžœαž“αŸƒαžŸαžΈαžαž»αžŽαŸ’αž αž—αžΆαž– αž“αž·αž„αžŸαŸ†αžŽαžΎαž˜ αž¬αžαžΆαž˜αž–αž›αž—αŸ’αž›αžΆαž˜αŸ—αž“αŸ…αž–αŸ’αžšαžΈαž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αŸ”

αžαŸ’αž˜αžΈαŸ—αž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αž˜αŸ‰αŸ‚αžαŸ’αžšαž‘αžΉαž€αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž‘αž·αž“αŸ’αž“αž•αž›αž‡αžΈαž–αž…αžšαŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαžΆαž›αŸ‹αž›αžΈαžαŸ’αžšαžŠαŸ‚αž›αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž˜αŸ‰αŸ‚αžαŸ’αžš αž€αž»αž„αžαžΆαž€αŸ‹ Reed αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž±αŸ’αž™αžŸαž€αž˜αŸ’αž˜ αž“αž·αž„αž”αž·αž‘αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αŸ” αžšαžΏαž„αžαŸ‚αž˜αž½αž™αž‚αžαŸ‹αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαž‚αžΊαž€αžΆαžšαžαŸ„αž„αžαŸ’αžŸαŸ‚αž—αŸ’αž›αžΎαž„αž αžΎαž™αž–αŸ’αž™αžΆαž™αžΆαž˜αž‘αž‘αž½αž›αž”αžΆαž“αž’αžαŸ’αžαž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž–αžΈαžœαžΆαŸ” αž§αž‘αžΆαž αžšαžŽαŸ αžœαž·αž—αžΆαž‚αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‘αžΉαž€αžαžΆαž˜αž˜αŸ‰αŸ„αž„ αž“αž·αž„αžαŸ’αž„αŸƒαž“αŸƒαžŸαž”αŸ’αžαžΆαž αŸαŸ” αž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαžŽαžΆαžŸαŸ‹ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αžΆαž“αž’αŸ’αž“αž€αž‘αžΎαž„αž‘αžΉαž€αž‡αžΆαž…αŸ’αžšαžΎαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžΆαž•αžΆαžαž˜αž·αž“ αž“αŸ„αŸ‡αžœαžΆαž„αžΆαž™αžŸαŸ’αžšαž½αž›αž‡αžΆαž„αž€αŸ’αž“αž»αž„αž€αžΆαžšαž˜αžΎαž›αžŸαžΌαž…αž“αžΆαž€αžšαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ…αž›αžΎαž’αŸαž€αŸ’αžšαž„αŸ‹αžαŸ‚αž˜αž½αž™ αž‡αžΆαž‡αžΆαž„αž€αžΆαžšαž‘αžΎαž„αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αž“αŸ’αž›αŸ‚αž„αž–αž·αž”αžΆαž€αž‘αŸ…αžŠαž›αŸ‹αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αž·αž›αŸ”

αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž€αžΆαžšαž€αžΆαžαŸ‹αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž€αŸ†αžŽαŸ‚αž§αž”αž€αžšαžŽαŸαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎ ESP8266 αžŠαŸ‚αž›αžšαžΆαž”αŸ‹αž‡αžΈαž–αž…αžšαž–αžΈαž˜αŸ‰αŸ‚αžαŸ’αžšαž‘αžΉαž€ αž“αž·αž„αž•αŸ’αž‰αžΎαž€αžΆαžšαž’αžΆαž“αžαžΆαž˜αžšαž™αŸˆ MQTT αž‘αŸ…αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž•αŸ’αž‘αŸ‡αž†αŸ’αž›αžΆαžαžœαŸƒαŸ” αž™αžΎαž„αž“αžΉαž„αžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‡αžΆ micropython αžŠαŸ„αž™αž”αŸ’αžšαžΎαž”αžŽαŸ’αžŽαžΆαž›αŸαž™ uasyncio αŸ” αž“αŸ…αž–αŸαž›αž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž„αŸ’αž€αž”αŸ‹ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž‡αž½αž”αž”αŸ’αžšαž‘αŸ‡αž€αžΆαžšαž›αŸ†αž”αžΆαž€αž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž‡αžΆαž…αŸ’αžšαžΎαž“ αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž•αž„αžŠαŸ‚αžšαŸ” αž‘αŸ…!

αž‚αž˜αŸ’αžšαŸ„αž„αž“αŸαŸ‡

αž™αžΎαž„αž—αŸ’αž‡αžΆαž”αŸ‹αž˜αŸ‰αŸ‚αžαŸ’αžšαž‘αžΉαž€αž‘αŸ…αž“αžΉαž„αž•αŸ’αž‘αŸ‡αž†αŸ’αž›αžΆαžαžœαŸƒ

αž”αŸαŸ‡αžŠαžΌαž„αž“αŸƒαžŸαŸ€αž‚αŸ’αžœαžΈαž‘αžΆαŸ†αž„αž˜αžΌαž›αž‚αžΊαž‡αžΆαž˜αŸ‰αžΌαžŒαž»αž›αž“αŸ…αž›αžΎ microcontroller ESP8266 αŸ” ESP-12 αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž‚αŸβ€‹αž‚αŸ’αžšαŸ„αž„β€‹αž‘αž»αž€β€‹αž–αžΈβ€‹αžŠαŸ†αž”αžΌαž„ αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αž˜αžΈαž“β€‹αž”αžΆαž“β€‹αž”αŸ’αžšαŸ‚β€‹αž‘αŸ…β€‹αž‡αžΆβ€‹αž˜αžΆαž“β€‹αž”αž‰αŸ’αž αžΆαŸ” αž™αžΎαž„αžαŸ’αžšαžΌαžœαžαŸ‚αž–αŸαž‰αž…αž·αžαŸ’αžαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž˜αŸ‰αžΌαžŒαž»αž› ESP-07 αžŠαŸ‚αž›αž’αžΆαž…αž”αŸ’αžšαžΎαž”αžΆαž“αŸ” αž‡αžΆαžŸαŸ†αžŽαžΆαž„αž›αŸ’αž’ αž–αž½αž€αžœαžΆαžŠαžΌαž…αž‚αŸ’αž“αžΆαž‘αžΆαŸ†αž„αž•αŸ’αž“αŸ‚αž€αž˜αŸ’αž‡αž»αž› αž“αž·αž„αž˜αž»αžαž„αžΆαžš αž—αžΆαž–αžαž»αžŸαž‚αŸ’αž“αžΆαžαŸ‚αž˜αž½αž™αž‚αžαŸ‹αž‚αžΊαž“αŸ…αž€αŸ’αž“αž»αž„αž’αž„αŸ‹αžαŸ‚αž“ - ESP-12 αž˜αžΆαž“αž—αŸ’αž‡αžΆαž”αŸ‹αž˜αž€αž‡αžΆαž˜αž½αž™αž˜αž½αž™ ខណៈ ESP-07 αž˜αžΆαž“αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ…αŸ” αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž˜αž·αž“αž˜αžΆαž“αž’αž„αŸ‹αžαŸ‚αž“αžœαŸ‰αžΆαž™αž αŸ’αžœαžΆαž™αž€αŸαžŠαŸ„αž™ αž€αŸαžŸαž‰αŸ’αž‰αžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž”αž“αŸ’αž‘αž”αŸ‹αž‘αžΉαž€αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αž‘αž½αž›αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαŸ”

αžαŸ’αžŸαŸ‚αž—αŸ’αž›αžΎαž„αž˜αŸ‰αžΌαžŒαž»αž›αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαŸ–

  • αž”αŸŠαžΌαžαž»αž„αž€αŸ†αžŽαžαŸ‹αž‘αžΎαž„αžœαž·αž‰αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž‘αžΆαž‰αž‘αžΎαž„αž“αž·αž„ capacitor (αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž‘αžΆαŸ†αž„αž–αžΈαžšαž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αŸ‰αžΌαžŒαž»αž›αžšαž½αž…αž αžΎαž™)
  • αžŸαž‰αŸ’αž‰αžΆαž”αžΎαž€ (CH_PD) αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αžΆαž‰αž‘αžΎαž„αžŠαžΎαž˜αŸ’αž”αžΈαžαžΆαž˜αž–αž›
  • GPIO15 αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αžΆαž‰αž‘αŸ…αžŠαžΈαŸ” αž“αŸαŸ‡αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž‡αžΆαž€αžΆαžšαž…αžΆαŸ†αž”αžΆαž…αŸ‹αž“αŸ…αž–αŸαž›αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ’αž‰αž»αŸ†αž“αŸ…αžαŸ‚αž˜αž·αž“αž˜αžΆαž“αž’αŸ’αžœαžΈαž‡αžΆαž”αŸ‹αž“αžΉαž„αž‡αžΎαž„αž“αŸαŸ‡αž‘αŸ αžαŸ’αž‰αž»αŸ†αž›αŸ‚αž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαžœαžΆαž‘αŸ€αžαž αžΎαž™

αžŠαžΎαž˜αŸ’αž”αžΈαžŠαžΆαž€αŸ‹αž˜αŸ‰αžΌαžŒαž»αž›αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αžšαž”αŸ€αž”αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž„αŸ’αž€αž”αŸ‹ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžαŸ‹αžŸαŸ€αž‚αŸ’αžœαžΈαžαŸ’αž›αžΈ GPIO2 αž‘αŸ…αžŠαžΈ αž αžΎαž™αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αžœαžΆαž€αžΆαž“αŸ‹αžαŸ‚αž„αžΆαž™αžŸαŸ’αžšαž½αž› αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž•αŸ’αžŠαž›αŸ‹αž”αŸŠαžΌαžαž»αž„αž…αžΆαž”αŸ‹αž•αŸ’αžŠαžΎαž˜αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž’αž˜αŸ’αž˜αžαžΆ αž˜αŸ’αž‡αž»αž›αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αžΆαž‰αž‘αŸ…αžαžΆαž˜αž–αž›αŸ”

αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸƒαžαŸ’αžŸαŸ‚ GPIO2 αžαŸ’αžšαžΌαžœαž”αžΆαž“αž–αž·αž“αž·αžαŸ’αž™αžαŸ‚αž“αŸ…αž–αŸαž›αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš - αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžαžΆαž˜αž–αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αž αž¬αž—αŸ’αž›αžΆαž˜αŸ—αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž‘αžΎαž„αžœαž·αž‰αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž˜αŸ‰αžΌαžŒαž»αž›αž…αžΆαž”αŸ‹αž•αŸ’αžŠαžΎαž˜αžŠαžΌαž…αž’αž˜αŸ’αž˜αžαžΆ αž¬αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αžšαž”αŸ€αž”αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž„αŸ’αž€αž”αŸ‹αŸ” αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αž‘αž»αž€ αž˜αŸ’αž‡αž»αž›αž“αŸαŸ‡αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž‡αžΆ GPIO αž’αž˜αŸ’αž˜αžαžΆαŸ” αž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαžŽαžΆαžŸαŸ‹ αžŠαŸ„αž™αžŸαžΆαžšαž˜αžΆαž“αž”αŸŠαžΌαžαž»αž„αž“αŸ…αž‘αžΈαž“αŸ„αŸ‡αžšαž½αž…αž αžΎαž™ αž’αŸ’αž“αž€αž’αžΆαž…αž—αŸ’αž‡αžΆαž”αŸ‹αž˜αž»αžαž„αžΆαžšαž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž˜αž½αž™αž…αŸ†αž“αž½αž“αž‘αŸ…αžœαžΆαŸ”

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αž“αž·αž„αž€αžΆαžšαž”αŸ†αž”αžΆαžαŸ‹αž€αŸ†αž αž»αžŸ αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž”αŸ’αžšαžΎ UART αžŠαŸ‚αž›αž‡αžΆαž›αž‘αŸ’αž’αž•αž›αž‘αŸ…αž‡αžΆαžŸαž·αžαžŸαž€αŸ‹αŸ” αž“αŸ…αž–αŸαž›αž…αžΆαŸ†αž”αžΆαž…αŸ‹ αžαŸ’αž‰αž»αŸ†αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž—αŸ’αž‡αžΆαž”αŸ‹αž’αžΆαžŠαžΆαž”αŸ‹αž‘αŸαžš USB-UART αž“αŸ…αž‘αžΈαž“αŸ„αŸ‡αŸ” αž’αŸ’αž“αž€αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžαŸ’αžšαžΌαžœαž…αžΆαŸ†αžαžΆαž˜αŸ‰αžΌαžŒαž»αž›αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ†αž–αžΆαž€αŸ‹αžŠαŸ„αž™ 3.3V αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž—αŸ’αž›αŸαž…αž”αŸ’αžαžΌαžšαž’αžΆαžŠαžΆαž”αŸ‹αž‘αŸαžšαž‘αŸ…αžœαŸ‰αž»αž›αž“αŸαŸ‡ αž“αž·αž„αž•αŸ’αž‚αžαŸ‹αž•αŸ’αž‚αž„αŸ‹ 5V αž“αŸ„αŸ‡αž˜αŸ‰αžΌαžŒαž»αž›αž‘αŸ†αž“αž„αž‡αžΆαž“αžΉαž„αž†αŸαŸ‡αŸ”

αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž˜αžΆαž“αž”αž‰αŸ’αž αžΆαž‡αžΆαž˜αž½αž™αž’αž‚αŸ’αž‚αžΈαžŸαž“αžΈαž“αŸ…αž€αŸ’αž“αž»αž„αž”αž“αŸ’αž‘αž”αŸ‹αž‘αžΉαž€αž‘αŸ - αž–αŸ’αžšαžΈαž˜αžΆαž“αž‘αžΈαžαžΆαŸ†αž„αž“αŸ…αž”αŸ’αžšαž αŸ‚αž›αž˜αž½αž™αž˜αŸ‰αŸ‚αžαŸ’αžšαž–αžΈαž˜αŸ‰αŸ‚αžαŸ’αžšαžŠαžΌαž…αŸ’αž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ†αž–αžΆαž€αŸ‹αžŠαŸ„αž™ 220V αŸ” αž€αŸ’αž“αž»αž„αž“αžΆαž˜αž‡αžΆαž”αŸ’αžšαž—αž–αžαžΆαž˜αž–αž›αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž˜αžΆαž“αžαžΌαž…αž˜αž½αž™ αž”αŸ’αž›αž»αž€ HLK-PM03 αžŠαŸ„αž™ Tenstar Robot αŸ” αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž‰αž»αŸ†αž˜αžΆαž“αž€αžΆαžšαž›αŸ†αž”αžΆαž€αž‡αžΆαž˜αž½αž™αž§αž”αž€αžšαžŽαŸαž’αŸαž‘αž·αž…αžαŸ’αžšαžΌαž“αž·αž€αž’αžΆαžŽαžΆαž‘αžΌαž€αž“αž·αž„αžαžΆαž˜αž–αž›αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž‚αžΊαž‡αžΆαž€αžΆαžšαž•αŸ’αž‚αžαŸ‹αž•αŸ’αž‚αž„αŸ‹αžαžΆαž˜αž–αž›αžŠαŸ‚αž›αžαŸ’αžšαŸ€αž˜αžšαž½αž…αž‡αžΆαžŸαŸ’αžšαŸαž…αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžαžΌαž…αž˜αž½αž™αŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αžαž›αŸ‹αžŸαž‰αŸ’αž‰αžΆαžšαž”αŸ€αž”αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž•αŸ’αžŠαž›αŸ‹ LED αžŠαŸ‚αž›αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ… GPIO2αŸ” αž‘αŸ„αŸ‡β€‹αž‡αžΆβ€‹αž™αŸ‰αžΆαž„β€‹αžŽαžΆβ€‹αž€αŸβ€‹αžŠαŸ„αž™ αžαŸ’αž‰αž»αŸ†β€‹αž˜αž·αž“β€‹αž”αžΆαž“β€‹αžŠαŸ„αŸ‡β€‹αžŸαŸ’αžšαžΆαž™β€‹αž‘αŸ αž–αŸ’αžšαŸ„αŸ‡... αž˜αŸ‰αžΌαžŒαž»αž› ESP-07 αž˜αžΆαž“ LED αžšαž½αž…αž αžΎαž™ αž αžΎαž™αžœαžΆαž€αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ… GPIO2 αž•αž„αžŠαŸ‚αžšαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αžœαžΆαž“αŸ…αž›αžΎαž€αŸ’αžαžΆαžšαž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž”αž‰αŸ’αž…αŸαž‰ LED αž“αŸαŸ‡αž‘αŸ…αž€αžšαžŽαžΈαŸ”

αž…αžΌαžšαž”αž“αŸ’αžαž‘αŸ…αž•αŸ’αž“αŸ‚αž€αžŠαŸ‚αž›αž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž”αŸ†αž•αž»αžαŸ” αž˜αŸ‰αŸ‚αžαŸ’αžšαž‘αžΉαž€αž˜αž·αž“αž˜αžΆαž“αžαž€αŸ’αž€αžœαž·αž‡αŸ’αž‡αžΆαž‘αŸ αž’αŸ’αž“αž€αž˜αž·αž“αž’αžΆαž…αžŸαž»αŸ†αž±αŸ’αž™αž–αž½αž€αž‚αŸαž’αžΆαž“αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž”αžΆαž“αž‘αŸαŸ” αžšαžΏαž„αžαŸ‚αž˜αž½αž™αž‚αžαŸ‹αžŠαŸ‚αž›αž˜αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž™αžΎαž„αž‚αžΊαž€αžΆαžšαž‡αŸ†αžšαž»αž‰ - αž”αž·αž‘αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αž“αŸƒαž€αž»αž„αžαžΆαž€αŸ‹ Reed αžšαŸ€αž„αžšαžΆαž›αŸ‹αž›αžΈαžαŸ’αžšαŸ” αž‘αž·αž“αŸ’αž“αž•αž›αž€αž»αž„αžαžΆαž€αŸ‹ Reed αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αžαŸ’αžšαžΌαžœαž”αžΆαž“αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ… GPIO12/GPIO13αŸ” αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš resistor αž‘αžΆαž‰αž‘αžΎαž„αžαžΆαž˜αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αŸ…αžαžΆαž„αž€αŸ’αž“αž»αž„αž˜αŸ‰αžΌαžŒαž»αž›αŸ”

αžŠαŸ†αž”αžΌαž„β€‹αž‘αžΎαž™ αžαŸ’αž‰αž»αŸ†β€‹αž—αŸ’αž›αŸαž…β€‹αž•αŸ’αžαž›αŸ‹β€‹αž§αž”αž€αžšαžŽαŸβ€‹αž‘αž”αŸ‹αž‘αž›αŸ‹ R8 αž“αž·αž„ R9 αž αžΎαž™β€‹αž€αŸ’αžαžΆαžšβ€‹αž”αž“αŸ’αž‘αŸ‡β€‹αžšαž”αžŸαŸ‹β€‹αžαŸ’αž‰αž»αŸ†β€‹αž˜αž·αž“β€‹αž˜αžΆαž“β€‹αžœαžΆβ€‹αž‘αŸαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚ αžŠαŸ„αž™αžŸαžΆαžšβ€‹αžαŸ’αž‰αž»αŸ†β€‹αž”αžΆαž“β€‹αž”αž„αŸ’αž αŸ„αŸ‡β€‹αžŠαŸ’αž™αžΆαž€αŸ’αžšαžΆαž˜β€‹αž²αŸ’αž™β€‹αž’αŸ’αž“αž€β€‹αžšαžΆαž›αŸ‹β€‹αž‚αŸ’αž“αžΆβ€‹αž˜αžΎαž›β€‹αžšαž½αž…β€‹αž αžΎαž™ αžœαžΆβ€‹αž‚αž½αžšβ€‹αžαŸ‚β€‹αž€αŸ‚β€‹αžαž˜αŸ’αžšαžΌαžœβ€‹αž€αžΆαžšβ€‹αžαŸ’αžšαž½αžβ€‹αž–αž·αž“αž·αžαŸ’αž™β€‹αž“αŸαŸ‡αŸ” Resistors αž‚αžΊαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž€αž»αŸ†αž±αŸ’αž™αž†αŸαŸ‡αž…αŸ’αžšαž€ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž„αŸ’αž€αž”αŸ‹αž˜αžΆαž“αž”αž‰αŸ’αž αžΆ αž αžΎαž™αž€αŸ†αžŽαžαŸ‹αž˜αŸ’αž‡αž»αž›αž‘αŸ…αž˜αž½αž™ αž αžΎαž™ Reed switch αž€αžΆαžαŸ‹αžαŸ’αžŸαŸ‚αž“αŸαŸ‡αž‘αŸ…αžŠαžΈ (αž‡αžΆαž˜αž½αž™αž“αžΉαž„ resistor αž’αžαž·αž”αžšαž˜αžΆ 3.3V/1000Ohm = 3.3mA αž“αžΉαž„αž αžΌαžš)αŸ”

αžœαžΆαžŠαž›αŸ‹αž–αŸαž›αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αž·αžαž’αŸ†αž–αžΈαž’αŸ’αžœαžΈαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αž‚αŸ’αž‚αž·αžŸαž“αžΈαžšαž›αžαŸ‹αŸ” αž‡αž˜αŸ’αžšαžΎαžŸαžŠαŸ†αž”αžΌαž„αž‚αžΊαžαŸ’αžšαžΌαžœαžŸαŸ’αž“αžΎαžŸαž»αŸ†αžαž˜αŸ’αž›αŸƒαžšαžΆαž”αŸ‹αžŠαŸ†αž”αžΌαž„αž–αžΈαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž“αŸ…αž–αŸαž›αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸαŸ‡αž“αžΉαž„αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αž˜αžΆαž“αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž™αŸ‰αžΆαž„αžŸαŸ†αžαžΆαž“αŸ‹αž“αŸƒαž–αž·αž’αžΈαž€αžΆαžšαž”αŸ’αžαžΌαžšαž”αŸ’αžšαžΆαž€αŸ‹αŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡αž‘αŸ…αž‘αŸ€αž αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžšαž”αžŸαŸ‹αž§αž”αž€αžšαžŽαŸαž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡αž‚αžΊαž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαžŸαŸ’αžαžΆαž“αž—αžΆαž–αžšαž”αžŸαŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž˜αž·αž“αž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαž”αž·αž‘αžαžΆαž˜αž–αž› (αž¬αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž“αŸ…αž–αŸαž›αž€αŸ’αžšαŸ„αž™) αž“αŸ„αŸ‡αž˜αŸ‰αŸ‚αžαŸ’αžšαž‘αžΉαž€αž“αžΉαž„αž˜αž·αž“αž’αžΆαž…αžŸαŸ’αž“αžΎαžŸαž»αŸ†αžαž˜αŸ’αž›αŸƒαžŠαŸ†αž”αžΌαž„αž”αžΆαž“αž‘αŸ αž αžΎαž™αž“αžΉαž„αž˜αž·αž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαŸ”

αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž αžΎαž™ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαžŸαž“αŸ’αžŸαŸ†αžαž˜αŸ’αž›αŸƒαžšαžΆαž”αŸ‹αž€αŸ’αž“αž»αž„αž”αž“αŸ’αž‘αŸ‡αžˆαžΈαž”αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ†αžŠαŸ‚αž›αž—αŸ’αž‡αžΆαž”αŸ‹αžαžΆαž˜αžšαž™αŸˆ I2C αŸ” αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž˜αžΆαž“αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž–αž·αžŸαŸαžŸαžŽαžΆαž˜αž½αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‘αŸ†αž αŸ†αž“αŸƒαž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ†αž–αž“αŸ’αž›αžΊαž‘αŸ - αž’αŸ’αž“αž€αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžαŸ’αžšαžΌαžœαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž›αŸαž 2 αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡ (αž…αŸ†αž“αž½αž“αž›αžΈαžαŸ’αžšαž™αŸ„αž„αž‘αŸ…αžαžΆαž˜αž˜αŸ‰αŸ‚αžαŸ’αžšαž‘αžΉαž€αž€αŸ’αžαŸ…αž“αž·αž„αžαŸ’αžšαž‡αžΆαž€αŸ‹) αŸ” αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αž˜αŸ‰αžΌαžŒαž»αž›αžαžΌαž…αž”αŸ†αž•αž»αžαž“αžΉαž„αž’αŸ’αžœαžΎαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹αž›αžΎαž…αŸ†αž“αž½αž“αžœαžŠαŸ’αžαž“αŸƒαž€αžΆαžšαžαžαŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αŸ‰αžΌαžŒαž»αž›αž—αžΆαž‚αž…αŸ’αžšαžΎαž“αž“αŸαŸ‡αž‚αžΊ 100 αž–αžΆαž“αŸ‹αžœαžŠαŸ’αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αž½αž™αž…αŸ†αž“αž½αž“αžšαž αžΌαžαžŠαž›αŸ‹αž˜αž½αž™αž›αžΆαž“αŸ”

αžœαžΆαž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαžαžΆαž˜αž½αž™αž›αžΆαž“αž‚αžΊαž…αŸ’αžšαžΎαž“αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž› 4 αž†αŸ’αž“αžΆαŸ†αž“αŸƒαž€αžΆαžšαžšαžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž‘αŸ‡αž›αŸ’αžœαŸ‚αž„αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‘αžΉαž€αž…αŸ’αžšαžΎαž“αž‡αžΆαž„ 500 αž˜αŸ‰αŸ‚αžαŸ’αžšαž‚αžΌαž”αž‚αžΊ 500 αž–αžΆαž“αŸ‹αž›αžΈαžαŸ’αžš! αž“αž·αž„ 500 αž–αžΆαž“αŸ‹αž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž–αž“αŸ’αž›αžΊαŸ” αž αžΎαž™αž“αŸ„αŸ‡αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž‡αžΆαž‘αžΉαž€αžαŸ’αžšαž‡αžΆαž€αŸ‹αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αž‡αžΆβ€‹αž€αžΆαžšβ€‹αž–αž·αžβ€‹αžŽαžΆαžŸαŸ‹ αž’αŸ’αž“αž€β€‹αž’αžΆαž…β€‹αž›αž€αŸ‹β€‹αž”αž“αŸ’αž‘αŸ‡β€‹αžˆαžΈαž”β€‹αž‡αžΆβ€‹αžšαŸ€αž„β€‹αžšαžΆαž›αŸ‹β€‹αž–αžΈαžšβ€‹αž†αŸ’αž“αžΆαŸ†β€‹αž˜αŸ’αžαž„ αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αžœαžΆβ€‹αž”αŸ’αžšαŸ‚β€‹αžαžΆβ€‹αž˜αžΆαž“β€‹αž”αž“αŸ’αž‘αŸ‡β€‹αžˆαžΈαž” FRAMαŸ” αžαžΆαž˜αž‘αžŸαŸ’αžŸαž“αŸˆαž“αŸƒαž€αžΆαžšαžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αž“αŸαŸ‡αž‚αžΊαž‡αžΆ I2C EEPROM αžŠαžΌαž…αž‚αŸ’αž“αžΆ αžαŸ‚αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž…αŸ†αž“αž½αž“αžŠαŸαž…αŸ’αžšαžΎαž“αž“αŸƒαžœαžŠαŸ’αžαž“αŸƒαž€αžΆαžšαžŸαžšαžŸαŸαžšαž‘αžΎαž„αžœαž·αž‰ (αžšαžΆαž”αŸ‹αžšαž™αž›αžΆαž“)αŸ” αžœαžΆαž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžαžΆαžαŸ’αž‰αž»αŸ†αž“αŸ…αžαŸ‚αž˜αž·αž“αž’αžΆαž…αž‘αŸ…αžŠαž›αŸ‹αž αžΆαž„αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž˜αžΈαž€αŸ’αžšαžΌαžŸαŸ€αž‚αŸ’αžœαžΈαž”αŸ‚αž”αž“αŸαŸ‡ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αŸαž›αž“αŸαŸ‡ 24LC512 αž’αž˜αŸ’αž˜αžαžΆαž“αžΉαž„αžˆαžšαŸ”

αž”αž“αŸ’αž‘αŸ‡αžŸαŸ€αž‚αŸ’αžœαžΈαžŠαŸ‚αž›αž”αžΆαž“αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–

αžŠαŸ†αž”αžΌαž„β€‹αž‘αžΎαž™ αžαŸ’αž‰αž»αŸ†β€‹αž˜αžΆαž“β€‹αž‚αž˜αŸ’αžšαŸ„αž„β€‹αž’αŸ’αžœαžΎβ€‹αž€αŸ’αžαžΆαžšβ€‹αž“αŸ…β€‹αž•αŸ’αž‘αŸ‡αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž”αž“αŸ’αž‘αŸ‡αž€αŸ’αžαžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž…αž“αžΆαž‡αžΆαž•αŸ’αž“αŸ‚αž€αž˜αŸ’αžαžΆαž„αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž…αŸ†αžŽαžΆαž™αž–αŸαž›αž˜αž½αž™αž˜αŸ‰αŸ„αž„αž‡αžΆαž˜αž½αž™αžŠαŸ‚αž€αž‘αžΆαžŸαŸŠαŸ‚αžš αž“αž·αž„αžšαž”αžΆαŸ†αž„αžŠαŸ‚αž€ (αžœαžΆαž˜αž·αž“αž’αžΈαž‘αŸαž”αžΎαž‚αŸ’αž˜αžΆαž“αžœαžΆ) αžαŸ’αž‰αž»αŸ†αž“αŸ…αžαŸ‚αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαž”αž‰αŸ’αž‡αžΆαž€αŸ’αžαžΆαžšαž”αž“αŸ’αž‘αŸ‡αž–αžΈαž‡αž“αž‡αžΆαžαž·αž…αž·αž“αŸ”

αž™αžΎαž„αž—αŸ’αž‡αžΆαž”αŸ‹αž˜αŸ‰αŸ‚αžαŸ’αžšαž‘αžΉαž€αž‘αŸ…αž“αžΉαž„αž•αŸ’αž‘αŸ‡αž†αŸ’αž›αžΆαžαžœαŸƒ

αžŸαŸ’αž‘αžΎαžšαžαŸ‚αž˜αž»αž“αž–αŸαž›αž”αž‰αŸ’αž‡αžΆαž‘αž·αž‰αž€αŸ’αžαžΆαžš αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŠαžΉαž„αžαžΆ αž”αž“αŸ’αžαŸ‚αž˜αž–αžΈαž›αžΎαž”αž“αŸ’αž‘αŸ‡αžˆαžΈαž”αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ†αž–αž“αŸ’αž›αžΊ αžαŸ’αž‰αž»αŸ†αž’αžΆαž…αž—αŸ’αž‡αžΆαž”αŸ‹αž’αŸ’αžœαžΈαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž‘αŸ…αž“αžΉαž„αž‘αžΆαž“αž€αŸ’αžšαž»αž„ I2C αžŠαžΌαž…αž‡αžΆαž’αŸαž€αŸ’αžšαž„αŸ‹αž‡αžΆαžŠαžΎαž˜αŸ” αž’αŸ’αžœαžΈβ€‹αžŠαŸ‚αž›β€‹αžαŸ’αžšαžΌαžœβ€‹αž…αŸαž‰β€‹αž‘αŸ…β€‹αžœαžΆβ€‹αž–αž·αžβ€‹αž”αŸ’αžšαžΆαž€αžŠβ€‹αž“αŸ…β€‹αžαŸ‚β€‹αž‡αžΆβ€‹αžŸαŸ†αžŽαž½αžš αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αžœαžΆβ€‹αžαŸ’αžšαžΌαžœβ€‹αžαŸ‚β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž”αž‰αŸ’αž‡αžΌαž“β€‹αž‘αŸ…β€‹αž›αžΎβ€‹αž€αŸ’αžαžΆαžšαŸ” αž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαžŽαžΆαžŸαŸ‹ αž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž”αž‰αŸ’αž‡αžΆαž‘αž·αž‰αž€αŸ’αžαžΆαžšαž–αžΈαžšαŸ„αž„αž…αž€αŸ’αžš αžœαžΆαž‚αŸ’αž˜αžΆαž“αž…αŸ†αžŽαž»αž…αžŽαžΆαž˜αž½αž™αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžαŸ’αž›αž½αž“αžαŸ’αž‰αž»αŸ†αž…αŸ†αž–αŸ„αŸ‡αž€αŸ’αžαžΆαžšαžαŸ‚αž˜αž½αž™αž‘αŸ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžαŸ’αžŸαŸ‚ I2C αž‚αžΊαž˜αžΆαž“αžαŸ‚αž˜αž½αž™αž‚αžαŸ‹αž“αŸ…αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™αž“αŸƒαž€αŸ’αžαžΆαžšαŸ”

αžœαžΆαž€αŸαž˜αžΆαž“αž”αž‰αŸ’αž αžΆαž’αŸ†αž˜αž½αž™αž•αž„αžŠαŸ‚αžšαž‡αžΆαž˜αž½αž™αž“αžΉαž„αžαŸ’αžŸαŸ‚αž—αŸ’αž›αžΎαž„αž˜αž½αž™αž•αŸ’αž›αžΌαžœαŸ” αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚ αž”αž“αŸ’αž‘αŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αžΌαžšαž‡αžΆαž•αŸ’αž“αŸ‚αž€αž˜αŸ’αžαžΆαž„ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž•αŸ’αž›αžΌαžœαžŠαŸ‚αž€ αž“αž·αž„αžŸαž˜αžΆαžŸαž’αžΆαžαž» SMD αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž‚αŸ’αžšαŸ„αž„αž“αžΉαž„αžŠαžΆαž€αŸ‹αž“αŸ…αž˜αŸ’αžαžΆαž„ αž αžΎαž™αžŸαž˜αžΆαžŸαž’αžΆαžαž»αž‘αž·αž“αŸ’αž“αž•αž› αž§αž”αž€αžšαžŽαŸαž—αŸ’αž‡αžΆαž”αŸ‹ αž“αž·αž„αž€αžΆαžšαž•αŸ’αž‚αžαŸ‹αž•αŸ’αž‚αž„αŸ‹αžαžΆαž˜αž–αž›αž“αŸ…αž˜αŸ’αžαžΆαž„αž‘αŸ€αžαŸ” αž“αŸ…αž–αŸαž›αžαŸ’αž‰αž»αŸ†αž‘αž‘αž½αž›αž”αžΆαž“αž€αŸ’αžαžΆαžšαž”αž“αŸ’αž‘αŸ‡αž˜αž½αž™αžαŸ‚αž€αŸ’αžšαŸ„αž™αž˜αž€ αžαŸ’αž‰αž»αŸ†αž—αŸ’αž›αŸαž…αž’αŸ†αž–αžΈαž•αŸ‚αž“αž€αžΆαžšαžŠαžΎαž˜ αž αžΎαž™αž”αžΆαž“αž›αž€αŸ‹αž‚αŸ’αžšαžΏαž„αž”αž“αŸ’αž›αžΆαžŸαŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ…αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž˜αž»αžαŸ” αž αžΎαž™αž˜αžΆαž“αžαŸ‚αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžœαžΆαž˜αž€αžŠαž›αŸ‹αž€αžΆαžšαž”αž·αž‘αž€αžΆαžšαž•αŸ’αž‚αžαŸ‹αž•αŸ’αž‚αž„αŸ‹αžαžΆαž˜αž–αž›αžœαžΆαž”αŸ’αžšαŸ‚αžαžΆαž”αžΌαž€αž“αž·αž„αžŠαž€αžαŸ’αžšαžΌαžœαž”αžΆαž“αžαŸ’αžŸαŸ‚αž”αž‰αŸ’αž…αŸ’αžšαžΆαžŸαŸ” αžαŸ’αž‰αž»αŸ†αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαžŸαŸ’αžšαŸ‚αž‡αžΆαž˜αž½αž™αž’αŸ’αž“αž€αž›αŸ„αžαŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αžšαžΌαž”αž—αžΆαž–αžαžΆαž„αž›αžΎ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžαŸ’αžŸαŸ‚αž—αŸ’αž›αžΎαž„αžšαž½αž…αž αžΎαž™ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŠαžΈαžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‘αŸαžšαž–αžΈαž•αŸ’αž“αŸ‚αž€αž˜αž½αž™αž“αŸƒαž€αŸ’αžαžΆαžšαž‘αŸ…αž˜αž½αž™αž‘αŸ€αžαžαžΆαž˜αžšαž™αŸˆαž˜αŸ’αž‡αž»αž›αž“αŸƒαž”αŸŠαžΌαžαž»αž„αž”αŸŠαžΌαž (αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαžœαžΆαž’αžΆαž…αž‚αžΌαžšαž•αŸ’αž›αžΌαžœαž“αŸ…αž›αžΎαžŸαŸ’αžšαž‘αžΆαž”αŸ‹αž‘αžΈαž–αžΈαžšαž€αŸαžŠαŸ„αž™) αŸ”

αžœαžΆαž”αŸ’αžšαŸ‚αž…αŸαž‰αžŠαžΌαž…αž“αŸαŸ‡

αž™αžΎαž„αž—αŸ’αž‡αžΆαž”αŸ‹αž˜αŸ‰αŸ‚αžαŸ’αžšαž‘αžΉαž€αž‘αŸ…αž“αžΉαž„αž•αŸ’αž‘αŸ‡αž†αŸ’αž›αžΆαžαžœαŸƒ

αž•αŸ’αž‘αŸ‡

αž‡αŸ†αž αžΆαž“αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž‚αžΊαžšαžΆαž„αž€αžΆαž™αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž– 3D αž“αŸαŸ‡αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž”αž‰αŸ’αž αžΆαž‘αŸαŸ” αžαŸ’αž‰αž»αŸ†β€‹αž˜αž·αž“β€‹αžšαŸ†αžαžΆαž“β€‹αžαŸ’αž›αžΆαŸ†αž„β€‹αž–αŸαž€β€‹αž‘αŸ - αžαŸ’αž‰αž»αŸ†β€‹αž‚αŸ’αžšαžΆαž“αŸ‹β€‹αžαŸ‚β€‹αž‚αžΌαžšβ€‹αž”αŸ’αžšαž’αž”αŸ‹β€‹αžŠαŸ‚αž›β€‹αž˜αžΆαž“β€‹αž‘αŸ†αž αŸ†β€‹αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœ αž αžΎαž™β€‹αž’αŸ’αžœαžΎβ€‹αž€αžΆαžšβ€‹αž€αžΆαžαŸ‹β€‹αž“αŸ…β€‹αž€αž“αŸ’αž›αŸ‚αž„β€‹αžŠαŸ‚αž›β€‹αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαŸ” αž‚αž˜αŸ’αžšαž”αžαŸ’αžšαžΌαžœαž”αžΆαž“αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αžαž½αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžœαžΈαžŸαžŠαžΆαž”αŸ‹αžαŸ’αž›αž½αž“αžαžΌαž…αŸ—αŸ”

αž™αžΎαž„αž—αŸ’αž‡αžΆαž”αŸ‹αž˜αŸ‰αŸ‚αžαŸ’αžšαž‘αžΉαž€αž‘αŸ…αž“αžΉαž„αž•αŸ’αž‘αŸ‡αž†αŸ’αž›αžΆαžαžœαŸƒ

αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž“αž·αž™αžΆαž™αžšαž½αž…αž αžΎαž™αžαžΆαž”αŸŠαžΌαžαž»αž„αž…αžΆαž”αŸ‹αž•αŸ’αžŠαžΎαž˜αž’αžΆαž…αž”αŸ’αžšαžΎαž‡αžΆαž”αŸŠαžΌαžαž»αž„αž‚αŸ„αž›αž”αŸ†αžŽαž„αž‘αžΌαž‘αŸ… - αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αž”αž„αŸ’αž αžΆαž‰αžœαžΆαž“αŸ…αž›αžΎαž”αž“αŸ’αž‘αŸ‡αžαžΆαž„αž˜αž»αžαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž‚αžΌαžš "αž’αžŽαŸ’αžαžΌαž„" αž–αž·αžŸαŸαžŸαž˜αž½αž™αžŠαŸ‚αž›αž”αŸŠαžΌαžαž»αž„αžšαžŸαŸ‹αž“αŸ…αŸ”

αž™αžΎαž„αž—αŸ’αž‡αžΆαž”αŸ‹αž˜αŸ‰αŸ‚αžαŸ’αžšαž‘αžΉαž€αž‘αŸ…αž“αžΉαž„αž•αŸ’αž‘αŸ‡αž†αŸ’αž›αžΆαžαžœαŸƒ

αž“αŸ…αžαžΆαž„αž€αŸ’αž“αž»αž„αžŸαŸ’αžšαŸ„αž˜αž€αŸαž˜αžΆαž“αž‘αŸ’αžšαž“αžΆαž”αŸ‹αž•αž„αžŠαŸ‚αžš αžŠαŸ‚αž›αž”αž“αŸ’αž‘αŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αž‘αžΎαž„ αž“αž·αž„αž’αžΆαž“αžΆαžŠαŸ„αž™αžœαžΈαžŸ M3 αžαŸ‚αž˜αž½αž™ (αž˜αž·αž“αž˜αžΆαž“αž€αž“αŸ’αž›αŸ‚αž„αž‘αŸ†αž“αŸαžšαž“αŸ…αž›αžΎαž€αŸ’αžαžΆαžšαž‘αŸ€αžαž‘αŸ)

αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž€αžΆαžšαž”αž„αŸ’αž αžΆαž‰αžšαž½αž…αž αžΎαž™ αž“αŸ…αž–αŸαž›αžαŸ’αž‰αž»αŸ†αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž€αŸ†αžŽαŸ‚αž‚αŸ†αžšαžΌαžŠαŸ†αž”αžΌαž„αž“αŸƒαž€αžšαžŽαžΈαŸ” αž§αž”αž€αžšαžŽαŸαž’αžΆαž“αž–αžΈαžšαž‡αž½αžšαžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαž˜αž·αž“αžŸαž˜αž“αžΉαž„αž€αžšαžŽαžΈαž“αŸαŸ‡αž‘αŸαž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž˜αžΆαž“αž’αŸαž€αŸ’αžšαž„αŸ‹ OLED SSD1306 128 Γ— 32 αŸ” αžœαžΆβ€‹αžαžΌαž…β€‹αž”αž“αŸ’αžαž·αž… αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αžαŸ’αž‰αž»αŸ†β€‹αž˜αž·αž“β€‹αž…αžΆαŸ†β€‹αž”αžΆαž…αŸ‹β€‹αž˜αžΎαž›β€‹αžœαžΆβ€‹αžšαžΆαž›αŸ‹β€‹αžαŸ’αž„αŸƒβ€‹αž‘αŸβ€”αžœαžΆβ€‹αž…αŸ’αžšαžΎαž“β€‹αž–αŸαž€β€‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αžαŸ’αž‰αž»αŸ†αŸ”

αžŠαŸ„αž™αžŠαžΉαž„αž–αžΈαžœαž·αž’αžΈαž“αŸαŸ‡ αž“αž·αž„αžαžΆαžαžΎαžαŸ’αžŸαŸ‚αž—αŸ’αž›αžΎαž„αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αž‰αŸ’αž‡αžΌαž“αž…αŸαž‰αž–αžΈαžœαžΆαžŠαŸ„αž™αžšαž”αŸ€αž”αžŽαžΆ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαž”αž·αž‘αž’αŸαž€αŸ’αžšαž„αŸ‹αž“αŸ…αž…αŸ†αž€αžŽαŸ’αžαžΆαž›αž€αžšαžŽαžΈαŸ” αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹ ergonomics αž‚αžΊαž‘αžΆαž”αž‡αžΆαž„αžαž˜αŸ’αž›αŸƒ - αž”αŸŠαžΌαžαž»αž„αž‚αžΊαž“αŸ…αž›αžΎαž€αŸ†αž–αžΌαž›αž€αžΆαžšαž”αž„αŸ’αž αžΆαž‰αž‚αžΊαž“αŸ…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž“αž·αž™αžΆαž™αžšαž½αž…αž αžΎαž™αžαžΆαž‚αŸ†αž“αž·αžαžŠαžΎαž˜αŸ’αž”αžΈαž—αŸ’αž‡αžΆαž”αŸ‹αž’αŸαž€αŸ’αžšαž„αŸ‹αž”αžΆαž“αž˜αž€αž™αžΊαžαž–αŸαž€ αž αžΎαž™αžαŸ’αž‰αž»αŸ†αžαŸ’αž‡αž·αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαž—αŸ’αž‡αžΆαž”αŸ‹αž”αž“αŸ’αž‘αŸ‡αž‘αžΎαž„αžœαž·αž‰αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž›αžΆαžŸαŸ‹αž‘αžΈαž”αŸŠαžΌαžαž»αž„αŸ”

αž§αž”αž€αžšαžŽαŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ†αŸ” αž˜αŸ‰αžΌαžŒαž»αž›αž”αž„αŸ’αž αžΆαž‰αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαŸ’αž’αž·αžαž‡αžΆαž”αŸ‹αž‡αžΆαž˜αž½αž™ snot αž‡αžΆαž˜αž½αž™αž€αžΆαžœαž€αŸ’αžαŸ…

αž™αžΎαž„αž—αŸ’αž‡αžΆαž”αŸ‹αž˜αŸ‰αŸ‚αžαŸ’αžšαž‘αžΉαž€αž‘αŸ…αž“αžΉαž„αž•αŸ’αž‘αŸ‡αž†αŸ’αž›αžΆαžαžœαŸƒ

αž™αžΎαž„αž—αŸ’αž‡αžΆαž”αŸ‹αž˜αŸ‰αŸ‚αžαŸ’αžšαž‘αžΉαž€αž‘αŸ…αž“αžΉαž„αž•αŸ’αž‘αŸ‡αž†αŸ’αž›αžΆαžαžœαŸƒ

αž›αž‘αŸ’αž’αž•αž›αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰αž“αŸ…αž›αžΎ KDPV

αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž„αŸ’αž€αž”αŸ‹αŸ”

αž…αžΌαžšαž”αž“αŸ’αžαž‘αŸ…αž•αŸ’αž“αŸ‚αž€αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαž·αž”αŸ’αž”αž€αž˜αŸ’αž˜αžαžΌαž…αŸ—αž”αŸ‚αž”αž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž–αž·αžαž‡αžΆαž…αžΌαž›αž…αž·αžαŸ’αžαž”αŸ’αžšαžΎ Python (αž˜αžΈαž€αŸ’αžšαžΌαž—αžΈαžαž»αž“) - αž€αžΌαžŠαž”αŸ’αžšαŸ‚αž‡αžΆαž”αž„αŸ’αžšαž½αž˜ αž“αž·αž„αž’αžΆαž…αž™αž›αŸ‹αž”αžΆαž“αŸ” αž‡αžΆαžŸαŸ†αžŽαžΆαž„αž›αŸ’αž’ αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž…αž»αŸ‡αžŠαž›αŸ‹αž€αž˜αŸ’αžšαž·αžαž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡ αžŠαžΎαž˜αŸ’αž”αžΈαž…αŸ’αžšαž”αžΆαž…αŸ‹αž…αŸαž‰αž˜αžΈαž€αŸ’αžšαžΌαžœαž·αž“αžΆαž‘αžΈαž“αŸ„αŸ‡αž‘αŸ - αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž’αžΆαž…αž’αŸ’αžœαžΎαž”αžΆαž“αž–αžΈ Python αŸ”

αžœαžΆαž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαž’αŸ’αžœαžΈαŸ—αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‚αžΊαžŸαžΆαž˜αž‰αŸ’αž‰ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αž·αž“αžŸαžΆαž˜αž‰αŸ’αž‰αž‘αŸ - αž§αž”αž€αžšαžŽαŸαž˜αžΆαž“αž˜αž»αžαž„αžΆαžšαž―αž€αžšαžΆαž‡αŸ’αž™αž‡αžΆαž…αŸ’αžšαžΎαž“αŸ–

  • αž’αŸ’αž“αž€β€‹αž”αŸ’αžšαžΎβ€‹αž…αž»αž…β€‹αž”αŸŠαžΌαžαž»αž„ αž αžΎαž™β€‹αž˜αžΎαž›β€‹αž’αŸαž€αŸ’αžšαž„αŸ‹
  • αž›αžΈαžαŸ’αžš αž‚αžΌαžŸ αž“αž·αž„αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αžαž˜αŸ’αž›αŸƒαž“αŸ…αž€αŸ’αž“αž»αž„αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ†αž–αž“αŸ’αž›αžΊ
  • αž˜αŸ‰αžΌαžŒαž»αž›αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŸαž‰αŸ’αž‰αžΆ WiFi αž αžΎαž™αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αžΎαž„αžœαž·αž‰αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž…αžΆαŸ†αž”αžΆαž…αŸ‹
  • αž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαžŽαžΆαžŸαŸ‹ αž”αžΎαž‚αŸ’αž˜αžΆαž“αž’αŸ†αž–αžΌαž›αž—αŸ’αž›αžΉαž”αž—αŸ’αž›αŸ‚αžαŸ— αžœαžΆαž˜αž·αž“αž’αžΆαž…αž‘αŸ…αžšαž½αž…αž‘αŸ

αž’αŸ’αž“αž€αž˜αž·αž“αž’αžΆαž…αžŸαž“αŸ’αž˜αžαŸ‹αžαžΆαž˜αž»αžαž„αžΆαžšαž˜αž½αž™αž˜αž·αž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αŸ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αž»αžαž„αžΆαžšαž˜αž½αž™αž‘αŸ€αžαž‡αžΆαž”αŸ‹αž‚αžΆαŸ†αž„αžŠαŸ„αž™αžŸαžΆαžšαž αŸαžαž»αž•αž›αž˜αž½αž™αž…αŸ†αž“αž½αž“αŸ” αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž”αŸ†αž–αŸαž‰ cacti αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αžšαž½αž…αž αžΎαž™αž“αŸ…αž€αŸ’αž“αž»αž„αž‚αž˜αŸ’αžšαŸ„αž„αž•αŸ’αžŸαŸαž„αž‘αŸ€αž αž αžΎαž™αž₯αž‘αžΌαžœαž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž“αŸ…αžαŸ‚αžƒαžΎαž‰αž—αžΆαž–αž˜αž·αž“αž”αŸ’αžšαž€αŸ’αžšαžαžΈαž“αŸ…αž€αŸ’αž“αž»αž„αžšαž…αž“αžΆαž”αŸαž‘αŸ’αž˜αž“αŸƒ "αžαž€αžαžΆαž“αž˜αž½αž™αž›αžΈαžαŸ’αžšαž‘αŸ€αžαž–αŸ’αžšαŸ„αŸ‡αž’αŸαž€αŸ’αžšαž„αŸ‹αž€αŸ†αž–αž»αž„αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž“αŸ…αž–αŸαž›αž“αŸ„αŸ‡" ឬ "αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž˜αž·αž“αž’αžΆαž…αž’αŸ’αžœαžΎαž’αŸ’αžœαžΈαž”αžΆαž“αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž›αž˜αŸ‰αžΌαžŒαž»αž›αž€αŸ†αž–αž»αž„αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ… αž”αŸ’αžšαž–αŸαž“αŸ’αž’ WifiαŸ”" αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹ αžšαžΏαž„αž˜αž½αž™αž…αŸ†αž“αž½αž“αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαžαžΆαž˜αžšαž™αŸˆαž€αžΆαžšαžšαŸ†αžαžΆαž“ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž’αŸ’αž“αž€αž’αžΆαž…αžˆαžΆαž“αžŠαž›αŸ‹αžŠαŸ‚αž“αž€αŸ†αžŽαžαŸ‹αž›αžΎαžšαž™αŸˆαž–αŸαž› αž€αžΆαžšαžŠαžΆαž€αŸ‹αž€αžΆαžšαž αŸ…αž‘αžΌαžšαžŸαž–αŸ’αž‘ αž¬αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŠαŸ‚αž›αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž’αžΆαžαžΌαž˜αž·αž€αž…αŸ†αž–αŸ„αŸ‡αž’αžαŸαžšαŸ” αž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαžŽαžΆαžŸαŸ‹, αž€αžΌαžŠαžŠαŸ‚αž›αž’αŸ’αžœαžΎαž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž™αŸ‰αžΆαž„αž†αžΆαž”αŸ‹αžšαž αŸαžŸαž”αŸ’αžšαŸ‚αž‘αŸ…αž‡αžΆ mush αŸ”

Π’ αž‚αž˜αŸ’αžšαŸ„αž„αž’αŸ’αž„αž“αŸ‹αž’αŸ’αž„αžšαž‡αžΆαž„αž“αŸαŸ‡αŸ” αžαŸ’αž‰αž»αŸ†β€‹αž”αžΆαž“β€‹αž”αŸ’αžšαžΎβ€‹αž€αžΆαžšβ€‹αž’αŸ’αžœαžΎβ€‹αž€αž·αž…αŸ’αž…αž€αžΆαžšβ€‹αž…αŸ’αžšαžΎαž“β€‹αž‡αžΆαž˜αž»αž“β€‹αž”αŸ‚αž”β€‹αž”αž»αžšαžΆαžŽ αž“αž·αž„ FreeRTOS αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αž“αŸ…β€‹αž€αŸ’αž“αž»αž„β€‹αž€αžšαžŽαžΈβ€‹αž“αŸαŸ‡ αž‚αŸ†αžšαžΌβ€‹αž”αžΆαž“β€‹αž€αŸ’αž›αžΆαž™β€‹αž‘αŸ…β€‹αž‡αžΆβ€‹αžŸαž˜αžšαž˜αŸ’αž™β€‹αž‡αžΆαž„ αž”αžŽαŸ’αžŽαžΆαž›αŸαž™ coroutines αž“αž·αž„ uasync . αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡αž‘αŸ…αž‘αŸ€αž αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αž Python αž“αŸƒ coroutines αž‚αžΊαž–αž·αžαž‡αžΆαž’αžŸαŸ’αž…αžΆαžšαŸ’αž™αžŽαžΆαžŸαŸ‹ - αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž™αŸ‰αžΆαž„αžŸαžΆαž˜αž‰αŸ’αž‰ αž“αž·αž„αž„αžΆαž™αžŸαŸ’αžšαž½αž›αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ” αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžŸαžšαžŸαŸαžšαžαž€αŸ’αž€αžœαž·αž‡αŸ’αž‡αžΆαž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž”αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž‰αž»αŸ†αžαžΆαž“αŸ…αž€αž“αŸ’αž›αŸ‚αž„αžŽαžΆαžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ’αžαžΌαžšαžšαžœαžΆαž„αžŸαŸ’αž‘αŸ’αžšαžΈαž˜

αžαŸ’αž‰αž»αŸ†αžŸαŸ’αž“αžΎαž±αŸ’αž™αžŸαž·αž€αŸ’αžŸαžΆαž–αžΈαž—αžΆαž–αžαž»αžŸαž‚αŸ’αž“αžΆαžšαžœαžΆαž„αž€αž·αž…αŸ’αž…αž€αžΆαžšαž…αŸ’αžšαžΎαž“αž‡αžΆαž˜αž»αž“ αž“αž·αž„αž€αžΆαžšαž”αŸ’αžšαž€αž½αžαž”αŸ’αžšαž‡αŸ‚αž„αž‡αžΆαž˜αž»αžαžœαž·αž‡αŸ’αž‡αžΆαžŸαŸ’αžšαŸαž…αž…αž·αžαŸ’αžαŸ” αž₯αž‘αžΌαžœαžŸαžΌαž˜αž”αž“αŸ’αžαž‘αŸ…αž›αŸαžαž€αžΌαžŠαŸ”

#####################################
# 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) - αž“αŸαŸ‡αž‡αžΆαžšαž”αŸ€αž”αžŠαŸ‚αž›αž€αžΆαžšαžŸαŸ’αžŠαžΆαžšαž‘αžΎαž„αžœαž·αž‰αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαžŠαžΆαž…αŸ‹αž…αžšαž“αŸ’αžαž’αž‚αŸ’αž‚αž·αžŸαž“αžΈαžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαŸ”

αž˜αŸ’αž‡αž»αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ„αž™αž—αŸ’αž‡αžΆαž”αŸ‹αž˜αž€αž‡αžΆαž˜αž½αž™αž€αžΆαžšαž‘αžΆαž‰αž‘αžΎαž„αž‘αŸ…αž€αžΆαž“αŸ‹αž€αžΆαžšαž•αŸ’αž‚αžαŸ‹αž•αŸ’αž‚αž„αŸ‹αžαžΆαž˜αž–αž›αŸ– αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž€αž»αž„αžαžΆαž€αŸ‹ Reed αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž·αž‘ αž“αŸ„αŸ‡αžαŸ’αžŸαŸ‚αž‚αžΊαžŸαžΌαž“αŸ’αž™ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžαŸ’αžŸαŸ‚αžšαž”αžΎαž€ αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αžΆαž‰αž‘αžΎαž„αž‘αŸ…αž€αžΆαžšαž•αŸ’αž‚αžαŸ‹αž•αŸ’αž‚αž„αŸ‹αžαžΆαž˜αž–αž› αž αžΎαž™αž§αž”αž€αžšαžŽαŸαž”αž‰αŸ’αž‡αžΆαž’αžΆαž“αž˜αž½αž™αŸ”

αž€αž·αž…αŸ’αž…αž€αžΆαžšαžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αž˜αž½αž™αž€αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αž±αŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž‘αžΈαž“αŸαŸ‡αž•αž„αžŠαŸ‚αžš αžŠαŸ‚αž›αž“αžΉαž„αž’αŸ’αžœαžΎαž€αžΆαžšαžŸαŸ’αž‘αž„αŸ‹αž˜αžαž·αž˜αŸ’αž‡αž»αž›αŸ” αž”αž‰αŸ’αž‡αžšαž“αžΈαž˜αž½αž™αŸ—αž“αžΉαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž—αžΆαžšαž€αž·αž…αŸ’αž…αžšαž”αžŸαŸ‹αžαŸ’αž›αž½αž“αŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž›αŸαžαž€αžΌαžŠαžšαž”αžŸαŸ‹αž“αžΆαž„

    """ Poll pin and advance value when another litre passed """
    async def _switchcheck(self):
        last_checked_pin_state = self._pin.value()  # Get initial state

        # Poll for a pin change
        while True:
            state = self._pin.value()
            if state != last_checked_pin_state:
                # State has changed: act on it now.
                last_checked_pin_state = state
                if state == 0:
                    self._another_litre_passed()

            # Ignore further state changes until switch has settled
            await asyncio.sleep_ms(Counter.debounce_ms)

αž€αžΆαžšαž–αž“αŸ’αž™αžΆαž–αŸαž› 25ms αž‚αžΊαžαŸ’αžšαžΌαžœαž€αžΆαžšαž‡αžΆαž…αžΆαŸ†αž”αžΆαž…αŸ‹ αžŠαžΎαž˜αŸ’αž”αžΈαžαŸ’αžšαž„αž€αžΆαžšαž›αŸ„αžαž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„ αž αžΎαž™αž€αŸ’αž“αž»αž„αž–αŸαž›αžαŸ‚αž˜αž½αž™αžœαžΆαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžαžΆαžαžΎαž—αžΆαžšαž€αž·αž…αŸ’αž…αž—αŸ’αž‰αžΆαž€αŸ‹αž–αžΈαžŠαŸ†αžŽαŸαž€αž‰αžΉαž€αž‰αžΆαž”αŸ‹αž”αŸ‰αž»αžŽαŸ’αžŽαžΆ (αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž›αž€αž·αž…αŸ’αž…αž€αžΆαžšαž“αŸαŸ‡αž€αŸ†αž–αž»αž„αžŠαŸαž€ αž€αž·αž…αŸ’αž…αž€αžΆαžšαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš)αŸ” αžšαžΆαž›αŸ‹ 25ms αž˜αž»αžαž„αžΆαžšαž—αŸ’αž‰αžΆαž€αŸ‹αž‘αžΎαž„ αž–αž·αž“αž·αžαŸ’αž™αž˜αŸ’αž‡αž»αž› αž αžΎαž™αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αž€αž»αž„αžαžΆαž€αŸ‹ Reed αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž·αž‘ αž“αŸ„αŸ‡αž›αžΈαžαŸ’αžšαž˜αž½αž™αž‘αŸ€αžαž”αžΆαž“αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž˜αŸ‰αŸ‚αžαŸ’αžš αž αžΎαž™αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαžαŸ‚αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ”

    def _another_litre_passed(self):
        self._value += 1
        self._value_changed = True

        self._value_storage.write(self._value)

αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αžΈαžαŸ’αžšαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž‚αžΊαžαžΌαž…αžαžΆαž… - αž”αž‰αŸ’αž‡αžšαž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž€αžΎαž“αž‘αžΎαž„αŸ” αž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαžŽαžΆαžŸαŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαžšαžŸαŸαžšαžαž˜αŸ’αž›αŸƒαžαŸ’αž˜αžΈαž“αŸ…αž›αžΎ flash driveαŸ”

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž—αžΆαž–αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž“αŸƒαž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ "αž§αž”αž€αžšαžŽαŸαž—αŸ’αž‡αžΆαž”αŸ‹" αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž‡αžΌαž“

    def value(self):
        self._value_changed = False
        return self._value

    def set_value(self, value):
        self._value = value
        self._value_changed = False

αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž…αžΌαžšαž™αžΎαž„αž‘αžΆαž‰αž™αž€αž’αžαŸ’αžαž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž–αžΈαž—αžΆαž–αžšαžΈαž€αžšαžΆαž™αžšαž”αžŸαŸ‹ Python αž“αž·αž„αž”αžŽαŸ’αžŽαžΆαž›αŸαž™ uasync αž αžΎαž™αž”αž„αŸ’αž€αžΎαžαžœαžαŸ’αžαž»αžšαžΆαž”αŸ‹αžŠαŸ‚αž›αž’αžΆαž…αžšαž„αŸ‹αž…αžΆαŸ†αž”αžΆαž“ (αžαžΎαž™αžΎαž„αž’αžΆαž…αž”αž€αž”αŸ’αžšαŸ‚αžœαžΆαž‘αŸ…αž‡αžΆαž—αžΆαžŸαžΆαžšαž»αžŸαŸ’αžŸαžΈαžŠαŸ„αž™αžšαž”αŸ€αž”αžŽαžΆ? αžœαžαŸ’αžαž»αžŠαŸ‚αž›αž’αŸ’αž“αž€αžšαŸ†αž–αžΉαž„αž‘αž»αž€?)

    def __await__(self):
        while not self._value_changed:
            yield from asyncio.sleep(0)

        return self.value()

    __iter__ = __await__  

αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž˜αž»αžαž„αžΆαžšαžŠαŸαž„αžΆαž™αžŸαŸ’αžšαž½αž›αžŠαŸ‚αž›αžšαž„αŸ‹αž…αžΆαŸ†αžšαž αžΌαžαžŠαž›αŸ‹αžαž˜αŸ’αž›αŸƒαžšαžΆαž”αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž– - αž˜αž»αžαž„αžΆαžšαž—αŸ’αž‰αžΆαž€αŸ‹αž–αžΈαž–αŸαž›αž˜αž½αž™αž‘αŸ…αž–αŸαž›αž˜αž½αž™ αž αžΎαž™αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž‘αž„αŸ‹ _value_changed αŸ” αž’αŸ’αžœαžΈβ€‹αžŠαŸ‚αž›β€‹αž’αžŸαŸ’αž…αžΆαžšαŸ’αž™β€‹αž’αŸ†αž–αžΈβ€‹αž˜αž»αžαž„αžΆαžšβ€‹αž“αŸαŸ‡β€‹αž‚αžΊβ€‹αž€αžΌαžŠβ€‹αž αŸ…β€‹αž‘αžΌαžšαžŸαž–αŸ’αž‘β€‹αž’αžΆαž…β€‹αžŠαŸαž€β€‹αž›αž€αŸ‹β€‹αž–αŸαž›β€‹αž αŸ…β€‹αž˜αž»αžαž„αžΆαžšβ€‹αž“αŸαŸ‡ αž αžΎαž™β€‹αž‚αŸαž„β€‹αžšαž αžΌαžβ€‹αžŠαž›αŸ‹β€‹αž‘αž‘αž½αž›β€‹αž”αžΆαž“β€‹αžαž˜αŸ’αž›αŸƒβ€‹αžαŸ’αž˜αžΈαŸ”

αž…αž»αŸ‡αž€αžΆαžšαžšαŸ†αžαžΆαž“?αž”αžΆαž‘/αž…αžΆαžŸ αž“αŸ…αž…αŸ†αžŽαž»αž…αž“αŸαŸ‡αž’αŸ’αž“αž€αž’αžΆαž… troll αžαŸ’αž‰αž»αŸ†αžŠαŸ„αž™αž“αž·αž™αžΆαž™αžαžΆαž’αŸ’αž“αž€αž•αŸ’αž‘αžΆαž›αŸ‹αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž€αžΆαžšαžšαŸ†αžαžΆαž“ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαžΆαž˜αž–αž·αžαž’αŸ’αž“αž€αž”αžΆαž“αž’αŸ’αžœαžΎαž€αžΆαžšαž”αŸ„αŸ‡αž†αŸ’αž“αŸ„αžαž˜αŸ’αž‡αž»αž›αžŠαŸαž†αŸ„αžαž›αŸ’αž„αž„αŸ‹αŸ” αžαžΆαž˜αž–αž·αžαž€αžΆαžšαžšαŸ†αžαžΆαž“αž‚αžΊαž‡αžΆαžšαžΏαž„αžŠαŸ†αž”αžΌαž„αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž–αŸ’αž™αžΆαž™αžΆαž˜αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„ ESP8266 αž’αŸ’αž“αž€αž’αžΆαž…αžšαŸ€αž”αž…αŸ† edge interrupt αž αžΎαž™αžαŸ‚αž˜αž‘αžΆαŸ†αž„αžŸαžšαžŸαŸαžš handler αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžšαŸ†αžαžΆαž“αž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„ PythonαŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαžšαŸ†αžαžΆαž“αž“αŸαŸ‡ αžαž˜αŸ’αž›αŸƒαž“αŸƒαž’αžαŸαžšαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αŸ” αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆ αž“αŸαŸ‡αž“αžΉαž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž”αž‰αŸ’αž‡αžšαž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαž‘αžΆαžŸαž€αžš - αž˜αž½αž™αžŠαŸ‚αž›αžšαž„αŸ‹αž…αžΆαŸ†αžšαž αžΌαžαžŠαž›αŸ‹αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαŸ’αž“αžΎαžŸαž»αŸ†αžαž˜αŸ’αž›αŸƒαž“αŸαŸ‡αŸ”

αž‡αžΆαž’αž€αž»αžŸαž› (αž¬αž‡αžΆαžŸαŸ†αžŽαžΆαž„αž›αŸ’αž’?) αž§αž”αž€αžšαžŽαŸαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αžŸαž€αž˜αŸ’αž˜ αžœαžΆαžαŸ’αžšαžΌαžœαžαŸ‚αž•αŸ’αž‰αžΎαžŸαžΆαžšαžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αžαžΆαž˜αžšαž™αŸˆαž–αž·αž’αžΈαž€αžΆαžš MQTT αž αžΎαž™αžŸαžšαžŸαŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αŸ… EEPROM αŸ” αž αžΎαž™αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž€αžΆαžšαžšαžΉαžαž”αž“αŸ’αžαžΉαž„αž”αžΆαž“αž…αžΌαž›αž‡αžΆαž’αžšαž˜αžΆαž“ - αž’αŸ’αž“αž€αž˜αž·αž“αž’αžΆαž…αž”αŸ‚αž„αž…αŸ‚αž€αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ†αž€αŸ’αž“αž»αž„αž€αžΆαžšαžšαŸ†αžαžΆαž“ αž“αž·αž„αž”αŸ’αžšαžΎαž‡αž„αŸ‹αž’αŸ† αžŠαŸ‚αž›αž˜αžΆαž“αž“αŸαž™αžαžΆαž’αŸ’αž“αž€αž’αžΆαž…αž—αŸ’αž›αŸαž…αž’αŸ†αž–αžΈαž€αžΆαžšαž•αŸ’αž‰αžΎαžŸαžΆαžšαžαžΆαž˜αž”αžŽαŸ’αžαžΆαž‰αŸ” αž˜αžΆαž“ buns αžŠαžΌαž…αž‡αžΆ micropython.schedule() αžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αž»αžαž„αžΆαžšαž˜αž½αž™αž…αŸ†αž“αž½αž“ "αž±αŸ’αž™αž”αžΆαž“αž†αžΆαž”αŸ‹αžαžΆαž˜αžŠαŸ‚αž›αž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“" αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŸαŸ†αžŽαž½αžšαž€αžΎαžαž‘αžΎαž„ "αžαžΎαž’αŸ’αžœαžΈαž‘αŸ…αž‡αžΆαž…αŸ†αžŽαž»αž…?" αž…αž»αŸ‡β€‹αž”αžΎβ€‹αž™αžΎαž„β€‹αž€αŸ†αž–αž»αž„β€‹αž•αŸ’αž‰αžΎβ€‹αžŸαžΆαžšβ€‹αž˜αž½αž™β€‹αž…αŸ†αž“αž½αž“β€‹αž“αŸ…β€‹αž–αŸαž›β€‹αž“αŸαŸ‡ αž αžΎαž™β€‹αž”αž“αŸ’αž‘αžΆαž”αŸ‹β€‹αž˜αž€β€‹αž˜αžΆαž“β€‹αž€αžΆαžšβ€‹αžšαŸ†αžαžΆαž“β€‹αž˜αž½αž™β€‹αž…αžΌαž›β€‹αž˜αž€β€‹αž αžΎαž™β€‹αž”αŸ†αž•αŸ’αž›αžΆαž‰β€‹αžαž˜αŸ’αž›αŸƒβ€‹αž“αŸƒβ€‹αž’αžαŸαžšαŸ” αž¬αž§αž‘αžΆαž αžšαžŽαŸ αžαž˜αŸ’αž›αŸƒαž”αž‰αŸ’αž‡αžšαžαŸ’αž˜αžΈαž”αžΆαž“αž˜αž€αžŠαž›αŸ‹αž–αžΈαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž›αž™αžΎαž„αž˜αž·αž“αž‘αžΆαž“αŸ‹αž”αžΆαž“αž€αžαŸ‹αžαŸ’αžšαžΆαžαž˜αŸ’αž›αŸƒαž…αžΆαžŸαŸ‹αŸ” αž‡αžΆαž‘αžΌαž‘αŸ… αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžšαžΆαžšαžΆαŸ†αž„αž€αžΆαžšαž’αŸ’αžœαžΎαžŸαž˜αž€αžΆαž›αž€αž˜αŸ’αž˜ αž¬αž…αŸαž‰αž–αžΈαžœαžΆαžŠαŸ„αž™αžœαž·αž’αžΈαž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαŸ”

αž αžΎαž™αž–αžΈαž–αŸαž›αž˜αž½αž™αž‘αŸ…αž–αŸαž›αž˜αž½αž™ RuntimeError: αž€αžΆαž›αžœαž·αž—αžΆαž‚αž‡αž„αŸ‹αž‚αžΆαŸ†αž„αž–αŸαž‰αž›αŸαž‰ αž αžΎαž™αž’αŸ’αž“αž€αžŽαžΆαžŠαžΉαž„αž˜αžΌαž›αž αŸαžαž»?

αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαžŸαŸ’αž‘αž„αŸ‹αž˜αžαž·αž…αŸ’αž”αžΆαžŸαŸ‹αž›αžΆαžŸαŸ‹ αž“αž·αž„αžŠαŸ‚αž›ync αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡αžœαžΆαž”αŸ’αžšαŸ‚αž…αŸαž‰αž€αžΆαž“αŸ‹αžαŸ‚αžŸαŸ’αžšαžŸαŸ‹αžŸαŸ’αž’αžΆαž αž“αž·αž„αž‚αž½αžšαž±αŸ’αž™αž‘αž»αž€αž…αž·αžαŸ’αž

αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž“αžΆαŸ†αž™αž€αž€αžΆαžšαž„αžΆαžšαž‡αžΆαž˜αž½αž™ 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)

αž“αŸ…αž€αŸ’αž“αž»αž„ Python αžœαžΆαž–αž·αž”αžΆαž€αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž‡αžΆαž˜αž½αž™αž”αŸƒ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžœαžΆαž‚αžΊαž‡αžΆαž”αŸƒαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž‘αŸ…αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ†αŸ” αžαŸ’αž‰αž»αŸ†αžαŸ’αžšαžΌαžœαž”αž·αž‘αž”αžΆαŸ†αž„αž€αžΆαžšαž”αŸ†αž”αŸ’αž›αŸ‚αž„αžšαžœαžΆαž„αž…αŸ†αž“αž½αž“αž‚αžαŸ‹ αž“αž·αž„αž”αŸƒαžŠαŸ„αž™αž”αŸ’αžšαžΎαž”αžŽαŸ’αžŽαžΆαž›αŸαž™ 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 αŸ” αž“αŸαŸ‡αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αžΌαžŠαžŠαŸ„αž™αž˜αž·αž“αž‚αž·αžαž–αžΈαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹ αž€αŸαžŠαžΌαž…αž‡αžΆ rivet αž§αž”αž€αžšαžŽαŸαžŠαžΌαž…αž‚αŸ’αž“αžΆαž”αŸαŸ‡αž”αž·αž‘αž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαŸ”

αž”αŸ’αž›αž»αž€αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž“αŸƒαž€αžΌαžŠαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ coroutines αž‡αžΆαž…αŸ’αžšαžΎαž“ αžŠαžΎαž˜αŸ’αž”αžΈαž”αž˜αŸ’αžšαžΎαž˜αž»αžαž„αžΆαžšαž•αŸ’αžŸαŸαž„αŸ—αž“αŸƒαž”αŸ’αžšαž–αŸαž“αŸ’αž’αŸ” αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž“αŸαŸ‡αž‡αžΆαž‘αž˜αŸ’αž›αžΆαž”αŸ‹αžŠαŸ‚αž›αžšαžΆαž”αŸ‹αž”αž‰αŸ’αž…αžΌαž›αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜

    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))

coroutine αžšαž„αŸ‹αž…αžΆαŸ†αž“αŸ…αž€αŸ’αž“αž»αž„αžšαž„αŸ’αžœαž·αž›αž‡αž»αŸ†αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαž˜αŸ’αž›αŸƒαžšαžΆαž”αŸ‹αžαŸ’αž˜αžΈ αž αžΎαž™αž—αŸ’αž›αžΆαž˜αŸ—αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžœαžΆαž›αŸαž…αž‘αžΎαž„ αž•αŸ’αž‰αžΎαžŸαžΆαžšαžαžΆαž˜αžšαž™αŸˆαž–αž·αž’αžΈαž€αžΆαžš MQTT αŸ” αž”αŸ†αžŽαŸ‚αž€αžŠαŸ†αž”αžΌαž„αž“αŸƒαž›αŸαžαž€αžΌαžŠαž•αŸ’αž‰αžΎαžαž˜αŸ’αž›αŸƒαžŠαŸ†αž”αžΌαž„αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž‚αŸ’αž˜αžΆαž“αž‘αžΉαž€αž αžΌαžšαžαžΆαž˜αž”αž‰αŸ’αž‡αžšαž€αŸαžŠαŸ„αž™αŸ”

αžαŸ’αž“αžΆαž€αŸ‹αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ MQTTClient αž”αž˜αŸ’αžšαžΎαžŠαŸ„αž™αžαŸ’αž›αž½αž“αžœαžΆ αž•αŸ’αžαž½αž…αž•αŸ’αžαžΎαž˜αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžœαŸ‰αžΆαž™αž αŸ’αžœαžΆαž™ αž“αž·αž„αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αžΎαž„αžœαž·αž‰αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžΆαžαŸ‹αž”αž„αŸ‹αŸ” αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž˜αžΆαž“αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸƒαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžœαŸ‰αžΆαž™αž αŸ’αžœαžΆαž™ αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž‡αžΌαž“αžŠαŸ†αžŽαžΉαž„αž™αžΎαž„αžŠαŸ„αž™αž€αžΆαžšαž αŸ…αž‘αžΌαžšαžŸαŸαž–αŸ’αž‘αž‘αŸ… 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) αž“αž·αž„αžšαž™αŸˆαž–αŸαž›αžšαž”αžŸαŸ‹αžœαžΆαŸ” αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαŸ’αžŠαžΆαžšαž‘αžΎαž„αžœαž·αž‰ αž–αŸαž›αžœαŸαž›αžΆαž‘αŸ†αž“αŸαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‰αžΎαž‘αŸ…αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαŸ”

αžŠαŸ„αž™αžœαž·αž’αžΈαž“αŸαŸ‡ αž€αžΆαžšαž‚αŸαž„αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž‚αžΊαž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžαŸ’αžšαžΌαžœαž€αžΆαžšαžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž±αŸ’αž™αž˜αž»αžαž„αžΆαžšαž’αžŸαž˜αž€αžΆαž›αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡ - αž“αŸ…αž€αŸ’αž“αž»αž„αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž αŸ…αžαžΆαž˜αžšαž™αŸˆαžšαž„αŸ‹αž…αžΆαŸ† αž αžΎαž™αž˜αžΆαž“αžαŸ‚αž˜αž»αžαž„αžΆαžšαžŠαŸ‚αž›αžšαžΆαž„αž€αžΆαž™αžšαž”αžŸαŸ‹αžœαžΆαž•αŸ’αž‘αž»αž€αž€αžΆαžšαžšαž„αŸ‹αž…αžΆαŸ†αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αžŠαŸ‚αž›αž’αžΆαž…αž αŸ…αž”αžΆαž“αŸ”

αž”αž“αŸ’αžαŸ‚αž˜αž–αžΈαž›αžΎαž€αžΆαžšαž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ… WiFi αž’αŸ’αž“αž€αž€αŸαžαŸ’αžšαžΌαžœαž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αžˆαŸ’αž˜αž½αž‰αž€αžŽαŸ’αžαžΆαž› MQTT (αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ) αž•αž„αžŠαŸ‚αžšαŸ” αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž€αŸαž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸαŸ‡αžŠαŸ‚αžš αž αžΎαž™αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αž±αž€αžΆαžŸαžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž’αŸ’αžœαžΈαž˜αž½αž™αžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„

    async def mqtt_connection_handler(self, client):
        await client.subscribe(self._mqtt_cold_water_theme)
        await client.subscribe(self._mqtt_hot_water_theme)

αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž™αžΎαž„αž‡αžΆαžœαžŸαžΆαžšαž‡αžΆαž…αŸ’αžšαžΎαž“ - αž₯αž‘αžΌαžœαž“αŸαŸ‡αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž˜αžΆαž“αž›αž‘αŸ’αž’αž—αžΆαž–αž€αŸ†αžŽαžαŸ‹αžαž˜αŸ’αž›αŸƒαž”αž‰αŸ’αž‡αžšαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αžŠαŸ„αž™αž€αžΆαžšαž•αŸ’αž‰αžΎαžŸαžΆαžšαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαŸ”

    def mqtt_msg_handler(self, topic, msg):
        topicstr = str(topic, 'utf8')
        self.dprint("Received MQTT message topic={}, msg={}".format(topicstr, msg))

        if topicstr == self._mqtt_cold_water_theme:
            self.cold_counter.set_value(int(msg))

        if topicstr == self._mqtt_hot_water_theme:
            self.hot_counter.set_value(int(msg))

αž˜αž»αžαž„αžΆαžšαž“αŸαŸ‡αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαžšαž…αžΌαž› αž αžΎαž™αž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαž”αŸ’αžšαž’αžΆαž“αž”αž‘ (αž…αŸ†αžŽαž„αž‡αžΎαž„αžŸαžΆαžš) αžαž˜αŸ’αž›αŸƒαž“αŸƒαž”αž‰αŸ’αž‡αžšαžŽαžΆαž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–

αž˜αž»αžαž„αžΆαžšαž‡αŸ†αž“αž½αž™αž–αžΈαžšαž”αžΈ

    # Publish a message if WiFi and broker is up, else discard
    async def publish_msg(self, topic, msg):
        self.dprint("Publishing message on topic {}: {}".format(topic, msg))
        if not self.internet_outage:
            await self.publish(topic, msg)
        else:
            self.dprint("Message was not published - no internet connection")

αž˜αž»αžαž„αžΆαžšαž“αŸαŸ‡αž•αŸ’αž‰αžΎαžŸαžΆαžšαž”αŸ’αžšαžŸαž·αž“αž”αžΎαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αž·αž“αž˜αžΆαž“αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ αžŸαžΆαžšαž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αžΎαž–αžΎαŸ”

αž αžΎαž™αž“αŸαŸ‡αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž‡αžΆαž˜αž»αžαž„αžΆαžšαž„αžΆαž™αžŸαŸ’αžšαž½αž›αžŠαŸ‚αž›αž”αž„αŸ’αž€αžΎαž αž“αž·αž„αž•αŸ’αž‰αžΎαžŸαžΆαžšαž”αŸ†αž”αžΆαžαŸ‹αž€αŸ†αž αž»αžŸαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ”

    async def publish_debug_msg(self, subtopic, msg):
        await self.publish_msg("{}/{}".format(self._mqtt_debug_water_theme, subtopic), str(msg))

αž’αžαŸ’αžαž”αž‘αž…αŸ’αžšαžΎαž“αžŽαžΆαžŸαŸ‹ αž αžΎαž™αž™αžΎαž„αž˜αž·αž“αž‘αžΆαž“αŸ‹αž–αŸ’αžšαž·αž…αž—αŸ’αž“αŸ‚αž€ LED αž“αŸ…αž‘αžΎαž™αž‘αŸαŸ” αž“αŸ…αž‘αžΈαž“αŸαŸ‡

    # Blink flash LED if WiFi down
    async def _heartbeat(self):
        while True:
            if self.internet_outage:
                self.blue_led(not self.blue_led()) # Fast blinking if no connection
                await asyncio.sleep_ms(200) 
            else:
                self.blue_led(0) # Rare blinking when connected
                await asyncio.sleep_ms(50)
                self.blue_led(1)
                await asyncio.sleep_ms(5000)

αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž•αŸ’αžαž›αŸ‹αžšαž”αŸ€αž”αž—αŸ’αž›αžΉαž”αž—αŸ’αž›αŸ‚αžαŸ—αž…αŸ†αž“αž½αž“ 2 αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž€αžΆαžšαž—αŸ’αž‡αžΆαž”αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžΆαžαŸ‹αž”αž„αŸ‹ (αž¬αžœαžΆαž‘αžΎαž”αžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„) αž§αž”αž€αžšαžŽαŸαž“αžΉαž„αž—αŸ’αž›αžΉαž”αž—αŸ’αž›αŸ‚αžαŸ—αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„ αž§αž”αž€αžšαžŽαŸαž“αžΉαž„αž—αŸ’αž›αžΉαž”αž—αŸ’αž›αŸ‚αžαŸ—αžšαŸ€αž„αžšαžΆαž›αŸ‹ 5 αžœαž·αž“αžΆαž‘αžΈαž˜αŸ’αžαž„αŸ” αž”αžΎαž…αžΆαŸ†αž”αžΆαž…αŸ‹ αžšαž”αŸ€αž”αž—αŸ’αž›αžΉαž”αž—αŸ’αž›αŸ‚αžαŸ—αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž“αŸ…αž‘αžΈαž“αŸαŸ‡αŸ”

αž”αŸ‰αž»αž“αŸ’αžαŸ‚ LED αž‚αžΊαž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž‡αžΆαž€αžΆαžšαž›αž½αž„αž›αŸ„αž˜αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αž™αžΎαž„β€‹αž€αŸβ€‹αž˜αžΆαž“β€‹αž‚αŸ„αž›β€‹αž”αŸ†αžŽαž„β€‹αž›αžΎβ€‹αž€αžΆαžšβ€‹αž”αž„αŸ’αž αžΆαž‰β€‹αžŠαŸ‚αžšαŸ”

    async def _display_coro(self):
        display = SSD1306_I2C(128,32, i2c)
    
        while True:
            display.poweron()
            display.fill(0)
            display.text("COLD: {:.3f}".format(self.cold_counter.value() / 1000), 16, 4)
            display.text("HOT:  {:.3f}".format(self.hot_counter.value() / 1000), 16, 20)
            display.show()
            await asyncio.sleep(3)
            display.poweroff()

            while self.button():
                await asyncio.sleep_ms(20)

αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž€αŸ†αž–αž»αž„αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈ - αžšαž”αŸ€αž”αžŠαŸ‚αž›αžœαžΆαžŸαžΆαž˜αž‰αŸ’αž‰ αž“αž·αž„αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž‡αžΆαž˜αž½αž™ coroutines αŸ” αž˜αž»αžαž„αžΆαžšαžαž·αž…αžαž½αž…αž“αŸαŸ‡αž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ ENTIRE αŸ” Coroutine αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžšαž„αŸ‹αž…αžΆαŸ†αž±αŸ’αž™αž”αŸŠαžΌαžαž»αž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž»αž…αž αžΎαž™αž”αžΎαž€αž€αžΆαžšαž”αž„αŸ’αž αžΆαž‰αžšαž™αŸˆαž–αŸαž› 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 αžαŸ’αž›αž½αž“αžœαžΆ) flash drive αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž…αžΌαž›αž”αŸ’αžšαžΎαžœαžΆαž–αžΈαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‡αžΆαž―αž€αžŸαžΆαžšαž’αž˜αŸ’αž˜αžαžΆαŸ” αž“αŸ…αž‘αžΈαž“αŸ„αŸ‡αžαŸ’αž‰αž»αŸ†αž€αŸαž”αžΆαž“αž”αž„αŸ’αž αŸ„αŸ‡ mqtt_as, uasyncio, ssd1306 αž“αž·αž„αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž”αŸ’αžšαž˜αžΌαž›αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž”αŸ’αžšαžΎ (αž”αŸ’αžšαžΎαž“αŸ…αžαžΆαž„αž€αŸ’αž“αž»αž„ mqtt_as)αŸ”

αž™αžΎαž„αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž αžΎαž™... αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“ MemoryErrorαŸ” αž‡αžΆαž„αž“αŸαŸ‡αž‘αŸ…αž‘αŸ€αž αž–αŸαž›αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž–αŸ’αž™αžΆαž™αžΆαž˜αž™αž›αŸ‹αž€αžΆαž“αŸ‹αžαŸ‚αž…αŸ’αž”αžΆαžŸαŸ‹αž–αžΈαž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ†αž”αžΆαž“αž›αŸαž…αž’αŸ’αž›αžΆαž™ αž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž”αŸ†αž”αžΆαžαŸ‹αž€αŸ†αž αž»αžŸαž€αžΆαž“αŸ‹αžαŸ‚αž…αŸ’αžšαžΎαž“ αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŠαžΆαž€αŸ‹ αž€αŸ†αž αž»αžŸαž“αŸαŸ‡αž”αžΆαž“αž›αŸαž…αž‘αžΎαž„αž˜αž»αž“αž“αŸαŸ‡αŸ” αž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αžαžΆαž˜ Google αžαŸ’αž›αžΈαŸ—αž“αžΆαŸ†αž±αŸ’αž™αžαŸ’αž‰αž»αŸ†αž™αž›αŸ‹αžαžΆ αž‡αžΆαž‚αŸ„αž›αž€αžΆαžšαžŽαŸ microcontroller αž˜αžΆαž“αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ†αžαŸ’αžšαžΉαž˜αžαŸ‚ 30 kB αžŠαŸ‚αž›αž€αŸ’αž“αž»αž„αž“αŸ„αŸ‡ 65 kB αž“αŸƒαž€αžΌαžŠ (αžšαž½αž˜αž‘αžΆαŸ†αž„αž”αžŽαŸ’αžŽαžΆαž›αŸαž™) αž˜αž·αž“αž’αžΆαž…αžŸαž˜αž”αžΆαž“αŸ”

αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αžΆαž“αž•αŸ’αž›αžΌαžœαž…αŸαž‰αŸ” αžœαžΆαž”αž„αŸ’αž αžΆαž‰αžαžΆ micropython αž˜αž·αž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΌαžŠαžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž–αžΈαž―αž€αžŸαžΆαžš .py αž‘αŸ - αž―αž€αžŸαžΆαžšαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž„αž€αŸ’αžšαž„αž‡αžΆαž˜αž»αž“αžŸαž·αž“αŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡αž‘αŸ…αž‘αŸ€αžαžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž„αž€αŸ’αžšαž„αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž“αŸ…αž›αžΎ microcontroller αž”αŸ’αžšαŸ‚αž‘αŸ…αž‡αžΆ bytecode αžŠαŸ‚αž›αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αŸ’αž“αž»αž„αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ†αŸ” αž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαžŽαžΆαžŸαŸ‹ αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž…αž„αž€αŸ’αžšαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž’αŸ’αž“αž€αž€αŸαžαŸ’αžšαžΌαžœαž€αžΆαžš RAM αž…αŸ†αž“αž½αž“αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž•αž„αžŠαŸ‚αžšαŸ”

αž›αŸ’αž”αž·αž…αž‚αžΊαžŠαžΎαž˜αŸ’αž”αžΈαžšαž€αŸ’αžŸαžΆαž‘αž»αž€ microcontroller αž–αžΈαž€αžΆαžšαž…αž„αž€αŸ’αžšαž„αžŠαŸ‚αž›αž–αžΉαž„αž•αŸ’αž’αŸ‚αž€αž›αžΎαž’αž“αž’αžΆαž“αŸ” αž’αŸ’αž“αž€αž’αžΆαž…αž…αž„αž€αŸ’αžšαž„αž―αž€αžŸαžΆαžšαž“αŸ…αž›αžΎαž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžšαž’αŸ†αž˜αž½αž™ αž αžΎαž™αž•αŸ’αž‘αž»αž€αž‘αžΎαž„αž“αžΌαžœ bytecode αžŠαŸ‚αž›αžαŸ’αžšαŸ€αž˜αžšαž½αž…αž‡αžΆαžŸαŸ’αžšαŸαž…αž‘αŸ…αž€αŸ’αž“αž»αž„ microcontroller αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸαŸ‡αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž‘αžΆαž‰αž™αž€αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž„αŸ’αž€αž”αŸ‹ micropython αž“αž·αž„αž”αž„αŸ’αž€αžΎαž mpy-cross utility.

αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž”αžΆαž“αžŸαžšαžŸαŸαžš Makefile αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž”αžΆαž“αž†αŸ’αž›αž„αž€αžΆαžαŸ‹ αž“αž·αž„αž…αž„αž€αŸ’αžšαž„αž―αž€αžŸαžΆαžšαž…αžΆαŸ†αž”αžΆαž…αŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹ (αžšαž½αž˜αž‘αžΆαŸ†αž„αž”αžŽαŸ’αžŽαžΆαž›αŸαž™) αžŠαŸ„αž™αžŠαŸƒαŸ”

mpy-cross water_counter.py

αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž“αŸ…αžŸαŸαžŸαžŸαž›αŸ‹αž‚αžΊαž€αžΆαžšαž”αž„αŸ’αž αŸ„αŸ‡αž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αž˜αžΆαž“αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜ .mpy αžŠαŸ„αž™αž˜αž·αž“αž—αŸ’αž›αŸαž…αž›αž»αž” .py αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž‡αžΆαž˜αž»αž“αž–αžΈαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž―αž€αžŸαžΆαžšαžšαž”αžŸαŸ‹αž§αž”αž€αžšαžŽαŸαŸ”

αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž’αŸ’αžœαžΎαž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ (IDE?) ESPlorer αŸ” αžœαžΆαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αž‰αŸ’αž…αžΌαž›αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž‘αŸ… microcontroller αž αžΎαž™αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž–αž½αž€αžœαžΆαž—αŸ’αž›αžΆαž˜αŸ—αŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αžαž€αŸ’αž€αžœαž·αž‡αŸ’αž‡αžΆ αž“αž·αž„αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžœαžαŸ’αžαž»αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž˜αžΆαž“αž‘αžΈαžαžΆαŸ†αž„αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš water_counter.py (.mpy)αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αž’αŸ’αžœαžΈαŸ—αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž· αžœαžΆαžαŸ’αžšαžΌαžœαžαŸ‚αž˜αžΆαž“αž―αž€αžŸαžΆαžšαž˜αž½αž™αžˆαŸ’αž˜αŸ„αŸ‡αžαžΆ main.py αž“αŸ…αž–αŸαž›αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αŸ” αž›αžΎαžŸβ€‹αž–αžΈβ€‹αž“αŸαŸ‡β€‹αž‘αŸ…β€‹αž‘αŸ€αž αžœαžΆβ€‹αž‚αž½αžšβ€‹αžαŸ‚β€‹αž‡αžΆ .py αž αžΎαž™β€‹αž˜αž·αž“β€‹αž”αžΆαž“β€‹αž…αž„αž€αŸ’αžšαž„β€‹αž‡αžΆβ€‹αž˜αž»αž“ .mpy αŸ” αž“αŸαŸ‡β€‹αž‡αžΆβ€‹αžαŸ’αž›αžΉαž˜αžŸαžΆαžšβ€‹αž˜αž·αž“β€‹αžŸαžΌαžœβ€‹αžŸαŸ†αžαžΆαž“αŸ‹β€‹αžšαž”αžŸαŸ‹β€‹αžœαžΆαŸ”

import water_counter

αž™αžΎαž„αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžœαžΆ - αž’αŸ’αžœαžΈαŸ—αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ†αž₯αžαž‚αž·αžαžαŸ’αž›αŸƒαž‚αžΊαžαžΌαž…αž‚αž½αžšαž±αŸ’αž™αž–αŸ’αžšαž½αž™αž”αžΆαžšαž˜αŸ’αž— - αž”αŸ’αžšαž αŸ‚αž› 1kb αŸ” αžαŸ’αž‰αž»αŸ†αž“αŸ…αžαŸ‚αž˜αžΆαž“αž‚αž˜αŸ’αžšαŸ„αž„αž–αž„αŸ’αžšαžΈαž€αž˜αž»αžαž„αžΆαžšαžšαž”αžŸαŸ‹αž§αž”αž€αžšαžŽαŸ αž αžΎαž™αž‚αžΈαž‘αžΌαž”αŸƒαž“αŸαŸ‡αž…αŸ’αž”αžΆαžŸαŸ‹αž‡αžΆαž˜αž·αž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž‰αž»αŸ†αž‘αŸαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžœαžΆαž”αžΆαž“αž”αŸ’αžšαŸ‚αž€αŸ’αž›αžΆαž™αžαžΆαž˜αžΆαž“αž•αŸ’αž›αžΌαžœαž…αŸαž‰αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžšαžŽαžΈαž“αŸαŸ‡αž•αž„αžŠαŸ‚αžšαŸ”

αž“αŸαŸ‡αž‡αžΆαžšαžΏαž„αŸ” αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž―αž€αžŸαžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž„αž€αŸ’αžšαž„αž‡αžΆ bytecode αž αžΎαž™αžšαžŸαŸ‹αž“αŸ…αž›αžΎαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž―αž€αžŸαžΆαžšαžαžΆαž„αž€αŸ’αž“αž»αž„αž€αŸαžŠαŸ„αž™ αžαžΆαž˜αž–αž·αžαž–αž½αž€αžœαžΆαž“αŸ…αžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‘αž»αž€αž‘αŸ…αž€αŸ’αž“αž»αž„ RAM αž“αž·αž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž–αžΈαž‘αžΈαž“αŸ„αŸ‡αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžœαžΆαž”αŸ’αžšαŸ‚αžαžΆ micropython αž’αžΆαž…αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž· bytecode αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž–αžΈ flash memory αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžœαžΆαž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αž„αŸ’αž€αžΎαžαžœαžΆαžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž„αŸ’αž€αž”αŸ‹αŸ” αžœαžΆαž˜αž·αž“αž–αž·αž”αžΆαž€αž‘αŸ αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαžœαžΆαž…αŸ†αžŽαžΆαž™αž–αŸαž›αžαŸ’αž›αŸ‡αž“αŸ…αž›αžΎ netbook αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† (αž˜αžΆαž“αžαŸ‚αž“αŸ…αž‘αžΈαž“αŸ„αŸ‡αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž’αŸ’αž›αžΆαž”αŸ‹αž˜αžΆαž“αž›αžΈαž“αž»αž…)αŸ”

αž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž˜αžΆαž“αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

  • αž‘αžΆαž‰αž™αž€αž“αž·αž„αžŠαŸ†αž‘αžΎαž„ ESP αž”αžΎαž€ SDK. αžšαžΏαž„αž“αŸαŸ‡αž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ†αž’αŸ’αž“αž€αž…αž„αž€αŸ’αžšαž„ αž“αž·αž„αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ ESP8266αŸ” αž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ†αžŠαŸ„αž™αž™αŸ„αž„αžαžΆαž˜αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž“αŸ…αž›αžΎαž‘αŸ†αž–αŸαžšαž˜αŸαž“αŸƒαž‚αž˜αŸ’αžšαŸ„αž„ (αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹ STANDALONE=yes)
  • αž‘αžΆαž‰αž™αž€ αž”αŸ’αžšαž—αŸαž‘ micropython
  • αžŠαžΆαž€αŸ‹αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„ ports/esp8266/modules αž“αŸ…αžαžΆαž„αž€αŸ’αž“αž»αž„ micropython tree
  • αž™αžΎαž„αž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ†αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž„αŸ’αž€αž”αŸ‹αžαžΆαž˜αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš ports/esp8266/README.md
  • αž™αžΎαž„αž•αŸ’αž‘αž»αž€αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž„αŸ’αž€αž”αŸ‹αž‘αŸ… microcontroller (αžαŸ’αž‰αž»αŸ†αž’αŸ’αžœαžΎαžœαžΆαž“αŸ…αž›αžΎ Windows αžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ ESP8266Flasher ឬ Python esptool)

αž“αŸ„αŸ‡αž αžΎαž™αž‡αžΆαžœαžΆ αž₯αž‘αžΌαžœαž“αŸαŸ‡ 'αž“αžΆαŸ†αž…αžΌαž› ssd1306' αž“αžΉαž„αž›αžΎαž€αž€αžΌαžŠαžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž–αžΈαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž„αŸ’αž€αž”αŸ‹ αž αžΎαž™ RAM αž“αžΉαž„αž˜αž·αž“αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαžΏαž„αž“αŸαŸ‡αž‘αŸαŸ” αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž›αŸ’αž”αž·αž…αž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž”αž„αŸ’αž αŸ„αŸ‡αžαŸ‚αž€αžΌαžŠαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž„αŸ’αž€αž”αŸ‹ αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž›αž€αžΌαžŠαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŸαŸ†αžαžΆαž“αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž…αŸαž‰αž–αžΈαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž―αž€αžŸαžΆαžšαŸ” αž“αŸαŸ‡αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž€αŸ‚αž”αŸ’αžšαŸ‚αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αžΆαž“αž™αŸ‰αžΆαž„αž„αžΆαž™αžŸαŸ’αžšαž½αž›αžŠαŸ„αž™αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž…αž„αž€αŸ’αžšαž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž„αŸ’αž€αž”αŸ‹αž‘αžΎαž„αžœαž·αž‰αŸ” αž“αŸ…αž–αŸαž›αž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž˜αžΆαž“ RAM αž₯αžαž‚αž·αžαžαŸ’αž›αŸƒαž”αŸ’αžšαž αŸ‚αž› 8.5kb αŸ” αžœαžΆαž“αžΉαž„αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž™αžΎαž„αž’αž“αž»αžœαžαŸ’αžαž˜αž»αžαž„αžΆαžšαž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆαž‡αžΆαž…αŸ’αžšαžΎαž“αž“αžΆαž–αŸαž›αž’αž“αžΆαž‚αžαŸ” αž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαžŽαžΆαžŸαŸ‹, αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αž·αž“αž˜αžΆαž“αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ†αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αž‘αŸαž“αŸ„αŸ‡αž’αŸ’αž“αž€αž’αžΆαž…αžšαž»αž‰αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŸαŸ†αžαžΆαž“αŸ‹αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž„αŸ’αž€αž”αŸ‹αŸ”

αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžαžΎαž™αžΎαž„αž‚αž½αžšαž’αŸ’αžœαžΎαž’αŸ’αžœαžΈαž₯αž‘αžΌαžœαž“αŸαŸ‡?

αž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαžŽαžΆαžŸαŸ‹, αž‚αŸ’αžšαžΏαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“ soldered, αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž„αŸ’αž€αž”αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžš, αž”αŸ’αžšαž’αž”αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–, αž§αž”αž€αžšαžŽαŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‡αžΆαž”αŸ‹αž‚αžΆαŸ†αž„αž“αŸ…αž›αžΎαž‡αž‰αŸ’αž‡αžΆαŸ†αž„αž“αž·αž„αžŠαŸ„αž™αžšαžΈαž€αžšαžΆαž™αž˜αž½αž™αž—αŸ’αž›αžΉαž”αž—αŸ’αž›αŸ‚αžαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αŸαž›αž“αŸαŸ‡ αžœαžΆαž‡αžΆαž”αŸ’αžšαž’αž”αŸ‹αžαŸ’αž˜αŸ…αž‘αžΆαŸ†αž„αž’αžŸαŸ‹ (αžαžΆαž˜αž“αŸαž™αžαŸ’αžšαž„αŸ‹ αž“αž·αž„αž“αŸαž™αž’αŸ€αž”) αž αžΎαž™αžœαžΆαž“αŸ…αžαŸ‚αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαž·αž…αžαž½αž…αŸ” αžœαžΆαžŠαž›αŸ‹αž–αŸαž›αž αžΎαž™αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž’αŸ’αžœαžΈαž˜αž½αž™αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžŸαžΆαžš MQTT αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‰αžΎαž‘αŸ…αž€αžΆαž“αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαŸ”

"αž•αŸ’αž‘αŸ‡αž†αŸ’αž›αžΆαž" αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž”αŸ’αžšαž–αŸαž“αŸ’αž’ Majordomo. αž˜αŸ‰αžΌαžŒαž»αž› MQTT αž…αŸαž‰αž˜αž€αž€αŸ’αžšαŸ…αž”αŸ’αžšαž’αž”αŸ‹ αž¬αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αž™αŸ‰αžΆαž„αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž–αžΈαž‘αžΈαž•αŸ’αžŸαžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž“αŸ’αžαŸ‚αž˜ - αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž…αžΆαŸ†αžαžΆαžαŸ’αž‰αž»αŸ†αž™αž€αžœαžΆαž˜αž€αž–αžΈαžŽαžΆαž‘αŸαŸ” MQTT αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαžšαž”αžŸαŸ‹αžŠαŸ‚αž›αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αž‘αŸ - αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžšαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž‚αŸαž αŸ…αžαžΆαŸ” αžˆαŸ’αž˜αž½αž‰αž€αžŽαŸ’αžαžΆαž› - αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžŠαŸ‚αž›αž‘αž‘αž½αž› αžαž˜αŸ’αžšαŸ€αž” αž“αž·αž„αž”αž‰αŸ’αž‡αžΌαž“αžŸαžΆαžš MQTT αž‘αŸ…αž€αžΆαž“αŸ‹αž’αžαž·αžαž·αž‡αž“αŸ” αžαŸ’αž‰αž»αŸ†αž”αŸ’αžšαžΎαž˜αžΌαžŸ αžŠαŸ‚αž› (αžŠαžΌαž…αž‡αžΆ majordomo) αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αžΎ netbook αžŠαžΌαž…αž‚αŸ’αž“αžΆαŸ”

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž§αž”αž€αžšαžŽαŸαž•αŸ’αž‰αžΎαžŸαžΆαžšαž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹αž˜αŸ’αžαž„ αžαž˜αŸ’αž›αŸƒαž“αžΉαž„αž”αž„αŸ’αž αžΆαž‰αž—αŸ’αž›αžΆαž˜αŸ—αž“αŸ…αž€αŸ’αž“αž»αž„αž”αž‰αŸ’αž‡αžΈαŸ”

αž™αžΎαž„αž—αŸ’αž‡αžΆαž”αŸ‹αž˜αŸ‰αŸ‚αžαŸ’αžšαž‘αžΉαž€αž‘αŸ…αž“αžΉαž„αž•αŸ’αž‘αŸ‡αž†αŸ’αž›αžΆαžαžœαŸƒ

αž₯αž‘αžΌαžœαž“αŸαŸ‡αžαž˜αŸ’αž›αŸƒαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžŸαžΆαžšαž—αŸ’αž‡αžΆαž”αŸ‹αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžœαžαŸ’αžαž»αž”αŸ’αžšαž–αŸαž“αŸ’αž’ αž–αž½αž€αžœαžΆαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αž‚αŸ’αžšαžΈαž”αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž€αž˜αŸ’αž˜ αž“αž·αž„αž‘αž‘αž½αž›αžšαž„αž“αžΌαžœαž€αžΆαžšαžœαž·αž—αžΆαž‚αž•αŸ’αžŸαŸαž„αŸ— - αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αž αž½αžŸαž–αžΈαžœαž·αžŸαžΆαž›αž—αžΆαž–αž“αŸƒαž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αŸ” αžαŸ’αž‰αž»αŸ†αž’αžΆαž…αžŽαŸ‚αž“αžΆαŸ†αž”αŸ’αžšαž–αŸαž“αŸ’αž’ majordomo αžŠαž›αŸ‹αž’αŸ’αž“αž€αžŠαŸ‚αž›αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸ channel Electronics In Lens - αž˜αž·αžαŸ’αžαž˜αŸ’αž“αžΆαž€αŸ‹αž€αŸαž€αŸ†αž–αž»αž„αžŸαžΆαž„αžŸαž„αŸ‹αž•αŸ’αž‘αŸ‡αž†αŸ’αž›αžΆαžαžœαŸƒ αž αžΎαž™αž“αž·αž™αžΆαž™αž™αŸ‰αžΆαž„αž…αŸ’αž”αžΆαžŸαŸ‹αž’αŸ†αž–αžΈαž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’αŸ”

αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž”αž„αŸ’αž αžΆαž‰αž’αŸ’αž“αž€αž“αžΌαžœαž€αŸ’αžšαžΆαž αŸ’αžœαž–αžΈαžšαž”αžΈαŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž€αŸ’αžšαžΆαž αŸ’αžœαžŠαŸαžŸαžΆαž˜αž‰αŸ’αž‰αž“αŸƒαžαž˜αŸ’αž›αŸƒαž”αŸ’αžšαž…αžΆαŸ†αžαŸ’αž„αŸƒ

αž™αžΎαž„αž—αŸ’αž‡αžΆαž”αŸ‹αž˜αŸ‰αŸ‚αžαŸ’αžšαž‘αžΉαž€αž‘αŸ…αž“αžΉαž„αž•αŸ’αž‘αŸ‡αž†αŸ’αž›αžΆαžαžœαŸƒ
αžœαžΆαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž˜αžΎαž›αžƒαžΎαž‰αžαžΆαžŸαŸ’αž‘αžΎαžšαžαŸ‚αž‚αŸ’αž˜αžΆαž“αž“αžšαžŽαžΆαž˜αŸ’αž“αžΆαž€αŸ‹αž”αžΆαž“αž”αŸ’αžšαžΎαž‘αžΉαž€αž“αŸ…αž–αŸαž›αž™αž”αŸ‹αŸ” αž–αžΈαžšαž”αžΈαžŠαž„αž˜αžΆαž“αž“αžšαžŽαžΆαž˜αŸ’αž“αžΆαž€αŸ‹αž‘αŸ…αž”αž„αŸ’αž‚αž“αŸ‹ αž αžΎαž™αžœαžΆαž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαžαžΆαžαž˜αŸ’αžšαž„ osmosis αž”αž‰αŸ’αž…αŸ’αžšαžΆαžŸαž”αžΌαž˜αž”αžΆαž“αž–αžΈαžšαž”αžΈαž›αžΈαžαŸ’αžšαž€αŸ’αž“αž»αž„αž˜αž½αž™αž™αž”αŸ‹αŸ” αž“αŸ…αž–αŸαž›αž–αŸ’αžšαžΉαž€αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αžΎαž“αž‘αžΎαž„αž™αŸ‰αžΆαž„αžαŸ’αž›αžΆαŸ†αž„αŸ” αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαžαŸ’αž‰αž»αŸ†αž”αŸ’αžšαžΎαž‘αžΉαž€αž–αžΈαž‘αž…αŸ†αž αžΆαž™ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž„αžΌαžαž‘αžΉαž€ αž αžΎαž™αž”αŸ’αžαžΌαžšαž‘αŸ…αž‘αžΉαž€αž€αŸ’αžαŸ…αž€αŸ’αž“αž»αž„αž‘αžΈαž€αŸ’αžšαž»αž„αž‡αžΆαž”αžŽαŸ’αžαŸ„αŸ‡αž’αžΆαžŸαž“αŸ’αž“ - αž“αŸαŸ‡αž€αŸαž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰αž™αŸ‰αžΆαž„αž…αŸ’αž”αžΆαžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ’αžšαžΆαž αŸ’αžœαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž•αž„αžŠαŸ‚αžšαŸ”

αž–αžΈαž€αŸ’αžšαžΆαž αŸ’αžœαž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŠαžΉαž„αžαžΆαž€αžΆαžšαž‘αŸ…αž”αž„αŸ’αž‚αž“αŸ‹αžαŸ’αžšαžΌαžœαž€αžΆαžšαž‘αžΉαž€ 6-7 αž›αžΈαžαŸ’αžšαž€αžΆαžšαž„αžΌαžαž‘αžΉαž€αžαŸ’αžšαžΌαžœαž€αžΆαžš 20-30 αž›αžΈαžαŸ’αžšαž€αžΆαžšαž›αžΆαž„αž…αžΆαž“αžαŸ’αžšαžΌαžœαž€αžΆαžšαž”αŸ’αžšαž αŸ‚αž› 20 αž›αžΈαžαŸ’αžšαž αžΎαž™αž€αžΆαžšαž„αžΌαžαž‘αžΉαž€αžαŸ’αžšαžΌαžœαž€αžΆαžš 160 αž›αžΈαžαŸ’αžšαŸ” αž‚αŸ’αžšαž½αžŸαžΆαžšαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αž“αŸ’αž›αŸ‚αž„αžŽαžΆαž˜αž½αž™αž”αŸ’αžšαž αŸ‚αž› 500-600 αž›αžΈαžαŸ’αžšαž€αŸ’αž“αž»αž„αž˜αž½αž™αžαŸ’αž„αŸƒαŸ”

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αžŠαŸ‚αž›αž…αž„αŸ‹αžŠαžΉαž„αž…αž„αŸ‹αžƒαžΎαž‰αž‡αžΆαž–αž·αžŸαŸαžŸαž’αŸ’αž“αž€αž’αžΆαž…αž˜αžΎαž›αž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαž˜αŸ’αž›αŸƒαž”αž»αž‚αŸ’αž‚αž›αž“αžΈαž˜αž½αž™αŸ—

αž™αžΎαž„αž—αŸ’αž‡αžΆαž”αŸ‹αž˜αŸ‰αŸ‚αžαŸ’αžšαž‘αžΉαž€αž‘αŸ…αž“αžΉαž„αž•αŸ’αž‘αŸ‡αž†αŸ’αž›αžΆαžαžœαŸƒ

αž–αžΈαž‘αžΈαž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŠαžΉαž„αžαžΆαž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž”αžΎαž€ αž‘αžΉαž€αž αžΌαžšαž€αŸ’αž“αž»αž„αž›αŸ’αž”αžΏαž“αž”αŸ’αžšαž αŸ‚αž› 1 αž›αžΈαžαŸ’αžšαž€αŸ’αž“αž»αž„ 5 αžœαž·αž“αžΆαž‘αžΈαŸ”

αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αž“αŸαŸ‡ αžŸαŸ’αžαž·αžαž·αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž˜αž·αž“αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž˜αžΎαž›αž‘αŸαŸ” Majordomo αž€αŸαž˜αžΆαž“αž›αž‘αŸ’αž’αž—αžΆαž–αž˜αžΎαž›αžαžΆαžšαžΆαž„αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαžΆαž˜αžαŸ’αž„αŸƒ αžŸαž”αŸ’αžαžΆαž αŸ αž“αž·αž„αžαŸ‚αž•αž„αžŠαŸ‚αžšαŸ” αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž‚αžΊαž‡αžΆαž€αŸ’αžšαžΆαž αŸ’αžœαž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αžšαž”αžΆαžš

αž™αžΎαž„αž—αŸ’αž‡αžΆαž”αŸ‹αž˜αŸ‰αŸ‚αžαŸ’αžšαž‘αžΉαž€αž‘αŸ…αž“αžΉαž„αž•αŸ’αž‘αŸ‡αž†αŸ’αž›αžΆαžαžœαŸƒ

αž˜αž€β€‹αž‘αž›αŸ‹β€‹αž–αŸαž›β€‹αž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†β€‹αž˜αžΆαž“β€‹αž‘αž·αž“αŸ’αž“αž“αŸαž™β€‹αžαŸ‚β€‹αž˜αž½αž™β€‹αžŸαž”αŸ’αžŠαžΆαž αŸβ€‹αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αž€αŸ’αž“αž»αž„β€‹αž˜αž½αž™β€‹αžαŸ‚ αž€αŸ’αžšαžΆαž αŸ’αžœβ€‹αž“αŸαŸ‡β€‹αž“αžΉαž„β€‹αž˜αžΆαž“β€‹αž€αžΆαžšβ€‹αž”αž„αŸ’αž αžΆαž‰β€‹αž€αžΆαž“αŸ‹β€‹αžαŸ‚β€‹αž…αŸ’αžšαžΎαž“ - αžšαžΆαž›αŸ‹β€‹αžαŸ’αž„αŸƒβ€‹αž“αžΉαž„β€‹αž˜αžΆαž“β€‹αž‡αž½αžšβ€‹αžˆαžšβ€‹αžŠαžΆαž…αŸ‹β€‹αžŠαŸ„αž™β€‹αž‘αŸ‚αž€αŸ” αžšαžΌαž”αž—αžΆαž–αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αžαžΌαž…αž”αž“αŸ’αžαž·αž…αžŠαŸ„αž™αž€αžΆαžšαž›αŸƒαžαž˜αŸ’αžšαžΌαžœαž‘αŸ…αž“αžΉαž„αžαž˜αŸ’αž›αŸƒαžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αž‰αŸ’αž…αžΌαž›αžŠαŸ„αž™αžŠαŸƒ (αž‡αž½αžšαžˆαžšαž’αŸ†αž”αŸ†αž•αž»αž) αŸ” αž αžΎαž™αžœαžΆαž˜αž·αž“αž‘αžΆαž“αŸ‹αž…αŸ’αž”αžΆαžŸαŸ‹αž“αŸ…αž‘αžΎαž™αž‘αŸαžαžΆαžαžΎαžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžαž˜αŸ’αž›αŸƒαžŠαŸ†αž”αžΌαž„αž˜αž·αž“αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœ αžŸαŸ’αž‘αžΎαžšαžαŸ‚αž˜αž½αž™αž‚αžΌαž”αžαž·αž… αž¬αžαžΆαžαžΎαž“αŸαŸ‡αž‡αžΆαž€αŸ†αž αž»αžŸαž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž„αŸ’αž€αž”αŸ‹ αž αžΎαž™αž˜αž·αž“αž˜αŸ‚αž“αž‚αŸ’αžšαž”αŸ‹αž›αžΈαžαŸ’αžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαžΆαž”αŸ‹αž“αŸ„αŸ‡αž‘αŸαŸ” αžαŸ’αžšαžΌαžœαž€αžΆαžšαž–αŸαž›αžœαŸαž›αžΆαž”αž“αŸ’αžαŸ‚αž˜αŸ”

αž€αŸ’αžšαžΆαž αŸ’αžœαžαŸ’αž›αž½αž“αž―αž„αž“αŸ…αžαŸ‚αžαŸ’αžšαžΌαžœαž€αžΆαžšαžœαŸαž‘αž˜αž“αŸ’αžαžαŸ’αž›αŸ‡ αž€αžΆαžšαž›αžΆαž„αž‡αž˜αŸ’αžšαŸ‡αž€αžΆαžšαž›αžΆαž”αž–αžŽαŸŒαŸ” αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαžαŸ’αž‰αž»αŸ†αž€αŸαž“αžΉαž„αž”αž„αŸ’αž€αžΎαžαž€αŸ’αžšαžΆαž αŸ’αžœαž“αŸƒαž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ†αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αŸ„αž›αž”αŸ†αžŽαž„αž”αŸ†αž”αžΆαžαŸ‹αž€αŸ†αž αž»αžŸαž•αž„αžŠαŸ‚αžš - αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž˜αžΆαž“αž’αŸ’αžœαžΈαž˜αž½αž™αž›αŸαž…αž’αŸ’αž›αžΆαž™αž“αŸ…αž‘αžΈαž“αŸ„αŸ‡αŸ” αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž”αž„αŸ’αž αžΆαž‰αžšαž™αŸˆαž–αŸαž›αžŠαŸ‚αž›αž˜αž·αž“αž˜αžΆαž“αž’αŸŠαžΈαž“αž’αžΊαžŽαž·αžαŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αŸαž›αž“αŸαŸ‡ αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αž‚αžΊαž“αŸ…αž€αž˜αŸ’αžšαž·αžαž“αŸƒαž‚αŸ†αž“αž·αžαŸ”

αžŸαŸαž…αž€αŸ’αžαžΈαžŸαž“αŸ’αž“αž·αžŠαŸ’αž‹αžΆαž“

αžŸαž–αŸ’αžœβ€‹αžαŸ’αž„αŸƒβ€‹αž“αŸαŸ‡ αž•αŸ’αž‘αŸ‡β€‹αž›αŸ’αžœαŸ‚αž„β€‹αžšαž”αžŸαŸ‹β€‹αžαŸ’αž‰αž»αŸ†β€‹αž”αžΆαž“β€‹αž€αŸ’αž›αžΆαž™β€‹αž‡αžΆβ€‹αž˜αž“αž»αžŸαŸ’αžŸβ€‹αž†αŸ’αž›αžΆαžβ€‹αž‡αžΆαž„β€‹αž˜αž»αž“β€‹αž”αž“αŸ’αžαž·αž…αŸ” αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž§αž”αž€αžšαžŽαŸαžαžΌαž…αž”αŸ‚αž”αž“αŸαŸ‡ αžœαžΆαž“αžΉαž„αž€αžΆαž“αŸ‹αžαŸ‚αž„αžΆαž™αžŸαŸ’αžšαž½αž›αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž‰αž»αŸ†αž€αŸ’αž“αž»αž„αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‘αžΉαž€αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž‘αŸ‡αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αž»αž“αž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αžαžΉαž„αž“αžΉαž„ "αž˜αŸ’αžαž„αž‘αŸ€αž αž™αžΎαž„αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‘αžΉαž€αž…αŸ’αžšαžΎαž“αž€αŸ’αž“αž»αž„αž˜αž½αž™αžαŸ‚" αž₯αž‘αžΌαžœαž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž’αžΆαž…αžšαž€αžƒαžΎαž‰αž”αŸ’αžšαž—αž–αž“αŸƒαž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αŸαŸ‡αŸ”

αž’αŸ’αž“αž€β€‹αžαŸ’αž›αŸ‡β€‹αž’αžΆαž…β€‹αž“αžΉαž„β€‹αžƒαžΎαž‰β€‹αžαžΆβ€‹αžœαžΆβ€‹αž…αž˜αŸ’αž›αŸ‚αž€β€‹αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αž˜αžΎαž›β€‹αž€αžΆαžšβ€‹αž’αžΆαž“β€‹αž“αŸ…β€‹αž›αžΎβ€‹αž’αŸαž€αŸ’αžšαž„αŸ‹β€‹αž”αŸ’αžšαžŸαž·αž“β€‹αž”αžΎβ€‹αžœαžΆβ€‹αž“αŸ…β€‹αž…αž˜αŸ’αž„αžΆαž™β€‹αž˜αž½αž™β€‹αž˜αŸ‰αŸ‚αžαŸ’αžšβ€‹αž–αžΈβ€‹αž˜αŸ‰αŸ‚αžαŸ’αžšαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αž–αŸαž›αž’αž“αžΆαž‚αžαž˜αž·αž“αž†αŸ’αž„αžΆαž™αž”αŸ‰αž»αž“αŸ’αž˜αžΆαž“αž‘αŸ αžαŸ’αž‰αž»αŸ†αž˜αžΆαž“αž‚αž˜αŸ’αžšαŸ„αž„αž•αŸ’αž›αžΆαžŸαŸ‹αž‘αŸ…αž’αžΆαž•αžΆαžαž˜αž·αž“αž˜αž½αž™αž‘αŸ€αž αžŠαŸ‚αž›αž“αžΉαž„αž˜αžΆαž“αž’αŸ’αž“αž€αž›αžΎαž€αž‘αžΉαž€αž‡αžΆαž…αŸ’αžšαžΎαž“ αž αžΎαž™αž˜αŸ‰αŸ‚αžαŸ’αžšαžαŸ’αž›αž½αž“αž―αž„αž‘αŸ†αž“αž„αž‡αžΆαžŸαŸ’αžαž·αžαž“αŸ…αž›αžΎαž€αžΆαžšαž…αž»αŸ‡αž…αžαŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž§αž”αž€αžšαžŽαŸαž’αžΆαž“αž–αžΈαž…αž˜αŸ’αž„αžΆαž™αž“αžΉαž„αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαžαŸ’αž›αžΆαŸ†αž„αžŽαžΆαžŸαŸ‹αŸ”

αžαŸ’αž‰αž»αŸ†αž€αŸαž˜αžΆαž“αž‚αž˜αŸ’αžšαŸ„αž„αž–αž„αŸ’αžšαžΈαž€αž˜αž»αžαž„αžΆαžšαžšαž”αžŸαŸ‹αž§αž”αž€αžšαžŽαŸαž•αž„αžŠαŸ‚αžšαŸ” αžαŸ’αž‰αž»αŸ†αž€αŸ†αž–αž»αž„αž˜αžΎαž›αžœαŸ‰αžΆαž›αŸ‹αž˜αŸ‰αžΌαžαžΌαžšαž½αž…αž αžΎαž™αŸ” αž₯αž‘αžΌαžœβ€‹αž“αŸαŸ‡ αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž”αŸ’αžαžΌαžšβ€‹αž‘αž…αŸ†αž αžΆαž™β€‹αž‘αŸ…β€‹αž‘αžΉαž€β€‹αž‘αžΈαž€αŸ’αžšαž»αž„ αžαŸ’αž‰αž»αŸ†β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΎαž€β€‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“ ៣ αž€αŸ’αž“αž»αž„β€‹αž€αž“αŸ’αž›αŸ‚αž„β€‹αž–αž·αž”αžΆαž€β€‹αž‘αŸ…β€‹αžŠαž›αŸ‹αŸ” αžœαžΆαž“αžΉαž„αž€αžΆαž“αŸ‹αžαŸ‚αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αŸ’αžœαžΎαžœαžΆαžŠαŸ„αž™αž”αŸ’αžšαžΎαž”αŸŠαžΌαžαž»αž„αž˜αž½αž™αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž…αž„αŸ’αž’αž»αž›αž”αž„αŸ’αž αžΆαž‰αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαŸ” αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹ αžœαžΆαž˜αžΆαž“αžαž˜αŸ’αž›αŸƒαž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž€αžΆαžšαž–αžΆαžšαž”αŸ’αžšαž†αžΆαŸ†αž„αž“αžΉαž„αž€αžΆαžšαž›αŸαž…αž’αŸ’αž›αžΆαž™αŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž€αŸ†αžŽαŸ‚αž§αž”αž€αžšαžŽαŸαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎ ESP8266αŸ” αžαžΆαž˜αž‚αŸ†αž“αž·αžαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž—αŸ’αž‡αžΆαž”αŸ‹αž˜αž€αž‡αžΆαž˜αž½αž™αž€αŸ†αžŽαŸ‚αž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž„αŸ’αž€αž”αŸ‹ micropython αžŠαŸ„αž™αž”αŸ’αžšαžΎ coroutines - αžŸαžΆαž˜αž‰αŸ’αž‰ αž“αž·αž„αžŸαŸ’αžšαžŸαŸ‹αžŸαŸ’αž’αžΆαžαŸ” αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž–αŸ’αž™αžΆαž™αžΆαž˜αž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž…αŸ†αžŽαž»αž…αžαŸ’αžœαŸ‡αžαžΆαž αž“αž·αž„αž…αŸ†αžŽαž»αž…αžαŸ’αžœαŸ‡αžαžΆαžαž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž‡αž½αž”αž”αŸ’αžšαž‘αŸ‡αž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›αž™αž»αž‘αŸ’αž’αž“αžΆαž€αžΆαžšαž“αŸαŸ‡αŸ” αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž–αžŽαŸŒαž“αžΆαž’αŸ’αžœαžΈαŸ—αž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž™αŸ‰αžΆαž„αž›αž˜αŸ’αž’αž·αžαž–αŸαž€αž αžΎαž™ αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹ αž€αŸ’αž“αž»αž„αž“αžΆαž˜αž‡αžΆαž’αŸ’αž“αž€αž’αžΆαž“ αžœαžΆαž„αžΆαž™αžŸαŸ’αžšαž½αž›αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž‰αž»αŸ†αž€αŸ’αž“αž»αž„αž€αžΆαžšαžšαŸ†αž›αž„αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹ αž‡αžΆαž‡αžΆαž„αž€αžΆαžšαž‚αž·αžαž“αŸ…αž–αŸαž›αž€αŸ’αžšαŸ„αž™αž“αžΌαžœαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž˜αž·αž“αž”αžΆαž“αž“αž·αž™αžΆαž™αŸ”

αžŠαžΌαž…αžšαžΆαž›αŸ‹αžŠαž„ αžαŸ’αž‰αž»αŸ†αž”αžΎαž€αž…αŸ†αž αžšαž…αŸ†αž–αŸ„αŸ‡αž€αžΆαžšαžšαž·αŸ‡αž‚αž“αŸ‹αž€αŸ’αž“αž»αž„αž“αŸαž™αžŸαŸ’αžαžΆαž”αž“αžΆαŸ”

αž”αŸ’αžšαž—αž–
αžŸαŸ€αž‚αŸ’αžœαžΈαž“αž·αž„αž”αž“αŸ’αž‘αŸ‡
αž‚αŸ†αžšαžΌαž€αžšαžŽαžΈ

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹