Kulumikiza mita yamadzi ku nyumba yanzeru

Kalekale, makina opangira nyumba, kapena "smart home" monga momwe amatchulidwira nthawi zambiri, anali okwera mtengo kwambiri ndipo olemera okha ndi omwe angakwanitse. Masiku ano pamsika mutha kupeza zida zotsika mtengo zokhala ndi masensa, mabatani / masiwichi ndi ma actuators owongolera kuyatsa, zitsulo, mpweya wabwino, madzi ndi ogula ena. Ndipo ngakhale munthu wokhotakhota wa DIY amatha kutenga nawo mbali pazokongola ndikusonkhanitsa zida zanyumba yanzeru pamtengo wotsika mtengo.

Kulumikiza mita yamadzi ku nyumba yanzeru

Nthawi zambiri, zida zomwe zimaperekedwa zimakhala ndi masensa kapena ma actuators. Amapangitsa kuti zikhale zosavuta kugwiritsa ntchito zinthu monga "cholumikizira choyenda chikayambika, kuyatsa magetsi" kapena "chosinthira pafupi ndi potuluka chimazimitsa magetsi mnyumba yonseyo." Koma mwanjira ina zinthu sizinayende ndi telemetry. Chabwino, ndi chithunzi cha kutentha ndi chinyezi, kapena mphamvu yanthawi yomweyo pamalo enaake.

Posachedwa ndidayika mita yamadzi yokhala ndi pulse output. Pa lita iliyonse yomwe imadutsa pa mita, kusintha kwa bango kumatsegulidwa ndikutseka kukhudzana. Chinthu chokha chomwe chatsala ndikumamatira ku mawaya ndikuyesera kupindula nawo. Mwachitsanzo, pendani mmene madzi amagwiritsira ntchito pa ola ndi tsiku lamlungu. Chabwino, ngati pali zokwera madzi zingapo m'nyumbamo, ndiye kuti ndizosavuta kuwona zisonyezo zonse zapano pazenera limodzi kuposa kukwera mu niches zovuta kuzifikira ndi tochi.

Pansi pa odulidwawo pali mtundu wanga wa chipangizo chozikidwa pa ESP8266, chomwe chimawerengera ma pulse kuchokera pamamita amadzi ndikutumiza zowerengera kudzera pa MQTT kupita ku seva yanzeru yakunyumba. Tidzakonza mu micropython pogwiritsa ntchito laibulale ya uasyncio. Popanga firmware, ndidakumana ndi zovuta zingapo zosangalatsa, zomwe ndikambirananso m'nkhaniyi. Pitani!

Chiwembu

Kulumikiza mita yamadzi ku nyumba yanzeru

Mtima wa dera lonse ndi gawo pa ESP8266 microcontroller. ESP-12 idakonzedweratu, koma yanga idakhala yolakwika. Tinayenera kukhutira ndi gawo la ESP-07, lomwe linalipo. Mwamwayi, iwo ali ofanana onse mwa mawu a zikhomo ndi magwiridwe antchito, kusiyana kokha kuli mu mlongoti - ESP-12 ili ndi imodzi, pamene ESP-07 ili ndi yakunja. Komabe, ngakhale popanda mlongoti wa WiFi, chizindikiro mu chipinda changa chosambira chimalandiridwa bwino.

Standard module wiring:

  • Bwezerani batani ndi kukoka-mmwamba ndi capacitor (ngakhale zonse zili kale mkati mwa module)
  • Chizindikiro chothandizira (CH_PD) chimakokedwa ku mphamvu
  • GPIO15 imakokedwa pansi. Izi zimangofunika poyambira, koma ndilibe chilichonse cholumikizira mwendo uwu; sindikufunanso

Kuti muyike gawolo mumayendedwe a firmware, muyenera kutsitsa GPIO2 pang'onopang'ono, ndikupangitsa kuti ikhale yosavuta, ndidapereka batani la Boot. Mkhalidwe wabwinobwino, pini iyi imakokedwa kuti igwire ntchito.

Mkhalidwe wa mzere wa GPIO2 umayang'aniridwa kokha kumayambiriro kwa ntchito - mphamvu ikagwiritsidwa ntchito kapena mwamsanga mutangokonzanso. Chifukwa chake gawoli limayamba mwachizolowezi kapena limapita ku firmware mode. Mukatsitsa, pini iyi itha kugwiritsidwa ntchito ngati GPIO wamba. Chabwino, popeza pali batani kale pamenepo, mutha kuyikapo zina zothandiza.

Pakukonza ndi kukonza zolakwika ndigwiritsa ntchito UART, yomwe imatuluka pachisa. Pakafunika, ndimangolumikiza adaputala ya USB-UART pamenepo. Muyenera kukumbukira kuti gawoli limayendetsedwa ndi 3.3V. Ngati muiwala kusintha adaputala ku voteji iyi ndikupereka 5V, gawoli likhoza kupsa.

Ndilibe vuto ndi magetsi m'bafa - malo ogulitsira ali pafupi mita kuchokera pamamita, kotero ndidzakhala ndi mphamvu 220V. Monga gwero lamphamvu ndidzakhala ndi kakang'ono Chithunzi cha HLK-PM03 ndi Tenstar Robot. Payekha, ndimavutika ndi analogi ndi magetsi amagetsi, koma apa pali magetsi opangidwa okonzeka mu nkhani yaying'ono.

Kuti ndiwonetse mawonekedwe ogwiritsira ntchito, ndidapereka LED yolumikizidwa ku GPIO2. Komabe, sindinasinthe, chifukwa ... Module ya ESP-07 ili kale ndi LED, ndipo imalumikizidwanso ndi GPIO2. Koma zikhale pa bolodi, ngati ndikufuna kutulutsa LED iyi pamilandu.

Tiyeni tipite ku gawo losangalatsa kwambiri. Mamita amadzi alibe zomveka; simungawafunse kuti akuwerengereni posachedwa. Chokhacho chomwe chilipo kwa ife ndi zokopa - kutseka zolumikizira za bango lita iliyonse. Zotulutsa zanga za bango zimalumikizidwa ndi GPIO12/GPIO13. Ndithandizira kukoka-mmwamba resistor mwadongosolo mkati mwa module.

Poyamba, ndinayiwala kupereka resistors R8 ndi R9 ndipo mtundu wanga wa bolodi alibe iwo. Koma popeza ndatumiza kale chithunzichi kuti aliyense awone, ndikofunikira kukonza kuyang'anira uku. Zotsutsa zimafunika kuti musawotche doko ngati firmware ikuphwanyidwa ndikuyika pini kumodzi, ndipo chosinthira bango chimafupikitsa mzerewu mpaka pansi (ndi resistor pazipita 3.3V / 1000Ohm = 3.3mA idzayenda).

Yakwana nthawi yoti muganizire zomwe mungachite ngati magetsi azima. Njira yoyamba ndikufunsira zowerengera zoyambira kuchokera pa seva poyambira. Koma izi zingafune kusokoneza kwakukulu kwa protocol yosinthira. Komanso, magwiridwe antchito a chipangizochi pankhaniyi amadalira momwe seva iliri. Ngati seva sinayambike mphamvu itazimitsidwa (kapena itayamba pambuyo pake), mita yamadzi sikanatha kufunsa zoyambira ndipo sizigwira ntchito moyenera.

Chifukwa chake, ndidaganiza zogwiritsa ntchito zosunga zowerengera mu memory chip yolumikizidwa kudzera pa I2C. Ndilibe zofunika zapadera za kukula kwa flash memory - muyenera kusunga manambala 2 (chiwerengero cha malita malinga ndi mita ya madzi otentha ndi ozizira). Ngakhale gawo laling'ono kwambiri lingachite. Koma muyenera kulabadira kuchuluka kwa kujambula mkombero. Kwa ma module ambiri izi ndi zozungulira 100, zina mpaka miliyoni.

Zikuoneka kuti miliyoni ndi zambiri. Koma m’zaka 4 zimene ndinakhala m’nyumba yanga, ndinamwa madzi opitirira makyubiki mita 500, ndiwo malita 500 zikwi! Ndipo 500 zikwi mbiri mu kung'anima. Ndipo amenewo ndi madzi ozizira basi. Mutha kugulitsanso chip zaka zingapo zilizonse, koma zimakhala kuti pali tchipisi ta FRAM. Kuchokera pamawonedwe a mapulogalamu, iyi ndi I2C EEPROM yomweyi, yokhayokha ndi chiwerengero chochuluka cholembanso maulendo (mazana a mamiliyoni). Kungoti sindingathe kufika ku sitolo ndi ma microcircuits otere, kotero pakali pano 24LC512 yachizolowezi idzayima.

bolodi losindikizidwa

Poyamba, ndinakonzekera kupanga bolodi kunyumba. Chifukwa chake, bolodi idapangidwa ngati mbali imodzi. Koma nditatha ola limodzi ndi chitsulo cha laser ndi chigoba cha solder (mwanjira ina sichidzabwera popanda izo), ndinaganizabe kuyitanitsa matabwa kuchokera ku China.

Kulumikiza mita yamadzi ku nyumba yanzeru

Pafupifupi ndisanayambe kuyitanitsa bolodi, ndinazindikira kuti kuwonjezera pa flash memory chip, ndimatha kulumikiza chinthu china chothandiza ku basi ya I2C, monga chiwonetsero. Chomwe chingaperekedwe kwa icho ndi funso, koma liyenera kuyendetsedwa pa bolodi. Chabwino, popeza ndimati ndikuyitanitsa matabwa kuchokera kufakitale, panalibe chifukwa chodziletsa ndekha ku bolodi la mbali imodzi, kotero mizere ya I2C ndiyo yokhayo kumbuyo kwa bolodi.

Panalinso vuto limodzi lalikulu ndi waya wa njira imodzi. Chifukwa Bolodiyo idakokedwa ngati mbali imodzi, kotero mayendedwe ndi zigawo za SMD zidakonzedwa kuti ziziyikidwa mbali imodzi, ndi zida zotulutsa, zolumikizira ndi magetsi mbali inayo. Nditalandira matabwa patatha mwezi umodzi, ndinayiwala za ndondomeko yoyamba ndikugulitsa zigawo zonse kutsogolo. Ndipo pokha pofika pakugulitsa mphamvu zamagetsi zidapezeka kuti kuphatikiza ndi minus zidalumikizidwa mobwerera. Ndinayenera kulima ndi ma jumper. Pachithunzi pamwambapa, ndasintha kale mawaya, koma nthaka imasamutsidwa kuchokera ku mbali imodzi ya bolodi kupita ku ina kudzera pazikhomo za batani la Boot (ngakhale kuti n'zotheka kujambula nyimbo pagawo lachiwiri).

Zinakhala chonchi

Kulumikiza mita yamadzi ku nyumba yanzeru

Nyumba

Gawo lotsatira ndi thupi. Ngati muli ndi chosindikizira cha 3D, ili si vuto. Sindinavutike kwambiri - ndinangojambula bokosi la kukula koyenera ndikudula m'malo oyenera. Chophimbacho chimamangiriridwa ku thupi ndi zomangira zazing'ono zodziwombera.

Kulumikiza mita yamadzi ku nyumba yanzeru

Ndanena kale kuti batani la Boot litha kugwiritsidwa ntchito ngati batani lazolinga wamba - ndiye tiwonetsa kutsogolo. Kuti ndichite izi, ndinajambula "chitsime" chapadera kumene batani limakhala.

Kulumikiza mita yamadzi ku nyumba yanzeru

Mkati mwake mulinso ma studs pomwe bolodi imayikidwa ndikutetezedwa ndi screw imodzi ya M3 (panalibenso malo pa bolodi)

Ndinasankha zowonetsera kale pamene ndinasindikiza chitsanzo choyamba cha mlanduwo. Wowerenga wamizere iwiri sanagwirizane ndi nkhaniyi, koma pansi pake panali chiwonetsero cha OLED SSD1306 128 Γ— 32. Ndizochepa pang'ono, koma sindiyenera kuziyang'ana tsiku lililonse - zimandichulukira.

Poganizira motere komanso momwe mawaya angayendetsedwere kuchokera pamenepo, ndinaganiza zokakamira chiwonetserocho pakati pamilanduyo. Ergonomics, inde, ili pansipa - batani lili pamwamba, chiwonetsero chili pansi. Koma ndidanena kale kuti lingaliro loyika chiwonetserochi lidafika mochedwa kwambiri ndipo ndidachita ulesi kwambiri kuti ndikonzenso bolodi kuti ndisunthe batani.

Chipangizocho chasonkhanitsidwa. Ma module owonetsera amamangiriridwa ku snot ndi guluu wotentha

Kulumikiza mita yamadzi ku nyumba yanzeru

Kulumikiza mita yamadzi ku nyumba yanzeru

Zotsatira zomaliza zitha kuwoneka pa KDPV

Firmware

Tiyeni tipite ku gawo la mapulogalamu. Pazantchito zazing'ono ngati izi, ndimakonda kugwiritsa ntchito Python (micropython) - code imakhala yochepa kwambiri komanso yomveka. Mwamwayi, palibe chifukwa chotsikira ku registry kuti mufinye ma microseconds - chilichonse chikhoza kuchitika kuchokera ku Python.

Zikuwoneka kuti zonse ndi zophweka, koma osati zophweka - chipangizocho chili ndi ntchito zingapo zodziimira:

  • Wogwiritsa akudina batani ndikuyang'ana mawonekedwe
  • Liters amakankhira ndikusintha mitengo mu flash memory
  • Module imayang'anira chizindikiro cha WiFi ndikulumikizanso ngati kuli kofunikira
  • Chabwino, popanda nyali yowunikira sikutheka

Simungaganize kuti ntchito imodzi sinagwire ntchito ngati ina ikakamira pazifukwa zina. Ndakhala ndikudzaza kale cacti m'mapulojekiti ena ndipo tsopano ndikuwonabe glitches mumayendedwe a "anaphonya lita ina chifukwa chiwonetserochi chinali kusinthidwa panthawiyo" kapena "wosuta sangathe kuchita kalikonse pamene gawoli likugwirizanitsa Wifi." Zachidziwikire, zinthu zina zitha kuchitika mwa kusokoneza, koma mutha kukhala ndi malire pa nthawi yayitali, kuyimitsa mafoni, kapena kusintha kosagwirizana ndi ma atomiki. Chabwino, code yomwe imachita chilichonse imasanduka nsima.

Π’ kwambiri polojekiti Ndidagwiritsa ntchito ma preemptive multitasking ndi FreeRTOS, koma pakadali pano mtunduwo udakhala woyenera kwambiri. coroutines ndi malaibulale a uasync . Komanso, kukhazikitsidwa kwa Python kwa coroutines ndikodabwitsa - zonse zimachitika mosavuta komanso mosavuta kwa wopanga mapulogalamu. Ingolembani malingaliro anu, ingondiuzani malo omwe mungasinthire pakati pa mitsinje.

Ndikupangira kuti tiphunzire kusiyana pakati pa kuchita zinthu moganizira mozama komanso zampikisano ngati phunziro losasankha. Tsopano tiyeni tipitirire ku 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

Kauntala iliyonse imayendetsedwa ndi chitsanzo cha Counter class. Choyamba, mtengo wowerengera woyambirira umachotsedwa ku EEPROM (value_storage) - umu ndi momwe kuchira pambuyo pakulephera kwamagetsi kumachitikira.

Pini imayambika ndi kukoka komwe kumapangidwira kumagetsi: ngati kusintha kwa bango kutsekedwa, mzerewo ndi zero, ngati mzerewo uli wotseguka, umakokera kumagetsi ndipo wolamulira amawerenga.

Ntchito ina yakhazikitsidwanso apa, yomwe idzavotere pini. Kauntala iliyonse idzagwira ntchito yakeyake. Nayi code yake

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

Kuchedwa kwa 25ms kumafunika kuti musefa kugundana, ndipo nthawi yomweyo imayendetsa kangati ntchitoyo imadzuka (pamene ntchitoyi ikugona, ntchito zina zikuyenda). Ma 25ms aliwonse ntchitoyo imadzuka, imayang'ana pini ndipo ngati zolumikizira za bango zatsekedwa, ndiye kuti lita ina yadutsa mita ndipo izi ziyenera kukonzedwa.

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

        self._value_storage.write(self._value)

Kukonza lita lotsatira n'kochepa - kauntala imangowonjezera. Chabwino, zingakhale bwino kulemba mtengo watsopano pa flash drive.

Kuti mugwiritse ntchito mosavuta, "owonjezera" amaperekedwa

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

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

Chabwino, tsopano tiyeni tipindule ndi zosangalatsa za Python ndi laibulale ya uasync ndikupanga chinthu chowerengera chodikirira (tingamasulire bwanji izi mu Chirasha? Zomwe mungayembekezere?)

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

        return self.value()

    __iter__ = __await__  

Ichi ndi ntchito yabwino kwambiri yomwe imadikirira mpaka mtengo wotsutsa usinthidwa - ntchitoyo imadzuka nthawi ndi nthawi ndikuyang'ana _value_changed mbendera. Chosangalatsa pa ntchitoyi ndikuti nambala yoyimbira imatha kugona pamene ikuyitanitsa ntchitoyi ndikugona mpaka mtengo watsopano utalandiridwa.

Nanga bwanji zosokoneza?Inde, pakadali pano mutha kundigwedeza, kunena kuti inuyo mwanenapo za zosokoneza, koma kwenikweni munapanga chisankho chopusa. Zosokoneza ndi chinthu choyamba chomwe ndinayesera. Mu ESP8266, mutha kukonza zosokoneza, komanso kulemba chothandizira kusokoneza uku mu Python. Pakusokoneza uku, mtengo wa kusintha ukhoza kusinthidwa. Mwinamwake, izi zikanakhala zokwanira ngati kauntalayo inali chipangizo cha akapolo - chomwe chimadikirira mpaka chikafunsidwa za mtengo uwu.

Mwamwayi (kapena mwamwayi?) chipangizo changa chikugwira ntchito, chiyenera kutumiza mauthenga kudzera pa protocol ya MQTT ndikulemba deta ku EEPROM. Ndipo apa ziletso zimayamba kugwira ntchito - simungathe kugawa kukumbukira ndikusokoneza ndikugwiritsa ntchito stack yayikulu, zomwe zikutanthauza kuti mutha kuyiwala za kutumiza mauthenga pamaneti. Pali ma buns ngati micropython.schedule() omwe amakulolani kuti mugwiritse ntchito "mwamsanga," koma funso limadzuka, "mfundo yake ndi chiyani?" Nanga bwanji ngati tikutumiza uthenga wamtundu wina pakali pano, ndiyeno kusokoneza kumabwera ndikuwononga zikhalidwe zamitundumitundu. Kapena, mwachitsanzo, mtengo watsopano wotsutsa unafika kuchokera ku seva pamene tinali tisanalembe zakale. Mwambiri, muyenera kuletsa kulumikizana kapena kutulukamo mwanjira ina.

Ndipo nthawi ndi nthawi RuntimeError: sungani zowonongeka zonse ndipo ndani akudziwa chifukwa chake?

Ndi kuvota momveka bwino komanso uasync, pamenepa zimakhala zokongola komanso zodalirika

Ndinabweretsa ntchito ndi EEPROM ku kalasi yaing'ono

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)

Ku Python, ndizovuta kugwira ntchito mwachindunji ndi ma byte, koma ndi ma byte omwe amalembedwa pamtima. Ndinayenera kutchinga kutembenuka pakati pa chiwerengero ndi ma byte pogwiritsa ntchito laibulale ya ustruct.

Kuti ndisamutse chinthu cha I2C ndi adilesi ya foni yam'manja nthawi zonse, ndidazikulunga zonse mumtundu waung'ono komanso wosavuta.

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)

Chinthu cha I2C chokha chimapangidwa ndi magawo awa

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

Timafika ku gawo losangalatsa kwambiri - kukhazikitsa kulumikizana ndi seva kudzera pa MQTT. Chabwino, palibe chifukwa chokhazikitsa protocol yokha - ndidayipeza pa intaneti okonzeka anapanga asynchronous kukhazikitsa. Izi ndi zomwe tidzagwiritse ntchito.

Zinthu zonse zosangalatsa zasonkhanitsidwa mu kalasi ya CounterMQTTClient, yomwe imachokera ku laibulale ya MQTTClient. Tiyeni tiyambire ku periphery

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

Apa mutha kupanga ndikusintha zikhomo ndi mabatani a nyali, komanso zinthu za mita yamadzi ozizira ndi otentha.

Ndi zoyambira, si zonse zomwe zimakhala zazing'ono

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

Kukhazikitsa magawo ogwiritsira ntchito laibulale ya mqtt_as, dikishonale yayikulu yamakonzedwe osiyanasiyana imagwiritsidwa ntchito - config. Zokonda zambiri zokhazikika ndizabwino kwa ife, koma zokonda zambiri ziyenera kukhazikitsidwa momveka bwino. Kuti ndisalembe zoikamo mwachindunji mu code, ndimazisunga mu fayilo yolemba config.txt. Izi zimakuthandizani kuti musinthe kachidindo mosasamala zosintha, komanso kuyika zida zingapo zofanana ndi magawo osiyanasiyana.

Chomaliza cha code chimayamba ma coroutine angapo kuti agwire ntchito zosiyanasiyana zamakina. Mwachitsanzo, nayi coroutine yomwe mautumiki amawerengera

    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 imadikirira mozungulira mtengo watsopano wotsutsa ndipo, ikangowonekera, imatumiza uthenga kudzera pa protocol ya MQTT. Chidutswa choyamba cha kachidindo chimatumiza mtengo woyamba ngakhale madzi akuyenda modutsa pa counter.

Gulu loyambira la MQTTClient limadzitumikira lokha, limayambitsa kulumikizana kwa WiFi ndikulumikizanso pomwe kugwirizanako kutayika. Pakakhala zosintha pamalumikizidwe a WiFi, laibulale imatidziwitsa poyimba 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)

Ntchitoyi imakopera moona mtima kuchokera ku zitsanzo. Pankhaniyi, imawerengera kuchuluka kwa kuzimitsidwa (internet_outages) ndi nthawi yawo. Pamene kugwirizana kwabwezeretsedwa, nthawi yopanda pake imatumizidwa ku seva.

Mwa njira, kugona komaliza kumangofunika kuti ntchitoyi ikhale yosasunthika - mulaibulale imatchedwa kudzera mukuyembekezera, ndipo ntchito zokhazokha zomwe thupi lake lili ndi kuyembekezera kwina kungatchulidwe.

Kuphatikiza pa kulumikiza kwa WiFi, muyeneranso kukhazikitsa kugwirizana kwa MQTT broker (seva). Laibulale imachitanso izi, ndipo timapeza mwayi wochita zinazake zothandiza pamene kulumikizana kwakhazikitsidwa

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

Apa timalembetsa mauthenga angapo - seva tsopano ili ndi kuthekera kokhazikitsa ziwerengero zaposachedwa potumiza uthenga womwewo.

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

Ntchitoyi imapanga mauthenga obwera, ndipo kutengera mutu (mutu wauthenga), zikhalidwe za imodzi mwazowerengera zimasinthidwa

Ntchito zingapo zothandizira

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

Ntchitoyi imatumiza uthenga ngati kugwirizana kwakhazikitsidwa. Ngati palibe kulumikizana, uthengawo umanyalanyazidwa.

Ndipo iyi ndi ntchito yabwino yomwe imapanga ndikutumiza mauthenga ochotsa zolakwika.

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

Zolemba zambiri, ndipo sitinapenyebe ma LED. Pano

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

Ndapereka mitundu 2 yophethira. Ngati kugwirizana kwatayika (kapena kukungokhazikitsidwa), chipangizocho chidzawombera mwamsanga. Ngati kugwirizana kwakhazikitsidwa, chipangizocho chimawombera kamodzi pamasekondi asanu aliwonse. Ngati ndi kotheka, njira zina zophethira zitha kukhazikitsidwa apa.

Koma nyali ya LED ndiyopepuka. Tinayang'ananso chiwonetserochi.

    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)

Izi ndi zomwe ndimakamba - momwe zimakhalira zosavuta komanso zosavuta ndi ma coroutines. Ntchito yaying'ono iyi ikufotokoza ZONSE za ogwiritsa ntchito. Coroutine imangodikirira kuti batani ikanikizidwe ndikuyatsa chiwonetsero kwa masekondi atatu. Chiwonetserochi chikuwonetsa kuwerengera kwa mita komweko.

Palinso zinthu zingapo zazing'ono zomwe zatsala. Nayi ntchito yomwe (re) imayambitsa bizinesi yonseyi. Lupu yayikulu imangotumiza zambiri zowongolera kamodzi pa mphindi imodzi. Nthawi zambiri, ndimatchula momwe zilili - sindikuganiza kuti palibe chifukwa chofotokozera zambiri

   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)

Chabwino, zosintha zingapo ndi zosintha kuti mumalize kufotokozera

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

Zonse zimayamba motere

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

Chinachake chinachitika m'maganizo mwanga

Kotero, ma code onse alipo. Ndidakweza mafayilo pogwiritsa ntchito chida cha ampy - chimakupatsani mwayi wowayika mkati (yomwe ili mu ESP-07 palokha) flash drive ndikuipeza kuchokera ku pulogalamuyi ngati mafayilo wamba. Kumeneko ndidayikanso mqtt_as, uasyncio, ssd1306 ndi malaibulale osonkhanitsa omwe ndidagwiritsa ntchito (omwe amagwiritsidwa ntchito mkati mwa mqtt_as).

Timatsegula ndi... Timapeza MemoryError. Komanso, m'mene ndimayesera kumvetsetsa komwe kukumbukira kunali kutayikira, pamene ndinayika zolemba zambiri, ndiye kuti cholakwikacho chinawonekera. Kufufuza kwakanthawi kwa Google kunandipangitsa kumvetsetsa kuti microcontroller ili ndi 30 kB yokha ya kukumbukira, momwe 65 kB ya code (kuphatikizapo malaibulale) sangagwirizane.

Koma pali njira yotulukira. Zikuoneka kuti micropython samapanga code mwachindunji kuchokera ku fayilo ya .py - fayiloyi imapangidwa poyamba. Kuphatikiza apo, imapangidwa mwachindunji pa microcontroller, ndikusinthidwa kukhala bytecode, yomwe imasungidwa kukumbukira. Chabwino, kuti compiler igwire ntchito, mumafunikanso kuchuluka kwa RAM.

Chinyengo ndikupulumutsa microcontroller kuchokera pakuphatikiza kogwiritsa ntchito kwambiri. Mutha kuphatikizira mafayilo pakompyuta yayikulu ndikuyika bytecode yokonzeka mu microcontroller. Kuti muchite izi, muyenera kutsitsa firmware ya micropython ndikumanga mpy-cross zothandiza.

Sindinalembe Makefile, koma ndidadutsa ndikulemba mafayilo onse ofunikira (kuphatikiza malaibulale) chonga ichi.

mpy-cross water_counter.py

Zonse zomwe zatsala ndikukweza mafayilo ndi .mpy extension, osaiwala kuti muyambe kuchotsa .py yogwirizana ndi fayilo ya chipangizocho.

Ndidapanga chitukuko chonse mu pulogalamuyi (IDE?) ESPlorer. Zimakulolani kukweza zolemba ku microcontroller ndikuzipanga nthawi yomweyo. Kwa ine, malingaliro onse ndi chilengedwe cha zinthu zonse zili mu fayilo ya water_counter.py (.mpy). Koma kuti zonsezi ziyambe zokha, payeneranso kukhala fayilo yotchedwa main.py poyambira. Komanso, ziyenera kukhala ndendende .py, osati kusanjidwa .mpy. Nazi nkhani zake zazing'ono

import water_counter

Timayiyambitsa - zonse zimagwira ntchito. Koma kukumbukira kwaulere ndikochepa kwambiri - pafupifupi 1kb. Ndikadali ndi mapulani okulitsa magwiridwe antchito a chipangizocho, ndipo kilobyte iyi mwachiwonekere siyokwanira kwa ine. Koma zinapezeka kuti palinso njira yotulukira pamlanduwu.

Nachi chinthucho. Ngakhale mafayilo amapangidwa kukhala bytecode ndikukhala pa fayilo yamkati, kwenikweni amakwezedwa mu RAM ndikuchitidwa kuchokera pamenepo. Koma zikuwoneka kuti micropython imatha kupha bytecode molunjika kuchokera ku flash memory, koma chifukwa cha izi muyenera kuyimanga mwachindunji mu firmware. Sizovuta, ngakhale zidatenga nthawi pa netbook yanga (pokhapokha ndidali ndi Linux).

Ma algorithm ndi awa:

  • Koperani ndi kukhazikitsa ESP Open SDK. Izi zimasonkhanitsa chojambulira ndi malaibulale a mapulogalamu a ESP8266. Zosonkhanitsidwa molingana ndi malangizo omwe ali patsamba lalikulu la polojekitiyi (ndinasankha STANDALONE=yes setting)
  • Sakanizani mitundu ya micropython
  • Ikani malaibulale ofunikira mu madoko/esp8266/module mkati mwa mtengo wa micropython
  • Timasonkhanitsa firmware molingana ndi malangizo omwe ali mufayilo madoko/esp8266/README.md
  • Timayika firmware ku microcontroller (ndimachita izi pa Windows pogwiritsa ntchito mapulogalamu a ESP8266Flasher kapena Python esptool)

Ndizo zonse, tsopano 'kulowetsa ssd1306' kukweza kachidindo mwachindunji kuchokera ku firmware ndipo RAM sidzagwiritsidwa ntchito pa izi. Ndi chinyengo ichi, ndidayika kachidindo ka laibulale yokha mu firmware, pomwe pulogalamu yayikulu imapangidwa kuchokera pamafayilo. Izi zimakuthandizani kuti musinthe pulogalamuyo mosavuta popanda kubwezeretsanso firmware. Pakadali pano ndili ndi pafupifupi 8.5kb ya RAM yaulere. Izi zidzatithandiza kugwiritsa ntchito zinthu zambiri zothandiza m'tsogolomu. Chabwino, ngati palibe kukumbukira kokwanira konse, ndiye kuti mutha kukankhira pulogalamu yayikulu mu firmware.

Ndiye tiyenera kuchita chiyani tsopano?

Chabwino, hardware imagulitsidwa, firmware imalembedwa, bokosilo limasindikizidwa, chipangizocho chimakankhidwa pakhoma ndipo mosangalala chimawombera babu. Koma pakali pano onse ndi bokosi lakuda (kwenikweni ndi mophiphiritsira) ndipo akadali osagwiritsidwa ntchito pang'ono. Yakwana nthawi yoti muchitepo kanthu ndi mauthenga a MQTT omwe amatumizidwa ku seva.

"Nyumba yanga yanzeru" ikuzungulira Majordomo system. Module ya MQTT mwina imatuluka m'bokosi, kapena imayikidwa mosavuta kuchokera kumsika wowonjezera - sindikukumbukira komwe ndidachokera. MQTT si chinthu chodzidalira - muyenera chotchedwa. broker - seva yomwe imalandira, kusanja ndi kutumiza mauthenga a MQTT kwa makasitomala. Ndimagwiritsa ntchito udzudzu, womwe (monga majordomo) umayenda pa netbook yomweyo.

Chipangizocho chikatumiza uthenga kamodzi, mtengowo udzawonekera pamndandanda.

Kulumikiza mita yamadzi ku nyumba yanzeru

Miyezo iyi tsopano ikhoza kulumikizidwa ndi zinthu zamakina, zitha kugwiritsidwa ntchito pazolemba zokha ndikuwunikiridwa mosiyanasiyana - zonse zomwe sizingachitike m'nkhaniyi. Nditha kupangira dongosolo la majordomo kwa aliyense amene ali ndi chidwi njira Electronics Mu mandala - Mnzako akumanganso nyumba yanzeru ndipo amalankhula momveka bwino za kukhazikitsa dongosolo.

Ndingokuwonetsani ma graph angapo. Ichi ndi chithunzi chosavuta cha zinthu zatsiku ndi tsiku

Kulumikiza mita yamadzi ku nyumba yanzeru
Zikuoneka kuti pafupifupi palibe amene ankagwiritsa ntchito madzi usiku. Kangapo wina amapita kuchimbudzi, ndipo zikuwoneka kuti fyuluta ya reverse osmosis imayamwa malita angapo usiku uliwonse. M'mawa, kumwa kumawonjezeka kwambiri. Nthawi zambiri ndimagwiritsa ntchito madzi kuchokera ku boiler, koma kenako ndimafuna kusamba ndikusinthira kwakanthawi kumadzi otentha amzinda - izi zikuwonekeranso bwino pa graph yapansi.

Kuchokera pa graphyi ndinaphunzira kuti kupita kuchimbudzi kumafuna malita 6-7 a madzi, kusamba kumafuna malita 20-30, kutsuka mbale kumafuna malita 20, ndipo kusamba kumafuna malita 160. Banja langa limadya penapake pafupifupi malita 500-600 patsiku.

Kwa iwo omwe ali ndi chidwi kwambiri, mutha kuyang'ana zolemba za mtengo uliwonse

Kulumikiza mita yamadzi ku nyumba yanzeru

Kuchokera apa ndinaphunzira kuti pamene mpopi watseguka, madzi amayenda pa liwiro la pafupifupi lita imodzi pa 1 s.

Koma mu mawonekedwe awa ziwerengero mwina si zabwino kwambiri kuyang'ana. Majordomo alinso ndi kuthekera kowonera ma chart omwe amamwa patsiku, sabata ndi mwezi. Pano, mwachitsanzo, pali graph yogwiritsira ntchito m'mabala

Kulumikiza mita yamadzi ku nyumba yanzeru

Pakadali pano ndili ndi data kwa sabata imodzi yokha. M'mwezi umodzi, graph iyi idzakhala yowonetsera - tsiku lililonse lidzakhala ndi gawo losiyana. Chithunzicho chimawonongeka pang'ono ndi zosintha pamikhalidwe yomwe ndimayika pamanja (gawo lalikulu kwambiri). Ndipo sizikudziwikabe ngati ndidayika molakwika zikhalidwe zoyambirira, pafupifupi kyubu yochepa, kapena ngati ichi ndi cholakwika mu firmware ndipo si malita onse omwe adawerengedwa. Mukufuna nthawi yochulukirapo.

Ma grafuwo amafunikirabe zamatsenga, zoyera, zopenta. Mwinanso ndipanga graph yogwiritsa ntchito kukumbukira kuti ndikonze zolakwika - ngati china chake chikutsika pamenepo. Mwina mwanjira ina ndiwonetsa nthawi pomwe panalibe intaneti. Pakadali pano, zonsezi zili pamlingo wamalingaliro.

Pomaliza

Lero nyumba yanga yakhala yochenjera pang'ono. Ndi kachipangizo kakang'ono chotere, zidzakhala zosavuta kuti ndiyang'ane momwe madzi amagwiritsira ntchito m'nyumba. Ngati m'mbuyomo ndidakwiyira "kachiwiri, tinamwa madzi ambiri m'mwezi umodzi," tsopano ndikutha kupeza komwe kumachokera.

Ena angaone kukhala achilendo kuyang’ana zoΕ΅erengeka pa zenera ngati kuli mita kutali ndi mita yokhayo. Koma posachedwa, ndikukonzekera kusamukira ku nyumba ina, komwe kudzakhala zokwera zingapo zamadzi, ndipo mamita okhawo adzakhalapo pamtunda. Choncho chipangizo chowerengera chakutali chidzakhala chothandiza kwambiri.

Ndikukonzekeranso kukulitsa magwiridwe antchito a chipangizocho. Ndikuyang'ana kale mavavu amoto. Tsopano, kuti ndisinthe chowotchera kuti chikhale madzi amzindawu, ndiyenera kutembenuza matepi atatu pamalo ovuta kufikako. Zingakhale zosavuta kuchita izi ndi batani limodzi lokhala ndi chizindikiro chofananira. Chabwino, ndithudi, ndi koyenera kukhazikitsa chitetezo ku kutayikira.

M'nkhaniyi ndidafotokoza za mtundu wanga wa chipangizo chozikidwa pa ESP8266. M'malingaliro anga, ndinabwera ndi mtundu wosangalatsa kwambiri wa firmware ya micropython pogwiritsa ntchito ma coroutines - osavuta komanso abwino. Ndidayesa kufotokoza zambiri mwazovuta ndi zofooka zomwe ndidakumana nazo panthawi ya kampeni. Mwina ndidafotokoza zonse mwatsatanetsatane; panokha, monga wowerenga, ndizosavuta kuti ndidumphe zinthu zosafunikira kuposa kuganiza pambuyo pake zomwe zidasiyidwa.

Monga nthawi zonse, ndimakonda kutsutsidwa mogwira mtima.

Nambala yachinsinsi
Chizungulire ndi bolodi
Mlandu wa chitsanzo

Source: www.habr.com

Kuwonjezera ndemanga