תוכן עניינים:

בקרת גישה לחתולים (ESP8266 + מנוע סרוו + הדפסה תלת -ממדית): 5 שלבים (עם תמונות)
בקרת גישה לחתולים (ESP8266 + מנוע סרוו + הדפסה תלת -ממדית): 5 שלבים (עם תמונות)

וִידֵאוֹ: בקרת גישה לחתולים (ESP8266 + מנוע סרוו + הדפסה תלת -ממדית): 5 שלבים (עם תמונות)

וִידֵאוֹ: בקרת גישה לחתולים (ESP8266 + מנוע סרוו + הדפסה תלת -ממדית): 5 שלבים (עם תמונות)
וִידֵאוֹ: איך להשיג ג'יימס בחינם!!😨 2024, יוני
Anonim
Image
Image
בקרת גישה למזון לחתולים (ESP8266 + מנוע סרוו + הדפסה תלת -ממדית)
בקרת גישה למזון לחתולים (ESP8266 + מנוע סרוו + הדפסה תלת -ממדית)

פרויקט זה עובר על התהליך בו יצרתי קערה אוטומטית של מזון לחתולים, לחתול הסוכרת הזקנה שלי צ'אז. תראה, הוא צריך לאכול ארוחת בוקר לפני שהוא יכול לקבל את האינסולין שלו, אבל לעתים קרובות אני שוכח לאסוף את מנת האוכל שלו לפני שאני הולך לישון, מה שמקלקל לו את התיאבון ומוריד את לוח הזמנים של האינסולין. מנה זו משתמשת במנוע סרוו כדי לסגור מכסה על האוכל בין השעות חצות ל -7: 30 בבוקר. מערכון Arduino של מיקרו -בקר ESP8266 של NodeMCU משתמש בפרוטוקול זמן רשת (NTP) לשליטה בלוח הזמנים.

ייתכן שפרויקט זה אינו מתאים לחתולים צעירים ופעילים יותר. צ'אז כל כך זקן ושברירי, שהוא לא נוטה לחטוף את הקערה, אבל זה אפשרי.

אם אתה חדש ב- Arduino או ב- ESP8266, תוכל ליהנות מהמדריכים המתאימים להלן:

  • שיעור Arduino מדריך
  • שיעור הוראות אינטרנט של דברים

אספקה

  • מדפסת תלת מימד (אני משתמש ב- Creality CR-10s Pro)
  • נימה של מדפסת תלת מימד (אני משתמש ב- PLA זהב)
  • NodeMCU ESP8266 מיקרו -בקר wifi
  • כבל USB (A ל- microB)
  • מתאם מתח USB
  • מנוע מיקרו סרוו
  • מברג וברגים קטנים
  • חוט חיבור
  • סיכות כותרת
  • לוח פרמה-פרוטו

כדי להתעדכן במה שאני עובד, עקוב אחריי ב- YouTube, אינסטגרם, טוויטר, פינטרסט והירשם לניוזלטר שלי. בתור עמית אמזון אני מרוויח מרכישות מתאימות שאתה מבצע באמצעות הקישורים השותפים שלי.

שלב 1: חלקים מודפסים בתלת מימד

חלקים מודפסים בתלת מימד
חלקים מודפסים בתלת מימד
חלקים מודפסים בתלת מימד
חלקים מודפסים בתלת מימד

מחזיק קערת מזון לחתולים מבוסס על העיצוב של ארדי לאי ב- 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

המעגל נשלט על ידי מיקרו -בקר Wi -Fi NodeMCU ESP8266. השתמשתי בסיכות כותרת על לוח פרמה-פרוטו כדי להפוך את מנוע המיקרו סרוו לניתוק בקלות. כותרות הסרו מחוברות ל- NodeMCU כדלקמן:

חוט סרוו צהוב: NodeMCU D1

חוט סרוו אדום: כוח NodeMCU (3V3 או VIN)

חוט סרוו שחור: NodeMCU הקרקע (GND)

שלב 4: העלה קוד Arduino ובדוק

העלה קוד Arduino ובדוק
העלה קוד Arduino ובדוק

התקן את מכלול המנוע/המכסה שלך בחתך בצורת המנוע על החלק המודפס בתלת-ממד למחזיק הקערה. חבר את כותרת המנוע לסיכות הכותרת של לוח הבקרה, וחבר את המעגל למחשב באמצעות כבל USB.

המערכון של Arduino משתמש בפרוטוקול Time Network כדי להביא את השעה הנוכחית ולאחר מכן פותח או סוגר את המכסה בהתאם ללוח זמנים מקודד. העתק את הקוד הבא, עדכן את אישורי ה- 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 הבייטים הראשונים של ה- NTPBuffer [NTP_PACKET_SIZE] של בית ההודעה; // מאגר להחזיק מנות נכנסות ויוצאות Servo myservo; // צור אובייקט סרוו לשליטה בסרוו // ניתן ליצור 12 אובייקטים של סרוו ברוב הלוחות int pos = 0; // משתנה לאחסון מיקום סרוו הגדרת חלל () {myservo.attach (5); // מחבר את הסרוו על סיכה 5 aka D1 לאובייקט הסרוו // פותח את המכסה כברירת מחדל Serial.println ("פתיחת המכסה"); עבור (pos = 95; pos> = 0; pos -= 1) {// עובר מ- 95 מעלות ל- 0 מעלות myservo.write (pos); // אמור לסרוו ללכת למיקום בהשהיית 'pos' משתנה (15); // ממתין 15 ms עד שהסרוו יגיע למיקום} Serial.begin (115200); // הפעל את התקשורת הטורית לשליחת הודעות לעיכוב המחשב (10); Serial.println ("\ r / n"); startWiFi (); // נסה להתחבר לכמה נקודות גישה נתונות. לאחר מכן המתן להתחלת החיבור startUDP (); if (! WiFi.hostByName (NTPServerName, timeServerIP)) {// קבל את כתובת ה- IP של שרת NTP Serial.println ("חיפוש DNS נכשל. אתחול מחדש"); Serial.flush (); ESP.reset (); } Serial.print ("כתובת שרת הזמן: / t"); Serial.println (timeServerIP); Serial.println ("\ r / n שליחת בקשת NTP …"); sendNTPpacket (timeServerIP); } מרווח ארוך לא חתום NTP = 60000; // בקש זמן NTP בכל דקה ללא חתימה ארוכה prevNTP = 0; לא חתום האחרון NTPResponse = millis (); uint32_t timeUNIX = 0; prevActualTime = 0; לולאת חלל () {unsign current longMillis = millis (); if (currentMillis - prevNTP> intervalNTP) {// אם עברה דקה מאז בקשת NTP האחרונה prevNTP = currentMillis; Serial.println ("\ r / n שליחת בקשת NTP …"); sendNTPpacket (timeServerIP); // שלח בקשת NTP} uint32_t time = getTime (); // בדוק אם הגיעה תגובת NTP וקבל את הזמן (UNIX) אם (זמן) {// אם חותמת זמן חדשה התקבלה timeUNIX = time; Serial.print ("תגובת NTP: / t"); Serial.println (timeUNIX); lastNTPResponse = currentMillis; } else if ((currentMillis - lastNTPResponse)> 3600000) {Serial.println ("יותר משעה מאז תגובת NTP האחרונה. אתחול מחדש."); Serial.flush (); ESP.reset (); } uint32_t actualTime = timeUNIX + (currentMillis - lastNTPResponse)/1000; uint32_t eastTime = timeUNIX - 18000 + (currentMillis - lastNTPResponse)/1000; if (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 (eastTime)); Serial.println (); } // 7:30 אם (getHours (eastTime) == 7 && getMinutes (eastTime) == 30 && getSeconds (eastTime) == 0) {// פתח את המכסה Serial.println ("פתיחת המכסה"); עבור (pos = 95; pos> = 0; pos -= 1) {// עובר מ- 95 מעלות ל- 0 מעלות myservo.write (pos); // אמור לסרוו ללכת למיקום בהשהיית 'pos' משתנה (15); // מחכה 15 ms עד שהסרוו יגיע למיקום}} // חצות אם (getHours (eastTime) == 0 && getMinutes (eastTime) == 0 && getSeconds (eastTime) == 0) {// סגור את המכסה סידורי. println ("סגירת המכסה"); עבור (pos = 0; pos <= 95; pos += 1) {// עובר מ 0 מעלות ל 95 מעלות // בשלבים של מעלה אחת myservo.write (pos); // אמור לסרוו ללכת למיקום בהשהיית 'pos' משתנה (15); // ממתין 15 ms עד שהסרוו יגיע למיקום}} /* // בודק אם (getHours (eastTime) == 12 && getMinutes (eastTime) == 45 && getSeconds (eastTime) == 0) {// סגור את המכסה Serial.println ("סגירת המכסה"); עבור (pos = 0; pos = 0; pos -= 1) {// עובר מ- 95 מעלות ל- 0 מעלות myservo.write (pos); // אמור לסרוו ללכת למיקום בהשהיית 'pos' משתנה (15); // ממתין 15 ms עד שהסרוו יגיע למיקום}} */} חלל 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); // קרא את החבילה למאגר // שלב את 4 בתים של חותמת הזמן למספר אחד של 32 סיביות uint32_t NTPTime = (NTPBuffer [40] << 24) | (NTPBuffer [41] << 16) | (NTPBuffer [42] << 8) | NTPBuffer [43]; // המרת זמן NTP לחותמת UNIX: // זמן יוניקס מתחיל ב -1 בינואר 1970. זה 2208988800 שניות בזמן NTP: const uint32_t seventyYears = 2208988800UL; // להפחית שבעים שנה: uint32_t UNIXTime = NTPTime - שבעים שנה; החזר UNIXTime; } void sendNTPpacket (IPAddress & address) {memset (NTPBuffer, 0, NTP_PACKET_SIZE); // הגדר את כל הבייטים במאגר ל- 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) {החזר UNIXTime % 60; } inline int getMinutes (uint32_t UNIXTime) {החזר UNIXTime / 60 % 60; } inline int getHours (uint32_t UNIXTime) {החזר UNIXTime / 3600 % 24; }

שלב 5: השתמש בו

תשתמש בזה!
תשתמש בזה!
תשתמש בזה!
תשתמש בזה!

נתב את החוטים שלך אל החלק הפנימי של מחזיק הקערה, וחבר את מזין החתולים לשקע באמצעות מתאם USB USB. אופן כתיבת הקוד הפשוט, נועד לאתחל במצב "פתוח", וישנה את מיקום המכסה שלו רק בזמן ספי הזמן שצוינו במערכון של Arduino.

תודה על ההמשך! אם אתה יוצר גרסה משלך, אשמח לראות אותה בקטע 'הכנתי' להלן!

אם אתה אוהב את הפרויקט הזה, אתה עשוי להתעניין בכמה מהאחרים שלי:

  • מחזיק פריזמה לדיוקנאות קשת
  • קיר אחסון דיקט עם מגדל חתול
  • פנסי צנצנת LED של מייסון (מכסה מודפס בתלת מימד)
  • תיבת נימה למדפסת תלת מימד
  • מקור כוח חירום USB (מודפס בתלת מימד)
  • ממתק גומי LED זוהר
  • עציץ גיאומטרי מודפס בתלת מימד עם ניקוז
  • פרחים זוהרים המודפסים בתלת מימד
  • כיצד להתקין נוריות מתחת לקורקינט (עם בלוטות ')

כדי להתעדכן במה שאני עובד, עקוב אחריי ביוטיוב, אינסטגרם, טוויטר ופינטרסט.

מוּמלָץ: