Innehållsförteckning:

Kattmatåtkomstkontroll (ESP8266 + Servomotor + 3D -utskrift): 5 steg (med bilder)
Kattmatåtkomstkontroll (ESP8266 + Servomotor + 3D -utskrift): 5 steg (med bilder)

Video: Kattmatåtkomstkontroll (ESP8266 + Servomotor + 3D -utskrift): 5 steg (med bilder)

Video: Kattmatåtkomstkontroll (ESP8266 + Servomotor + 3D -utskrift): 5 steg (med bilder)
Video: Arduino RFID Door Lock Access Control System 2024, Juni
Anonim
Image
Image
Kattmatåtkomstkontroll (ESP8266 + Servomotor + 3D -utskrift)
Kattmatåtkomstkontroll (ESP8266 + Servomotor + 3D -utskrift)

Detta projekt går igenom processen jag använde för att skapa en automatiserad kattmatskål för min äldre diabetiska katt Chaz. Se, han behöver äta frukost innan han kan få sitt insulin, men jag glömmer ofta att hämta hans maträtt innan jag går och lägger mig, vilket förstör hans aptit och släpper hans insulinplan. Denna maträtt använder en servomotor för att stänga ett lock över maten mellan midnattstiderna och 07:30. NodeMCU ESP8266 mikrokontroller Arduino -skiss använder Network Time Protocol (NTP) för att styra schemat.

Detta projekt kanske inte är lämpligt för yngre, mer aktiva katter. Chaz är så gammal och svag, han är inte benägen att försöka bända skålen, men det är möjligt.

Om du är ny på Arduino eller ESP8266 kan du njuta av följande förutsättningsguider:

  • Instructables Arduino Class
  • Instructables Internet of Things Class

Tillbehör

  • 3D-skrivare (jag använder en Creality CR-10s Pro)
  • 3D -skrivarfilament (jag använder guld PLA)
  • NodeMCU ESP8266 wifi mikrokontroller
  • USB -kabel (A till mikroB)
  • USB -strömadapter
  • Mikro servomotor
  • Liten skruvmejsel och skruvar
  • Anslutningstråd
  • Rubrikstift
  • Perma-proto tavla

För att hänga med i det jag jobbar med, följ mig på YouTube, Instagram, Twitter, Pinterest och prenumerera på mitt nyhetsbrev. Som Amazon Associate tjänar jag på kvalificerade köp som du gör med mina länkar.

Steg 1: 3D -tryckta delar

3D -tryckta delar
3D -tryckta delar
3D -tryckta delar
3D -tryckta delar

Kattmatskålhållaren är baserad på Ardy Lais design på Thingiverse. Jag gjorde den större för att rymma min kattskål och gjorde den också kortare eftersom uppskalningen hade gjort den för hög. Jag lade till en hållare för en mikro servomotor och ett par hål för kablar för att dra till insidan.

Jag modellerade ett enkelt lock med hjälp av Tinkercad, utformat för att fästas på mikronervos horn. Du kan ta min design direkt från Tinkercad och/eller ladda ner STL: erna som bifogas detta steg.

Jag skrev ut delarna på min Creality CR-10s Pro-skrivare med PLA-filament av guld.

Avslöjande: när jag skriver detta är jag anställd hos Autodesk, som gör Tinkercad.

Steg 2: Fäst locket på servomotorn

Fäst locket på servomotorn
Fäst locket på servomotorn
Fäst locket på servomotorn
Fäst locket på servomotorn

Jag använde en liten borr för att öka storleken på hålen på servohornet, sedan använde jag skruvar för att fästa servon på det 3D -tryckta locket.

Steg 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 styrs av en NodeMCU ESP8266 wifi mikrokontroller. Jag använde huvudstiften på ett perma-proto-kort för att göra mikroservomotorn lätt avtagbar. Servohuvudena är anslutna till NodeMCU enligt följande:

Gul servotråd: NodeMCU D1

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

Svart servotråd: NodeMCU -jordad (GND)

Steg 4: Ladda upp Arduino -kod och test

Ladda upp Arduino -kod och test
Ladda upp Arduino -kod och test

Installera din motor/lock-enhet i den motorformade urskärningen på skålhållarens 3D-tryckta del. Anslut motorhuvudet till mikrokontrollkortets huvudstiften och anslut kretsen till din dator med en USB -kabel.

Arduino-skissen använder Network Time Protocol för att hämta den aktuella tiden och öppnar eller stänger sedan locket enligt ett hårdkodat schema. Kopiera följande kod, uppdatera dina wifi -uppgifter och UTC -tidsförskjutning och ladda upp den till ditt NodeMCU -kort med Arduino IDE.

#omfatta

#include #include #include ESP8266WiFiMulti wifiMulti; // Skapa en instans av ESP8266WiFiMulti -klassen, kallad 'wifiMulti' WiFiUDP UDP; // Skapa en instans av WiFiUDP -klassen för att skicka och ta emot IPAddress timeServerIP; // time.nist.gov NTP -serveradress const char* NTPServerName = "time.nist.gov"; const int NTP_PACKET_SIZE = 48; // NTP -tidsstämpel finns i de första 48 byten i meddelandebyten NTPBuffer [NTP_PACKET_SIZE]; // buffert för att hålla inkommande och utgående paket Servo myservo; // skapa servoobjekt för att styra en servo // tolv servobjekt kan skapas på de flesta kort int pos = 0; // variabel för att lagra servopositionen void setup () {myservo.attach (5); // fäster servon på stift 5 aka D1 till servoobjektet // öppnar locket som standard Serial.println ("öppnar locket"); för (pos = 95; pos> = 0; pos -= 1) {// går från 95 grader till 0 grader myservo.write (pos); // berätta för servon att gå till position i variabeln 'pos' fördröjning (15); // väntar 15 ms på att servon når positionen} Serial.begin (115200); // Starta seriekommunikationen för att skicka meddelanden till datorfördröjningen (10); Serial.println ("\ r / n"); startWiFi (); // Försök att ansluta till vissa givna åtkomstpunkter. Vänta sedan på en anslutning startUDP (); if (! WiFi.hostByName (NTPServerName, timeServerIP)) {// Hämta IP -adressen till NTP -servern Serial.println ("DNS -sökning misslyckades. Omstart."); Serial.flush (); ESP.reset (); } Serial.print ("Tidsserver -IP: / t"); Serial.println (timeServerIP); Serial.println ("\ r / nSänder NTP -begäran …"); sendNTPpacket (timeServerIP); } osignerat långt intervallNTP = 60000; // Begär NTP -tid varje minut osignerad lång prevNTP = 0; osignerad lång lastNTPResponse = millis (); uint32_t timeUNIX = 0; osignerad lång prevActualTime = 0; void loop () {unsigned long currentMillis = millis (); if (currentMillis - prevNTP> intervalNTP) {// Om det har gått en minut sedan senaste NTP -begäran prevNTP = currentMillis; Serial.println ("\ r / nSänder NTP -begäran …"); sendNTPpacket (timeServerIP); // Skicka en NTP -begäran} uint32_t time = getTime (); // Kontrollera om ett NTP -svar har kommit och få (UNIX) -tiden om (tid) {// Om en ny tidsstämpel har mottagits timeUNIX = time; Serial.print ("NTP -svar: / t"); Serial.println (timeUNIX); lastNTPResponse = currentMillis; } annars if ((currentMillis - lastNTPResponse)> 3600000) {Serial.println ("Mer än 1 timme sedan senaste 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) {// Om en sekund har gått sedan senaste 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 (eastTime), getMinutes (eastTime), getSeconds (easternTime)); Serial.println (); } // 07:30 om (getHours (eastTime) == 7 && getMinutes (easternTime) == 30 && getSeconds (eastTime) == 0) {// öppna locket Serial.println ("öppna locket"); för (pos = 95; pos> = 0; pos -= 1) {// går från 95 grader till 0 grader myservo.write (pos); // berätta för servon att gå till position i variabeln 'pos' fördröjning (15); // väntar 15 ms på att servon når positionen}} // midnatt om (getHours (eastTime) == 0 && getMinutes (eastTime) == 0 && getSeconds (eastTime) == 0) {// stäng locket Serial. println ("stänga locket"); för (pos = 0; pos <= 95; pos += 1) {// går från 0 grader till 95 grader // i steg om 1 grad myservo.write (pos); // berätta för servon att gå till position i variabeln 'pos' fördröjning (15); // väntar 15 ms på att servon når positionen}} /* // testar om (getHours (eastTime) == 12 && getMinutes (eastTime) == 45 && getSeconds (eastTime) == 0) {// stäng locket Serial.println ("stänga locket"); för (pos = 0; pos = 0; pos -= 1) {// går från 95 grader till 0 grader myservo.write (pos); // berätta för servon att gå till position i variabeln 'pos' fördröjning (15); // väntar 15 ms på att servon når positionen}} */} void startWiFi () {// Försök att ansluta till vissa givna åtkomstpunkter. Vänta sedan på en anslutning wifiMulti.addAP ("ssid_from_AP_1", "your_password_for_AP_1"); // lägg till Wi-Fi-nätverk som du vill ansluta till //wifiMulti.addAP("ssid_from_AP_2 "," your_password_for_AP_2 "); //wifiMulti.addAP("ssid_from_AP_3 "," ditt_lösenord_för_AP_3 "); Serial.println ("Ansluter"); while (wifiMulti.run ()! = WL_CONNECTED) {// Vänta på att Wi-Fi-anslutningen ska anslutas (250); Serial.print ('.'); } Serial.println ("\ r / n"); Serial.print ("Ansluten till"); Serial.println (WiFi. SSID ()); // Berätta vilket nätverk vi är anslutna till Serial.print ("IP -adress: / t"); Serial.print (WiFi.localIP ()); // Skicka IP -adressen för ESP8266 till datorn Serial.println ("\ r / n"); } void startUDP () {Serial.println ("Startar UDP"); UDP.start (123); // Börja lyssna efter UDP -meddelanden på port 123 Serial.print ("Lokal port: / t"); Serial.println (UDP.localPort ()); Serial.println (); } uint32_t getTime () {if (UDP.parsePacket () == 0) {// Om det inte finns något svar (ännu), returnera 0; } UDP.read (NTPBuffer, NTP_PACKET_SIZE); // läs paketet i bufferten // Kombinera de fyra tidsstämpelbyte till ett 32-bitars tal uint32_t NTPTime = (NTPBuffer [40] << 24) | (NTPBuffer [41] << 16). (NTPBuffer [42] << 8) | NTPBuffer [43]; // Konvertera NTP -tid till en UNIX -tidsstämpel: // Unix -tid börjar 1 januari 1970. Det är 2208988800 sekunder i NTP -tid: const uint32_t seventyYears = 2208988800UL; // subtrahera sjuttio år: uint32_t UNIXTime = NTPTime - seventyYears; returnera UNIXTime; } void sendNTPpacket (IPAddress & address) {memset (NTPBuffer, 0, NTP_PACKET_SIZE); // ställ in alla byte i bufferten till 0 // Initiera värden som behövs för att bilda NTP -begäran NTPBuffer [0] = 0b11100011; // LI, Version, Mode // skicka ett paket som begär en tidsstämpel: UDP.beginPacket (adress, 123); // NTP -förfrågningar ska 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; }

Steg 5: Använd det

Använd den!
Använd den!
Använd den!
Använd den!

Dra dina ledningar till insidan av skålhållaren och anslut din kattmatare till ett uttag med en USB -nätadapter. Så som den enkla koden skrivs är den avsedd att startas upp i "öppet" tillstånd och kommer endast att ändra lockets position vid de tidströsklar som anges i Arduino -skissen.

Tack för att du följer med! Om du gör din egen version ser jag den gärna i avsnittet I Made It nedan!

Om du gillar det här projektet kan du vara intresserad av några av mina andra:

  • Prismahållare för regnbågsporträtt
  • Förvaringsvägg i plywood med Cat Tower
  • LED Mason Jar Lanterns (3D -tryckt lock)
  • 3D -skrivare Filament Dry Box
  • Nödkraft USB -strömkälla (3D -utskriven)
  • Glödande LED Gummy Candy
  • 3D -tryckt geometrisk plantering med dränering
  • Glödande 3D -tryckta blommor
  • Hur man installerar lysdioder under en skoter (med Bluetooth)

Följ mig på YouTube, Instagram, Twitter och Pinterest för att hålla koll på vad jag arbetar med.

Rekommenderad: