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.
ʻ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
ʻ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.
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
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.
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.
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
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.
ʻĀ, ʻā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.
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
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
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.
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.
ʻ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
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ʻ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.
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ā
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
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
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.