Sadržaj:

Cat kontrola pristupa hrani (ESP8266 + servo motor + 3D ispis): 5 koraka (sa slikama)
Cat kontrola pristupa hrani (ESP8266 + servo motor + 3D ispis): 5 koraka (sa slikama)

Video: Cat kontrola pristupa hrani (ESP8266 + servo motor + 3D ispis): 5 koraka (sa slikama)

Video: Cat kontrola pristupa hrani (ESP8266 + servo motor + 3D ispis): 5 koraka (sa slikama)
Video: ПРАВДА О РЕИНКАРНАЦИИ. Что будет после смерти? Откровение оккультиста (English, CS Subtitles) 2024, Jun
Anonim
Image
Image
Cat kontrola pristupa hrani (ESP8266 + servo motor + 3D ispis)
Cat kontrola pristupa hrani (ESP8266 + servo motor + 3D ispis)

Ovaj projekt prelazi proces koji sam koristio za stvaranje automatizirane zdjele za hranu za mačke, za moju stariju dijabetičku mačku Chaz. Vidite, mora doručkovati prije nego što dobije inzulin, ali često zaboravim pokupiti njegovu hranu prije nego što odem u krevet, što mu kvari apetit i odbija raspored inzulina. Ovo jelo koristi servo motor za zatvaranje poklopca hrane između ponoći i 7:30 ujutro. Arduino skica NodeMCU ESP8266 mikrokontrolera koristi Network Time Protocol (NTP) za kontrolu rasporeda.

Ovaj projekt možda nije prikladan za mlađe, aktivnije mačke. Chaz je toliko star i krhak da nije sklon pokušaju otvoriti zdjelu, ali je moguće.

Ako ste tek počeli koristiti Arduino ili ESP8266, možda ćete uživati u sljedećim preduvjetima:

  • Instrukcije Arduino klase
  • Klasa Interneta stvari koja se može uputiti

Supplies

  • 3D štampač (koristim Creality CR-10s Pro)
  • Filament za 3D štampač (koristim zlatni PLA)
  • NodeMCU ESP8266 wifi mikrokontroler
  • USB kabl (od A do microB)
  • USB adapter za napajanje
  • Mikro servo motor
  • Mali odvijač i vijci
  • Spojna žica
  • Igle zaglavlja
  • Perma-proto ploča

Da biste bili u toku sa onim na čemu radim, pratite me na YouTube -u, Instagramu, Twitteru, Pinterestu i pretplatite se na moj bilten. Kao Amazon saradnik zarađujem od kvalifikovanih kupovina koje obavite pomoću mojih partnerskih veza.

Korak 1: 3D štampani dijelovi

3D štampani delovi
3D štampani delovi
3D štampani delovi
3D štampani delovi

Nosač zdjele za mačju hranu zasnovan je na dizajnu Ardyja Laija na Thingiverseu. Učinio sam ga većim za smještaj zdjele moje mačke, a također ga i skratio jer ga je povećavanjem učinio previsokim. Dodao sam držač za mikro servo motor i nekoliko rupa za kabele koji se mogu provesti prema unutra.

Modelirao sam jednostavan poklopac koristeći Tinkercad, dizajniran za pričvršćivanje na trupu mikro serva. Možete preuzeti moj dizajn direktno iz Tinkercada i/ili preuzeti STL -ove priložene ovom koraku.

Štampao sam delove na svom Creality CR-10s Pro štampaču sa zlatnim PLA filamentom.

Otkriće: u vrijeme pisanja ovog članka zaposlen sam u Autodesku, koji čini Tinkercad.

Korak 2: Pričvrstite poklopac na servo motor

Pričvrstite poklopac na servo motor
Pričvrstite poklopac na servo motor
Pričvrstite poklopac na servo motor
Pričvrstite poklopac na servo motor

Upotrijebio sam malu burgiju za povećanje veličine rupa na servo trupi, a zatim pomoću vijaka pričvrstio servo na 3D štampani poklopac.

Korak 3: Izgradite krug NodeMCU ESP8266

Izgradite NodeMCU ESP8266 kolo
Izgradite NodeMCU ESP8266 kolo
Izgradite NodeMCU ESP8266 kolo
Izgradite NodeMCU ESP8266 kolo
Izgradite NodeMCU ESP8266 kolo
Izgradite NodeMCU ESP8266 kolo
Izgradite NodeMCU sklop ESP8266
Izgradite NodeMCU sklop ESP8266

Krugom upravlja NodeMCU ESP8266 wifi mikrokontroler. Koristio sam iglice zaglavlja na perma-proto ploči kako bih mikro servo motor mogao lako odvojiti. Servo zaglavlja su spojena na NodeMCU na sljedeći način:

Žuta servo žica: NodeMCU D1

Crvena servo žica: NodeMCU napajanje (3V3 ili VIN)

Crna servo žica: NodeMCU uzemljenje (GND)

Korak 4: Prenesite Arduino kôd i testirajte

Prenesite Arduino kod i test
Prenesite Arduino kod i test

Instalirajte sklop motora/poklopca u izrez u obliku motora na 3D štampanom dijelu držača zdjele. Uključite zaglavlje motora u pinove zaglavlja ploče mikrokontrolera i spojite kolo u računar pomoću USB kabla.

Arduino skica koristi protokol mrežnog vremena za dohvaćanje trenutnog vremena, a zatim otvara ili zatvara poklopac prema tvrdo kodiranom rasporedu. Kopirajte sljedeći kôd, ažurirajte svoje WiFi vjerodajnice i pomak UTC -a te ih prenesite na svoju NodeMCU ploču koristeći Arduino IDE.

#include

#include #include #include ESP8266WiFiMulti wifiMulti; // Kreirajte instancu klase ESP8266WiFiMulti, nazvanu 'wifiMulti' WiFiUDP UDP; // Kreirajte instancu klase WiFiUDP za slanje i primanje IPAddress timeServerIP; // time.nist.gov Adresa NTP servera const char* NTPServerName = "time.nist.gov"; const int NTP_PACKET_SIZE = 48; // NTP vremenska oznaka je u prvih 48 bajtova bajta poruke NTPBuffer [NTP_PACKET_SIZE]; // bafer za držanje dolaznih i odlaznih paketa Servo myservo; // kreiranje servo objekta za kontrolu servo // dvanaest servo objekata može se kreirati na većini ploča int pos = 0; // varijabla za spremanje servo pozicije void setup () {myservo.attach (5); // priključuje servo na pin 5 ili D1 na servo objekt // prema zadanim postavkama otvara poklopac Serial.println ("otvaranje poklopca"); for (pos = 95; pos> = 0; pos -= 1) {// ide od 95 stepeni do 0 stepeni myservo.write (pos); // kaže servo da ide na poziciju u varijabli 'poz' delay (15); // čeka 15ms da servo dođe do pozicije} Serial.begin (115200); // Pokretanje serijske komunikacije za slanje poruka računaru delay (10); Serial.println ("\ r / n"); startWiFi (); // Pokušajte se povezati na neke date pristupne tačke. Zatim pričekajte početak vezeUDUDP (); if (! WiFi. Serial.flush (); ESP.reset (); } Serial.print ("IP servera vremena: / t"); Serial.println (timeServerIP); Serial.println ("\ r / nSlanje NTP zahtjeva …"); sendNTPpacket (timeServerIP); } nepotpisani dugi intervalNTP = 60000; // Traženje NTP vremena svake minute nepotpisano dugo prevNTP = 0; unsigned long lastNTPResponse = millis (); uint32_t vrijemeUNIX = 0; unsigned long prevActualTime = 0; void loop () {unsigned long currentMillis = millis (); if (currentMillis - prevNTP> intervalNTP) {// Ako je prošla minuta od zadnjeg NTP zahtjeva prevNTP = currentMillis; Serial.println ("\ r / nSlanje NTP zahtjeva …"); sendNTPpacket (timeServerIP); // Pošaljite NTP zahtjev} uint32_t time = getTime (); // Provjerite je li stigao NTP odgovor i dobijte (UNIX) vrijeme if (time) {// Ako je primljena nova vremenska oznaka timeUNIX = time; Serial.print ("NTP odgovor: / t"); Serial.println (timeUNIX); lastNTPResponse = currentMillis; } else if ((currentMillis - lastNTPResponse)> 3600000) {Serial.println ("Više od 1 sata od zadnjeg NTP odgovora. Ponovno pokretanje."); Serial.flush (); ESP.reset (); } uint32_t actualTime = timeUNIX + (currentMillis - lastNTPResponse)/1000; uint32_t eastTime = vrijemeUNIX - 18000 + (currentMillis - lastNTPResponse)/1000; if (actualTime! = prevActualTime && timeUNIX! = 0) {// Ako je prošla sekunda od zadnjeg ispisa prevActualTime = actualTime; Serial.printf ("\ rUTC vrijeme: / t%d:%d:%d", getHours (actualTime), getMinutes (actualTime), getSeconds (actualTime)); Serial.printf ("\ rEST (-5): / t%d:%d:%d", getHours (eastTime), getMinutes (eastTime), getSeconds (eastTime)); Serial.println (); } // 7:30 ujutro if (getHours (eastTime) == 7 && getMinutes (eastTime) == 30 && getSeconds (eastTime) == 0) {// otvorite poklopac Serial.println ("otvaranje poklopca"); for (pos = 95; pos> = 0; pos -= 1) {// ide od 95 stepeni do 0 stepeni myservo.write (pos); // kaže servo da ide na poziciju u varijabli 'poz' delay (15); // čeka 15ms da servo dođe do pozicije}} // ponoć if (getHours (eastTime) == 0 && getMinutes (eastTime) == 0 && getSeconds (eastTime) == 0) {// zatvori poklopac Serijski. println ("zatvaranje poklopca"); for (poz = 0; poz <= 95; pos += 1) {// ide od 0 stepeni do 95 stepeni // u koracima od 1 stepen myservo.write (poz); // kaže servo da ide na poziciju u varijabli 'poz' delay (15); // čeka 15 ms da servo dosegne poziciju}} /* // testiranje ako (getHours (EasternTime) == 12 && getMinutes (EasternTime) == 45 && getSeconds (EasternTime) == 0) {// zatvori poklopac Serial.println ("zatvaranje poklopca"); for (pos = 0; pos = 0; pos -= 1) {// ide od 95 stepeni do 0 stepeni myservo.write (pos); // kaže servo da ide na poziciju u varijabli 'poz' delay (15); // čeka 15ms da servo dođe do pozicije}} */} void startWiFi () {// Pokušajte se povezati na neke date pristupne tačke. Zatim pričekajte vezu wifiMulti.addAP ("ssid_from_AP_1", "your_password_for_AP_1"); // dodajte Wi-Fi mreže na koje želite da se povežete //wifiMulti.addAP("ssid_from_AP_2 "," your_password_for_AP_2 "); //wifiMulti.addAP("ssid_from_AP_3 "," your_password_for_AP_3 "); Serial.println ("Povezivanje"); while (wifiMulti.run ()! = WL_CONNECTED) {// Sačekajte da Wi-Fi poveže kašnjenje (250); Serial.print ('.'); } Serial.println ("\ r / n"); Serial.print ("Povezano sa"); Serial.println (WiFi. SSID ()); // Recite nam s kojom smo mrežom povezani sa Serial.print ("IP adresa: / t"); Serial.print (WiFi.localIP ()); // šalje IP adresu ESP8266 računaru Serial.println ("\ r / n"); } void startUDP () {Serial.println ("Pokretanje UDP -a"); UDP.početi (123); // Počnite slušati UDP poruke na portu 123 Serial.print ("Lokalni port: / t"); Serial.println (UDP.localPort ()); Serial.println (); } uint32_t getTime () {if (UDP.parsePacket () == 0) {// Ako nema odgovora (još) vrati 0; } UDP.read (NTPBuffer, NTP_PACKET_SIZE); // čita paket u međuspremnik // Kombinirajte 4 bajta vremenske oznake u jedan 32-bitni broj uint32_t NTPTime = (NTPBuffer [40] << 24) | (NTPBuffer [41] << 16) | (NTPBuffer [42] << 8) | NTPBuffer [43]; // Pretvorimo NTP vrijeme u UNIX vremensku oznaku: // Unix vrijeme počinje 1. siječnja 1970. To je 2208988800 sekundi u NTP vremenu: const uint32_t seventyYears = 2208988800UL; // oduzimamo sedamdeset godina: uint32_t UNIXTime = NTPTime - sedamdeset godina; return UNIXTime; } void sendNTPpacket (IP adresa i adresa) {memset (NTPBuffer, 0, NTP_PACKET_SIZE); // postavljanje svih bajtova u međuspremniku na 0 // Inicijalizacija vrijednosti potrebnih za formiranje NTP zahtjeva NTPBuffer [0] = 0b11100011; // LI, Version, Mode // šalje paket koji traži vremensku oznaku: UDP.beginPacket (adresa, 123); // NTP zahtjevi su za 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; }

Korak 5: Iskoristite ga

Use It!
Use It!
Use It!
Use It!

Provucite svoje žice prema unutrašnjosti držača zdjele i priključite hranilicu za mačke u utičnicu pomoću USB adaptera za izmjeničnu struju. Način na koji je jednostavan kod napisan, trebao bi se pokrenuti u "otvorenom" stanju i promijenit će položaj poklopca samo u vremenskim pragovima navedenim u Arduino skici.

Hvala što ste nas pratili! Ako napravite vlastitu verziju, volio bih je vidjeti u odjeljku Napravio sam ispod!

Ako vam se sviđa ovaj projekt, možda će vas zanimati neki od mojih drugih:

  • Držač za prizmu za Rainbow Portrete
  • Zid za skladištenje od šperploče sa Cat tornjem
  • LED svjetiljke Mason Jar (3D štampani poklopac)
  • Suha kutija sa nitima 3D štampača
  • USB izvor napajanja za hitne slučajeve (3D štampano)
  • Sjajni LED gumeni bomboni
  • 3D štampana geometrijska sadilica sa drenažom
  • Sjajno 3D štampano cvijeće
  • Kako instalirati LED diode ispod skutera (sa Bluetoothom)

Da biste bili u toku sa onim na čemu radim, pratite me na YouTubeu, Instagramu, Twitteru i Pinterestu.

Preporučuje se: