የውሃ ቆጣሪውን ወደ ዘመናዊው ቤት እናገናኘዋለን

በአንድ ወቅት የቤት አውቶሜሽን ሲስተም ወይም ብዙ ጊዜ "ስማርት ቤት" እየተባለ የሚጠራው በጣም ውድ ስለነበር ባለጠጎች ብቻ ይገዙላቸው ነበር። ዛሬ በገበያው ላይ መብራትን፣ ሶኬቶችን፣ አየር ማናፈሻን፣ የውሃ አቅርቦትን እና ሌሎች ሸማቾችን ለመቆጣጠር ትክክለኛ የበጀት ኪቶችን ከሴንሰሮች፣ አዝራሮች/ማብሪያና ማጥፊያዎች ማግኘት ይችላሉ። እና በጣም ጠማማው DIY-shnik እንኳን ውበቱን መቀላቀል እና መሳሪያዎችን ለዘመናዊ ቤት ውድ ባልሆነ ዋጋ ሊሰበስብ ይችላል።

የውሃ ቆጣሪውን ወደ ዘመናዊው ቤት እናገናኘዋለን

እንደ አንድ ደንብ, የታቀዱት መሳሪያዎች ዳሳሾች ወይም አንቀሳቃሾች ናቸው. እንደ "የእንቅስቃሴ ዳሳሽ ሲነቃ መብራቱን ያብሩ" ወይም "በመውጫው አቅራቢያ ያለው ማብሪያ / ማጥፊያ በአጠቃላይ አፓርታማ ውስጥ መብራቱን ያጠፋል" ያሉ ሁኔታዎችን ተግባራዊ ለማድረግ ቀላል ያደርጉታል. ግን በሆነ መልኩ በቴሌሜትሪ አልሰራም። ቢበዛ፣ ይህ የሙቀት እና እርጥበት ግራፍ ነው፣ ወይም በአንድ የተወሰነ መውጫ ውስጥ ያለው ቅጽበታዊ ኃይል።

በቅርቡ የውሃ ቆጣሪዎችን በ pulse ውፅዓት ጫንኩ። በቆጣሪው ውስጥ በተሰራው በእያንዳንዱ ሊትር, የሸምበቆው መቀየሪያ ነቅቷል እና እውቂያውን ይዘጋል. የሚቀረው ብቸኛው ነገር በሽቦዎቹ ላይ ተጣብቆ መቆየት እና ከእሱ የተወሰነ ጥቅም ለማግኘት መሞከር ነው. ለምሳሌ የውሃ ፍጆታን በሰዓታት እና በሳምንቱ ቀናት ይተንትኑ። ደህና ፣ በአፓርታማ ውስጥ ብዙ የውሃ መወጣጫዎች ካሉ ፣ በባትሪ ብርሃን ለመድረስ አስቸጋሪ የሆኑ ቦታዎችን ከመውጣት ይልቅ ሁሉንም የአሁኑን አመልካቾች በአንድ ማያ ገጽ ላይ ማየት የበለጠ ምቹ ነው።

ከውሃ ቆጣሪዎች የሚመነጩትን የሚቆጥር እና በMQTT በኩል ወደ ስማርት ሆም አገልጋይ ንባቦችን የሚልክ በESP8266 ላይ የተመሠረተ የመሣሪያ የእኔ ስሪት በቁርጡ ስር። Uasyncio ቤተ-መጽሐፍትን በመጠቀም በማይክሮፒቶን ፕሮግራም እናደርጋለን። firmwareን በሚፈጥሩበት ጊዜ ብዙ አስደሳች ችግሮች አጋጥመውኛል ፣ በዚህ ጽሑፍ ውስጥም እነጋገራለሁ ። ሂድ!

መርሃግብሩ

የውሃ ቆጣሪውን ወደ ዘመናዊው ቤት እናገናኘዋለን

የጠቅላላው ወረዳ ልብ በ ESP8266 ማይክሮ መቆጣጠሪያ ላይ ያለ ሞጁል ነው። ESP-12 በመጀመሪያ ታቅዶ ነበር፣ ነገር ግን የእኔ ጉድለት ያለበት ሆኖ ተገኝቷል። በ ESP-07 ሞጁል ረክቼ መኖር ነበረብኝ, እሱም ይገኛል. እንደ እድል ሆኖ, እነሱ በመደምደሚያ እና በተግባራዊነት ሁለቱም ተመሳሳይ ናቸው, ልዩነቱ በአንቴና ውስጥ ብቻ ነው - ESP-12 አብሮገነብ አለው, ESP-07 ግን ውጫዊ ነው. ነገር ግን፣ ያለ ዋይፋይ አንቴና እንኳን፣ በመታጠቢያ ቤቴ ውስጥ ያለው ምልክት በመደበኛነት ይያዛል።

የሞጁሉ ማሰር መደበኛ ነው፡-

  • ዳግም ማስጀመር ቁልፍ በሚጎትት እና በ capacitor (ምንም እንኳን ሁለቱም ሞጁሉ ውስጥ ቢሆኑም)
  • የነቃ ሲግናል (CH_PD) ወደ ኃይል ተጎትቷል።
  • GPIO15 ወደ መሬት ተነጠቀ። ይህ መጀመሪያ ላይ ብቻ ነው የሚያስፈልገው, ግን አሁንም ከዚህ እግር ጋር መጣበቅ አያስፈልገኝም

ሞጁሉን ወደ firmware ሁነታ ለማስተላለፍ GPIO2 ን ወደ መሬት መዝጋት ያስፈልግዎታል ፣ እና የበለጠ ምቹ ለማድረግ የቡት አዝራሩን ሰጠሁ። በተለመደው ሁኔታ, ይህ ፒን ወደ ኃይል ይሳባል.

የ GPIO2 መስመር ሁኔታ የሚመረጠው በስራው መጀመሪያ ላይ ብቻ ነው - ኃይል ሲተገበር ወይም እንደገና ከተጀመረ በኋላ ወዲያውኑ። ስለዚህ ሞጁሉ እንደተለመደው ይነሳል ወይም ወደ firmware ሁነታ ይሄዳል። አንዴ ከተጫነ ይህ ፒን እንደ መደበኛ GPIO ሊያገለግል ይችላል። ደህና, እዚያ ቀድሞውኑ አንድ አዝራር ስላለ, አንዳንድ ጠቃሚ ተግባራትን በእሱ ላይ መስቀል ይችላሉ.

ለፕሮግራም እና ለማረም እኔ ወደ ማበጠሪያው ያመጣሁትን UART እጠቀማለሁ። አስፈላጊ ሆኖ ሲገኝ በቀላሉ እዚያ የዩኤስቢ-UART አስማሚን እገናኛለሁ. ሞጁሉ በ 3.3 ቪ የተጎላበተ መሆኑን ብቻ ማስታወስ ያስፈልግዎታል. አስማሚውን ወደዚህ ቮልቴጅ ለመቀየር ከረሱ እና 5 ቮን ተግባራዊ ካደረጉ, ሞጁሉ በጣም ሊቃጠል ይችላል.

በመጸዳጃ ቤት ውስጥ በኤሌክትሪክ ምንም ችግር የለብኝም - መውጫው ከሜትሮች አንድ ሜትር ያህል ይገኛል, ስለዚህ ከ 220 ቮ ኃይል አደርገዋለሁ. እንደ የኃይል ምንጭ, ትንሽ ይኖረኛል አግድ HLK-PM03 በ Tenstar Robot. በግሌ ከአናሎግ እና ከኤሌክትሪክ ሃይል ኤሌክትሮኒክስ ጋር እቸገራለሁ, እና እዚህ በትንሽ መያዣ ውስጥ ዝግጁ የሆነ የኃይል አቅርቦት አለ.

የክወና ሁነታዎችን ለመጠቆም ከGPIO2 ጋር የተገናኘ ኤልኢዲ አቅርቤ ነበር። ይሁን እንጂ እኔ አልሸጥኩትም, ምክንያቱም. የ ESP-07 ሞጁል አስቀድሞ ከተመሳሳይ GPIO2 ጋር የተገናኘ LED አለው። ግን በቦርዱ ላይ ይሁን - በድንገት ይህንን LED ወደ ጉዳዩ ማምጣት እፈልጋለሁ.

ወደ በጣም አስደሳች ወደሆነው እንሂድ። የውሃ ቆጣሪዎች ምንም አመክንዮ የላቸውም, ለአሁኑ ንባብ ሊጠየቁ አይችሉም. ለእኛ ያለው ብቸኛው ነገር ግፊቶች ነው - በእያንዳንዱ ሊትር የሸምበቆውን እውቂያዎች መዝጋት። በ GPIO12/GPIO13 ውስጥ የሸምበቆ ማብሪያ ውፅዓት አለኝ። በሞጁሉ ውስጥ ፑል አፕ ተቃዋሚን በፕሮግራማዊ መንገድ እከፍታለሁ።

መጀመሪያ ላይ, resistors R8 እና R9 ን ማቅረብ ረሳሁ እና በእኔ የቦርድ ስሪት ውስጥ አይደሉም. ግን እቅዱን ሁሉም ሰው እንዲያየው አስቀድሜ ስለዘረጋሁ፣ ይህን ቁጥጥር ማስተካከል ተገቢ ነው። ፋየርዌሩ አስቸጋሪ ከሆነ እና በፒን ላይ አንድ አሃድ ካዘጋጀ ወደቡን እንዳያቃጥሉ ተቃዋሚዎች ያስፈልጋሉ ፣ እና ሸምበቆው ይህንን መስመር ወደ መሬት ያሳርፋል (በተቃዋሚ ፣ ቢበዛ 3.3 ቪ / 1000Ω = 3.3mA ይፈስሳል) .

ኤሌክትሪክ ከጠፋ ምን ማድረግ እንዳለበት ለማሰብ ጊዜው አሁን ነው። የመጀመሪያው አማራጭ አገልጋዩን በመነሻ ጊዜ ቆጣሪዎቹ የመጀመሪያ ዋጋዎችን መጠየቅ ነው። ነገር ግን ይህ የልውውጥ ፕሮቶኮሉን ጉልህ የሆነ ውስብስብነት ይጠይቃል። ከዚህም በላይ በዚህ ጉዳይ ላይ የመሳሪያው አፈፃፀም በአገልጋዩ ሁኔታ ላይ የተመሰረተ ነው. መብራቱን ካጠፋ በኋላ አገልጋዩ ካልጀመረ (ወይም በኋላ ላይ የጀመረው) ከሆነ የውሃ ቆጣሪው የመጀመሪያ እሴቶችን መጠየቅ አይችልም እና በስህተት ይሰራል።

ስለዚህ በ I2C በኩል በተገናኘ የማስታወሻ ቺፕ ውስጥ የቆጣሪ እሴቶችን ማከማቻ ለመተግበር ወሰንኩ ። ለፍላሽ ማህደረ ትውስታ መጠን ምንም ልዩ መስፈርቶች የለኝም - 2 ቁጥሮችን ብቻ ማስቀመጥ ያስፈልግዎታል (በሙቅ እና በቀዝቃዛ ውሃ ቆጣሪዎች መሠረት የሊቶች ብዛት)። ትንሹ ሞጁል እንኳን ይሠራል. ነገር ግን ለጽህፈት ዑደቶች ብዛት ትኩረት መስጠት አለብዎት. ለአብዛኛዎቹ ሞጁሎች ይህ 100 ሺህ ዑደቶች ነው ፣ ለአንዳንዶቹ እስከ አንድ ሚሊዮን።

አንድ ሚሊዮን ብዙ የሚመስል ይመስላል። ነገር ግን በአፓርታማዬ ውስጥ ለ 4 ዓመታት ያህል ከ 500 ሜትር ኩብ በላይ ውሃ እበላ ነበር, ይህ 500 ሺህ ሊትር ነው! እና 500 ሺህ መዝገቦች በፍላሽ. እና ያ ቀዝቃዛ ውሃ ብቻ ነው. በእርግጥ በየሁለት ዓመቱ ቺፑን እንደገና መሸጥ ይችላሉ፣ነገር ግን የFRAM ቺፕስ መኖሩ ታወቀ። ከፕሮግራም አተያይ አንፃር ፣ ይህ ተመሳሳይ I2C EEPROM ነው ፣ በጣም ብዙ ቁጥር እንደገና የመፃፍ ዑደቶች (በመቶ ሚሊዮን) ብቻ። ያ ነው እኔ አሁንም እንደዚህ ዓይነት ማይክሮ ሰርኮች ወዳለው ሱቅ መድረስ እስካልችል ድረስ ነው፣ ስለዚህ አሁን የተለመደው 24LC512 ይቆማል።

የታተመ የወረዳ ሰሌዳ

መጀመሪያ ላይ ቤት ውስጥ ሰሌዳ ለመሥራት እቅድ ነበረኝ. ስለዚህ, ቦርዱ አንድ-ጎን ሆኖ ተዘጋጅቷል. ነገር ግን ለአንድ ሰዓት ያህል በሌዘር ብረት እና በተሸጠው ጭንብል ካሳለፍኩ በኋላ (ያለ እሱ በሆነ መንገድ አይመጣም) ፣ አሁንም ሰሌዳዎችን ከቻይናውያን ለማዘዝ ወሰንኩ።

የውሃ ቆጣሪውን ወደ ዘመናዊው ቤት እናገናኘዋለን

ቦርዱን ከማዘዝዎ በፊት ማለት ይቻላል ከፍላሽ ማህደረ ትውስታ ቺፕ በተጨማሪ ለ I2C አውቶቡስ ሌላ ጠቃሚ ነገር ማያያዝ እንደሚችሉ ተገነዘብኩ ፣ ለምሳሌ ፣ ማሳያ። በትክክል ወደ እሱ የሚወጣው ነገር አሁንም ጥያቄ ነው ፣ ግን በቦርዱ ላይ ማራባት ያስፈልግዎታል። ደህና, በፋብሪካው ውስጥ ቦርዶችን ስለማዘዝ, እራሴን በአንድ-ጎን ሰሌዳ ላይ መገደብ ምንም ፋይዳ የለውም, ስለዚህ የ I2C መስመሮች በቦርዱ ጀርባ ላይ ብቻ ናቸው.

አንድ ትልቅ ጃምብ እንዲሁ ከአንድ-መንገድ ሽቦ ጋር ተገናኝቷል። ምክንያቱም ቦርዱ አንድ-ጎን ተስሏል, ከዚያም ትራኮች እና የ SMD ክፍሎች በአንድ በኩል እንዲቀመጡ ታቅዶ ነበር, እና የውጤት አካላት, ማገናኛዎች እና የኃይል አቅርቦቶች በሌላኛው በኩል. ከአንድ ወር በኋላ ቦርዶችን ስቀበል የመጀመሪያውን እቅድ ረሳሁ እና ሁሉንም ክፍሎች በፊት ለፊት በኩል ሸጥኩ. እና የኃይል አቅርቦቱን ለመሸጥ ሲመጣ ብቻ ፕላስ እና ተቀንሶ የተፋቱት በተቃራኒው ነው። በጀልባዎች ማረስ ነበረብኝ። በሥዕሉ ላይ ከላይ ባለው ሥዕል ላይ ሽቦውን ቀይሬያለሁ ፣ ግን መሬቱ ከቦርዱ አንድ ክፍል ወደ ሌላ በቡት ቁልፍ ፒን በኩል ይተላለፋል (ምንም እንኳን በሁለተኛው ሽፋን ላይ ትራክ መሳል ይቻል ነበር)።

እንዲህ ሆነ

የውሃ ቆጣሪውን ወደ ዘመናዊው ቤት እናገናኘዋለን

መኖሪያ ቤት

ቀጣዩ ደረጃ አካል ነው. 3-ል አታሚ ካለዎት ይህ ችግር አይደለም. ብዙም አልተቸገርኩም - ልክ መጠን ያለው ሳጥን ሣልኩ እና በትክክለኛው ቦታዎች ላይ ቁርጥኖችን ሠራሁ። ሽፋኑ በሰውነት ላይ በትንሽ የራስ-ታፕ ዊንሽኖች ተጣብቋል.

የውሃ ቆጣሪውን ወደ ዘመናዊው ቤት እናገናኘዋለን

አስቀድሜ የቡት አዝራሩ እንደ አጠቃላይ ዓላማ ሆኖ ሊያገለግል እንደሚችል ተናግሬያለሁ - ስለዚህ ወደ የፊት ፓነል እናምጣው። ይህንን ለማድረግ, አዝራሩ የሚኖርበት ልዩ "ደህና" ሣልኩ.

የውሃ ቆጣሪውን ወደ ዘመናዊው ቤት እናገናኘዋለን

እንዲሁም በቦርዱ ውስጥ ቦርዱ የተጫነባቸው እና በአንድ M3 screw (በቦርዱ ላይ ምንም ተጨማሪ ቦታ አልነበረም) የሚስተካከሉበት ፣ በቦርዱ ውስጥ ያሉት ቁርጥራጮች አሉ።

የመጀመሪያውን ተስማሚ የሻንጣውን እትም ሳተም ማሳያው ቀድሞውኑ ተመርጧል. መደበኛ ባለ ሁለት መስመር አታሚ በዚህ ጉዳይ ላይ አልገባም ፣ ግን በርሜሉ ግርጌ ላይ OLED ማሳያ SSD1306 128 × 32 ነበር። እሱ ትንሽ ነው ፣ ግን በየቀኑ አላየውም - ይንከባለል።

በዚህ መንገድ እና በዚህ መንገድ በመገመት, ሽቦዎቹ ከእሱ እንዴት እንደሚቀመጡ, ማሳያውን በጉዳዩ መካከል ለመለጠፍ ወሰንኩ. Ergonomics, በእርግጥ, ከፕሊንት በታች - አዝራሩ ከላይ ነው, ማሳያው ከታች ነው. ነገር ግን ማሳያውን የመንኮራኩሩ ሀሳብ በጣም ዘግይቷል እና ቁልፉን ለማንቀሳቀስ ቦርዱን እንደገና ሽቦ ለማድረግ ሰነፍ ነበርኩኝ ።

የተገጣጠመ መሳሪያ. የማሳያው ሞጁል በሞቃት ሙጫ ወደ snot ተጣብቋል

የውሃ ቆጣሪውን ወደ ዘመናዊው ቤት እናገናኘዋለን

የውሃ ቆጣሪውን ወደ ዘመናዊው ቤት እናገናኘዋለን

የመጨረሻው ውጤት በ KDPV ላይ ሊታይ ይችላል

Firmware

ወደ ሶፍትዌሩ ክፍል እንሂድ። ለእንደዚህ አይነት ትናንሽ የእጅ ስራዎች፣ የፒቲን ቋንቋን መጠቀም በጣም እወዳለሁ።ማይክሮፒቶን) - ኮዱ በጣም የታመቀ እና ለመረዳት የሚቻል ነው. እንደ እድል ሆኖ, ማይክሮ ሰከንድ ለማውጣት ወደ መዝገቦች ደረጃ መውረድ አያስፈልግም - ሁሉም ነገር ከፓይቶን ሊሠራ ይችላል.

ሁሉም ነገር ቀላል ነው, ግን በጣም አይደለም - መሣሪያው በርካታ ገለልተኛ ተግባራት አሉት.

  • ተጠቃሚው አንድ አዝራርን መታ እና ማሳያውን ይመለከታል
  • ሊትር በፍላሽ ማህደረ ትውስታ ውስጥ እሴቶችን ምልክት ያድርጉ እና ያዘምኑ
  • ሞጁሉ የ WiFi ምልክትን ይከታተላል እና አስፈላጊ ከሆነ እንደገና ይገናኛል
  • ደህና ፣ ብልጭ ድርግም የሚል አምፖል ከሌለ ፣ በጭራሽ አይችሉም

ሌላኛው, በሆነ ምክንያት, ሞኝ ከሆነ አንድ ተግባር እንዳልሰራ መቀበል አይቻልም. በሌሎች ፕሮጄክቶች ውስጥ ካክቲን በልቻለሁ እና አሁን አሁንም “ሌላ ሊትር አምልጦታል ምክንያቱም ማሳያው በዚያን ጊዜ ስለዘመነ” ​​ወይም “ሞጁሉ ከዋይፋይ ጋር ሲገናኝ ተጠቃሚው ምንም ማድረግ አይችልም” የሚሉ ጉድለቶችን እያየሁ ነው። እርግጥ ነው፣ አንዳንድ ነገሮች በማቋረጥ ሊከናወኑ ይችላሉ፣ ነገር ግን የቆይታ ጊዜ ገደብ፣ የጥሪዎች መክተቻ ወይም የአቶሚክ ያልሆኑ የተለዋዋጮች ለውጥ ሊያጋጥሙዎት ይችላሉ። ደህና, ሁሉንም ነገር የሚያከናውነው ኮድ እና ወዲያውኑ በፍጥነት ወደ ቆሻሻነት ይለወጣል.

В የበለጠ ከባድ ፕሮጀክት ክላሲክ ፕሪምፕቲቭ ባለብዙ ተግባር እና FreeRTOS ተጠቀምኩ፣ ነገር ግን በዚህ አጋጣሚ ሞዴሉ ይበልጥ ተስማሚ ሆኖ ተገኝቷል። coroutines እና uasync ቤተ መጻሕፍት . ከዚህም በላይ የፓይዘን ትግበራ ቦምብ ብቻ ነው - ሁሉም ነገር ለፕሮግራም አውጪው ቀላል እና ምቹ ነው. የእራስዎን አመክንዮ ብቻ ይፃፉ፣ በክር መካከል የት መቀየር እንደሚችሉ ብቻ ይንገሩኝ።

በቅድመ ዝግጅት እና በተወዳዳሪ ሁለገብ ስራዎች መካከል ያለውን ልዩነት እንደ አማራጭ ለማጥናት ሀሳብ አቀርባለሁ። አሁን በመጨረሻ ወደ ኮዱ እንሂድ።

#####################################
# Counter class - implements a single water counter on specified pin
#####################################
class Counter():
    debounce_ms = const(25)
    
    def __init__(self, pin_num, value_storage):
        self._value_storage = value_storage
        
        self._value = self._value_storage.read()
        self._value_changed = False

        self._pin = Pin(pin_num, Pin.IN, Pin.PULL_UP)

        loop = asyncio.get_event_loop()
        loop.create_task(self._switchcheck())  # Thread runs forever

እያንዳንዱ ቆጣሪ በቆጣሪው ክፍል ምሳሌ ይያዛል። በመጀመሪያ ደረጃ, የቆጣሪው የመጀመሪያ ዋጋ ከ EEPROM (እሴት_ማከማቻ) ይቀንሳል - ከኃይል ውድቀት በኋላ መልሶ ማገገም እንዴት እንደሚተገበር ነው.

ፒኑ የተጀመረው አብሮ በተሰራ የኃይል አቅርቦቱ ላይ ነው፡ የሸምበቆው ማብሪያ / ማጥፊያ ከተዘጋ ፣ መስመሩ ዜሮ ነው ፣ መስመሩ ክፍት ከሆነ ፣ እስከ ኃይል አቅርቦቱ ድረስ ይሳባል እና ተቆጣጣሪው አንድ ያነባል።

እንዲሁም፣ እዚህ የተለየ ተግባር ተጀምሯል፣ እሱም ፒኑን ይመርጣል። እያንዳንዱ ቆጣሪ የራሱን ተግባር ያካሂዳል. የእሷ ኮድ ይኸውና

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

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

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

የግንኙነቶችን ብዥታ ለማጣራት የ 25ms መዘግየት ያስፈልጋል, እና በተመሳሳይ ጊዜ ስራው ምን ያህል ጊዜ እንደሚነቃ ይቆጣጠራል (ይህ ተግባር በሚተኛበት ጊዜ, ሌሎች ስራዎች እየሰሩ ናቸው). በየ 25 ሚ.ሜ, ተግባሩ ከእንቅልፉ ይነሳል, ፒኑን ይፈትሻል, እና የሸምበቆው ማብሪያ እውቂያዎች ከተዘጉ, ከዚያም ሌላ ሊትር በቆጣሪው ውስጥ አልፏል እና ይሄ መደረግ አለበት.

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

        self._value_storage.write(self._value)

የሚቀጥለውን ሊትር ማቀነባበር ቀላል አይደለም - ቆጣሪው እየጨመረ ይሄዳል. መልካም, አዲስ እሴት ወደ ዩኤስቢ ፍላሽ አንፃፊ መፃፍ ጥሩ ይሆናል.

ለአጠቃቀም ቀላል "መዳረሻዎች" ቀርበዋል.

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

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

ደህና፣ አሁን የፒቶንን እና የኡአሲንክ ቤተመፃህፍትን ውበቶች እንጠቀም እና ቆጣሪው እንዲቆይ እናድርገው (እንዴት ወደ ሩሲያኛ መተርጎም እችላለሁ? የሚጠበቀው?)

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

        return self.value()

    __iter__ = __await__  

ይህ የቆጣሪው እሴቱ እስኪዘመን ድረስ የሚጠብቅ በጣም ምቹ ተግባር ነው - ተግባሩ ከጊዜ ወደ ጊዜ ከእንቅልፉ ሲነቃ እና የ_ዋጋ_የተቀየረውን ባንዲራ ያረጋግጣል። የዚህ ተግባር ብልሃት የጥሪ ኮድ ወደዚህ ተግባር በሚደወልበት ጊዜ ተኝቶ መተኛት እና አዲስ እሴት እስኪያገኝ ድረስ መተኛት ይችላል።

ግን ስለ መቆራረጥስ?አዎ፣ በዚህ ጊዜ እሱ ራሱ ስለ መቆራረጦች ተናግሯል በማለት እኔን መንከባከብ ትችላላችሁ፣ ነገር ግን በእውነቱ እሱ የሞኝ ፒን ምርጫ አዘጋጅቷል። በእውነቱ ማቋረጥ የሞከርኩት የመጀመሪያው ነገር ነው። በESP8266 ፊት ለፊት መቋረጥን ማደራጀት እና ለዚህ መቆራረጥ በፓይቶን እንኳን መፃፍ ይችላሉ። በዚህ ማቋረጥ፣ የተለዋዋጭ እሴትን ማዘመን ይችላሉ። ምናልባት, ቆጣሪው የባሪያ መሣሪያ ከሆነ ይህ በቂ ሊሆን ይችላል - ይህ ዋጋ እስኪጠየቅ ድረስ የሚጠብቅ.

እንደ አለመታደል ሆኖ (ወይን እንደ እድል ሆኖ?) የእኔ መሣሪያ ንቁ ነው ፣ እሱ ራሱ በMQTT ፕሮቶኮል በኩል መልዕክቶችን መላክ እና ውሂብ ወደ EEPROM መፃፍ አለበት። እና እዚህ ገደቦች ቀድሞውኑ ገብተዋል - በማቋረጥ ውስጥ ማህደረ ትውስታን መመደብ እና ትልቅ ቁልል መጠቀም አይችሉም ፣ ይህ ማለት በአውታረ መረቡ ላይ መልእክት ስለመላክ መርሳት ይችላሉ። እንደ micropython.schedule () አንድ ዓይነት ተግባርን “ወዲያውኑ እና ወዲያውኑ” እንዲያሄዱ የሚፈቅዱ ዳቦዎች አሉ፣ ነገር ግን ጥያቄው የሚነሳው “ጥቅሙ ምንድነው?” ነው። በድንገት፣ አሁን የሆነ አይነት መልእክት እየላክን ነው፣ እና ከዚያ ማቋረጥ ወደ ውስጥ ገብቶ የተለዋዋጮችን እሴቶች ያበላሻል። ወይም፣ ለምሳሌ፣ አሮጌውን ገና ሳንመዘግብ ሳለ አዲስ ቆጣሪ ዋጋ ከአገልጋዩ ደርሷል። በአጠቃላይ ማመሳሰልን ማገድ ወይም በሆነ መንገድ መውጣት ያስፈልግዎታል።

እና ከጊዜ ወደ ጊዜ Runtime ስህተት፡ ሙሉ ብልሽቶችን መርሐግብር ያስይዙ እና ለምን እንደሆነ ማን ያውቃል?

ግልጽ በሆነ የድምፅ አሰጣጥ እና uasync ፣ በዚህ ሁኔታ ፣ በሆነ መንገድ የበለጠ ቆንጆ እና የበለጠ አስተማማኝ ይሆናል።

ከ EEPROM ጋር በትንሽ ክፍል ውስጥ ሥራ ጀመርኩ

class EEPROM():
    i2c_addr = const(80)

    def __init__(self, i2c):
        self.i2c = i2c
        self.i2c_buf = bytearray(4) # Avoid creation/destruction of the buffer on each call


    def read(self, eeprom_addr):
        self.i2c.readfrom_mem_into(self.i2c_addr, eeprom_addr, self.i2c_buf, addrsize=16)
        return ustruct.unpack_from("<I", self.i2c_buf)[0]    
        
    
    def write(self, eeprom_addr, value):
        ustruct.pack_into("<I", self.i2c_buf, 0, value)
        self.i2c.writeto_mem(self.i2c_addr, eeprom_addr, self.i2c_buf, addrsize=16)

በፓይቶን ውስጥ በቀጥታ ከባይት ጋር ለመስራት አስቸጋሪ ነው, እና ወደ ማህደረ ትውስታ የተፃፈው ባይት ነው. የኡስትራክት ቤተ-መጽሐፍትን በመጠቀም ኢንቲጀር እና ባይት መካከል ያለውን ቅየራ ማጠር ነበረብኝ።

የI2C እቃውን እና የማስታወሻ ህዋሱን አድራሻ በያንዳንዱ ጊዜ ላለማስተላለፍ፣ ሁሉንም በትንሽ እና በሚመች ክላሲክ ጠቅልዬዋለሁ።

class EEPROMValue():
    def __init__(self, i2c, eeprom_addr):
        self._eeprom = EEPROM(i2c)
        self._eeprom_addr = eeprom_addr
        

    def read(self):
        return self._eeprom.read(self._eeprom_addr)


    def write(self, value):
        self._eeprom.write(self._eeprom_addr, value)

የ I2C ነገር ራሱ በእነዚህ መለኪያዎች ነው የተፈጠረው

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

በጣም አስደሳች የሆነውን እንቀርባለን - በ MQTT በኩል ከአገልጋዩ ጋር የግንኙነት ትግበራ። ደህና ፣ ፕሮቶኮሉን ራሱ መተግበር አያስፈልግዎትም - በይነመረብ ላይ አገኘሁት ዝግጁ-የተሰራ ያልተመሳሰለ ትግበራ. እዚህ እንጠቀማለን.

ሁሉም በጣም ሳቢ የሚሰበሰበው በ CounterMQTTClient ክፍል ውስጥ ነው፣ እሱም በቤተመፃህፍት MQTTClient ላይ የተመሰረተ። ከዳርቻው እንጀምር

#####################################
# Class handles both counters and sends their status to MQTT
#####################################
class CounterMQTTClient(MQTTClient):

    blue_led = Pin(2, Pin.OUT, value = 1)
    button = Pin(0, Pin.IN)

    hot_counter = Counter(12, EEPROMValue(i2c, EEPROM_ADDR_HOT_VALUE))
    cold_counter = Counter(13, EEPROMValue(i2c, EEPROM_ADDR_COLD_VALUE))

እዚህ, አምፖል እና የአዝራር ፒኖች ተፈጥረዋል እና የተዋቀሩ ናቸው, እንዲሁም ቀዝቃዛ እና ሙቅ ውሃ ቆጣሪ ነገሮች.

በመነሻነት, ሁሉም ነገር በጣም ቀላል አይደለም

    def __init__(self):
        self.internet_outage = True
        self.internet_outages = 0
        self.internet_outage_start = ticks_ms()

        with open("config.txt") as config_file:
            config['ssid'] = config_file.readline().rstrip()
            config['wifi_pw'] = config_file.readline().rstrip()
            config['server'] = config_file.readline().rstrip()
            config['client_id'] = config_file.readline().rstrip()
            self._mqtt_cold_water_theme = config_file.readline().rstrip()
            self._mqtt_hot_water_theme = config_file.readline().rstrip()
            self._mqtt_debug_water_theme = config_file.readline().rstrip()

        config['subs_cb'] = self.mqtt_msg_handler
        config['wifi_coro'] = self.wifi_connection_handler
        config['connect_coro'] = self.mqtt_connection_handler
        config['clean'] = False
        config['clean_init'] = False
        super().__init__(config)

        loop = asyncio.get_event_loop()
        loop.create_task(self._heartbeat())
        loop.create_task(self._counter_coro(self.cold_counter, self._mqtt_cold_water_theme))
        loop.create_task(self._counter_coro(self.hot_counter, self._mqtt_hot_water_theme))
        loop.create_task(self._display_coro())

የ mqtt_as ቤተ-መጽሐፍት መለኪያዎችን ለማዘጋጀት ፣ የተለያዩ መቼቶች ትልቅ መዝገበ-ቃላት ጥቅም ላይ ይውላሉ - config. አብዛኛዎቹ ነባሪ ቅንጅቶች ለእኛ ይሰራሉ፣ ግን ብዙ ቅንጅቶች በግልፅ መቀናበር አለባቸው። ቅንብሮቹን በቀጥታ በኮዱ ውስጥ ላለማዘዝ ፣ በጽሑፍ ፋይል config.txt ውስጥ አከማቸዋለሁ። ይሄ ምንም አይነት ቅንጅቶች ምንም ይሁን ምን ኮዱን እንዲቀይሩ ይፈቅድልዎታል, እንዲሁም በርካታ ተመሳሳይ መሳሪያዎችን ከተለያዩ መለኪያዎች ጋር ያሽከረክራሉ.

የመጨረሻው የማገጃ ኮድ የተለያዩ የስርዓት ተግባራትን ለማገልገል ብዙ ኮርቲኖችን ይጀምራል። ቆጣሪዎችን የሚያገለግል የኮሮቲን ምሳሌ እዚህ አለ።

    async def _counter_coro(self, counter, topic):
        # Publish initial value
        value = counter.value()
        await self.publish(topic, str(value))

        # Publish each new value
        while True:
            value = await counter
            await self.publish_msg(topic, str(value))

ኮርቲኑ አዲስ የቆጣሪ እሴትን ለማግኘት በአንድ ዙር ይጠብቃል እና ልክ እንደታየ በMQTT ፕሮቶኮል በኩል መልእክት ይልካል። የመጀመሪያው ኮድ በቆጣሪው ውስጥ የሚፈሰው ውሃ ባይኖርም የመጀመሪያውን እሴት ይልካል.

የመሠረት ክፍል MQTTClient እራሱን ያገለግላል, የ WiFi ግንኙነት ይጀምራል እና ግንኙነቱ ሲጠፋ እንደገና ይገናኛል. የዋይፋይ ግንኙነት ሁኔታ ሲቀየር ቤተ መፃህፍቱ ወደ wifi_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)

ተግባሩ በቅንነት ከምሳሌዎቹ ይልሳል። በዚህ አጋጣሚ፣ የመቋረጦች ብዛት (ኢንተርኔት_ውጣ) እና የቆይታ ጊዜያቸውን ይቆጥራል። ግንኙነቱ ወደነበረበት ሲመለስ የስራ ፈት ጊዜ ወደ አገልጋዩ ይላካል።

በነገራችን ላይ የመጨረሻው እንቅልፍ የሚያስፈልገው ተግባሩ የማይመሳሰል እንዲሆን ብቻ ነው - በቤተመፃህፍት ውስጥ በመጠባበቅ ይባላል, እና ሌላ የሚጠባበቅ አካል ውስጥ ያሉ ተግባራት ብቻ ሊጠሩ ይችላሉ.

ከዋይፋይ ጋር ከመገናኘት በተጨማሪ ከMQTT ደላላ (አገልጋይ) ጋር ግንኙነት መፍጠር አለቦት። ይህ በቤተመፃህፍትም ይከናወናል, እና ግንኙነቱ ሲፈጠር ጠቃሚ ነገር ለማድረግ እድሉን እናገኛለን

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

እዚህ ለብዙ መልእክቶች ተመዝግበናል - አገልጋዩ አሁን ተገቢውን መልእክት በመላክ የቆጣሪዎችን ዋጋ የማዘጋጀት ችሎታ አለው።

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

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

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

ይህ ተግባር ገቢ መልዕክቶችን ያስኬዳል፣ እና በርዕሱ (የመልእክት ስም) ላይ በመመስረት የአንዱ ቆጣሪዎቹ እሴቶች ተዘምነዋል።

ጥንድ ረዳት ተግባራት

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

ግንኙነቱ ከተመሰረተ ይህ ተግባር መልእክት የመላክ ሃላፊነት አለበት። ምንም ግንኙነት ከሌለ, መልእክቱ ችላ ይባላል.

እና ይሄ የማረም መልዕክቶችን የሚያመነጭ እና የሚልክ ምቹ ተግባር ብቻ ነው።

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

በጣም ብዙ ጽሑፍ እና እስካሁን LED ን ብልጭ ድርግም አላደረግነውም። እዚህ

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

ብልጭ ድርግም የሚል 2 ሁነታዎችን ሰጥቻለሁ። ግንኙነቱ ከጠፋ (ወይም ገና እየተቋቋመ ነው) ፣ ከዚያ መሣሪያው በፍጥነት ብልጭ ድርግም ይላል። ግንኙነቱ ከተፈጠረ መሣሪያው በየ 5 ሰከንድ ብልጭ ድርግም ይላል. አስፈላጊ ከሆነ, ሌሎች የብልጭታ ዘዴዎች እዚህ ሊተገበሩ ይችላሉ.

ነገር ግን ኤልኢዲው በጣም, ተንከባካቢ ነው. ማሳያው ላይም ተወዛወዝን።

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

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

እያወራሁ የነበረው ይህ ነው - ከኮሮቲን ጋር ምን ያህል ቀላል እና ምቹ ነው። ይህ ትንሽ ተግባር ሁሉንም የተጠቃሚ መስተጋብር ይገልጻል። ኮሩቲን አዝራሩን እስኪጫን ብቻ ይጠብቃል እና ማሳያውን ለ3 ሰከንድ ያበራል። ማሳያው የአሁኑን ሜትር ንባቦችን ያሳያል.

አሁንም ጥቂት ጥቂት ነገሮች ይቀራሉ። ይህንን አጠቃላይ ኢኮኖሚ (እንደገና) የሚጀምረው ተግባር እዚህ አለ። ዋናው ምልልስ የሚያሳስበው በደቂቃ አንድ ጊዜ የተለያዩ የማረሚያ መረጃዎችን ለመላክ ብቻ ነው። በአጠቃላይ ፣ እኔ እንደዛው እሰጣለሁ - እኔ እንደማስበው በተለይ አስተያየት መስጠት አያስፈልገኝም።

   async def main(self):
        while True:
            try:
                await self._connect_to_WiFi()
                await self._run_main_loop()
                    
            except Exception as e:
                self.dprint('Global communication failure: ', e)
                await asyncio.sleep(20)

    async def _connect_to_WiFi(self):
        self.dprint('Connecting to WiFi and MQTT')
        sta_if = network.WLAN(network.STA_IF)
        sta_if.connect(config['ssid'], config['wifi_pw'])
        
        conn = False
        while not conn:
            await self.connect()
            conn = True

        self.dprint('Connected!')
        self.internet_outage = False

    async def _run_main_loop(self):
        # Loop forever
        mins = 0
        while True:
            gc.collect()  # For RAM stats.
            mem_free = gc.mem_free()
            mem_alloc = gc.mem_alloc()

            try:
                await self.publish_debug_msg("Uptime", mins)
                await self.publish_debug_msg("Repubs", self.REPUB_COUNT)
                await self.publish_debug_msg("Outages", self.internet_outages)
                await self.publish_debug_msg("MemFree", mem_free)
                await self.publish_debug_msg("MemAlloc", mem_alloc)
            except Exception as e:
                self.dprint("Exception occurred: ", e)
            mins += 1

            await asyncio.sleep(60)

ደህና፣ ለመግለጫው ሙሉነት ሁለት ተጨማሪ ቅንብሮች እና ቋሚዎች

#####################################
# Constants and configuration
#####################################


config['keepalive'] = 60
config['clean'] = False
config['will'] = ('/ESP/Wemos/Water/LastWill', 'Goodbye cruel world!', False, 0)

MQTTClient.DEBUG = True

EEPROM_ADDR_HOT_VALUE = const(0)
EEPROM_ADDR_COLD_VALUE = const(4)

ሁሉም የሚጀምረው እንደዚህ ነው።

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

በትዝታዬ ላይ የሆነ ነገር ተፈጠረ

ስለዚህ, ሁሉም ኮድ እዚያ አለ. ፋይሎቹን በ ampy utility በመጠቀም ሰቅያለው - ወደ ውስጣዊው (በ ESP-07 በራሱ ውስጥ ያለው) ፍላሽ አንፃፊ እንዲሰቅሉ ይፈቅድልዎታል እና ከዚያ እንደ መደበኛ ፋይሎች ከፕሮግራሙ ያገኙታል። እዚያም እኔ የተጠቀምኳቸውን mqtt_as፣ uasyncio፣ ssd1306 እና የስብስብ ቤተ-መጻሕፍት ሰቅያለሁ (በ mqtt_as ውስጥ ጥቅም ላይ ይውላል)።

እንጀምራለን እና ... MemoryError እንቀበላለን. ከዚህም በላይ ማህደረ ትውስታው የት እንደሚፈስ በትክክል ለመረዳት በሞከርኩ ቁጥር ህትመቶችን ባረምኩ ቁጥር ይህ ስህተት ቀደም ብሎ ተከስቷል. አንድ አጭር ጎግል በማይክሮ መቆጣጠሪያ ውስጥ በመርህ ደረጃ 30 ኪባ ኮድ (ከላይብረሪዎች ጋር) በምንም መልኩ የማይመጥኑበት 65 ኪ.ባ ማህደረ ትውስታ ብቻ እንዳለ እንድረዳ አድርጎኛል።

ግን መውጫ መንገድ አለ. ማይክሮፒቶን ኮድን በቀጥታ ከ.py ፋይል አይሰራም - ይህ ፋይል መጀመሪያ የተጠናቀረ ነው። ከዚህም በላይ በማይክሮ መቆጣጠሪያው ላይ በቀጥታ ይሰበሰባል, ወደ ባይትኮድ ይለወጣል, ከዚያም በማስታወሻ ውስጥ ይከማቻል. ደህና፣ አቀናባሪው ለመስራት የተወሰነ መጠን ያለው RAMም ያስፈልገዋል።

ዘዴው ማይክሮ መቆጣጠሪያውን ከንብረት-ተኮር ስብስብ ማዳን ነው. በአንድ ትልቅ ኮምፒውተር ላይ ፋይሎችን ማሰባሰብ እና ዝግጁ የሆነ ባይት ኮድ ወደ ማይክሮ መቆጣጠሪያው መጫን ትችላለህ። ይህንን ለማድረግ ማይክሮፒቶን firmware ን ማውረድ እና መገንባት ያስፈልግዎታል mpy-መስቀል መገልገያ.

ማክፋይል አልጻፍኩም ፣ ግን እጄን አልፌ ሁሉንም አስፈላጊ ፋይሎች (ቤተ-መጽሐፍትን ጨምሮ) እንደዚህ አይነት አዘጋጅቼ ነበር ።

mpy-cross water_counter.py

መጀመሪያ ተዛማጅ .py ፋይሎችን ከመሣሪያው የፋይል ስርዓት ማስወገድን በማስታወስ ፋይሎችን በ .mpy ቅጥያ ለመሙላት ብቻ ይቀራል።

በፕሮግራሙ (IDE?) ESPlorer ውስጥ ያሉትን ሁሉንም እድገቶች አደረግሁ. ስክሪፕቶችን ወደ ማይክሮ መቆጣጠሪያው እንዲሰቅሉ እና ወዲያውኑ እንዲፈጽሙ ይፈቅድልዎታል. በእኔ ሁኔታ, ሁሉም አመክንዮዎች እና ሁሉም ነገሮች መፈጠር በውሃ_ቆጣሪ.py (.mpy) ፋይል ውስጥ ይገኛሉ. ነገር ግን ይህ ሁሉ በጅምር ላይ በራስ-ሰር እንዲጀምር፣ እንዲሁም main.py የሚባል ፋይል መኖር አለበት። በተጨማሪም፣ በትክክል .py መሆን አለበት፣ እና አስቀድሞ ያልተጠናቀረ .mpy መሆን አለበት። እዚህ ላይ ትንሽ ይዘቱ ነው።

import water_counter

እንጀምራለን - ሁሉም ነገር ይሰራል. ነገር ግን ነፃ ማህደረ ትውስታ በአስጊ ሁኔታ ትንሽ ነው - ወደ 1 ኪ.ባ. አሁንም የመሳሪያውን ተግባራዊነት ለማስፋት እቅድ አለኝ, እና ይህ ኪሎባይት ለእኔ በቂ አይሆንም. ግን መውጫ መንገድ እንዳለ ታወቀ።

ቁም ነገሩ ይህ ነው። ምንም እንኳን ፋይሎቹ በባይቴኮድ የተጠናቀሩ እና በውስጣዊው የፋይል ስርዓት ውስጥ ቢኖሩም, በእውነቱ ወደ ራም ተጭነዋል እና ለማንኛውም ከዚያ ይገደላሉ. ግን ማይክሮፓይቶን ባይትኮድ በቀጥታ ከፍላሽ ማህደረ ትውስታ ሊሰራ ይችላል ፣ ግን ለዚህ በቀጥታ ወደ firmware ውስጥ መገንባት ያስፈልግዎታል። ምንም እንኳን በኔትቡክ ላይ ጥሩ ጊዜ ቢወስድም (በዚያ ብቻ ሊኑክስ ነበረኝ) ከባድ አይደለም።

ስልተ ቀመር እንደሚከተለው ነው

  • አውርድና ጫን ESP ክፈት ኤስዲኬ. ይህ ነገር በESP8266 ሾር ላሉ ፕሮግራሞች አጠናቃሪ እና ቤተመጻሕፍት ይገነባል። በፕሮጀክቱ ዋና ገጽ ላይ ባለው መመሪያ መሰረት ተሰብስቧል (የ STANDALONE = አዎ መቼቱን መርጫለሁ)
  • አውርድ የማይክሮፒቶን ዓይነቶች
  • አስፈላጊዎቹን ቤተ-መጻሕፍት በማይክሮፒቶን ዛፍ ውስጥ ወደቦች/esp8266/ሞጁሎች ይጣሉ
  • በፋይሉ ውስጥ ባለው መመሪያ መሰረት firmware እንሰበስባለን ports/esp8266/README.md
  • ፈርሙን ወደ ማይክሮ መቆጣጠሪያው ስቀል (የ ESP8266Flasher ፕሮግራሞችን ወይም Python's esptoolን በመጠቀም በዊንዶውስ ላይ አደርገዋለሁ)

ሁሉም ነገር ፣ አሁን 'ssd1306 አስመጣ' ኮዱን በቀጥታ ከ firmware ከፍ ያደርገዋል እና RAM ለዚህ አይውልም። በዚህ ብልሃት ፣ የላይብረሪውን ኮድ ብቻ ወደ firmware ሰቅያለሁ ፣ ዋናው የፕሮግራም ኮድ ከፋይል ስርዓቱ ላይ ሲተገበር። ይህ firmware ን እንደገና ሳያጠናቅቅ ፕሮግራሙን ለመቀየር ቀላል ያደርገዋል። በአሁኑ ጊዜ 8.5kb ያህል ራም በነፃ አለኝ። ይህ ለወደፊቱ በጣም ብዙ የተለያዩ ጠቃሚ ተግባራትን ተግባራዊ ለማድረግ ያስችለናል. ደህና ፣ በቂ ማህደረ ትውስታ ከሌለ ፣ ከዚያ ዋናውን ፕሮግራም ወደ firmware መጫን ይችላሉ።

እና አሁን ምን ይደረግ?

እሺ፣ የብረቱ ቁራጭ ተሽጧል፣ ፈርምዌር ተጽፏል፣ ሳጥኑ ታትሟል፣ መሳሪያው ግድግዳው ላይ ተጣብቋል እና ብርሃኑ በደስታ ብልጭ ድርግም ይላል። ግን እስካሁን ድረስ ይህ ሁሉ ጥቁር ሳጥን ነው (በትክክል እና በምሳሌያዊ አነጋገር) እና ከሱ አሁንም ትንሽ ስሜት የለም. ወደ አገልጋዩ በሚላኩ የMQTT መልእክቶች አንድ ነገር ለማድረግ ጊዜው አሁን ነው።

የእኔ "ስማርት ቤት" እየተሽከረከረ ነው። የሜጀርዶሞ ስርዓት. የMQTT ሞጁል ከሳጥኑ ውጭ ነው ወይም በቀላሉ ከተጨማሪው ገበያ ተጭኗል - ከየት እንደመጣ አላስታውስም። MQTT ራሱን የቻለ ነገር አይደለም - የሚባል ነገር ያስፈልግዎታል። ደላላ - መልእክቶችን የሚቀበል፣ የሚለይ እና ወደ MQTT ደንበኞች የሚያስተላልፍ አገልጋይ። እኔ (እንደ ሜጀርዶሞ) በተመሳሳይ ኔትቡክ የሚሰራውን ትንኝ እጠቀማለሁ።

መሣሪያው ቢያንስ አንድ ጊዜ መልእክት ከላከ በኋላ ዋጋው ወዲያውኑ በዝርዝሩ ውስጥ ይታያል.

የውሃ ቆጣሪውን ወደ ዘመናዊው ቤት እናገናኘዋለን

እነዚህ እሴቶች አሁን ከስርዓት ነገሮች ጋር ሊጣመሩ ይችላሉ, በአውቶሜሽን ስክሪፕቶች ውስጥ ጥቅም ላይ ሊውሉ እና ለተለያዩ ትንታኔዎች ሊደረጉ ይችላሉ - ይህ ሁሉ ከዚህ ጽሑፍ ወሰን ውጭ ነው. የ majordomo ሥርዓት ፍላጎት ያለው ማን ነው, እኔ እንመክራለን ይችላሉ የሰርጥ ኤሌክትሮኒክስ በሌንስ - ጓደኛም ብልጥ ቤት እየገነባ ነው እና ስርዓቱን ስለማዋቀር በጥበብ ይናገራል።

ሁለት ግራፎችን ብቻ አሳይሃለሁ። ይህ በቀን ቀላል የእሴቶች ግራፍ ነው።

የውሃ ቆጣሪውን ወደ ዘመናዊው ቤት እናገናኘዋለን
በሌሊት ማንም ሰው ማለት ይቻላል ውሃውን እንዳልተጠቀመ ማየት ይቻላል. ሁለት ጊዜ አንድ ሰው ወደ መጸዳጃ ቤት ሄደ፣ እና የተገላቢጦሽ ኦስሞሲስ ማጣሪያ በአንድ ሌሊት ሁለት ሊትር የሚጠባ ይመስላል። ጠዋት ላይ ፍጆታ በከፍተኛ ሁኔታ ይጨምራል. አብዛኛውን ጊዜ ውሃ ከማሞቂያው ውስጥ እጠቀማለሁ, ነገር ግን ገላ መታጠብ ፈልጌ ነበር እና ለጊዜው ወደ ከተማ ሙቅ ውሃ ቀይሬ - ይህ ደግሞ በታችኛው ግራፍ ላይ በግልጽ ይታያል.

ከዚህ ቻርት ላይ ወደ መጸዳጃ ቤት መሄድ ከ6-7 ሊትር ውሃ፣ ሻወር መውሰድ ከ20-30 ሊትር፣ እቃ ማጠብ 20 ሊትር እንደሆነ እና ገላ መታጠብ 160 ሊትር እንደሚያስፈልግ ተረድቻለሁ። በቀን ውስጥ, ቤተሰቤ ከ 500-600 ሊትር አካባቢ ይበላል.

በተለይ የማወቅ ጉጉት ላላቸው፣ ለእያንዳንዱ የግል እሴት መዝገቦችን መመልከት ይችላሉ።

የውሃ ቆጣሪውን ወደ ዘመናዊው ቤት እናገናኘዋለን

ከዚህ በመነሳት የቧንቧው ክፍት በሚሆንበት ጊዜ ውሃ በ 1 ሰከንድ ውስጥ በ 5 ሊትር አካባቢ እንደሚፈስ ተረዳሁ.

ነገር ግን በዚህ ቅፅ, ስታቲስቲክስ ምናልባት ለመመልከት በጣም አመቺ ላይሆን ይችላል. majordomo የፍጆታ ገበታዎችን በቀን፣ በሳምንት እና በወር የማየት ችሎታ አለው። እዚህ, ለምሳሌ, በአምዶች ውስጥ የፍጆታ ግራፍ ነው

የውሃ ቆጣሪውን ወደ ዘመናዊው ቤት እናገናኘዋለን

እስካሁን አንድ ሳምንት ብቻ መረጃ አለኝ። በአንድ ወር ውስጥ, ይህ ግራፍ የበለጠ ገላጭ ይሆናል - የተለየ አምድ ከእያንዳንዱ ቀን ጋር ይዛመዳል. ስዕሉ በእጅ በሚያስገቡት የእሴቶች ማስተካከያ (ትልቁ አምድ) ትንሽ ተበላሽቷል። እና የመጀመሪያዎቹን ዋጋዎች በአንድ ኪዩብ ያነሰ በትክክል እንዳስቀመጥኩ ወይም ይህ በ firmware ውስጥ ስህተት እንደሆነ እና ሁሉም ሊትሮች ከግምት ውስጥ እንዳልገቡ እስካሁን ግልፅ አይደለም። ተጨማሪ ጊዜ ይፈልጋሉ።

ከግራፎቹ እራሳቸው በላይ, አሁንም ማደብዘዝ, ነጭ ማድረግ, መቀባት ያስፈልግዎታል. ምናልባት ለማረም ዓላማዎች የማህደረ ትውስታ ፍጆታ ግራፍ እገነባለሁ - በድንገት የሆነ ነገር እዚያ እየፈሰሰ ነው። ምናልባት ኢንተርኔት ያልነበረባቸውን ወቅቶች እንደምንም አሳይሻለሁ። ይህ ሁሉ በሃሳቡ ደረጃ እየተሽከረከረ ነው።

መደምደሚያ

ዛሬ አፓርታማዬ ትንሽ ብልህ ሆኗል. በእንደዚህ አይነት ትንሽ መሳሪያ, በቤት ውስጥ ያለውን የውሃ ፍጆታ ለመከታተል የበለጠ አመቺ ይሆናል. ቀደም ሲል ተናድጄ ከሆነ “በአንድ ወር ውስጥ እንደገና ብዙ ውሃ ተበላ” ፣ አሁን የዚህን ፍጆታ ምንጭ ማግኘት እችላለሁ።

ከራሱ ሜትር ርቀት ላይ ከሆነ አንድ ሰው በስክሪኑ ላይ ያለውን ንባብ መመልከት እንግዳ ይመስላል። ነገር ግን ብዙም ሩቅ ባልሆነ ጊዜ ውስጥ ወደ ሌላ አፓርታማ ለመሄድ እቅድ አለኝ, እዚያም ብዙ የውሃ መወጣጫዎች ይኖራሉ, እና ሜትሮቹ እራሳቸው, ምናልባትም, በማረፊያው ላይ ይገኛሉ. ስለዚህ የርቀት ንባብ መሣሪያ በጣም ምቹ ይሆናል.

እንዲሁም የመሳሪያውን ተግባር ለማስፋት እቅድ አለኝ. ቀድሞውኑ የሞተር ቫልቮች እየተመለከትኩ ነው። አሁን፣ የቦይለር ከተማውን ውሃ ለመቀየር፣ ለመድረስ አስቸጋሪ በሆነ ቦታ ውስጥ 3 ቧንቧዎችን መታጠፍ አለብኝ። ተጓዳኝ አመልካች ባለው አንድ አዝራር ይህን ለማድረግ የበለጠ አመቺ ይሆናል. ደህና ፣ በእርግጥ ፣ ከመጥፋት መከላከልን መተግበር ተገቢ ነው።

በጽሁፉ ውስጥ, በ ESP8266 ላይ በመመስረት የመሳሪያውን ስሪት ነግሬው ነበር. በእኔ አስተያየት, coroutines በመጠቀም የማይክሮፒቶን firmware በጣም አስደሳች ስሪት አገኘሁ - ቀላል እና ቆንጆ። በዘመቻው ወቅት ያጋጠሙኝን ብዙ ድንቆችን እና ጃምቦችን ለመግለጽ ሞከርኩ። ምናልባት ሁሉንም ነገር በዝርዝር ገልጬዋለሁ፣ ለኔ በግሌ እንደ አንባቢ፣ በኋላ ላይ ያልተነገረውን ከማሰብ ይልቅ ትርፉን ማባከን ይቀላል።

እንደ ሁሌም ለገንቢ ትችት ክፍት ነኝ።

ምንጭ ኮድ
መርሐግብር እና ሰሌዳ
የጉዳይ ሞዴል

ምንጭ: hab.com

በDDoS ጥበቃ፣ VPS VDS አገልጋዮች ለጣቢያዎች አስተማማኝ ማስተናገጃ ይግዙ 🔥 አስተማማኝ የድር ጣቢያ ማስተናገጃ በዲዶኤስ ጥበቃ፣ በቪፒኤስ ቪዲኤስ አገልጋዮች ይግዙ | ProHoster