Indholdsfortegnelse:

Adgangskontrol til kattefoder (ESP8266 + Servomotor + 3D -udskrivning): 5 trin (med billeder)
Adgangskontrol til kattefoder (ESP8266 + Servomotor + 3D -udskrivning): 5 trin (med billeder)

Video: Adgangskontrol til kattefoder (ESP8266 + Servomotor + 3D -udskrivning): 5 trin (med billeder)

Video: Adgangskontrol til kattefoder (ESP8266 + Servomotor + 3D -udskrivning): 5 trin (med billeder)
Video: Eachen GD-DC5 Garage Door Opener for eWeLink 2024, Juni
Anonim
Image
Image
Adgangskontrol til kattefoder (ESP8266 + Servomotor + 3D -udskrivning)
Adgangskontrol til kattefoder (ESP8266 + Servomotor + 3D -udskrivning)

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

3D -trykte dele
3D -trykte dele
3D -trykte dele
3D -trykte 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

Sæt låg på servomotor
Sæt låg på servomotor
Sæt låg på servomotor
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

Byg NodeMCU ESP8266 kredsløb
Byg NodeMCU ESP8266 kredsløb
Byg NodeMCU ESP8266 kredsløb
Byg NodeMCU ESP8266 kredsløb
Byg NodeMCU ESP8266 kredsløb
Byg NodeMCU ESP8266 kredsløb
Byg NodeMCU ESP8266 kredsløb
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

Upload Arduino -kode og test
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

Brug det!
Brug det!
Brug det!
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: