Բովանդակություն:

Cat Food Access Access Control (ESP8266 + Servo Motor + 3D Printing) ՝ 5 քայլ (նկարներով)
Cat Food Access Access Control (ESP8266 + Servo Motor + 3D Printing) ՝ 5 քայլ (նկարներով)

Video: Cat Food Access Access Control (ESP8266 + Servo Motor + 3D Printing) ՝ 5 քայլ (նկարներով)

Video: Cat Food Access Access Control (ESP8266 + Servo Motor + 3D Printing) ՝ 5 քայլ (նկարներով)
Video: Cat Food Bowl Access Control with ESP8266 // Becky Stern 2024, Նոյեմբեր
Anonim
Image
Image
Cat Food Access Access Control (ESP8266 + Servo Motor + 3D Printing)
Cat Food Access Access Control (ESP8266 + Servo Motor + 3D Printing)

Այս նախագիծն անցնում է այն գործընթացով, որով ես զբաղվում էի կատուների սննդի ավտոմատ ամանի ստեղծմամբ ՝ իմ տարեց շաքարախտով հիվանդ Չազ կատվի համար: Տեսեք, նա պետք է նախաճաշի նախքան ինսուլինը ստանալը, բայց ես հաճախ մոռանում եմ քնելուց առաջ վերցնել նրա ուտեստը, ինչը փչացնում է նրա ախորժակը և գցում է ինսուլինի ժամանակացույցը: Այս ուտեստը օգտագործում է սերվո շարժիչ `սննդի կափարիչը փակելու կեսգիշերից մինչև առավոտյան 7:30: NodeMCU ESP8266 միկրոկառավարիչի Arduino էսքիզը օգտագործում է Network Time Protocol (NTP) ՝ ժամանակացույցը վերահսկելու համար:

Այս նախագիծը կարող է հարմար չլինել երիտասարդ, ավելի ակտիվ կատուների համար: Չազն այնքան ծեր է և տկար, նա հակված չէ փորձել գավաթը բացել, բայց դա հնարավոր է:

Եթե դուք նորեկ եք Arduino- ում կամ ESP8266- ում, կարող եք օգտվել հետևյալ նախադրյալ ուղեցույցներից.

  • Հրահանգներ Arduino դաս
  • Instructables իրերի ինտերնետ դաս

Պարագաներ

  • 3D տպիչ (ես օգտագործում եմ Creality CR-10s Pro)
  • 3D տպիչի թել (ես օգտագործում եմ ոսկե PLA)
  • NodeMCU ESP8266 wifi միկրոկոնտրոլեր
  • USB մալուխ (A- ից microB)
  • USB հոսանքի ադապտեր
  • Միկրո servo շարժիչ
  • Փոքր պտուտակահան և պտուտակներ
  • Միացման մետաղալար
  • Վերնագրի կապում
  • Պերմա-նախատախտակ

Աշխատանքին հետևելու համար հետևեք ինձ YouTube- ում, Instagram- ում, Twitter- ում, Pinterest- ում և բաժանորդագրվեք իմ տեղեկագրին: Որպես Amazon Associate ես վաստակում եմ որակյալ գնումներից, որոնք դուք կատարում եք ՝ օգտագործելով իմ փոխկապակցված հղումները:

Քայլ 1: 3D տպագիր մասեր

3D տպագիր մասեր
3D տպագիր մասեր
3D տպագիր մասեր
3D տպագիր մասեր

Կատուների սննդի ամանի կրողը հիմնված է Արդի Լայի նախագծի վրա Thingiverse- ում: Ես այն ավելի մեծ դարձրեցի ՝ տեղավորելով իմ կատվի ամանը, և նաև այն ավելի կարճ դարձրեցի, քանի որ այն մեծացնելով այն չափազանց բարձր էր դարձրել: Ես ավելացրեցի միկրո սերվո շարժիչի պահարան և մի քանի անցք մալուխների համար դեպի ներս:

Ես մոդելավորեցի մի պարզ կափարիչ ՝ օգտագործելով Tinkercad- ը, որը նախատեսված է միկրո սերվոյի եղջյուրին ամրացնելու համար: Դուք կարող եք վերցնել իմ դիզայնը անմիջապես Tinkercad- ից և/կամ ներբեռնել այս քայլին կից STL- ները:

Ես տպագրեցի մասերը իմ Creality CR-10s Pro տպիչի վրա ՝ ոսկե PLA թելերով:

Բացահայտում. Այս գրառման պահին ես Autodesk- ի աշխատակից եմ, որը արտադրում է Tinkercad- ը:

Քայլ 2: Կցեք կափարիչը Servo Motor- ին

Կցեք կափարիչը Servo Motor- ին
Կցեք կափարիչը Servo Motor- ին
Կցեք կափարիչը Servo Motor- ին
Կցեք կափարիչը Servo Motor- ին

Ես փոքր հորատիչ օգտագործեցի սերվոյի եղջյուրի անցքերի չափը մեծացնելու համար, այնուհետև պտուտակներ օգտագործեցի սերվոն եռաչափ տպված կափարիչին ամրացնելու համար:

Քայլ 3. Կառուցեք NodeMCU ESP8266 միացում

Կառուցեք NodeMCU ESP8266 միացում
Կառուցեք NodeMCU ESP8266 միացում
Կառուցեք NodeMCU ESP8266 միացում
Կառուցեք NodeMCU ESP8266 միացում
Կառուցեք NodeMCU ESP8266 միացում
Կառուցեք NodeMCU ESP8266 միացում
Կառուցեք NodeMCU ESP8266 միացում
Կառուցեք NodeMCU ESP8266 միացում

Շղթան վերահսկվում է NodeMCU ESP8266 wifi միկրոկոնտրոլերի կողմից: Ես օգտագործել եմ վերնագրի կապում մշտական պրոտո տախտակի վրա, որպեսզի միկրո servo շարժիչը հեշտությամբ անջատելի լինի: Servo վերնագրերը միացված են NodeMCU- ին հետևյալ կերպ.

Դեղին servo մետաղալար `NodeMCU D1

Կարմիր սերվո լար `NodeMCU հզորություն (3V3 կամ VIN)

Սև servo մետաղալար ՝ NodeMCU հող (GND)

Քայլ 4: Վերբեռնեք Arduino ծածկագիրը և փորձարկումը

Վերբեռնեք Arduino ծածկագիրը և փորձարկումը
Վերբեռնեք Arduino ծածկագիրը և փորձարկումը

Տեղադրեք ձեր շարժիչի/կափարիչի հավաքածուն եռաչափ տպված մասի վրա, շարժիչի տեսքով կտրվածքի մեջ: Միացրեք շարժիչի վերնագիրը միկրոկառավարիչի տախտակի վերնագրի կապում և միացրեք համակարգիչը ձեր համակարգչին USB մալուխով:

Arduino- ի էսքիզը օգտագործում է Network Time Protocol- ը `ընթացիկ ժամանակը բերելու համար, այնուհետև բացում կամ փակում է կափարիչը` կոշտ ծածկագրված ժամանակացույցի համաձայն: Պատճենեք հետևյալ ծածկագիրը, թարմացրեք ձեր Wi -Fi հավատարմագրերը և UTC ժամանակի անջատումը և տեղադրեք այն ձեր NodeMCU տախտակին ՝ օգտագործելով Arduino IDE- ն:

#ներառում

#ներառել #ներառել #ներառել ESP8266WiFiMulti wifiMulti; // Ստեղծեք ESP8266WiFiMulti դասի օրինակ ՝ «wifiMulti» WiFiUDP UDP; // Ստեղծեք WiFiUDP դասի օրինակ ՝ IPAddress timeServerIP ուղարկելու և ստանալու համար; // time.nist.gov NTP սերվերի հասցեն const char* NTPServerName = "time.nist.gov"; const int NTP_PACKET_SIZE = 48; // NTP ժամանակային կնիքը գտնվում է հաղորդագրության առաջին 48 բայթում NTPBuffer [NTP_PACKET_SIZE]; // բուֆեր `մուտքային և ելքային փաթեթներ պահելու համար Servo myservo; // ստեղծել servo օբյեկտ `servo- ն վերահսկելու համար // տասներկու servo օբյեկտ կարող է ստեղծվել տախտակների մեծ մասում int pos = 0; // փոփոխական, որպեսզի պահպանվի servo position void setup () {myservo.attach (5); // ամրացնում է servo 5 -րդ կապի Dka a1- ն servo օբյեկտին // լռելյայն բացել կափարիչը Serial.println («կափարիչը բացելը»); for (pos = 95; pos> = 0; pos -= 1) {// անցնում է 95 աստիճանից մինչև 0 աստիճան myservo.write (pos); // սերվոյին ասա, որ անցնի «pos» փոփոխականի հետաձգման դիրքը (15); // սպասում է 15 ms, մինչև servo- ն հասնի դիրքի} Serial.begin (115200); // Սկսեք սերիական հաղորդակցությունը `համակարգչին ուշացումով հաղորդագրություններ ուղարկելու համար (10); Serial.println ("\ r / n"); startWiFi (); // Փորձեք միանալ որոշ տրված մուտքի կետերին: Այնուհետեւ սպասեք միացման startUDP (); եթե (! WiFi.hostByName (NTPServerName, timeServerIP)) {// Ստացեք NTP սերվերի IP հասցեն Serial.println ("DNS որոնումը ձախողվեց: Վերագործարկում"); Serial.flush (); ESP.reset (); } Serial.print ("serverամանակի սերվերի IP: / t"); Serial.println (timeServerIP); Serial.println ("\ r / n Ուղարկվում է NTP հարցում …"); sendNTPpacket (timeServerIP); } անստորագիր երկար ընդմիջում NTP = 60000; // Պահանջել NTP ժամանակ ամեն րոպե չստորագրված երկար prevNTP = 0; անստորագիր երկար վերջին NTPResponse = millis (); uint32_t ժամանակ UNIX = 0; անստորագիր երկար prevActualTime = 0; void loop () {unsigned long currentMillis = millis (); if (currentMillis - prevNTP> intervalNTP) {// Եթե մեկ րոպե է անցել NTP- ի վերջին խնդրանքից prevNTP = currentMillis; Serial.println ("\ r / n Ուղարկվում է NTP հարցում …"); sendNTPpacket (timeServerIP); // Ուղարկեք NTP հարցում} uint32_t time = getTime (); // Ստուգեք, արդյոք NTP արձագանքը ժամանել է և ստացեք (UNIX) ժամը, եթե (ժամանակ) {// Եթե նոր ժամադրոշմ է ստացվել ժամանակը UNIX = ժամանակը; Serial.print ("NTP պատասխան. / T"); Serial.println (timeUNIX); lastNTPResponse = ընթացիկ Միլիս; } else if ((currentMillis - lastNTPResponse)> 3600000) {Serial.println ("Վերջին NTP արձագանքից ավելի քան 1 ժամ. վերագործարկում"); Serial.flush (); ESP.reset (); } uint32_t actualTime = timeUNIX + (currentMillis - lastNTPResponse)/1000; uint32_t EasternTime = ժամանակ UNIX - 18000 + (ընթացիկ Միլիս - վերջին NTPResponse)/1000; եթե (actualTime! = prevActualTime && timeUNIX! = 0) {// Եթե վերջին տպագրությունից մեկ վայրկյան է անցել prevActualTime = actualTime; Serial.printf ("\ rUTC ժամանակը: / t%d:%d:%d", getHours (actualTime), getMinutes (actualTime), getSeconds (actualTime)); Serial.printf ("\ rEST (-5): / t%d:%d:%d", getHours (eastTime), getMinutes (eastTime), getSeconds (EasternTime)); Serial.println (); } // առավոտյան 7:30, եթե (getHours (eastTime) == 7 && getMinutes (eastTime) == 30 && getSeconds (eastTime) == 0) {// բացել կափարիչը Serial.println («կափարիչի բացում»); for (pos = 95; pos> = 0; pos -= 1) {// անցնում է 95 աստիճանից մինչև 0 աստիճան myservo.write (pos); // սերվոյին ասա, որ անցնի «pos» փոփոխականի հետաձգման դիրքը (15); // սպասում է 15 ms սերվոյին պաշտոնին հասնելու համար}} // կեսգիշեր, եթե (getHours (eastTime) == 0 && getMinutes (eastTime) == 0 && getSeconds (eastTime) == 0) {// փակեք կափարիչը Serial. println («կափարիչը փակելը»); համար (pos = 0; pos <= 95; pos += 1) {// անցնում է 0 աստիճանից մինչև 95 աստիճան // 1 աստիճանի քայլերով myservo.write (pos); // սերվոյին ասա, որ անցնի «pos» փոփոխականի հետաձգման դիրքը (15); // սպասում է 15 ms սերվոյին դիրքի հասնելու համար}} /* // փորձարկում, եթե (getHours (eastTime) == 12 && getMinutes (eastTime) == 45 && getSeconds (eastTime) == 0) {// փակեք կափարիչը Serial.println («կափարիչը փակելը»); համար (pos = 0; pos = 0; pos -= 1) {// անցնում է 95 աստիճանից մինչև 0 աստիճան myservo.write (pos); // սերվոյին ասա, որ անցնի «pos» փոփոխականի հետաձգման դիրքը (15); // սպասում է 15 ms, մինչև servo- ն հասնի դիրքի}} */} void startWiFi () {// Փորձեք միանալ տվյալ մուտքի կետերին: Հետո սպասեք wifiMulti.addAP կապին («ssid_from_AP_1», «your_password_for_AP_1»); // ավելացնել Wi-Fi ցանցեր, որոնց ցանկանում եք միանալ //wifiMulti.addAP("ssid_from_AP_2 "," your_password_for_AP_2 "); //wifiMulti.addAP("ssid_from_AP_3 "," your_password_for_AP_3 "); Serial.println («Միացում»); while (wifiMulti.run ()! = WL_CONNECTED) {// Սպասեք Wi-Fi- ի միացման հետաձգմանը (250); Serial.print ('.'); } Serial.println ("\ r / n"); Serial.print («Միացված է»); Serial.println (WiFi. SSID ()); // Ասացեք մեզ, թե որ ցանցին ենք միացած Serial.print ("IP հասցե: / t"); Serial.print (WiFi.localIP ()); // Ուղարկեք ESP8266- ի IP հասցեն համակարգչին Serial.println ("\ r / n"); } void startUDP () {Serial.println («Մեկնարկող UDP»); UDP.begin (123); // Սկսեք լսել UDP հաղորդագրությունները 123 նավահանգստում Serial.print ("Տեղական նավահանգիստ: / t"); Serial.println (UDP.localPort ()); Serial.println (); } uint32_t getTime () {if (UDP.parsePacket () == 0) {// Եթե պատասխան չկա (դեռ) վերադարձնել 0; } UDP.read (NTPBuffer, NTP_PACKET_SIZE); // կարդալ փաթեթը բուֆերի մեջ // Համատեղել 4 ժամաչափի բայթը մեկ 32 բիթանոց համարի մեջ uint32_t NTPTime = (NTPBuffer [40] << 24) | (NTPBuffer [41] << 16) | (NTPBuffer [42] << 8) | NTPBuffer [43]; // Փոխարկեք NTP ժամանակը UNIX- ի ժամանակացույցի: // Unix- ի ժամանակը սկսվում է 1970 թ. Հունվարի 1 -ից: Դա NTP ժամանակում կազմում է 2208988800 վայրկյան. Const uint32_t յոթանասուն տարի = 2208988800UL; // հանել յոթանասուն տարի. uint32_t UNIXTime = NTPTime - յոթանասուն տարի; վերադարձ UNIXTime; } void sendNTPpacket (IPAddress & address) {memset (NTPBuffer, 0, NTP_PACKET_SIZE); // բուֆերում բոլոր բայթերը սահմանել 0 // Նախաստորագրել արժեքներ, որոնք անհրաժեշտ են NTP հարցում NTPBuffer ձևավորելու համար [0] = 0b11100011; // LI, Տարբերակ, Ռեժիմ // ուղարկեք փաթեթ ՝ ժամանակագրության խնդրանքով. UDP.beginPacket (հասցե, 123); // NTP հարցումները պետք է մուտքագրեն 123 UDP.write (NTPBuffer, NTP_PACKET_SIZE); UDP.endPacket (); } inline int getSeconds (uint32_t UNIXTime) {վերադարձ UNIXTime % 60; } inline int getMinutes (uint32_t UNIXTime) {վերադարձ UNIXTime / 60 % 60; } inline int getHours (uint32_t UNIXTime) {վերադարձ UNIXTime / 3600 % 24; }

Քայլ 5: Օգտագործեք այն:

Օգտագործիր դա!
Օգտագործիր դա!
Օգտագործիր դա!
Օգտագործիր դա!

Ուղղեք ձեր լարերը ամանի պահարանի ներսում և միացրեք ձեր կատվի սնուցողը վարդակից `օգտագործելով USB AC ադապտեր: Ինչպես պարզ կոդն է գրված, այն պետք է գործարկվի «բաց» վիճակում և կփոխի իր կափարիչի դիրքը միայն Arduino էսքիզում նշված ժամանակային շեմերին:

Շնորհակալություն հետևելու համար: Եթե դուք ինքներդ եք պատրաստում ձեր տարբերակը, ես կցանկանայի այն տեսնել ներքևում գտնվող «Ես պատրաստեցի» բաժնում:

Եթե ձեզ դուր է գալիս այս նախագիծը, ապա ձեզ կարող են հետաքրքրել իմ մյուսներից մի քանիսը.

  • Պրիզմայի սեփականատեր Rիածանի դիմանկարների համար
  • Նրբատախտակի պահեստային պատ Cat Tower- ով
  • LED Mason Jar Lanterns (3D տպագիր կափարիչ)
  • 3D տպիչի թելերի չոր տուփ
  • Արտակարգ իրավիճակների USB էներգիայի աղբյուր (3D տպագիր)
  • Փայլուն լուսադիոդային կոնֆետ
  • Եռաչափ տպված երկրաչափական տնկիչ `ջրահեռացմամբ
  • Եռաչափ տպված ծաղիկներ
  • Ինչպես տեղադրել LED- ները սկուտերի տակ (Bluetooth- ով)

Աշխատանքին հետևելու համար հետևեք ինձ YouTube- ում, Instagram- ում, Twitter- ում և Pinterest- ում:

Խորհուրդ ենք տալիս: