Inhaltsverzeichnis:

Cat Food Access Control (ESP8266 + Servomotor + 3D-Druck) - Gunook
Cat Food Access Control (ESP8266 + Servomotor + 3D-Druck) - Gunook

Video: Cat Food Access Control (ESP8266 + Servomotor + 3D-Druck) - Gunook

Video: Cat Food Access Control (ESP8266 + Servomotor + 3D-Druck) - Gunook
Video: Cat Food Bowl Access Control with ESP8266 // Becky Stern 2024, November
Anonim
Image
Image
Cat-Zutrittskontrolle für Lebensmittel (ESP8266 + Servomotor + 3D-Druck)
Cat-Zutrittskontrolle für Lebensmittel (ESP8266 + Servomotor + 3D-Druck)

Dieses Projekt behandelt den Prozess, mit dem ich einen automatisierten Katzenfutternapf für meine ältere diabetische Katze Chaz erstellt habe. Sehen Sie, er muss frühstücken, bevor er sein Insulin bekommen kann, aber ich vergesse oft, sein Essen abzuholen, bevor ich ins Bett gehe, was ihm den Appetit verdirbt und seinen Insulinplan durcheinander bringt. Dieses Gericht verwendet einen Servomotor, um zwischen Mitternacht und 7.30 Uhr einen Deckel über dem Essen zu schließen. Die Arduino-Skizze des NodeMCU ESP8266-Mikrocontrollers verwendet das Network Time Protocol (NTP), um den Zeitplan zu steuern.

Dieses Projekt ist möglicherweise nicht für jüngere, aktivere Katzen geeignet. Chaz ist so alt und gebrechlich, dass er nicht dazu neigt, die Schüssel aufzubrechen, aber es ist möglich.

Wenn Sie neu beim Arduino oder ESP8266 sind, können Sie die folgenden Anleitungen zu den Voraussetzungen genießen:

  • Instructables Arduino-Klasse
  • Instructables Internet der Dinge Klasse

Lieferungen

  • 3D-Drucker (ich benutze einen Creality CR-10s Pro)
  • 3D-Drucker-Filament (ich verwende goldenes PLA)
  • NodeMCU ESP8266 WLAN-Mikrocontroller
  • USB-Kabel (A auf microB)
  • USB-Netzteil
  • Mikro-Servomotor
  • Kleiner Schraubendreher und Schrauben
  • Anschlusskabel
  • Kopfstifte
  • Perma-Protoboard

Folgen Sie mir auf YouTube, Instagram, Twitter, Pinterest und abonnieren Sie meinen Newsletter, um auf dem Laufenden zu bleiben, woran ich arbeite. Als Amazon-Partner verdiene ich an qualifizierten Käufen, die Sie über meine Affiliate-Links tätigen.

Schritt 1: 3D-gedruckte Teile

3D-gedruckte Teile
3D-gedruckte Teile
3D-gedruckte Teile
3D-gedruckte Teile

Der Futternapfhalter für Katzen basiert auf dem Design von Ardy Lai auf Thingiverse. Ich habe ihn größer gemacht, um den Napf meiner Katze unterzubringen, und ihn auch kürzer gemacht, da er durch das Vergrößern zu groß geworden war. Ich fügte einen Halter für einen Mikroservomotor und ein paar Löcher für Kabel nach innen hinzu.

Ich habe mit Tinkercad einen einfachen Deckel modelliert, der am Horn des Mikroservos befestigt werden soll. Sie können mein Design direkt von Tinkercad abrufen und / oder die STLs herunterladen, die diesem Schritt beigefügt sind.

Ich habe die Teile auf meinem Creality CR-10s Pro Drucker mit goldenem PLA-Filament gedruckt.

Offenlegung: Zum Zeitpunkt dieses Schreibens bin ich ein Mitarbeiter von Autodesk, das Tinkercad herstellt.

Schritt 2: Deckel am Servomotor befestigen

Deckel am Servomotor anbringen
Deckel am Servomotor anbringen
Deckel am Servomotor anbringen
Deckel am Servomotor anbringen

Ich habe einen kleinen Bohrer verwendet, um die Löcher am Servohorn zu vergrößern, dann habe ich Schrauben verwendet, um das Servo am 3D-gedruckten Deckel zu befestigen.

Schritt 3: Bauen Sie die NodeMCU ESP8266-Schaltung

Bauen Sie die NodeMCU ESP8266-Schaltung
Bauen Sie die NodeMCU ESP8266-Schaltung
Bauen Sie die NodeMCU ESP8266-Schaltung
Bauen Sie die NodeMCU ESP8266-Schaltung
Bauen Sie die NodeMCU ESP8266-Schaltung
Bauen Sie die NodeMCU ESP8266-Schaltung
Bauen Sie die NodeMCU ESP8266-Schaltung
Bauen Sie die NodeMCU ESP8266-Schaltung

Die Schaltung wird von einem NodeMCU ESP8266 WLAN-Mikrocontroller gesteuert. Ich habe Header-Pins auf einer Perma-Proto-Platine verwendet, um den Mikro-Servomotor leicht abnehmbar zu machen. Die Servo-Header sind wie folgt mit der NodeMCU verbunden:

Gelbes Servokabel: NodeMCU D1

Rotes Servokabel: NodeMCU-Strom (3V3 oder VIN)

Schwarzes Servokabel: NodeMCU-Masse (GND)

Schritt 4: Arduino-Code hochladen und testen

Arduino-Code hochladen und testen
Arduino-Code hochladen und testen

Installieren Sie Ihre Motor- / Deckelbaugruppe in den motorförmigen Ausschnitt am 3D-gedruckten Teil des Schüsselhalters. Stecken Sie den Motor-Header in die Header-Pins der Mikrocontroller-Platine und stecken Sie die Schaltung mit einem USB-Kabel in Ihren Computer.

Die Arduino-Skizze verwendet das Network Time Protocol, um die aktuelle Uhrzeit abzurufen und öffnet oder schließt dann den Deckel nach einem fest codierten Zeitplan. Kopieren Sie den folgenden Code, aktualisieren Sie Ihre WLAN-Anmeldeinformationen und den UTC-Zeitversatz und laden Sie ihn mit der Arduino IDE auf Ihr NodeMCU-Board hoch.

#enthalten

#include #include #include ESP8266WiFiMulti wifiMulti; // Erstellen Sie eine Instanz der ESP8266WiFiMulti-Klasse namens 'wifiMulti' WiFiUDP UDP; // Erstellen Sie eine Instanz der WiFiUDP-Klasse zum Senden und Empfangen von IPAddress timeServerIP; // time.nist.gov NTP-Serveradresse const char* NTPServerName = "time.nist.gov"; const int NTP_PACKET_SIZE = 48; // NTP-Zeitstempel befindet sich in den ersten 48 Bytes des Nachrichtenbytes NTPBuffer[NTP_PACKET_SIZE]; // Puffer zum Halten von eingehenden und ausgehenden Paketen Servo myservo; // Servo-Objekt erstellen, um ein Servo zu steuern // Auf den meisten Boards können zwölf Servo-Objekte erstellt werden int pos = 0; // Variable zum Speichern der Servoposition Void setup () {myservo.attach (5); // befestigt das Servo an Pin 5 aka D1 an das Servoobjekt // Öffnen Sie den Deckel standardmäßig Serial.println ("Öffnen des Deckels"); for (pos = 95; pos >= 0; pos -= 1) {// geht von 95 Grad auf 0 Grad myservo.write(pos); // dem Servo sagen, dass es in der Variablen 'pos' delay (15) in Position gehen soll; // wartet 15ms, bis das Servo die Position erreicht hat} Serial.begin(115200); // Starten Sie die serielle Kommunikation, um Nachrichten an die Computerverzögerung zu senden (10); Serial.println("\r\n"); startWiFi(); // Versuchen Sie, eine Verbindung zu bestimmten Zugangspunkten herzustellen. Dann auf eine Verbindung warten startUDP(); if(!WiFi.hostByName(NTPServerName, timeServerIP)) {// Abrufen der IP-Adresse des NTP-Servers Serial.println("DNS-Lookup fehlgeschlagen. Neustart."); Serial.flush(); ESP.reset(); } Serial.print("Zeitserver-IP:\t"); Serial.println (timeServerIP); Serial.println("\r\nSende NTP-Anfrage …"); sendNTPpacket(timeServerIP); } langes Intervall ohne VorzeichenNTP = 60000; // NTP-Zeit jede Minute anfordern unsigned long prevNTP = 0; unsigned long lastNTPResponse = millis(); uint32_t timeUNIX = 0; unsigned long prevActualTime = 0; Void Schleife () { unsigned long currentMillis = millis (); if (currentMillis - prevNTP > intervalNTP) { // Wenn seit der letzten NTP-Anfrage eine Minute vergangen ist prevNTP = currentMillis; Serial.println("\r\nSende NTP-Anfrage …"); sendNTPpacket(timeServerIP); // Eine NTP-Anfrage senden } uint32_t time = getTime(); // Prüfen, ob eine NTP-Antwort angekommen ist und die (UNIX)-Zeit abrufen if (time) { // Wenn ein neuer Zeitstempel empfangen wurde timeUNIX = time; Serial.print ("NTP-Antwort: / t"); Serial.println (timeUNIX); lastNTPResponse = currentMillis; } else if ((currentMillis - lastNTPResponse)> 3600000) { Serial.println ("Mehr als 1 Stunde seit der letzten NTP-Antwort. Neustart."); Serial.flush(); ESP.reset(); } uint32_t currentTime = timeUNIX + (currentMillis - lastNTPResponse)/1000; uint32_t EasternTime = timeUNIX - 18000 + (currentMillis - lastNTPResponse)/1000; if (actualTime != prevActualTime && timeUNIX != 0) { // Wenn seit dem letzten Druck eine Sekunde vergangen ist prevActualTime = currentTime; Serial.printf("\rUTC-Zeit:\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 Uhr if (getHours (easternTime) == 7 && getMinutes (easternTime) == 30 && getSeconds (easternTime) == 0) {// öffne den Deckel Serial.println ("Öffne den Deckel"); for (pos = 95; pos >= 0; pos -= 1) {// geht von 95 Grad auf 0 Grad myservo.write(pos); // dem Servo sagen, dass es in der Variablen 'pos' delay (15) in Position gehen soll; // wartet 15ms, bis das Servo die Position erreicht hat. println("Deckel schließen"); for (pos = 0; pos <= 95; pos += 1) {// geht von 0 Grad auf 95 Grad // in Schritten von 1 Grad myservo.write(pos); // dem Servo sagen, dass es in der Variablen 'pos' delay (15) in Position gehen soll; // wartet 15ms, bis das Servo die Position erreicht hat}} /* // Testen if(getHours(easternTime) == 12 && getMinutes(easternTime) == 45 && getSeconds(easternTime) == 0){ //den Deckel schließen Serial.println ("Deckel schließen"); for (pos = 0; pos = 0; pos -= 1) {// geht von 95 Grad auf 0 Grad myservo.write(pos); // dem Servo sagen, dass es in der Variablen 'pos' delay (15) in Position gehen soll; // wartet 15 ms, bis das Servo die Position erreicht hat. Warten Sie dann auf eine Verbindung wifiMulti.addAP("ssid_from_AP_1", "your_password_for_AP_1"); // Wi-Fi-Netzwerke hinzufügen, mit denen Sie eine Verbindung herstellen möchten //wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2"); //wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3"); Serial.println("Verbinden"); while (wifiMulti.run() != WL_CONNECTED) {// Warten Sie, bis das Wi-Fi eine Verbindung herstellt Verzögerung (250); Serial.print ('.'); } Serial.println("\r\n"); Serial.print ("Verbunden mit"); Serial.println (WiFi. SSID()); // Sagen Sie uns, mit welchem Netzwerk wir verbunden sind Serial.print ("IP-Adresse: / t"); Serial.print (WiFi.localIP()); // Senden Sie die IP-Adresse des ESP8266 an den Computer Serial.println("\r\n"); aufrechtzuerhalten. Void startUDP () {Serial.println ("Starten von UDP"); UDP.begin(123); // Beginnen Sie mit dem Abhören von UDP-Nachrichten auf Port 123 Serial.print ("Lokaler Port: / t"); Serial.println (UDP.localPort ()); Serial.println(); } uint32_t getTime() { if (UDP.parsePacket() == 0) {// Wenn es (noch) keine Antwort gibt return 0; } UDP.read(NTPBuffer, NTP_PACKET_SIZE); // Paket in den Puffer einlesen // Die 4 Zeitstempelbytes zu einer 32-Bit-Zahl kombinieren uint32_t NTPTime = (NTPBuffer[40] << 24) | (NTPPuffer[41] << 16) | (NTPPuffer[42] << 8) | NTP-Puffer[43]; // NTP-Zeit in einen UNIX-Zeitstempel umwandeln: // Die Unix-Zeit beginnt am 1. Januar 1970. Das sind 2208988800 Sekunden in NTP-Zeit: const uint32_t seventyYears = 2208988800UL; // 70 Jahre subtrahieren: uint32_t UNIXTime = NTPTime - seventyYears; UNIXTime zurückgeben; aufrechtzuerhalten. Void sendNTPpacket (IPAddress& Adresse) { memset (NTPBuffer, 0, NTP_PACKET_SIZE); // alle Bytes im Puffer auf 0 setzen // Werte initialisieren, die zum Bilden der NTP-Anforderung benötigt werden NTPBuffer[0] = 0b11100011; // LI, Version, Mode // ein Paket senden, das einen Zeitstempel anfordert: UDP.beginPacket(address, 123); // NTP-Anfragen sind an 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; }

Schritt 5: Verwenden Sie es

Benutze es!
Benutze es!
Benutze es!
Benutze es!

Verlegen Sie Ihre Kabel zum Inneren des Schüsselhalters und schließen Sie Ihr Katzenfutter mit einem USB-Netzteil an eine Steckdose an. So wie der einfache Code geschrieben ist, soll er im "offenen" Zustand hochgefahren werden und ändert seine Deckelposition nur zu den in der Arduino-Skizze angegebenen Zeitschwellen.

Danke fürs Mitmachen! Wenn Sie Ihre eigene Version erstellen, würde ich sie gerne im Abschnitt "Ich habe es gemacht" unten sehen!

Wenn Ihnen dieses Projekt gefällt, interessieren Sie sich vielleicht für einige meiner anderen:

  • Prismenhalter für Regenbogenporträts
  • Sperrholz-Lagerwand mit Katzenturm
  • LED Mason Jar Laternen (3D gedruckter Deckel)
  • Filament-Trockenbox für 3D-Drucker
  • Notfall-USB-Stromquelle (3D gedruckt)
  • Leuchtende LED Gummibonbons
  • 3D gedruckter geometrischer Übertopf mit Entwässerung
  • Leuchtende 3D-gedruckte Blumen
  • So installieren Sie LEDs unter einem Roller (mit Bluetooth)

Folgen Sie mir auf YouTube, Instagram, Twitter und Pinterest, um auf dem Laufenden zu bleiben, woran ich arbeite.

Empfohlen: