Talaan ng mga Nilalaman:

Control ng Pagkain sa Pagkain ng Cat (ESP8266 + Servo Motor + 3D Pag-print): 5 Hakbang (na may Mga Larawan)
Control ng Pagkain sa Pagkain ng Cat (ESP8266 + Servo Motor + 3D Pag-print): 5 Hakbang (na may Mga Larawan)

Video: Control ng Pagkain sa Pagkain ng Cat (ESP8266 + Servo Motor + 3D Pag-print): 5 Hakbang (na may Mga Larawan)

Video: Control ng Pagkain sa Pagkain ng Cat (ESP8266 + Servo Motor + 3D Pag-print): 5 Hakbang (na may Mga Larawan)
Video: PRACTICAL WORK 3 IOT AUTOMATIC PET FEEDER 2024, Hunyo
Anonim
Image
Image
Control ng Pagkain sa Pagkain ng Cat (ESP8266 + Servo Motor + 3D Pag-print)
Control ng Pagkain sa Pagkain ng Cat (ESP8266 + Servo Motor + 3D Pag-print)

Ang proyektong ito ay napupunta sa proseso na ginamit ko upang lumikha ng isang awtomatikong mangkok ng pagkain ng pusa, para sa aking nakatatandang diabetic cat na si Chaz. Kita n'yo, kailangan niyang kumain ng agahan bago siya makakuha ng kanyang insulin, ngunit madalas kong makalimutan na kunin ang kanyang ulam sa pagkain bago ako matulog, na sumisira sa kanyang gana sa pagkain at itinapon ang kanyang iskedyul ng insulin. Ang ulam na ito ay gumagamit ng isang motor na servo upang isara ang takip sa pagkain sa pagitan ng mga oras ng hatinggabi at 7:30 ng umaga. Ang sketch ng Arduino ng NodeMCU ESP8266 microcontroller ay gumagamit ng Network Time Protocol (NTP) upang makontrol ang iskedyul.

Ang proyektong ito ay maaaring hindi angkop para sa mas bata, mas aktibong mga pusa. Si Chaz ay matanda at mahina, hindi siya hilig na subukang buksan ang mangkok, ngunit posible.

Kung bago ka sa Arduino o sa ESP8266, masisiyahan ka sa mga sumusunod na paunang kinakailangan na gabay:

  • Mga Tagubilin sa Arduino Class
  • Mga Instruction na Klase sa Internet ng Mga Bagay

Mga gamit

  • 3D printer (Gumagamit ako ng isang Creality CR-10s Pro)
  • 3D filament filament (Gumagamit ako ng gintong PLA)
  • NodeMCU ESP8266 wifi microcontroller
  • USB cable (A hanggang microB)
  • USB power adapter
  • Micro servo motor
  • Maliit na distornilyador at mga tornilyo
  • Hookup wire
  • Mga pin ng header
  • Perma-proto board

Upang makasabay sa ginagawa ko, sundan ako sa YouTube, Instagram, Twitter, Pinterest, at mag-subscribe sa aking newsletter. Bilang isang Associate sa Amazon kumikita ako mula sa mga kwalipikadong pagbili na iyong ginagawa gamit ang aking mga kaakibat na link.

Hakbang 1: Mga Naka-print na Bahaging 3D

Mga Naka-print na Bahaging 3D
Mga Naka-print na Bahaging 3D
Mga Naka-print na Bahaging 3D
Mga Naka-print na Bahaging 3D

Ang may hawak ng mangkok ng cat food ay batay sa disenyo ni Ardy Lai sa Thingiverse. Ginawa ko itong mas malaki upang mapaunlakan ang mangkok ng aking pusa, at ginawang mas maikli ito dahil ang pag-scale nito ay napakataas nito. Nagdagdag ako ng isang may-ari para sa isang micro servo motor, at isang pares ng mga butas para sa mga kable na madadaanan sa loob.

Nagmomodel ako ng isang simpleng takip gamit ang Tinkercad, na idinisenyo upang ikabit sa sungay ng micro servo. Maaari mong kunin ang aking disenyo nang direkta mula sa Tinkercad, at / o i-download ang mga STL na nakakabit sa hakbang na ito.

Nai-print ko ang mga bahagi sa aking printer ng Creality CR-10s Pro na may gintong PLA filament.

Pagbubunyag: sa oras ng pagsulat na ito, ako ay isang empleyado ng Autodesk, na gumagawa ng Tinkercad.

Hakbang 2: Ikabit ang Lid sa Servo Motor

Ikabit ang Lid sa Servo Motor
Ikabit ang Lid sa Servo Motor
Ikabit ang Lid sa Servo Motor
Ikabit ang Lid sa Servo Motor

Gumamit ako ng isang maliit na bit ng drill upang madagdagan ang laki ng mga butas sa sungay ng servo, pagkatapos ay gumamit ng mga tornilyo upang ilakip ang servo sa naka-print na talukap ng 3D.

Hakbang 3: Bumuo ng NodeMCU ESP8266 Circuit

Bumuo ng NodeMCU ESP8266 Circuit
Bumuo ng NodeMCU ESP8266 Circuit
Bumuo ng NodeMCU ESP8266 Circuit
Bumuo ng NodeMCU ESP8266 Circuit
Bumuo ng NodeMCU ESP8266 Circuit
Bumuo ng NodeMCU ESP8266 Circuit
Bumuo ng NodeMCU ESP8266 Circuit
Bumuo ng NodeMCU ESP8266 Circuit

Ang circuit ay kinokontrol ng isang NodeMCU ESP8266 wifi microcontroller. Gumamit ako ng mga pin ng header sa isang perma-proto board upang gawing madaling matanggal ang micro servo motor. Ang mga header ng servo ay konektado sa NodeMCU tulad ng sumusunod:

Dilaw na servo wire: NodeMCU D1

Red servo wire: NodeMCU power (3V3 o VIN)

Itim na servo wire: NodeMCU ground (GND)

Hakbang 4: Mag-upload ng Arduino Code at Pagsubok

Mag-upload ng Arduino Code at Test
Mag-upload ng Arduino Code at Test

I-install ang iyong pagpupulong sa motor / talukap ng mata sa hugis ng motor sa may hawak ng mangkok na 3D na naka-print na bahagi. I-plug ang header ng motor sa mga header pin ng microcontroller board, at isaksak ang circuit sa iyong computer gamit ang isang USB cable.

Ang sketch ng Arduino ay gumagamit ng Network Time Protocol upang makuha ang kasalukuyang oras at pagkatapos ay bubukas o isara ang takip alinsunod sa isang hard-code na iskedyul. Kopyahin ang sumusunod na code, i-update ang iyong mga kredensyal sa wifi at offset ang oras ng UTC, at i-upload ito sa iyong board ng NodeMCU gamit ang Arduino IDE.

# isama

#include #include #include ESP8266WiFiMulti wifiMulti; // Lumikha ng isang halimbawa ng klase ng ESP8266WiFiMulti, na tinawag na 'wifiMulti' WiFiUDP UDP; // Lumikha ng isang halimbawa ng klase ng WiFiUDP upang magpadala at makatanggap ng IPAddress timeServerIP; // time.nist.gov NTP server address const char * NTPServerName = "time.nist.gov"; const int NTP_PACKET_SIZE = 48; // NTP time stamp ay nasa unang 48 bytes ng byte ng mensahe na NTPBuffer [NTP_PACKET_SIZE]; // buffer upang hawakan ang mga papasok at papalabas na packet Servo MyServo; // create servo object upang makontrol ang isang servo // ang labingdalawang servo na bagay ay maaaring malikha sa karamihan ng mga board int pos = 0; // variable upang maiimbak ang servo posisyon na walang bisa ang pag-setup () {myservo.attach (5); // nakakabit ang servo sa pin 5 aka D1 sa object ng servo // buksan ang takip bilang default na Serial.println ("pagbubukas ng takip"); para sa (pos = 95; pos> = 0; pos - = 1) {// mula sa 95 degree hanggang 0 degree myservo.write (pos); // sabihin kay servo na pumunta sa posisyon sa variable na 'pos' na pagkaantala (15); // naghihintay ng 15ms para maabot ng servo ang posisyon} Serial.begin (115200); // Simulan ang Serial na komunikasyon upang magpadala ng mga mensahe sa pagkaantala ng computer (10); Serial.println ("\ r / n"); startWiFi (); // Subukang kumonekta sa ilang mga naibigay na access point. Pagkatapos maghintay para sa isang koneksyon startUDP (); kung (! WiFi.hostByName (NTPServerName, timeServerIP)) {// Kunin ang IP address ng NTP server Serial.println ("Nabigo ang paghahanap sa DNS. Pag-reboot."); Serial.flush (); ESP.reset (); } Serial.print ("Time server IP: / t"); Serial.println (timeServerIP); Serial.println ("\ r / nPagpadala ng kahilingan sa NTP …"); sendNTPpacket (timeServerIP); } unsigned long intervalNTP = 60000; // Humiling ng oras ng NTP bawat minuto na hindi naka-sign matagal na prevNTP = 0; unsigned long lastNTPResponse = millis (); uint32_t timeUNIX = 0; unsigned mahabang prevActualTime = 0; void loop () {unsigned long currentMillis = millis (); if (currentMillis - prevNTP> intervalNTP) {// Kung ang isang minuto ay lumipas mula noong huling kahilingan ng NTP prevNTP = currentMillis; Serial.println ("\ r / nPagpadala ng kahilingan sa NTP …"); sendNTPpacket (timeServerIP); // Send a NTP request} uint32_t time = getTime (); // Suriin kung ang isang tugon sa NTP ay dumating at makuha ang (UNIX) oras kung (oras) {// Kung ang isang bagong timestamp ay natanggap timeUNIX = oras; Serial.print ("Tugon ng NTP: / t"); Serial.println (timeUNIX); lastNTPResponse = currentMillis; } iba pa kung ((currentMillis - lastNTPResponse)> 3600000) {Serial.println ("Mahigit sa 1 oras mula noong huling pagtugon ng NTP. Pag-reboot."); Serial.flush (); ESP.reset (); } uint32_t actualTime = timeUNIX + (currentMillis - lastNTPResponse) / 1000; uint32_t easternTime = timeUNIX - 18000 + (currentMillis - lastNTPResponse) / 1000; if (actualTime! = prevActualTime && timeUNIX! = 0) {// Kung ang isang segundo ay lumipas mula noong huling print prevActualTime = actualTime; Serial.printf ("\ rUTC time: / t% d:% d:% d", getHours (actualTime), getMinutes (actualTime), getSeconds (actualTime)); Serial.printf ("\ rEST (-5): / t% d:% d:% d", getHours (easternTime), getMinutes (easternTime), getSeconds (easternTime)); Serial.println (); } // 7:30 am if (getHours (easternTime) == 7 && getMinutes (easternTime) == 30 && getSeconds (easternTime) == 0) {// buksan ang talukap ng mata Serial.println ("pagbubukas ng takip"); para sa (pos = 95; pos> = 0; pos - = 1) {// mula sa 95 degree hanggang 0 degree myservo.write (pos); // sabihin kay servo na pumunta sa posisyon sa variable na 'pos' na pagkaantala (15); // naghihintay ng 15ms para maabot ng servo ang posisyon}} // hatinggabi kung (getHours (easternTime) == 0 && getMinutes (easternTime) == 0 && getSeconds (easternTime) == 0) {// isara ang talukbong Serial. println ("pagsasara ng talukap ng mata"); para sa (pos = 0; pos <= 95; pos + = 1) {// ay mula sa 0 degree hanggang 95 degree // sa mga hakbang na 1 degree myservo.write (pos); // sabihin kay servo na pumunta sa posisyon sa variable na 'pos' na pagkaantala (15); // naghihintay ng 15ms para maabot ng servo ang posisyon}} / * // pagsubok kung (getHours (easternTime) == 12 && getMinutes (easternTime) == 45 && getSeconds (easternTime) == 0) {// isara ang takip Serial.println ("pagsasara ng talukap ng mata"); para sa (pos = 0; pos = 0; pos - = 1) {// mula sa 95 degree hanggang 0 degree myservo.write (pos); // sabihin kay servo na pumunta sa posisyon sa variable na 'pos' na pagkaantala (15); // naghihintay ng 15ms para maabot ng servo ang posisyon}} * /} walang bisa ang startWiFi () {// Subukang kumonekta sa ilang mga naibigay na access point. Pagkatapos maghintay para sa isang koneksyon wifiMulti.addAP ("ssid_from_AP_1", "your_password_for_AP_1"); // magdagdag ng mga Wi-Fi network na nais mong ikonekta sa //wifiMulti.addAP("ssid_from_AP_2 "," your_password_for_AP_2 "); //wifiMulti.addAP("ssid_from_AP_3 "," your_password_for_AP_3 "); Serial.println ("Pagkonekta"); habang (wifiMulti.run ()! = WL_CONNected) {// Hintayin ang Wi-Fi na kumonekta ang pagkaantala (250); Serial.print ('.'); } Serial.println ("\ r / n"); Serial.print ("Nakakonekta sa"); Serial.println (WiFi. SSID ()); // Sabihin sa amin kung anong network ang konektado sa Serial.print ("IP address: / t"); Serial.print (WiFi.localIP ()); // Ipadala ang IP address ng ESP8266 sa computer Serial.println ("\ r / n"); } walang bisa startUDP () {Serial.println ("Simula UDP"); UDP.begin (123); // Simulang makinig para sa mga mensahe ng UDP sa port 123 Serial.print ("Local port: / t"); Serial.println (UDP.localPort ()); Serial.println (); } uint32_t getTime () {if (UDP.parsePacket () == 0) {// Kung walang tugon (pa) ibalik ang 0; } UDP.read (NTPBuffer, NTP_PACKET_SIZE); // basahin ang packet sa buffer // Pagsamahin ang 4 timestamp bytes sa isang 32-bit na numero uint32_t NTPTime = (NTPBuffer [40] << 24) | (NTPBuffer [41] << 16) | (NTPBuffer [42] << 8) | NTPBuffer [43]; // convert NTP time to a UNIX timestamp: // Unix time is start on Jan 1 1970. Iyon ay 2208988800 segundo sa oras ng NTP: const uint32_t pitung Taon = 2208988800UL; // bawasan ang pitumpung taon: uint32_t UNIXTime = NTPTime - pitumpung Taon; bumalik sa UNIXTime; } walang bisa ang sendNTPpacket (IPAddress at address) {memset (NTPBuffer, 0, NTP_PACKET_SIZE); // itakda ang lahat ng mga byte sa buffer sa 0 // Ipasimula ang mga halagang kinakailangan upang mabuo ang kahilingan ng NTP na NTPBuffer [0] = 0b11100011; // LI, Bersyon, Mode // magpadala ng isang packet na humihiling ng isang timestamp: UDP.beginPacket (address, 123); // NTP mga kahilingan ay sa port 123 UDP.write (NTPBuffer, NTP_PACKET_SIZE); UDP.endPacket (); } inline int getSeconds (uint32_t UNIXTime) {return UNIXTime% 60; } inline int getMinutes (uint32_t UNIXTime) {return UNIXTime / 60% 60; } inline int getHours (uint32_t UNIXTime) {return UNIXTime / 3600% 24; }

Hakbang 5: Gamitin Ito

Gamitin ito!
Gamitin ito!
Gamitin ito!
Gamitin ito!

Ituro ang iyong mga wire sa loob ng may hawak ng mangkok, at isaksak ang iyong feeder ng pusa sa isang outlet gamit ang isang USB AC adapter. Ang paraan ng pagsulat ng simpleng code, ito ay sinadya upang ma-boot up sa "bukas" na estado, at babaguhin lamang ang posisyon ng takip nito sa mga threshold ng oras na tinukoy sa sketch ng Arduino.

Salamat sa pagsunod! Kung gumawa ka ng iyong sariling bersyon, gusto kong makita ito sa seksyong Ginawa Ko Ito sa ibaba!

Kung gusto mo ang proyektong ito, maaaring interesado ka sa ilan pa sa aking iba:

  • Prism Holder para sa Rainbow Portraits
  • Plywood Storage Wall na may Cat Tower
  • LED Mason Jar Lanterns (naka-print na talukap ng 3D)
  • 3D Printer Filament Dry Box
  • Pinagmulan ng Pinagmulang USB Power (3D Printed)
  • Kumikinang na LED Gummy Candy
  • 3D Printed Geometric Planter Na May Drainage
  • Kumikinang na 3D Printed Flowers
  • Paano Mag-install ng Mga LED Sa ilalim ng Scooter (gamit ang Bluetooth)

Upang makasabay sa ginagawa ko, sundan ako sa YouTube, Instagram, Twitter, at Pinterest.

Inirerekumendang: