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, Lipanj
Anonim
Image
Image
Cat kontrola pristupa hrani (ESP8266 + servo motor + 3D ispis)
Cat kontrola pristupa hrani (ESP8266 + servo motor + 3D ispis)

Ovaj projekt ide preko procesa 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 njegovo jelo s hranom 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 tako star i krhak, nije sklon pokušati otvoriti zdjelu, ali moguće je.

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

  • Instrukcije za klasu Arduino
  • Klasa Interneta stvari s instrukcijama

Pribor

  • 3D pisač (koristim Creality CR-10s Pro)
  • Filament 3D pisača (koristim zlatni PLA)
  • NodeMCU ESP8266 wifi mikrokontroler
  • USB kabel (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 s onim na čemu radim, pratite me na YouTubeu, Instagramu, Twitteru, Pinterestu i pretplatite se na moj bilten. Kao suradnik Amazona zarađujem od kvalificiranih kupnji koje izvršite pomoću mojih partnerskih veza.

Korak 1: 3D ispisani dijelovi

3D ispisani dijelovi
3D ispisani dijelovi
3D ispisani dijelovi
3D ispisani dijelovi

Držač zdjele za mačju hranu temelji se 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 pomoću Tinkercada, dizajniran za pričvršćivanje na trupu mikro serva. Možete preuzeti moj dizajn izravno s Tinkercada i/ili preuzeti STL -ove priložene ovom koraku.

Ispisao sam dijelove na svom pisaču Creality CR-10s Pro sa zlatnom PLA nitom.

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

Koristio sam malu bušilicu za povećanje veličine rupa na servo trupi, a zatim pomoću vijaka pričvrstio servo na 3D tiskani poklopac.

Korak 3: Izgradite krug NodeMCU ESP8266

Sastavi sklop čvora NodeMCU ESP8266
Sastavi sklop čvora NodeMCU ESP8266
Sastavi sklop čvora NodeMCU ESP8266
Sastavi sklop čvora NodeMCU ESP8266
Sastavi sklop čvora NodeMCU ESP8266
Sastavi sklop čvora NodeMCU ESP8266
Sastavi sklop čvora NodeMCU ESP8266
Sastavi sklop čvora NodeMCU ESP8266

Krugom upravlja NodeMCU ESP8266 wifi mikrokontroler. Koristio sam iglice zaglavlja na perma-proto ploči kako bih mikro servo motor lako odvojio. 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 kod i testirajte

Prenesite Arduino kod i test
Prenesite Arduino kod i test

Ugradite sklop motora/poklopca u izrez u obliku motora na 3D printanom dijelu držača zdjele. Uključite zaglavlje motora u pinove zaglavlja ploče mikrokontrolera i spojite krug u računalo pomoću USB kabela.

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

#uključi

#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 poslužitelja const char* NTPServerName = "vrijeme.nist.gov"; const int NTP_PACKET_SIZE = 48; // NTP vremenska oznaka je u prvih 48 bajtova bajta poruke NTPBuffer [NTP_PACKET_SIZE]; // međuspremnik za spremanje dolaznih i odlaznih paketa Servo myservo; // izrada servo objekta za upravljanje servo // dvanaest servo objekata može se stvoriti na većini ploča int pos = 0; // varijabla za spremanje položaja servo 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 stupnjeva do 0 stupnjeva myservo.write (pos); // reći servo da ide na položaj u varijabli 'poz' kašnjenje (15); // čeka 15 ms da servo dosegne poziciju} Serial.begin (115200); // Pokretanje serijske komunikacije za slanje poruka računalu delay (10); Serial.println ("\ r / n"); startWiFi (); // Pokušajte se povezati s nekim danim pristupnim točkama. Zatim pričekajte početak vezeUDUDP (); if (! WiFi.hostByName (NTPServerName, timeServerIP)) {// Dohvatite IP adresu NTP poslužitelja Serial.println ("Potraga DNS -a nije uspjela. Ponovno pokretanje."); Serial.flush (); ESP.reset (); } Serial.print ("IP poslužitelja 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 (vrijeme) {// 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 EasternTime = 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 (EasternTime) == 7 && getMinutes (EasternTime) == 30 && getSeconds (EasternTime) == 0) {// otvorite poklopac Serial.println ("otvaranje poklopca"); for (pos = 95; pos> = 0; pos -= 1) {// ide od 95 stupnjeva do 0 stupnjeva myservo.write (pos); // reći servo da ide na položaj u varijabli 'poz' kašnjenje (15); // čeka 15 ms da servo dosegne poziciju}} // ponoć if (getHours (EasternTime) == 0 && getMinutes (EasternTime) == 0 && getSeconds (eastTime) == 0) {// zatvori poklopac Serijski. println ("zatvaranje poklopca"); for (pos = 0; pos <= 95; pos += 1) {// ide od 0 stupnjeva do 95 stupnjeva // u koracima od 1 stupanj myservo.write (pos); // reći servo da ide na položaj u varijabli 'poz' kašnjenje (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 stupnjeva do 0 stupnjeva myservo.write (pos); // reći servo da ide na položaj u varijabli 'poz' kašnjenje (15); // čeka 15 ms da servo dosegne položaj}} */} void startWiFi () {// Pokušajte se povezati s nekim danim pristupnim točkama. Zatim pričekajte vezu wifiMulti.addAP ("ssid_from_AP_1", "your_password_for_AP_1"); // dodamo Wi-Fi mreže na koje se želite povezati //wifiMulti.addAP("ssid_from_AP_2 "," vaša_zaporka_za_AP_2 "); //wifiMulti.addAP("ssid_from_AP_3 "," vaša_zaporka_za_AP_3 "); Serial.println ("Povezivanje"); while (wifiMulti.run ()! = WL_CONNECTED) {// Pričekajte da Wi-Fi poveže kašnjenje (250); Serial.print ('.'); } Serial.println ("\ r / n"); Serial.print ("Povezano s"); Serial.println (WiFi. SSID ()); // Recite nam s kojom smo mrežom povezani sa Serial.print ("IP adresa: / t"); Serial.print (WiFi.localIP ()); // Pošaljite IP adresu ESP8266 na računalo 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 sevendesetGodina = 2208988800UL; // oduzeti sedamdeset godina: uint32_t UNIXTime = NTPTime - sedamdesetGodina; return UNIXTime; } void sendNTPpacket (IP adresa i adresa) {memset (NTPBuffer, 0, NTP_PACKET_SIZE); // sve bajtove u međuspremniku postaviti na 0 // Inicijalizirati vrijednosti potrebne 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 prijenos 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

Iskoristi!
Iskoristi!
Iskoristi!
Iskoristi!

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, znači da se pokreće 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 dugine portrete
  • Zid za skladištenje od šperploče s Cat tornjem
  • LED svjetiljke Mason Jar (3D tiskani poklopac)
  • Suha kutija sa nitima 3D pisača
  • USB izvor napajanja za hitne slučajeve (3D ispis)
  • Sjajni LED gumeni bomboni
  • 3D ispisana geometrijska sadilica s drenažom
  • Sjajno 3D tiskano cvijeće
  • Kako instalirati LED diode ispod skutera (s Bluetoothom)

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

Preporučeni: