Innholdsfortegnelse:

Cat Food Access Control (ESP8266 + Servomotor + 3D -utskrift): 5 trinn (med bilder)
Cat Food Access Control (ESP8266 + Servomotor + 3D -utskrift): 5 trinn (med bilder)

Video: Cat Food Access Control (ESP8266 + Servomotor + 3D -utskrift): 5 trinn (med bilder)

Video: Cat Food Access Control (ESP8266 + Servomotor + 3D -utskrift): 5 trinn (med bilder)
Video: Cat Food Bowl Access Control with ESP8266 // Becky Stern 2024, November
Anonim
Image
Image
Kattematstilgangskontroll (ESP8266 + Servomotor + 3D -utskrift)
Kattematstilgangskontroll (ESP8266 + Servomotor + 3D -utskrift)

Dette prosjektet går over prosessen jeg brukte til å lage en automatisk kattematskål for min eldre diabetiske katt Chaz. Se, han trenger å spise frokost før han får insulinet sitt, men jeg glemmer ofte å hente matretten før jeg legger meg, noe som ødelegger appetitten og slipper insulinplanen. Denne retten bruker en servomotor for å lukke et lokk over maten mellom midnatt og 07:30. NodeMCU ESP8266 mikrokontrollerens Arduino -skisse bruker Network Time Protocol (NTP) for å kontrollere tidsplanen.

Dette prosjektet er kanskje ikke egnet for yngre, mer aktive katter. Chaz er så gammel og skrøpelig at han ikke er tilbøyelig til å prøve å lirke bollen, men det er mulig.

Hvis du er ny på Arduino eller ESP8266, kan du glede deg over følgende forutsetningsguider:

  • Instructables Arduino Class
  • Instructables Internet of Things Class

Rekvisita

  • 3D-skriver (jeg bruker en Creality CR-10s Pro)
  • 3D -skriverfilament (jeg bruker gull PLA)
  • NodeMCU ESP8266 wifi mikrokontroller
  • USB -kabel (A til mikroB)
  • USB strømadapter
  • Mikro servomotor
  • Liten skrutrekker og skruer
  • Tilkoblingskabel
  • Toppstifter
  • Perma-proto bord

For å holde tritt med det jeg jobber med, følg meg på YouTube, Instagram, Twitter, Pinterest og abonner på nyhetsbrevet mitt. Som Amazon Associate tjener jeg på kvalifiserte kjøp du gjør ved hjelp av tilknyttede lenker.

Trinn 1: 3D -trykte deler

3D -trykte deler
3D -trykte deler
3D -trykte deler
3D -trykte deler

Kattematskålholderen er basert på Ardy Lais design på Thingiverse. Jeg gjorde den større for å imøtekomme kattens bolle, og gjorde den også kortere siden oppskalering hadde gjort den for høy. Jeg la til en holder for en mikro servomotor, og et par hull for kabler for å føre til innsiden.

Jeg modellerte et enkelt lokk ved hjelp av Tinkercad, designet for å feste til mikroservoens horn. Du kan hente designet mitt direkte fra Tinkercad, og/eller laste ned STL -er som er knyttet til dette trinnet.

Jeg skrev ut delene på min Creality CR-10s Pro-skriver med gull PLA-filament.

Avsløring: I skrivende stund er jeg ansatt i Autodesk, som lager Tinkercad.

Trinn 2: Fest lokket til servomotoren

Fest lokket til servomotoren
Fest lokket til servomotoren
Fest lokket til servomotoren
Fest lokket til servomotoren

Jeg brukte en liten borekrone for å øke størrelsen på hullene på servohornet, og deretter brukte jeg skruer for å feste servoen til det 3D -trykte lokket.

Trinn 3: Bygg NodeMCU ESP8266 -krets

Bygg NodeMCU ESP8266 krets
Bygg NodeMCU ESP8266 krets
Bygg NodeMCU ESP8266 krets
Bygg NodeMCU ESP8266 krets
Bygg NodeMCU ESP8266 krets
Bygg NodeMCU ESP8266 krets
Bygg NodeMCU ESP8266 krets
Bygg NodeMCU ESP8266 krets

Kretsen styres av en NodeMCU ESP8266 wifi mikrokontroller. Jeg brukte headerpinner på et perma-proto-kort for å gjøre mikro-servomotoren lett avtagbar. Servooverskriftene er koblet til NodeMCU som følger:

Gul servotråd: NodeMCU D1

Rød servotråd: NodeMCU -strøm (3V3 eller VIN)

Svart servotråd: NodeMCU jordet (GND)

Trinn 4: Last opp Arduino -kode og test

Last opp Arduino -kode og test
Last opp Arduino -kode og test

Installer motoren/lokket i den motorformede utskjæringen på skålholderens 3D-trykte del. Koble motorhodet til mikrokontrollerbordets toppnål, og sett kretsen i datamaskinen med en USB -kabel.

Arduino-skissen bruker Network Time Protocol for å hente gjeldende tid og åpner eller lukker deretter lokket i henhold til en hardkodet tidsplan. Kopier følgende kode, oppdater wifi -legitimasjonen og UTC -tidsforskyvningen, og last den opp til NodeMCU -kortet ved hjelp av Arduino IDE.

#inkludere

#include #include #include ESP8266WiFiMulti wifiMulti; // Lag en forekomst av ESP8266WiFiMulti -klassen, kalt 'wifiMulti' WiFiUDP UDP; // Lag en forekomst av WiFiUDP -klassen for å sende og motta IPAddress timeServerIP; // time.nist.gov NTP -serveradresse const char* NTPServerName = "time.nist.gov"; const int NTP_PACKET_SIZE = 48; // NTP -tidsstempel er i de første 48 byte av meldingsbyte NTPBuffer [NTP_PACKET_SIZE]; // buffer for å holde innkommende og utgående pakker Servo myservo; // lage servoobjekt for å kontrollere en servo // tolv servoobjekter kan opprettes på de fleste tavler int pos = 0; // variabel for å lagre servoposisjonen tom oppsett () {myservo.attach (5); // fester servoen på pin 5 aka D1 til servoobjektet // åpner lokket som standard Serial.println ("åpning av lokket"); for (pos = 95; pos> = 0; pos -= 1) {// går fra 95 grader til 0 grader myservo.write (pos); // be servoen om å gå til posisjon i variabelen 'pos' forsinkelse (15); // venter 15 ms på at servoen skal nå posisjonen} Serial.begin (115200); // Start seriekommunikasjonen for å sende meldinger til datamaskinens forsinkelse (10); Serial.println ("\ r / n"); startWiFi (); // Prøv å koble til noen gitte tilgangspunkter. Vent deretter på en tilkobling startUDP (); if (! WiFi.hostByName (NTPServerName, timeServerIP)) {// Få IP -adressen til NTP -serveren Serial.println ("DNS -oppslag mislyktes. Rebooting."); Serial.flush (); ESP.reset (); } Serial.print ("Tidsserver -IP: / t"); Serial.println (timeServerIP); Serial.println ("\ r / nSender NTP -forespørsel …"); sendNTPpacket (timeServerIP); } usignert langt intervallNTP = 60000; // Be om NTP -tid hvert minutt usignert lang prevNTP = 0; usignert lang lastNTPResponse = millis (); uint32_t timeUNIX = 0; usignert lang prevActualTime = 0; void loop () {unsigned long currentMillis = millis (); if (currentMillis - prevNTP> intervalNTP) {// Hvis det har gått et minutt siden siste NTP -forespørsel prevNTP = currentMillis; Serial.println ("\ r / nSender NTP -forespørsel …"); sendNTPpacket (timeServerIP); // Send en NTP -forespørsel} uint32_t time = getTime (); // Sjekk om et NTP -svar har kommet og få (UNIX) -tiden hvis (tid) {// Hvis et nytt tidsstempel er mottatt timeUNIX = time; Serial.print ("NTP -svar: / t"); Serial.println (timeUNIX); lastNTPResponse = currentMillis; } annet hvis ((currentMillis - lastNTPResponse)> 3600000) {Serial.println ("Mer enn 1 time siden siste NTP -svar. Omstart."); Serial.flush (); ESP.reset (); } uint32_t actualTime = timeUNIX + (currentMillis - lastNTPResponse)/1000; uint32_t eastTime = timeUNIX - 18000 + (currentMillis - lastNTPResponse)/1000; if (actualTime! = prevActualTime && timeUNIX! = 0) {// Hvis et sekund har gått siden siste utskrift prevActualTime = actualTime; Serial.printf ("\ rUTC -tid: / 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 (); } // 07:30 hvis (getHours (eastTime) == 7 && getMinutes (easternTime) == 30 && getSeconds (eastTime) == 0) {// åpne lokket Serial.println ("åpne lokket"); for (pos = 95; pos> = 0; pos -= 1) {// går fra 95 grader til 0 grader myservo.write (pos); // be servoen om å gå til posisjon i variabelen 'pos' forsinkelse (15); // venter 15 ms på at servoen kommer til posisjonen}} // midnatt hvis (getHours (eastTime) == 0 && getMinutes (eastTime) == 0 && getSeconds (eastTime) == 0) {// lukk lokket Serial. println ("lukke lokket"); for (pos = 0; pos <= 95; pos += 1) {// går fra 0 grader til 95 grader // i trinn på 1 grad myservo.write (pos); // be servoen om å gå til posisjon i variabelen 'pos' forsinkelse (15); // venter 15 ms på at servoen kommer til posisjonen}} /* // tester om (getHours (easternTime) == 12 && getMinutes (eastTime) == 45 && getSeconds (eastTime) == 0) {// lukk lokket Serial.println ("lukke lokket"); for (pos = 0; pos = 0; pos -= 1) {// går fra 95 grader til 0 grader myservo.write (pos); // be servoen om å gå til posisjon i variabelen 'pos' forsinkelse (15); // venter 15 ms på at servoen når posisjonen}} */} ugyldig startWiFi () {// Prøv å koble til noen gitte tilgangspunkter. Vent deretter på en tilkobling wifiMulti.addAP ("ssid_from_AP_1", "your_password_for_AP_1"); // legg til Wi-Fi-nettverk du vil koble til //wifiMulti.addAP("ssid_from_AP_2 "," your_password_for_AP_2 "); //wifiMulti.addAP("ssid_from_AP_3 "," ditt_passord_for_AP_3 "); Serial.println ("Koble til"); while (wifiMulti.run ()! = WL_CONNECTED) {// Vent på at Wi-Fi-en skal koble til forsinkelse (250); Serial.print ('.'); } Serial.println ("\ r / n"); Serial.print ("Koblet til"); Serial.println (WiFi. SSID ()); // Fortell oss hvilket nettverk vi er koblet til Serial.print ("IP -adresse: / t"); Serial.print (WiFi.localIP ()); // Send IP -adressen til ESP8266 til datamaskinen Serial.println ("\ r / n"); } ugyldig startUDP () {Serial.println ("Starter UDP"); UDP.begynner (123); // Begynn å lytte etter UDP -meldinger på port 123 Serial.print ("Lokal port: / t"); Serial.println (UDP.localPort ()); Serial.println (); } uint32_t getTime () {if (UDP.parsePacket () == 0) {// Hvis det ikke er noe svar (ennå), returner 0; } UDP.read (NTPBuffer, NTP_PACKET_SIZE); // les pakken i bufferen // Kombiner de fire tidsstempelbyteene til et 32-bits tall uint32_t NTPTime = (NTPBuffer [40] << 24) | (NTPBuffer [41] << 16). (NTPBuffer [42] << 8) | NTPBuffer [43]; // Konverter NTP -tid til et UNIX -tidsstempel: // Unix -tid starter 1. januar 1970. Det er 2208988800 sekunder i NTP -tid: const uint32_t seventyYears = 2208988800UL; // trekke fra sytti år: uint32_t UNIXTime = NTPTime - seventyYears; returnere UNIXTime; } ugyldig sendNTPpacket (IPAddress og adresse) {memset (NTPBuffer, 0, NTP_PACKET_SIZE); // sett alle byte i bufferen til 0 // Initialiser verdier som trengs for å danne NTP -forespørsel NTPBuffer [0] = 0b11100011; // LI, versjon, modus // send en pakke som ber om et tidsstempel: UDP.beginPacket (adresse, 123); // NTP -forespørsler skal 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; }

Trinn 5: Bruk den

Bruk det!
Bruk det!
Bruk det!
Bruk det!

Før ledningene til innsiden av bolleholderen, og sett kattemateren i en stikkontakt med en USB -vekselstrømadapter. Slik den enkle koden skrives, er den ment å starte opp i "åpen" tilstand, og vil bare endre lokkposisjonen ved tidsgrensene som er angitt i Arduino -skissen.

Takk for at du følger med! Hvis du lager din egen versjon, vil jeg gjerne se den i I Made It -delen nedenfor!

Hvis du liker dette prosjektet, kan du være interessert i noen av mine andre:

  • Prismeholder for regnbue portretter
  • Oppbevaringsvegg i kryssfiner med Cat Tower
  • LED Mason Jar Lanterns (3D -trykt lokk)
  • 3D Printer Filament Dry Box
  • Nødstrøm USB -strømkilde (3D -trykt)
  • Glødende LED Gummy Candy
  • 3D -trykt geometrisk planter med drenering
  • Glødende 3D -trykte blomster
  • Hvordan installere lysdioder under en scooter (med Bluetooth)

For å holde tritt med det jeg jobber med, følg meg på YouTube, Instagram, Twitter og Pinterest.

Anbefalt: