Indholdsfortegnelse:
- Forbrugsvarer
- Trin 1: 3D -udskrevne dele
- Trin 2: Sæt låg på servomotor
- Trin 3: Byg NodeMCU ESP8266 -kredsløb
- Trin 4: Upload Arduino -kode og test
- Trin 5: Brug det
Video: Adgangskontrol til kattefoder (ESP8266 + Servomotor + 3D -udskrivning): 5 trin (med billeder)
2024 Forfatter: John Day | [email protected]. Sidst ændret: 2024-01-30 08:25
Dette projekt går over den proces, jeg plejede at oprette en automatiseret kattefoderskål til min ældre diabetiske kat Chaz. Se, han har brug for at spise morgenmad, før han kan få sit insulin, men jeg glemmer ofte at hente hans madret, før jeg går i seng, hvilket ødelægger hans appetit og slukker hans insulinplan. Denne ret bruger en servomotor til at lukke et låg over maden mellem midnat og 7:30. NodeMCU ESP8266 mikrokontrollerens Arduino -skitse bruger Network Time Protocol (NTP) til at styre tidsplanen.
Dette projekt er muligvis ikke egnet til yngre, mere aktive katte. Chaz er så gammel og skrøbelig, at han ikke er tilbøjelig til at prøve at lirke skålen op, men det er muligt.
Hvis du er ny på Arduino eller ESP8266, kan du nyde følgende forudsætningsguider:
- Instructables Arduino klasse
- Instructables Internet of Things -klasse
Forbrugsvarer
- 3D-printer (jeg bruger en Creality CR-10s Pro)
- 3D -printerfilament (jeg bruger guld PLA)
- NodeMCU ESP8266 wifi mikrokontroller
- USB -kabel (A til microB)
- USB strømadapter
- Mikro servomotor
- Lille skruetrækker og skruer
- Tilslutningstråd
- Header pins
- Perma-proto bord
For at følge med i det, jeg arbejder på, skal du følge mig på YouTube, Instagram, Twitter, Pinterest og abonnere på mit nyhedsbrev. Som Amazon Associate tjener jeg på kvalificerede køb, du foretager ved hjælp af mine affiliate links.
Trin 1: 3D -udskrevne dele
Kattefoderskålholderen er baseret på Ardy Lai's design på Thingiverse. Jeg gjorde den større til at rumme min katteskål og gjorde den også kortere, da opskalering havde gjort den for høj. Jeg tilføjede en holder til en mikroservomotor og et par huller til kabler til at føre indad.
Jeg modellerede et simpelt låg ved hjælp af Tinkercad, designet til at fastgøre til mikroservoens horn. Du kan få fat i mit design direkte fra Tinkercad og/eller downloade STL'erne, der er knyttet til dette trin.
Jeg printede delene på min Creality CR-10s Pro printer med guld PLA filament.
Oplysning: På tidspunktet for dette skriv er jeg ansat i Autodesk, som laver Tinkercad.
Trin 2: Sæt låg på servomotor
Jeg brugte et lille bor til at øge størrelsen på hullerne på servohornet og brugte derefter skruer til at fastgøre servoen til det 3D -trykte låg.
Trin 3: Byg NodeMCU ESP8266 -kredsløb
Kredsløbet styres af en NodeMCU ESP8266 wifi mikrokontroller. Jeg brugte headerstifter på et perma-proto-kort for at gøre mikroservomotoren let aftagelig. Servooverskrifterne er forbundet til NodeMCU som følger:
Gul servotråd: NodeMCU D1
Rød servotråd: NodeMCU -strøm (3V3 eller VIN)
Sort servotråd: NodeMCU -jord (GND)
Trin 4: Upload Arduino -kode og test
Installer din motor/låg-samling i den motorformede udskæring på skålholderens 3D-trykte del. Sæt motorhovedet i mikrokontrolkortets hovedstifter, og tilslut kredsløbet til din computer med et USB -kabel.
Arduino-skitsen bruger Network Time Protocol til at hente den aktuelle tid og åbner eller lukker derefter låget i henhold til en hårdt kodet tidsplan. Kopier følgende kode, opdater dine wifi -legitimationsoplysninger og UTC -tidsforskydning, og upload den til dit NodeMCU -kort ved hjælp af Arduino IDE.
#omfatte
#include #include #include ESP8266WiFiMulti wifiMulti; // Opret en forekomst af ESP8266WiFiMulti -klassen, kaldet 'wifiMulti' WiFiUDP UDP; // Opret en forekomst af WiFiUDP -klassen for at sende og modtage 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 bytes i meddelelsesbyte NTPBuffer [NTP_PACKET_SIZE]; // buffer til at holde indgående og udgående pakker Servo myservo; // opret servoobjekt for at styre en servo // tolv servoobjekter kan oprettes på de fleste tavler int pos = 0; // variabel til lagring af servopositionens hulrumsopsætning () {myservo.attach (5); // fastgør servoen på pin 5 aka D1 til servoobjektet // åbner låget som standard Serial.println ("åbning af låget"); for (pos = 95; pos> = 0; pos -= 1) {// går fra 95 grader til 0 grader myservo.write (pos); // fortæl servo at gå til position i variabel 'pos' forsinkelse (15); // venter 15 ms på, at servoen når positionen} Serial.begin (115200); // Start seriel kommunikation for at sende meddelelser til computerens forsinkelse (10); Serial.println ("\ r / n"); startWiFi (); // Prøv at oprette forbindelse til nogle givne adgangspunkter. Vent derefter på en forbindelse startUDP (); if (! WiFi.hostByName (NTPServerName, timeServerIP)) {// Hent IP -adressen til NTP -serveren Serial.println ("DNS -opslag mislykkedes. Genstart."); Seriel.flush (); ESP.reset (); } Serial.print ("Tidsserver -IP: / t"); Serial.println (timeServerIP); Serial.println ("\ r / nSender NTP -anmodning …"); sendNTPpacket (timeServerIP); } usigneret langt intervalNTP = 60000; // Anmod om NTP -tid hvert minut usigneret lang prevNTP = 0; usigneret lang lastNTPResponse = millis (); uint32_t timeUNIX = 0; usigneret lang prevActualTime = 0; void loop () {unsigned long currentMillis = millis (); if (currentMillis - prevNTP> intervalNTP) {// Hvis der er gået et minut siden sidste NTP -anmodning prevNTP = currentMillis; Serial.println ("\ r / nSender NTP -anmodning …"); sendNTPpacket (timeServerIP); // Send en NTP -anmodning} uint32_t time = getTime (); // Kontroller, om der er ankommet et NTP -svar, og få (UNIX) -tiden, hvis (tid) {// Hvis et nyt tidsstempel er modtaget timeUNIX = time; Serial.print ("NTP -svar: / t"); Serial.println (timeUNIX); lastNTPResponse = currentMillis; } ellers if ((currentMillis - lastNTPResponse)> 3600000) {Serial.println ("Mere end 1 time siden sidste NTP -svar. Genstart."); Seriel.flush (); ESP.reset (); } uint32_t actualTime = timeUNIX + (currentMillis - lastNTPResponse)/1000; uint32_t eastTime = timeUNIX - 18000 + (currentMillis - lastNTPResponse)/1000; if (actualTime! = prevActualTime && timeUNIX! = 0) {// Hvis der er gået et sekund siden sidste udskrift 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 (); } // 7:30 am if (getHours (easternTime) == 7 && getMinutes (easternTime) == 30 && getSeconds (eastTime) == 0) {// åbn låget Serial.println ("åbning af låget"); for (pos = 95; pos> = 0; pos -= 1) {// går fra 95 grader til 0 grader myservo.write (pos); // fortæl servo at gå til position i variabel 'pos' forsinkelse (15); // venter 15 ms på, at servoen når positionen}} // midnat, hvis (getHours (eastTime) == 0 && getMinutes (eastTime) == 0 && getSeconds (eastTime) == 0) {// luk låget Serial. println ("lukning af låget"); for (pos = 0; pos <= 95; pos += 1) {// går fra 0 grader til 95 grader // i trin på 1 grad myservo.write (pos); // fortæl servo at gå til position i variabel 'pos' forsinkelse (15); // venter 15 ms på, at servoen når positionen}} /* // tester, om (getHours (easternTime) == 12 && getMinutes (eastTime) == 45 && getSeconds (eastTime) == 0) {// luk låget Serial.println ("lukning af låget"); for (pos = 0; pos = 0; pos -= 1) {// går fra 95 grader til 0 grader myservo.write (pos); // fortæl servo at gå til position i variabel 'pos' forsinkelse (15); // venter 15 ms på, at servoen når positionen}} */} ugyldig startWiFi () {// Prøv at oprette forbindelse til nogle givne adgangspunkter. Vent derefter på en forbindelse wifiMulti.addAP ("ssid_from_AP_1", "dit_passord_for_AP_1"); // tilføj Wi-Fi-netværk, du vil oprette forbindelse til //wifiMulti.addAP("ssid_from_AP_2 "," dit_passord_for_AP_2 "); //wifiMulti.addAP("ssid_from_AP_3 "," dit_passord_for_AP_3 "); Serial.println ("Tilslutning"); mens (wifiMulti.run ()! = WL_CONNECTED) {// Vent på, at Wi-Fi'en forbinder forsinkelse (250); Serial.print ('.'); } Serial.println ("\ r / n"); Serial.print ("Tilsluttet"); Serial.println (WiFi. SSID ()); // Fortæl os, hvilket netværk vi har forbindelse til Serial.print ("IP -adresse: / t"); Serial.print (WiFi.localIP ()); // Send IP -adressen for ESP8266 til computeren Serial.println ("\ r / n"); } ugyldig startUDP () {Serial.println ("Start UDP"); UDP.begynd (123); // Begynd at lytte efter UDP -meddelelser på port 123 Serial.print ("Lokal port: / t"); Serial.println (UDP.localPort ()); Serial.println (); } uint32_t getTime () {if (UDP.parsePacket () == 0) {// Hvis der ikke er noget svar (endnu), returner 0; } UDP.read (NTPBuffer, NTP_PACKET_SIZE); // læs pakken i bufferen // Kombiner de 4 tidsstempelbytes til et 32-bit tal 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; // træk halvfjerds år: uint32_t UNIXTime = NTPTime - halvfjerds år; returner UNIXTime; } ugyldig sendNTPpacket (IPAddress & adresse) {memset (NTPBuffer, 0, NTP_PACKET_SIZE); // sæt alle bytes i bufferen til 0 // Initialiser værdier, der er nødvendige for at danne NTP -anmodning NTPBuffer [0] = 0b11100011; // LI, Version, Mode // send en pakke, der anmoder om et tidsstempel: UDP.beginPacket (adresse, 123); // NTP -anmodninger 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; }
Trin 5: Brug det
Før dine ledninger til skålholderens inderside, og tilslut din kattefoder til en stikkontakt ved hjælp af en USB -vekselstrømsadapter. Den måde, den simple kode er skrevet på, er beregnet til at blive startet op i "åben" tilstand og vil kun ændre dens lågposition på de tidsgrænser, der er angivet i Arduino -skitsen.
Tak fordi du følger med! Hvis du laver din egen version, vil jeg meget gerne se den i afsnittet I Made It nedenfor!
Hvis du kan lide dette projekt, kan du være interesseret i nogle af mine andre:
- Prismeholder til Rainbow Portrætter
- Krydsfiner Opbevaringsvæg med Cat Tower
- LED Mason Jar Lanterns (3D -trykt låg)
- 3D printer filament tørkasse
- Nød -USB -strømkilde (3D -printet)
- Glødende LED Gummy Candy
- 3D -trykt geometrisk planter med dræning
- Glødende 3D -trykte blomster
- Sådan installeres lysdioder under en scooter (med Bluetooth)
For at følge med i det, jeg arbejder på, skal du følge mig på YouTube, Instagram, Twitter og Pinterest.
Anbefalede:
Sikkerhedsboks med adgangskontrol: 4 trin
Sikkerhedsboks med adgangskontrol: Jeg bruger denne prøve til at lave mit projekt. Og jeg ændrer nogle værker, for eksempel knappen til servoen. Jeg laver denne sikkerhedsboks, fordi nogle gange vil min familie og jeg miste nogle vigtige ting. Med dette vil min familie og jeg ikke kæmpe for at miste
Arduino Project: Dispenser til kattefoder: 6 trin
Arduino Project: Cat Food Dispenser: Denne instruerbare blev oprettet for at opfylde projektkravet fra Makecourse ved University of South Florida (www.makecourse.com)
Automatisk kattefoder dispenser: 7 trin (med billeder)
Automatisk kattefoderdispenser: Hvis du ikke kontrollerer mængden af mad, som din kat spiser, kan det føre til overspisning og overvægtige problemer. Dette er især tilfældet, hvis du er væk hjemmefra og efterlader ekstra mad til din kat at indtage på egen plan. Andre gange kan du
Super stilfuld automatisk kattefoder: 3 trin (med billeder)
Super stilfuld automatisk kattefoder: Jojo er en super smuk kat. Jeg elsker ham i alle aspekter, undtagen at han bliver ved med at vække mig hver dag kl. 4 om morgenen til sin mad, så det er på tide at få en automatisk kattefoder til at redde min søvn. Han er dog så smuk, at når jeg vil finde den rigtige
Byg din egen adgangskontrol med Please-open.it: 4 trin
Byg din egen adgangskontrol med Please-open.it: Please-open.it er baseret i Frankrig, og vi vil være på fuld tid med dette projekt. Vi ønsker, at virksomheder (hoteller, campingpladser, stationer, husleje …) får fordel af mere fleksible løsninger og naturligvis til en lavere pris. Tilslut alle interne data (udnæv