Πίνακας περιεχομένων:

Control Food Access Control (ESP8266 + Servo Motor + 3D Printing): 5 βήματα (με εικόνες)
Control Food Access Control (ESP8266 + Servo Motor + 3D Printing): 5 βήματα (με εικόνες)

Βίντεο: Control Food Access Control (ESP8266 + Servo Motor + 3D Printing): 5 βήματα (με εικόνες)

Βίντεο: Control Food Access Control (ESP8266 + Servo Motor + 3D Printing): 5 βήματα (με εικόνες)
Βίντεο: Pet feeder controlled via WiFi - ESP8266 Wemos D1 Mini and 28BYJ-48 Stepper Motor 2024, Ιούνιος
Anonim
Image
Image
Control Food Access Control (ESP8266 + Servo Motor + 3D Printing)
Control Food Access Control (ESP8266 + Servo Motor + 3D Printing)

Αυτό το έργο περνάει πάνω από τη διαδικασία που χρησιμοποίησα για τη δημιουργία ενός αυτοματοποιημένου μπολ τροφής για γάτες, για την ηλικιωμένη διαβητική γάτα Chaz. Βλέπετε, πρέπει να φάει πρωινό πριν προλάβει να πάρει την ινσουλίνη του, αλλά συχνά ξεχνάω να πάρω το φαγητό του πριν κοιμηθώ, κάτι που του χαλάει την όρεξη και το πρόγραμμα ινσουλίνης του. Αυτό το πιάτο χρησιμοποιεί σερβοκινητήρα για να κλείσει το καπάκι του φαγητού μεταξύ των μεσάνυχτων και των 7:30 π.μ. Το σκίτσο του Arduino του μικροελεγκτή NodeMCU ESP8266 χρησιμοποιεί το πρωτόκολλο δικτυακής ώρας (NTP) για τον έλεγχο του προγράμματος.

Αυτό το έργο μπορεί να μην είναι κατάλληλο για νεότερες, πιο δραστήριες γάτες. Ο Chaz είναι τόσο παλιός και αδύναμος, δεν είναι διατεθειμένος να προσπαθήσει να ανοίξει το μπολ, αλλά είναι δυνατό.

Εάν είστε νέοι στο Arduino ή στο ESP8266, μπορείτε να απολαύσετε τους ακόλουθους προαπαιτούμενους οδηγούς:

  • Οδηγίες Arduino Class
  • Instructables Class of Internet of Things

Προμήθειες

  • 3D εκτυπωτής (χρησιμοποιώ Creality CR-10s Pro)
  • Νήμα 3D εκτυπωτή (χρησιμοποιώ χρυσό PLA)
  • Μικροελεγκτής NodeMCU ESP8266 wifi
  • Καλώδιο USB (A έως microB)
  • Προσαρμογέας ρεύματος USB
  • Μικρο σερβοκινητήρας
  • Μικρό κατσαβίδι και βίδες
  • Σύρμα σύνδεσης
  • Καρφίτσες κεφαλίδας
  • Πίνακας Perma-proto

Για να συμβαδίσετε με αυτό που δουλεύω, ακολουθήστε με στο YouTube, το Instagram, το Twitter, το Pinterest και εγγραφείτε στο newsletter μου. Ως Amazon Associate κερδίζω από κατάλληλες αγορές που πραγματοποιείτε χρησιμοποιώντας τους συνδέσμους συνεργατών μου.

Βήμα 1: Τμήματα εκτυπωμένων 3D

Τρισδιάστατα εκτυπωμένα ανταλλακτικά
Τρισδιάστατα εκτυπωμένα ανταλλακτικά
Τρισδιάστατα εκτυπωμένα ανταλλακτικά
Τρισδιάστατα εκτυπωμένα ανταλλακτικά

Ο κάτοχος του μπολ τροφής για γάτες βασίζεται στο σχέδιο του Ardy Lai στο Thingiverse. Το έκανα μεγαλύτερο για να χωρέσω το μπολ της γάτας μου, και το έκανα επίσης πιο κοντό, αφού το κλιμάκωμά του το είχε κάνει πολύ ψηλό. Πρόσθεσα ένα στήριγμα για έναν σερβοκινητήρα μικροϋπολογιστή και μερικές οπές για καλώδια για να περάσουν στο εσωτερικό.

Μοντελοποίησα ένα απλό καπάκι χρησιμοποιώντας το Tinkercad, σχεδιασμένο για να στερεώνεται στο κέρατο του μικρο σερβο. Μπορείτε να πάρετε το σχέδιό μου απευθείας από το Tinkercad και/ή να κατεβάσετε τα STL που επισυνάπτονται σε αυτό το βήμα.

Τύπωσα τα μέρη στον εκτυπωτή μου Creality CR-10s Pro με χρυσό νήμα PLA.

Αποκάλυψη: τη στιγμή που γράφω αυτό το άρθρο, είμαι υπάλληλος της Autodesk, η οποία κάνει το Tinkercad.

Βήμα 2: Συνδέστε το καπάκι στο σερβοκινητήρα

Συνδέστε το καπάκι στο σερβοκινητήρα
Συνδέστε το καπάκι στο σερβοκινητήρα
Συνδέστε το καπάκι στο σερβοκινητήρα
Συνδέστε το καπάκι στο σερβοκινητήρα

Χρησιμοποίησα ένα μικρό τρυπάνι για να αυξήσω το μέγεθος των οπών στο κέρατο σερβο, και στη συνέχεια χρησιμοποίησα βίδες για να συνδέσω το σερβο στο τρισδιάστατο καπάκι.

Βήμα 3: Δημιουργία κυκλώματος NodeMCU ESP8266

Δημιουργία κυκλώματος NodeMCU ESP8266
Δημιουργία κυκλώματος NodeMCU ESP8266
Δημιουργία κυκλώματος NodeMCU ESP8266
Δημιουργία κυκλώματος NodeMCU ESP8266
Δημιουργία κυκλώματος NodeMCU ESP8266
Δημιουργία κυκλώματος NodeMCU ESP8266
Δημιουργία κυκλώματος NodeMCU ESP8266
Δημιουργία κυκλώματος NodeMCU ESP8266

Το κύκλωμα ελέγχεται από έναν μικροελεγκτή wifi NodeMCU ESP8266. Χρησιμοποίησα καρφίτσες κεφαλίδας σε έναν πίνακα perma-proto για να κάνω τον μικρο σερβοκινητήρα εύκολα αποσπώμενο. Οι κεφαλίδες σερβο συνδέονται με το NodeMCU ως εξής:

Κίτρινο σερβοσύρμα: NodeMCU D1

Κόκκινο σερβοσύρμα: Ισχύς NodeMCU (3V3 ή VIN)

Μαύρο σερβοσύρμα: NodeMCU γείωση (GND)

Βήμα 4: Μεταφόρτωση κώδικα και δοκιμή Arduino

Μεταφόρτωση κώδικα και δοκιμή Arduino
Μεταφόρτωση κώδικα και δοκιμή Arduino

Τοποθετήστε το συγκρότημα του κινητήρα/του καπακιού σας στο μοτέρ σε σχήμα μοτέρ στο τρισδιάστατο κομμάτι της θήκης του μπολ. Συνδέστε την κεφαλίδα του κινητήρα στις ακίδες κεφαλίδας της πλακέτας μικροελεγκτή και συνδέστε το κύκλωμα στον υπολογιστή σας με καλώδιο USB.

Το σκίτσο του Arduino χρησιμοποιεί το πρωτόκολλο Network Time για την ανάκτηση της τρέχουσας ώρας και στη συνέχεια ανοίγει ή κλείνει το καπάκι σύμφωνα με ένα σκληρό κωδικοποιημένο πρόγραμμα. Αντιγράψτε τον ακόλουθο κώδικα, ενημερώστε τα διαπιστευτήριά σας wifi και τον χρόνο αντιστάθμισης UTC και ανεβάστε τον στον πίνακα NodeMCU χρησιμοποιώντας το Arduino IDE.

#περιλαμβάνω

#include #include #include ESP8266WiFiMulti wifiMulti; // Δημιουργήστε ένα παράδειγμα της κλάσης ESP8266WiFiMulti, που ονομάζεται «wifiMulti» WiFiUDP UDP. // Δημιουργήστε ένα παράδειγμα της κλάσης WiFiUDP για αποστολή και λήψη IPAddress timeServerIP. // time.nist.gov Διεύθυνση διακομιστή NTP const char* NTPServerName = "time.nist.gov"; const int NTP_PACKET_SIZE = 48; // Η χρονική σήμανση NTP είναι στα πρώτα 48 byte του byte μηνύματος NTPBuffer [NTP_PACKET_SIZE]. // buffer για τη διατήρηση εισερχόμενων και εξερχόμενων πακέτων Servo myservo. // δημιουργία αντικειμένου σερβο για τον έλεγχο ενός σερβο // δώδεκα σερβο αντικείμενα μπορούν να δημιουργηθούν στους περισσότερους πίνακες int pos = 0; // μεταβλητή για αποθήκευση της θέσης σερβο void setup () {myservo.attach (5); // συνδέει το σερβο στον πείρο 5 ή αλλιώς D1 στο σερβο αντικείμενο // ανοίξτε το καπάκι από προεπιλογή Serial.println ("άνοιγμα του καπακιού"). για (pos = 95; pos> = 0; pos -= 1) {// πηγαίνει από 95 μοίρες σε 0 μοίρες myservo.write (pos); // πείτε στο servo να μεταβεί στη θέση στη μεταβλητή "pos" καθυστέρηση (15). // περιμένει 15ms για να φτάσει το σερβο στη θέση} Serial.begin (115200). // Ξεκινήστε τη Σειριακή επικοινωνία για να στείλετε μηνύματα στον υπολογιστή καθυστέρηση (10). Serial.println ("\ r / n"); startWiFi (); // Προσπαθήστε να συνδεθείτε σε ορισμένα σημεία πρόσβασης. Στη συνέχεια, περιμένετε μια σύνδεση startUDP (); εάν (! WiFi.hostByName (NTPServerName, timeServerIP)) {// Λάβετε τη διεύθυνση IP του διακομιστή NTP Serial.println ("Η αναζήτηση DNS απέτυχε. Επανεκκίνηση."); Serial.flush (); ESP.reset (); } Serial.print ("IP διακομιστή ώρας: / t"); Serial.println (timeServerIP); Serial.println ("\ r / nΑποστολή αιτήματος NTP …"); sendNTPpacket (timeServerIP); } ανυπόγραφο μεγάλο διάστημαNTP = 60000; // Αίτημα χρόνου NTP κάθε λεπτό χωρίς υπογραφή μακροχρόνιο prevNTP = 0; ανυπόγραφο μακρύ lastNTPResponse = millis (); uint32_t timeUNIX = 0; ανυπόγραφο μεγάλο prevActualTime = 0; void loop () {unsigned long currentMillis = millis (); if (currentMillis - prevNTP> intervalNTP) {// Εάν έχει περάσει ένα λεπτό από το τελευταίο αίτημα NTP prevNTP = currentMillis; Serial.println ("\ r / nΑποστολή αιτήματος NTP …"); sendNTPpacket (timeServerIP); // Αποστολή αιτήματος NTP} uint32_t time = getTime (); // Ελέγξτε εάν έχει φτάσει μια απάντηση NTP και λάβετε την ώρα (UNIX) εάν (ώρα) {// Εάν έχει ληφθεί νέα χρονική σήμανση ώρα UNIX = ώρα. Serial.print ("Απόκριση NTP: / t"); Serial.println (timeUNIX); lastNTPResponse = currentMillis; } else if ((currentMillis - lastNTPResponse)> 3600000) {Serial.println ("Περισσότερο από 1 ώρα από την τελευταία απάντηση NTP. Επανεκκίνηση."); Serial.flush (); ESP.reset (); } uint32_t actualTime = timeUNIX + (currentMillis - lastNTPResponse)/1000; uint32_t easternTime = timeUNIX - 18000 + (currentMillis - lastNTPResponse)/1000; εάν (actualTime! = prevActualTime && timeUNIX! = 0) {// Εάν έχει περάσει ένα δευτερόλεπτο από την τελευταία εκτύπωση prevActualTime = actualTime; Serial.printf ("\ rUTC time: / 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 (); } // 7:30 π.μ. αν (getHours (EasternTime) == 7 && getMinutes (eastTime) == 30 && getSeconds (EasternTime) == 0) {// ανοίξτε το καπάκι Serial.println ("άνοιγμα του καπακιού"); για (pos = 95; pos> = 0; pos -= 1) {// πηγαίνει από 95 μοίρες σε 0 μοίρες myservo.write (pos); // πείτε στο servo να μεταβεί στη θέση στη μεταβλητή "pos" καθυστέρηση (15). // περιμένει 15ms για να φτάσει το σερβο στη θέση}} // μεσάνυχτα αν (getHours (eastTime) == 0 && getMinutes (eastTime) == 0 && getSeconds (EasternTime) == 0) {// κλείστε το σειριακό καπάκι. println ("κλείσιμο του καπακιού")? για (pos = 0; pos <= 95; pos += 1) {// πηγαίνει από 0 μοίρες σε 95 μοίρες // σε βήματα 1 βαθμού myservo.write (pos); // πείτε στο servo να μεταβεί στη θέση στη μεταβλητή "pos" καθυστέρηση (15). // περιμένει 15ms για να φτάσει το σερβο στη θέση}} /* // δοκιμή εάν (getHours (eastTime) == 12 && getMinutes (eastTime) == 45 && getSeconds (EasternTime) == 0) {// κλείστε το καπάκι Serial.println ("κλείσιμο του καπακιού"); για (pos = 0; pos = 0; pos -= 1) {// πηγαίνει από 95 μοίρες σε 0 βαθμούς myservo.write (pos); // πείτε στο servo να μεταβεί στη θέση στη μεταβλητή "pos" καθυστέρηση (15). // περιμένει 15ms για να φτάσει το σερβο στη θέση}} */} void startWiFi () {// Προσπαθήστε να συνδεθείτε σε ορισμένα σημεία πρόσβασης. Στη συνέχεια, περιμένετε μια σύνδεση wifiMulti.addAP ("ssid_from_AP_1", "your_password_for_AP_1"); // προσθέστε δίκτυα Wi-Fi στα οποία θέλετε να συνδεθείτε //wifiMulti.addAP("ssid_from_AP_2 "," your_password_for_AP_2 "); //wifiMulti.addAP("ssid_from_AP_3 "," your_password_for_AP_3 "); Serial.println ("Σύνδεση"); while (wifiMulti.run ()! = WL_CONNECTED) {// Περιμένετε να καθυστερήσει η σύνδεση Wi-Fi (250); Serial.print ('.'); } Serial.println ("\ r / n"); Serial.print ("Συνδέθηκε με"); Serial.println (WiFi. SSID ()); // Πείτε μας σε ποιο δίκτυο είμαστε συνδεδεμένοι στο Serial.print ("Διεύθυνση IP: / t"); Serial.print (WiFi.localIP ()); // Στείλτε τη διεύθυνση IP του ESP8266 στον υπολογιστή Serial.println ("\ r / n"); } void startUDP () {Serial.println ("Έναρξη UDP"); UDP.begin (123); // Ξεκινήστε να ακούτε μηνύματα UDP στη θύρα 123 Serial.print ("Τοπική θύρα: / t"); Serial.println (UDP.localPort ()); Serial.println (); } uint32_t getTime () {if (UDP.parsePacket () == 0) {// Εάν δεν υπάρχει απάντηση (ακόμα) επιστρέψτε 0; } UDP.read (NTPBuffer, NTP_PACKET_SIZE); // διαβάστε το πακέτο στο buffer // Συνδυάστε τα 4 bytes χρονικής σήμανσης σε έναν αριθμό 32-bit uint32_t NTPTime = (NTPBuffer [40] << 24) | (NTPBuffer [41] << 16) | (NTPBuffer [42] << 8) | NTPBuffer [43]; // Μετατροπή χρόνου NTP σε χρονική σήμανση UNIX: // Ο χρόνος Unix ξεκινά την 1η Ιανουαρίου 1970. Δηλαδή 2208988800 δευτερόλεπτα σε χρόνο NTP: const uint32_t εβδομήντα Χρόνια = 2208988800UL; // αφαιρέστε εβδομήντα χρόνια: uint32_t UNIXTime = NTPTime - εβδομήντα χρόνια; επιστροφή UNIXTime. } void sendNTPpacket (IPAddress & address) {memset (NTPBuffer, 0, NTP_PACKET_SIZE); // ορίστε όλα τα byte στο buffer σε 0 // Αρχικοποιήστε τις τιμές που απαιτούνται για τη δημιουργία αιτήματος NTP NTPBuffer [0] = 0b11100011; // LI, Έκδοση, Λειτουργία // αποστολή πακέτου ζητώντας χρονική σήμανση: UDP.beginPacket (διεύθυνση, 123); // Τα αιτήματα NTP είναι στη θύρα 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; }

Βήμα 5: Χρησιμοποιήστε το

Χρησιμοποιησετο!
Χρησιμοποιησετο!
Χρησιμοποιησετο!
Χρησιμοποιησετο!

Δρομολογήστε τα καλώδια σας στο εσωτερικό της θήκης μπολ και συνδέστε τον τροφοδότη γάτας σας σε πρίζα χρησιμοποιώντας προσαρμογέα εναλλασσόμενου ρεύματος USB. Ο τρόπος με τον οποίο γράφεται ο απλός κώδικας, προορίζεται για εκκίνηση σε κατάσταση "ανοικτής" και θα αλλάξει τη θέση του καπακιού μόνο στα χρονικά όρια που καθορίζονται στο σκίτσο του Arduino.

Ευχαριστώ που ακολουθήσατε! Αν φτιάξετε τη δική σας έκδοση, θα ήθελα πολύ να την δω στην ενότητα I Made It παρακάτω!

Αν σας αρέσει αυτό το έργο, μπορεί να σας ενδιαφέρουν μερικά από τα άλλα μου:

  • Prism Holder για πορτρέτα Rainbow
  • Τοίχος αποθήκευσης κόντρα πλακέ με πύργο γάτας
  • LED Mason Jar Lanterns (τρισδιάστατο καπάκι)
  • Τρισδιάστατο κουτί νήματος εκτυπωτή
  • Πηγή ισχύος USB έκτακτης ανάγκης (τρισδιάστατη εκτύπωση)
  • Λαμπερό LED Gummy Candy
  • Τρισδιάστατη εκτύπωση γεωμετρικού φυτευτή με αποχέτευση
  • Λαμπερά τρισδιάστατα λουλούδια
  • Πώς να εγκαταστήσετε LED κάτω από ένα σκούτερ (με Bluetooth)

Για να συμβαδίσετε με αυτό που δουλεύω, ακολουθήστε με στο YouTube, το Instagram, το Twitter και το Pinterest.

Συνιστάται: