Hoʻohui mākou i ka mika wai i ka home akamai

I kekahi manawa, ʻo nā ʻōnaehana home automation, a i ʻole "home akamai" e like me ka mea i kapa pinepine ʻia, he kumukūʻai nui a ʻo ka poʻe waiwai wale nō ke loaʻa iā lākou. I kēia lā ma ka mākeke hiki iā ʻoe ke loaʻa i nā pahu kūʻai kūpono ʻole me nā mea ʻike, nā pihi / nā hoʻololi a me nā mea hana no ka hoʻomalu ʻana i nā kukui, nā kumu, ka ea, ka wai a me nā mea kūʻai aku. A hiki i ka mea DIY kekee loa ke komo i ka nani a hōʻuluʻulu i nā mea hana no ka home akamai ma ke kumu kūʻai ʻole.

Hoʻohui mākou i ka mika wai i ka home akamai

ʻO ka maʻamau, ʻo nā mea i manaʻo ʻia he sensor a i ʻole actuators. Hiki iā lākou ke maʻalahi i ka hoʻokō ʻana i nā hiʻohiʻona e like me "ke hoʻāla ʻia kahi mea ʻike neʻe, e hoʻā i nā kukui" a i ʻole "ke pani kokoke i ka puka e hoʻopau i nā kukui o ke keʻena holoʻokoʻa." Akā ʻaʻole i holo nā mea me ka telemetry. ʻO ka maikaʻi loa, ʻo ia ka pakuhi o ka mahana a me ka haʻahaʻa, a i ʻole ka mana hikiwawe ma kahi puka kikoʻī.

Ua hoʻokomo au i nā mika wai me ka puka pulse. No kēlā me kēia lita e hele ana i ka mika, hoʻāla ʻia ke kī ʻohe a pani i ka pilina. ʻO ka mea wale nō i koe e hana ai, ʻo ka pili ʻana i nā uwea a hoʻāʻo e loaʻa ka pōmaikaʻi mai ia mea. No ka laʻana, e nānā i ka hoʻohana ʻana i ka wai ma ka hola a me ka lā o ka pule. ʻAe, inā he nui nā wai i loko o ke keʻena, a laila ʻoi aku ka maʻalahi o ka ʻike ʻana i nā hōʻailona o kēia manawa ma ka pale hoʻokahi ma mua o ka piʻi ʻana i nā niches paʻakikī me kahi kukui uila.

Aia ma lalo o ka ʻoki ʻia kaʻu mana o kahi hāmeʻa e pili ana i ka ESP8266, e helu ana i nā pulses mai nā mika wai a hoʻouna i nā heluhelu ma o MQTT i ka server home akamai. E hoʻolālā mākou ma micropython me ka hoʻohana ʻana i ka waihona uasyncio. I ka hana ʻana i ka firmware, ua loaʻa iaʻu nā pilikia hoihoi, aʻu e kūkākūkā pū ai ma kēia ʻatikala. Hele!

ʻO ke kumuhana

Hoʻohui mākou i ka mika wai i ka home akamai

ʻO ka puʻuwai o ke kaapuni holoʻokoʻa he module ia ma ka microcontroller ESP8266. Ua hoʻolālā mua ʻia ka ESP-12, akā ua hewa kaʻu. Pono mākou e ʻoluʻolu me ka module ESP-07, i loaʻa. ʻO ka mea pōmaikaʻi, ua like lākou ma nā ʻōlelo o nā pine a me nā hana, ʻo ka ʻokoʻa wale nō i ka antenna - aia ka ESP-12 i kahi i kūkulu ʻia, ʻoiai ʻo ka ESP-07 kahi waho. Eia nō naʻe, ʻoiai me ka ʻole o kahi antenna WiFi, loaʻa maʻamau ka hōʻailona i loko o koʻu lumi ʻauʻau.

ʻO ka uwila o ka module maʻamau:

  • pihi hoʻihoʻi me ka huki-up a me ka capacitor (ʻoiai aia nā mea ʻelua i loko o ka module)
  • Huki ʻia ka hōʻailona hiki (CH_PD) i ka mana
  • Huki ʻia ʻo GPIO15 i ka honua. Pono kēia i ka hoʻomaka, akā ʻaʻohe aʻu mea e hoʻopili ai i kēia wāwae; ʻAʻole pono iaʻu

No ka hoʻokomo ʻana i ka module i ke ʻano firmware, pono ʻoe e hoʻokaʻawale i ka GPIO2 i ka honua, a i mea e maʻalahi ai, hāʻawi wau i kahi pihi Boot. Ma ke kūlana maʻamau, huki ʻia kēia pine i ka mana.

ʻIke ʻia ka mokuʻāina o ka laina GPIO2 i ka hoʻomaka ʻana o ka hana - ke hoʻohana ʻia ka mana a i ʻole ma hope koke o ka hoʻonohonoho ʻana. No laila, hoʻomaka ka module e like me ka mea maʻamau a i ʻole ke komo ʻana i ke ʻano firmware. Ke hoʻouka ʻia, hiki ke hoʻohana ʻia kēia pine ma ke ʻano he GPIO maʻamau. ʻAe, ʻoiai aia kahi pihi ma laila, hiki iā ʻoe ke hoʻopili i kekahi hana pono iā ia.

No ka hoʻolālā a me ka debugging e hoʻohana wau i ka UART, kahi i hoʻopuka ʻia i kahi lehu. Inā pono, hoʻopili wale wau i kahi mea hoʻopili USB-UART ma laila. Pono ʻoe e hoʻomanaʻo i ka mana o ka module e 3.3V. Inā poina ʻoe e hoʻololi i ka mea hoʻopili i kēia volta a hāʻawi i ka 5V, e ʻā paha ka module.

ʻAʻohe oʻu pilikia me ka uila i loko o ka lumi ʻauʻau - aia ka puka waho ma kahi o hoʻokahi mika mai nā mika, no laila e hoʻohana ʻia wau e 220V. Ma ke ʻano he kumu mana e loaʻa iaʻu kahi liʻiliʻi poloka HLK-PM03 na Tenstar Robot. ʻO wau iho, paʻakikī wau me ka analog a me ka uila uila, akā eia kahi lako mana i mākaukau i kahi pahu liʻiliʻi.

No ka hōʻailona ʻana i nā ʻano hana, hāʻawi wau i kahi LED i hoʻopili ʻia me GPIO2. Akā naʻe, ʻaʻole wau i hoʻopau i ka mea, no ka mea ... Ua loaʻa i ka module ESP-07 kahi LED, a ua pili pū me GPIO2. Akā e waiho ma ka papa, inā makemake wau e hoʻopuka i kēia LED i ka hihia.

E neʻe kākou i ka ʻāpana hoihoi loa. ʻAʻohe noʻonoʻo nā mika wai; ʻaʻole hiki iā ʻoe ke noi iā lākou no nā heluhelu o kēia manawa. ʻO ka mea wale nō i loaʻa iā mākou he impulses - pani i nā pilina o ka hoʻololi o ka ʻohe i kēlā me kēia lita. Hoʻopili ʻia kaʻu mau mea hoʻololi hoʻololi i ka GPIO12/GPIO13. Hiki iaʻu ke hoʻohana i ka resistor pull-up programmatically i loko o ka module.

I ka hoʻomaka ʻana, ua poina iaʻu e hāʻawi i nā resistors R8 a me R9 a ʻaʻohe o kaʻu mana o ka papa. Akā, ʻoiai ke kau nei au i ke kiʻikuhi e ʻike ai nā mea a pau, pono e hoʻoponopono i kēia ʻike. Pono nā pale pale i ʻole e puhi i ke awa inā glitches ka firmware a hoʻonohonoho i ka pine i hoʻokahi, a hoʻololi ka ʻohe i kēia laina i ka honua (me ka resistor ka nui o 3.3V/1000Ohm = 3.3mA e kahe).

ʻO ka manawa kēia e noʻonoʻo ai i ka mea e hana ai inā pio ka uila. ʻO ka koho mua e noi i nā kumu kūʻai mua mai ka kikowaena ma ka hoʻomaka. Akā pono kēia i ka hoʻopiʻi nui o ka protocol exchange. Eia kekahi, ʻo ka hana o ka hāmeʻa i kēia hihia e pili ana i ka mokuʻāina o ke kikowaena. Inā ʻaʻole i hoʻomaka ke kikowaena ma hope o ka pio ʻana o ka mana (a i ʻole hoʻomaka ʻia ma hope), ʻaʻole hiki i ka mika wai ke noi i nā kumu waiwai mua a ʻaʻole e hana pololei.

No laila, ua hoʻoholo wau e hoʻokō i ka mālama ʻana i nā waiwai kūʻai i loko o kahi pahu hoʻomanaʻo i hoʻopili ʻia ma o I2C. ʻAʻohe oʻu koi kūikawā no ka nui o ka hoʻomanaʻo uila - pono ʻoe e mālama i nā helu 2 (ka helu o nā lita e like me nā mika wai wela a me ke anuanu). ʻO ka module liʻiliʻi e hana. Akā pono ʻoe e hoʻolohe i ka helu o nā pōʻai hoʻopaʻa. No ka nui o nā modules he 100 tausani mau pōʻai, no kekahi a hiki i ka miliona.

Me he mea lā he miliona ka nui. Akā i loko o nā makahiki 4 o koʻu noho ʻana i loko o koʻu hale noho, ua hoʻopau wau i kahi liʻiliʻi ma mua o 500 cubic mika o ka wai, ʻo ia ka 500 tausani lita! A ʻo 500 tausani mau moʻolelo i ka uila. A he wai anuanu wale nō kēlā. Hiki iā ʻoe, ʻoiaʻiʻo, hoʻihoʻi hou i ka chip i kēlā me kēia mau makahiki, akā ua ʻike ʻia aia nā chips FRAM. Mai ka manaʻo hoʻolālā, ʻo ia ka I2C EEPROM like, me ka helu nui loa o nā pōʻai kākau hou (haneri miliona). ʻAʻole hiki iaʻu ke hele i ka hale kūʻai me ia microcircuits, no laila e kū nei ka 24LC512 maʻamau.

Papa kaapuni pai

I ka wā mua, ua hoʻolālā wau e hana i ka papa ma ka home. No laila, ua hoʻolālā ʻia ka papa e like me ka ʻaoʻao hoʻokahi. Akā ma hope o ka hoʻolilo ʻana i hoʻokahi hola me ka hao laser a me kahi pale pale (ʻaʻole ia he comme il faut me ka ʻole), ua hoʻoholo mau wau e kauoha i nā papa mai ka Kina.

Hoʻohui mākou i ka mika wai i ka home akamai

Aneane ma mua o ke kauoha ʻana i ka papa, ua ʻike wau ma waho aʻe o ka chip memory flash, hiki iaʻu ke hoʻohui i kahi mea ʻē aʻe e pono ai i ka pahi I2C, e like me ka hōʻike. He aha ka mea e hoʻopuka ai i kahi nīnau, akā pono e hoʻolele ʻia ma ka papa. ʻAe, no ka mea e kauoha ana au i nā papa mai ka hale hana, ʻaʻohe mea e kaupalena ʻia iaʻu iho i kahi papa ʻaoʻao hoʻokahi, no laila ʻo nā laina I2C wale nō ma ka ʻaoʻao hope o ka papa.

Aia kekahi pilikia nui me ka uwea ala hoʻokahi. No ka mea Ua kaha ʻia ka papa ma ke ʻano he ʻaoʻao hoʻokahi, no laila ua hoʻolālā ʻia nā ala a me nā ʻāpana SMD e kau ʻia ma kekahi ʻaoʻao, a me nā mea hoʻopuka, nā mea hoʻohui a me nā lako mana ma kekahi ʻaoʻao. I ka loaʻa ʻana o nā papa i hoʻokahi mahina ma hope, ua poina iaʻu i ka hoʻolālā kumu a kūʻai aku i nā mea āpau ma ka ʻaoʻao mua. A i ka wā wale nō e kūʻai aku ai i ka lako mana, ua ʻike ʻia ka hoʻohui a me ka liʻiliʻi i hoʻohuli ʻia. Pono au e mahiʻai me nā mea lele. Ma ke kiʻi ma luna, ua hoʻololi au i ka wili, akā ua hoʻoneʻe ʻia ka ʻāina mai kahi ʻāpana o ka papa i kekahi ma o nā pine o ka pihi Boot (ʻoiai e hiki ke kaha kiʻi i kahi ala ma ka papa lua).

Ua like me keia

Hoʻohui mākou i ka mika wai i ka home akamai

Ka hale noho

ʻO ke kino ka hana aʻe. Inā he paʻi 3D kāu, ʻaʻole pilikia kēia. ʻAʻole au i hoʻopilikia nui loa - huki wale wau i kahi pahu o ka nui kūpono a hana i nā ʻokiʻoki ma nā wahi kūpono. Hoʻopili ʻia ka uhi i ke kino me nā wili liʻiliʻi liʻiliʻi.

Hoʻohui mākou i ka mika wai i ka home akamai

Ua haʻi mua wau e hiki ke hoʻohana ʻia ke pihi Boot ma ke ʻano he pihi kumu nui - no laila e hōʻike mākou iā ia ma ka ʻaoʻao mua. No ka hana ʻana i kēia, ua huki au i kahi "punawai" kūikawā kahi e ola ai ka pihi.

Hoʻohui mākou i ka mika wai i ka home akamai

Aia i loko o ka pahu he mau studs kahi i hoʻokomo ʻia ai ka papa a hoʻopaʻa ʻia me kahi wili M3 hoʻokahi (ʻaʻohe wahi hou ma ka papa)

Ua koho au i ka hōʻike i koʻu paʻi ʻana i ka mana hoʻohālike mua o ka hihia. ʻAʻole i kūpono ka mea heluhelu laina ʻelua i kēia hihia, akā aia ma lalo kahi hōʻike OLED SSD1306 128 × 32. He mea liʻiliʻi ia, akā ʻaʻole pono iaʻu e nānā iā ia i kēlā me kēia lā - ʻoi loa ia iaʻu.

Ke noʻonoʻo nei i kēia ala a pehea e hoʻokuʻu ʻia ai nā uea mai ia mea, ua hoʻoholo wau e hoʻopaʻa i ka hōʻike ma waena o ka hihia. ʻO ka Ergonomics, ʻoiaʻiʻo, aia ma lalo o par - aia ka pihi ma luna, aia ka hōʻike ma lalo. Akā ua ʻōlelo mua wau ua hiki mai ka manaʻo e hoʻopili i ka hōʻike a ua moloā wau e hoʻihoʻi hou i ka papa e hoʻoneʻe i ke pihi.

Hoʻohui ʻia ka mea hana. Hoʻopili ʻia ka module hōʻike i ka snot me ke kāpili wela

Hoʻohui mākou i ka mika wai i ka home akamai

Hoʻohui mākou i ka mika wai i ka home akamai

Hiki ke ʻike ʻia ka hopena hopena ma KDPV

Nūkini

E neʻe kākou i ka ʻāpana polokalamu. No nā hana liʻiliʻi e like me kēia, makemake nui au i ka hoʻohana ʻana i ka Python (micropython) - ua hoʻololi ʻia ke code i mea paʻa loa a maopopo. ʻO ka mea pōmaikaʻi, ʻaʻohe pono e iho i ka pae hoʻopaʻa inoa i mea e ʻoki ai i nā microseconds - hiki ke hana i nā mea āpau mai Python.

Me he mea lā ua maʻalahi nā mea a pau, akā ʻaʻole maʻalahi loa - he mau hana kūʻokoʻa ka hāmeʻa:

  • Hoʻopili ka mea hoʻohana i ke pihi a nānā i ka hōʻike
  • Liters tick a hoʻonui i nā waiwai i ka hoʻomanaʻo flash
  • Mālama ka module i ka hōʻailona WiFi a hoʻopili hou inā pono
  • ʻAe, me ka ʻole o ke kukui uila ʻaʻole hiki ʻole

ʻAʻole hiki iā ʻoe ke manaʻo ʻaʻole i hana kekahi hana inā paʻa kekahi no kekahi kumu. Ua piha au i ka cacti i nā papahana ʻē aʻe a i kēia manawa ke ʻike nei au i nā glitches i ke ʻano o ke ʻano o ka "ʻalo i kahi lita ʻē aʻe no ka mea e hōʻano hou ana ka hōʻike i kēlā manawa" a i ʻole "ʻaʻole hiki i ka mea hoʻohana ke hana i kekahi mea i ka wā e pili ana ka module WiFi. ʻOiaʻiʻo, hiki ke hana ʻia kekahi mau mea ma o nā interrupts, akā hiki iā ʻoe ke holo i nā palena o ka lōʻihi, ka nesting o nā kelepona, a i ʻole nā ​​hoʻololi non-atomic i nā mea hoʻololi. ʻAe, ʻo ke code e hana i nā mea āpau e lilo koke i mush.

В papahana koʻikoʻi Ua hoʻohana au i ka multitasking preemptive maʻamau a me FreeRTOS, akā i kēia hihia ua ʻoi aku ka maikaʻi o ke kumu hoʻohālike nā hale waihona puke coroutine a me uasync . Eia kekahi, he mea kupanaha wale ka hoʻokō ʻana o Python i nā coroutine - hana maʻalahi nā mea āpau a maʻalahi no ka mea papahana. E kākau wale i kou manaʻo ponoʻī, e haʻi mai iaʻu i nā wahi āu e hiki ai ke hoʻololi i waena o nā kahawai.

Manaʻo wau e aʻo i ka ʻokoʻa ma waena o ka preemptive a me ka hoʻokūkū multitasking ma ke ʻano he kumuhana koho. I kēia manawa e neʻe mākou i ke code.

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

Hoʻohana ʻia kēlā me kēia counter e kahi laʻana o ka papa Counter. ʻO ka mea mua, e unuhi ʻia ke kumu kūʻai mua mai ka EEPROM (value_storage) - ʻo ia ke ʻano o ka hoʻihoʻi ʻana ma hope o ka ʻike ʻole ʻia o ka mana.

Hoʻomaka ka pine me kahi huki i kūkulu ʻia i ka mana: inā pani ʻia ke kī o ka ʻohe, ʻaʻole ka laina, inā wehe ʻia ka laina, huki ʻia i ka mana a heluhelu ka mea hoʻoponopono i kekahi.

Hoʻomaka ʻia kahi hana ʻokoʻa ma ʻaneʻi, kahi e koho ai i ka pine. E holo ana kēlā me kēia counter i kāna hana pono'ī. Eia kāna code

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

Pono ka lohi o 25ms no ka kānana ʻana i ka bounce contact, a i ka manawa like e hoʻoponopono ai i ka manawa e ala ai ka hana (ʻoiai e hiamoe ana kēia hana, e holo ana nā hana ʻē aʻe). I kēlā me kēia 25ms, ala ka hana, nānā i ka pine a inā ua pani ʻia nā mea hoʻopili o ka ʻohe, a laila ua hele kekahi lita ma ka mika a pono e hana ʻia kēia.

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

        self._value_storage.write(self._value)

He mea liʻiliʻi ka hana ʻana i ka lita aʻe - piʻi wale ka counter. ʻAe, maikaʻi ke kākau ʻana i ka waiwai hou ma ka flash drive.

No ka maʻalahi o ka hoʻohana ʻana, hāʻawi ʻia nā "mea komo".

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

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

ʻĀ, ʻānō, e hoʻohana kākou i nā mea leʻaleʻa o Python a me ka waihona uasync a hana i kahi mea kūʻē e kali nei (pehea mākou e unuhi ai i kēia i ka Lūkini? ʻO ka mea āu e manaʻo ai?)

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

        return self.value()

    __iter__ = __await__  

He hana maʻalahi kēia e kali a hiki i ka hoʻonui ʻia ʻana o ke kumu kūʻai - ala ka hana i kēlā me kēia manawa a nānā i ka hae _value_changed. ʻO ka mea ʻoluʻolu e pili ana i kēia hana ʻo ia ka hiki ke hāʻule ke code kelepona i ke kāhea ʻana i kēia hana a hiamoe a loaʻa kahi waiwai hou.

Pehea e pili ana i nā keakea?ʻAe, i kēia manawa hiki iā ʻoe ke troll iaʻu, me ka ʻōlelo ʻana ua ʻōlelo ʻoe iā ʻoe iho e pili ana i nā keakea, akā i ka ʻoiaʻiʻo ua hana ʻoe i kahi koho pin naʻaupō. ʻO ka interrupts ka mea mua aʻu i hoʻāʻo ai. Ma ka ESP8266, hiki iā ʻoe ke hoʻonohonoho i kahi interrupt, a kākau i kahi mea hoʻokele no kēia interrupt ma Python. I loko o kēia keakea, hiki ke hoʻonui ʻia ka waiwai o kahi hoʻololi. Malia paha, lawa kēia inā he mea kauā ka counter - kahi e kali ana a noi ʻia no kēia waiwai.

ʻO ka pōʻino (a ʻoi paha?) ʻeleʻele kaʻu hāmeʻa, pono ia e hoʻouna i nā memo ma o ka protocol MQTT a kākau i ka ʻikepili i EEPROM. A eia ka hoʻopaʻa ʻana i ka pāʻani - ʻaʻole hiki iā ʻoe ke hoʻokaʻawale i ka hoʻomanaʻo i nā interrupts a hoʻohana i kahi waihona nui, ʻo ia hoʻi hiki iā ʻoe ke poina e pili ana i ka hoʻouna ʻana i nā leka ma luna o ka pūnaewele. Aia kekahi mau buns e like me micropython.schedule() e ʻae iā ʻoe e holo i kekahi hana "i ka wā hiki loa," akā e kū mai ka nīnau, "he aha ke kumu?" He aha inā inā e hoʻouna ana mākou i kekahi ʻano memo i kēia manawa, a laila hele mai kahi mea hoʻopilikia a hoʻopau i nā waiwai o nā ʻano. A i ʻole, no ka laʻana, ua hōʻea mai kahi kumu kūʻai hou mai ke kikowaena ʻoiai ʻaʻole mākou i kākau i ka mea kahiko. Ma keʻano laulā, pono ʻoe e ālai i ka synchronization a i ʻole e hele i waho ma kahi ʻano ʻokoʻa.

A i kēlā me kēia manawa RuntimeError: hoʻonohonoho i ka hoʻopaʻa ʻana i nā pōpilikia piha a ʻo wai ka mea ʻike i ke kumu?

Me ke koho balota a me ka uasync, i kēia hihia, ʻoi aku ka nani a hilinaʻi

Lawe au i ka hana me EEPROM i kahi papa liʻiliʻi

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)

Ma Python, paʻakikī ke hana pololei me nā bytes, akā ʻo nā bytes i kākau ʻia i ka hoʻomanaʻo. Pono wau e pā i ka hoʻololi ʻana ma waena o ka integer a me nā bytes me ka hoʻohana ʻana i ka waihona ustruct.

I ʻole e hoʻoneʻe i ka mea I2C a me ka helu o ke kelepona hoʻomanaʻo i kēlā me kēia manawa, ua kāʻei au iā ia a pau i kahi papa liʻiliʻi a maʻalahi.

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)

Hana ʻia ka mea I2C me kēia mau ʻāpana

i2c = I2C(freq=400000, scl=Pin(5), sda=Pin(4))

Hele mākou i ka ʻāpana hoihoi loa - ka hoʻokō ʻana i ke kamaʻilio me ke kikowaena ma o MQTT. ʻAe, ʻaʻohe pono e hoʻokō i ka protocol ponoʻī - loaʻa iaʻu ma ka Pūnaewele hoʻokō asynchronous mākaukau. ʻO kēia kā mākou e hoʻohana ai.

ʻO nā mea hoihoi loa a pau e hōʻiliʻili ʻia ma ka papa CounterMQTTClient, i hoʻokumu ʻia ma ka waihona MQTTClient. E hoʻomaka kākou mai ka ʻaoʻao

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

Ma ʻaneʻi hiki iā ʻoe ke hana a hoʻonohonoho i nā pin a me nā pihi kukui, a me nā mea mika wai anuanu a me ka wela.

Me ka hoʻomaka ʻana, ʻaʻole mea liʻiliʻi nā mea āpau

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

No ka hoʻonohonoho ʻana i nā ʻāpana hana o ka waihona mqtt_as, hoʻohana ʻia kahi puke wehewehe ʻōlelo nui o nā hoʻonohonoho like ʻole - config. Maikaʻi ka hapa nui o nā hoʻonohonoho paʻamau iā mākou, akā pono e hoʻonohonoho pono ʻia nā hoʻonohonoho he nui. Iʻole e kākau pololei i nā hoʻonohonoho i ke code, mālama wau iā lākou i loko o ka faila kikokikona config.txt. Hāʻawi kēia iā ʻoe e hoʻololi i ke code me ka nānā ʻole i nā hoʻonohonoho, a me ka rivet i kekahi mau mea like me nā ʻāpana like ʻole.

Hoʻomaka ka poloka hope o ke code i nā coroutine e lawelawe i nā hana like ʻole o ka ʻōnaehana. Eia kekahi laʻana, eia kahi coroutine e helu ana nā lawelawe

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

Ke kali nei ka coroutine i loko o kahi loop no kahi kumu kūʻai hou a, i ka wā e ʻike ʻia ai, hoʻouna i kahi leka ma o ka protocol MQTT. Hoʻouna ka ʻāpana mua o ke code i ka waiwai mua inā ʻaʻohe wai e kahe ma ka counter.

ʻO ka MQTTClient papa kumu e lawelawe iā ia iho, hoʻomaka i kahi pilina WiFi a hoʻohui hou i ka wā e nalowale ai ka pilina. Ke hoʻololi ʻia ka mokuʻāina o ka pilina WiFi, hoʻomaopopo ka waihona iā mākou ma ke kāhea ʻana iā 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)

Hoʻopili pololei ʻia ka hana mai nā laʻana. I kēia hihia, helu ia i ka helu o nā outages (internet_outages) a me ko lākou lōʻihi. Ke hoʻihoʻi ʻia ka pilina, hoʻouna ʻia kahi manawa hana ʻole i ke kikowaena.

Ma ke ala, pono wale ka hiamoe hope e hana i ka hana asynchronous - i loko o ka hale waihona ua kapa ʻia ʻo ia ma o ka kali, a ʻo nā hana wale nō i loaʻa i ke kino ke kali ʻē aʻe ke kāhea ʻia.

Ma waho aʻe o ka hoʻopili ʻana iā WiFi, pono ʻoe e hoʻokumu i kahi pilina me ka MQTT broker (server). Hana pū ka hale waihona puke i kēia, a loaʻa iā mākou ka manawa e hana i kahi mea pono ke hoʻokumu ʻia ka pilina

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

Ma ʻaneʻi mākou e kau inoa i nā leka he nui - hiki i ka server ke hoʻonohonoho i nā waiwai kūʻē i kēia manawa ma ka hoʻouna ʻana i ka leka pili.

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

Hoʻoponopono kēia hana i nā memo e hiki mai ana, a ma muli o ke kumuhana (ka inoa memo), ua hoʻonui ʻia nā waiwai o kekahi o nā helu helu.

ʻElua mau hana kōkua

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

Hoʻouna kēia hana i kahi leka inā hoʻokumu ʻia ka pilina. Inā ʻaʻohe pili, mālama ʻole ʻia ka memo.

A he hana maʻalahi kēia e hana a hoʻouna i nā memo debugging.

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

Nui nā kikokikona, a ʻaʻole mākou i hoʻomoe i kahi LED. Eia

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

Ua hoʻolako au i 2 mau ʻano ʻānai. Inā nalowale ka pilina (a i ʻole ke hoʻokumu ʻia nei), e ʻālohilohi ka hāmeʻa. Inā hoʻopaʻa ʻia ka pilina, e ʻā ana ka hāmeʻa i hoʻokahi manawa i kēlā me kēia 5 kekona. Inā pono, hiki ke hoʻokō ʻia nā ʻano hana ʻoni ʻē aʻe ma aneʻi.

Akā, hoʻomaʻamaʻa wale ka LED. Hoʻoholo pū mākou i ka hōʻike.

    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)

ʻO kēia kaʻu e kamaʻilio nei - pehea ka maʻalahi a me ka maʻalahi me nā coroutines. Hōʻike kēia hana liʻiliʻi i ka ʻike mea hoʻohana ENTIRE. Ke kali wale nei ka coroutine no ke kaomi ʻana i ke pihi a huli i ka hōʻike no 3 kekona. Hōʻike ka hōʻike i ka heluhelu mika o kēia manawa.

ʻElua mau mea liʻiliʻi i koe. Eia ka hana e hoʻomaka ai i kēia ʻoihana holoʻokoʻa. Hoʻouna wale ka loop loop i nā ʻike debugging like ʻole i hoʻokahi minuke. Ma keʻano laulā, ʻōlelo wau e like me ia - ʻaʻohe oʻu manaʻo e pono ke ʻōlelo nui

   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)

ʻAe, ʻelua mau hoʻonohonoho a me nā mea mau e hoʻopau i ka wehewehe

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

Hoʻomaka e like me kēia

client = CounterMQTTClient()
loop = asyncio.get_event_loop()
loop.run_until_complete(client.main())

Ua loaʻa kekahi mea i koʻu hoʻomanaʻo

No laila, aia nā code a pau. Ua hoʻouka wau i nā faila me ka hoʻohana ʻana i ka pono ampy - hiki iā ʻoe ke hoʻouka iā lākou i loko (ka mea i loko o ka ESP-07 ponoʻī) a laila e komo iā ia mai ka papahana e like me nā faila maʻamau. Ma laila wau i hoʻouka ai i ka mqtt_as, uasyncio, ssd1306 a me nā waihona waihona aʻu i hoʻohana ai (hoʻohana i loko o mqtt_as).

Hoʻomaka mākou a ... Loaʻa iā mākou kahi MemoryError. Eia kekahi, ʻoi aku ka nui o koʻu hoʻāʻo ʻana e hoʻomaopopo i kahi e kahe ai ka hoʻomanaʻo, ʻoi aku ka nui o nā paʻi debug aʻu i kau ai, ʻoi aku ka mua o kēia hewa. ʻO kahi hulina Google pōkole i alakaʻi iaʻu i ka hoʻomaopopo ʻana he 30 kB wale nō ka hoʻomanaʻo o ka microcontroller, ʻaʻole hiki ke komo i loko o 65 kB code (me nā hale waihona puke).

Akā aia kahi ala i waho. ʻAʻole hoʻokō pololei ʻo micropython i ke code mai kahi faila .py - ua hui mua ʻia kēia faila. Eia kekahi, ua hoʻopili pololei ʻia ma ka microcontroller, i hoʻololi ʻia i bytecode, a laila mālama ʻia i ka hoʻomanaʻo. ʻAe, no ka hana ʻana o ka mea hoʻopili, pono ʻoe i kahi nui o RAM.

ʻO ka hoʻopunipuni ka mālama ʻana i ka microcontroller mai ka hoʻopili ʻana i nā kumuwaiwai. Hiki iā ʻoe ke hōʻuluʻulu i nā faila ma kahi kamepiula nui a hoʻouka i ka bytecode i mākaukau i loko o ka microcontroller. No ka hana ʻana i kēia, pono ʻoe e hoʻoiho i ka firmware micropython a kūkulu mpy-cross pono.

ʻAʻole wau i kākau i kahi Makefile, akā hele lima a hōʻuluʻulu i nā faila pono āpau (me nā hale waihona puke) kekahi mea e like me kēia.

mpy-cross water_counter.py

ʻO nā mea a pau i koe, ʻo ka hoʻouka ʻana i nā faila me ka .mpy extension, me ka poina ʻole e holoi mua i ka .py pili mai ka ʻōnaehana faila o ka mea.

Ua hana au i ka hoʻomohala ʻana i ka papahana (IDE?) ESPlorer. Hiki iā ʻoe ke hoʻouka i nā palapala i ka microcontroller a hoʻokō koke iā lākou. I koʻu hihia, aia nā loina a me ka hana ʻana o nā mea a pau i loko o ka faila water_counter.py (.mpy). Akā i mea e hoʻomaka maʻalahi ai kēia mau mea, pono e loaʻa kahi faila i kapa ʻia ʻo main.py ma ka hoʻomaka. Eia kekahi, pono ia .py, ʻaʻole i hoʻonohonoho mua ʻia .mpy. Eia kona mau mea liʻiliʻi

import water_counter

Hoʻomaka mākou - hana nā mea a pau. Akā ʻaʻole liʻiliʻi ka hoʻomanaʻo manuahi - ma kahi o 1kb. Loaʻa iaʻu nā manaʻo e hoʻonui i ka hana o ka hāmeʻa, a ʻaʻole lawa kēia kilobyte iaʻu. Akā ua ʻike ʻia aia kahi ala no kēia hihia.

Eia ka mea. ʻOiai ua hōʻuluʻulu ʻia nā faila i ka bytecode a noho ma ka ʻōnaehana faila i loko, ʻoiaʻiʻo ua hoʻouka ʻia lākou i loko o ka RAM a hoʻokō ʻia mai laila. Akā ʻo ka mea hiki i ka micropython ke hoʻokō pololei i ka bytecode mai ka hoʻomanaʻo flash, akā no kēia pono ʻoe e kūkulu pololei i ka firmware. ʻAʻole paʻakikī, ʻoiai ua lōʻihi ka manawa ma kaʻu netbook (ma laila wale nō wau i loaʻa ai iā Linux).

Penei ka algorithm:

  • Hoʻoiho a hoʻouka ESP Open SDK. Hoʻohui kēia mea i kahi mea hoʻopili a me nā hale waihona puke no nā papahana no ka ESP8266. Hoʻohui ʻia e like me nā ʻōlelo aʻoaʻo ma ka ʻaoʻao nui o ka papahana (Ua koho wau i ka STANDALONE=ʻae hoʻonohonoho)
  • Hoʻoili ʻano micropython
  • E kau i nā waihona i makemake ʻia ma nā awa/esp8266/modules i loko o ka lāʻau micropython
  • Hoʻohui mākou i ka firmware e like me nā kuhikuhi i ka faila awa/esp8266/README.md
  • Hoʻouka mākou i ka firmware i ka microcontroller (hana wau i kēia ma Windows me ka hoʻohana ʻana i nā polokalamu ESP8266Flasher a i ʻole Python esptool)

ʻO ia, i kēia manawa 'import ssd1306' e hāpai pololei i ke code mai ka firmware a ʻaʻole e pau ka RAM no kēia. Me kēia hoʻopunipuni, ua hoʻouka wau i ka code waihona wale nō i ka firmware, ʻoiai ke hoʻokō ʻia ka code program nui mai ka ʻōnaehana faila. ʻAe kēia iā ʻoe e hoʻololi maʻalahi i ka papahana me ka ʻole e hoʻopili hou i ka firmware. I kēia manawa loaʻa iaʻu ma kahi o 8.5kb o ka RAM manuahi. E ʻae kēia iā mākou e hoʻokō i nā hana pono like ʻole i ka wā e hiki mai ana. ʻAe, inā ʻaʻole lawa ka hoʻomanaʻo, a laila hiki iā ʻoe ke pana i ka papahana nui i ka firmware.

No laila he aha kā mākou e hana ai i kēia manawa?

ʻAe, kūʻai ʻia ka lako, kākau ʻia ka firmware, paʻi ʻia ka pahu, hoʻopaʻa ʻia ka hāmeʻa ma ka paia a ʻoliʻoli i kahi ʻōpuʻu kukui. Akā i kēia manawa he pahu ʻeleʻele ia (ma ke ʻano maoli a me ke ʻano) a ʻaʻole hoʻohana iki. ʻO ka manawa kēia e hana ai me nā leka MQTT i hoʻouna ʻia i ke kikowaena.

Ke wili nei koʻu "home akamai". ʻōnaehana Majordomo. Hiki mai ka module MQTT mai loko mai o ka pahu, a i ʻole e hoʻokomo maʻalahi ʻia mai ka mākeke hoʻohui - ʻaʻole wau e hoʻomanaʻo i kahi i loaʻa ai iaʻu. ʻAʻole lawa ka MQTT - pono ʻoe i kahi mea i kapa ʻia. broker - he kikowaena e loaʻa, hoʻokaʻawale a hoʻouna i nā leka MQTT i nā mea kūʻai. Hoʻohana au i ka makika, (e like me majordomo) e holo ana ma ka netbook like.

Ma hope o ka hoʻouna ʻana o ka hāmeʻa i kahi leka ma ka liʻiliʻi hoʻokahi, e ʻike koke ʻia ka waiwai ma ka papa inoa.

Hoʻohui mākou i ka mika wai i ka home akamai

Hiki ke hoʻopili ʻia kēia mau waiwai me nā mea ʻōnaehana, hiki ke hoʻohana ʻia i nā palapala automation a kau ʻia i nā loiloi like ʻole - ʻo ia mau mea āpau ma waho o ke kiko o kēia ʻatikala. Hiki iaʻu ke paipai i ka ʻōnaehana majordomo i ka poʻe hoihoi channel Electronics In Lens - ke kūkulu nei kekahi hoaaloha i hale akamai a kamaʻilio maopopo e pili ana i ka hoʻonohonoho ʻana i ka ʻōnaehana.

E hōʻike wale aku au iā ʻoe i ʻelua kiʻi. He pakuhi maʻalahi kēia o nā waiwai o kēlā me kēia lā

Hoʻohui mākou i ka mika wai i ka home akamai
Hiki ke ʻike ʻia ʻaneʻane ʻaʻohe mea hoʻohana i ka wai i ka pō. ʻElua mau manawa i hele ai kekahi i ka lua, a me he mea lā ua ʻai ʻia ka kānana reverse osmosis i ʻelua mau lita i ka pō. I ke kakahiaka, hoʻonui nui ka ʻai. Hoʻohana pinepine au i ka wai mai ka paila, akā makemake wau e ʻauʻau a hoʻololi iki i ka wai wela o ke kūlanakauhale - ʻike maopopo ʻia kēia ma ka pakuhi lalo.

Mai kēia pakuhi aʻu i aʻo ai ʻo ka hele ʻana i ka lua e pono ai ka 6-7 lita o ka wai, ʻo ka lawe ʻana i ka ʻauʻau e pono ai 20-30 lita, ʻo ka holoi ʻana i nā kīʻaha e pono ai ma kahi o 20 lita, a ʻo ka ʻauʻau ʻana he 160 lita. ʻAi koʻu ʻohana ma kahi o 500-600 lita i kēlā me kēia lā.

No ka poʻe i makemake nui, hiki iā ʻoe ke nānā i nā moʻolelo no kēlā me kēia waiwai

Hoʻohui mākou i ka mika wai i ka home akamai

Mai ʻaneʻi au i aʻo ai i ka wā e hāmama ai ka paipa, kahe ka wai ma kahi o 1 lita no 5 kekona.

Akā, ma kēia ʻano, ʻaʻole maʻalahi ka ʻikepili ke nānā aku. Loaʻa iā Majordomo ka hiki ke nānā i nā palapala hoʻohana ma ka lā, pule a me ka mahina. Eia kekahi laʻana, he pakuhi hoʻohana ma nā kaola

Hoʻohui mākou i ka mika wai i ka home akamai

I kēia manawa, loaʻa iaʻu ka ʻikepili no hoʻokahi pule. I loko o hoʻokahi mahina, e hōʻike hou ʻia kēia pakuhi - e loaʻa i kēlā me kēia lā kahi kolamu ʻokoʻa. Hoʻopau iki ʻia ke kiʻi e ka hoʻoponopono ʻana i nā waiwai aʻu i hoʻokomo lima ai (ke kolamu nui loa). A ʻaʻole i maopopo inā hoʻonohonoho hewa wau i nā waiwai mua loa, kokoke i kahi cube liʻiliʻi, a i ʻole he bug kēia i ka firmware a ʻaʻole i helu ʻia nā lita āpau. Pono manawa hou.

Pono nā kiʻi ponoʻī i nā mea kilokilo, keʻokeʻo, pena. E kūkulu paha au i ka pakuhi o ka hoʻohana ʻana i ka hoʻomanaʻo no ka hoʻopau ʻana i nā kumu - inā e lele kekahi mea ma laila. E hōʻike paha wau i nā manawa i ka wā ʻaʻohe Pūnaewele. I kēia manawa, aia kēia mau mea ma ka pae o nā manaʻo.

hopena

I kēia lā ua ʻoi aku ka naʻauao o koʻu hale noho. Me kahi mea liʻiliʻi liʻiliʻi, e ʻoi aku ka maʻalahi iaʻu e nānā i ka hoʻohana ʻana i ka wai i loko o ka hale. Inā ma mua ua huhū wau i ka "hou, ua hoʻopau mākou i ka wai nui i hoʻokahi mahina," i kēia manawa hiki iaʻu ke ʻike i ke kumu o kēia ʻai.

He mea ʻē paha kekahi ke nānā aku i nā heluhelu ma ka pale inā he mika ka mamao mai ka mika ponoʻī. Akā i ka wā e hiki mai ana, manaʻo wau e neʻe i kahi keʻena ʻē aʻe, kahi e nui ai nā wai wai, a ʻo nā mita ponoʻī e kau ʻia ma ka pae ʻana. No laila e lilo ana kahi mea heluhelu mamao.

Hoʻolālā pū wau e hoʻonui i ka hana o ka hāmeʻa. Ke nānā nei au i nā ʻūhā kaʻa. I kēia manawa, e hoʻololi i ka paila i ka wai o ke kūlanakauhale, pono iaʻu e hoʻohuli i 3 mau kī i loko o kahi niche paʻakikī. E ʻoi aku ka maʻalahi o ka hana ʻana i kēia me hoʻokahi pihi me ka hōʻailona pili. ʻAe, ʻoiaʻiʻo, pono ia e hoʻokō i ka pale ʻana i nā leaks.

Ma ka ʻatikala ua wehewehe au i kaʻu mana o kahi hāmeʻa e pili ana iā ESP8266. I koʻu manaʻo, ua hele mai au me kahi manaʻo hoihoi loa o ka micropython firmware e hoʻohana ana i nā coroutines - maʻalahi a maikaʻi. Ua ho'āʻo wau e wehewehe i nā nuances a me nā hemahema i loaʻa iaʻu i ka wā o ka hoʻolaha. Malia paha ua wehewehe au i nā mea āpau i nā kikoʻī nui loa; ʻo wau iho, ma ke ʻano he mea heluhelu, ʻoi aku ka maʻalahi noʻu e lele i nā mea pono ʻole ma mua o ka noʻonoʻo ʻana i ka mea i waiho ʻole ʻia.

E like me nā manawa a pau, ua wehe au i ka hoʻohewa ʻana.

Nīnau
Kaapuni a me ka papa
Ke Ana Hoʻohālike

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka