جدول المحتويات:
- اللوازم
- الخطوة 1: أجزاء مطبوعة ثلاثية الأبعاد
- الخطوة 2: قم بتوصيل الغطاء بمحرك سيرفو
- الخطوة 3: بناء دائرة NodeMCU ESP8266
- الخطوة 4: قم بتحميل كود Arduino واختباره
- الخطوة 5: استخدمها
فيديو: التحكم في الوصول إلى طعام القطط (ESP8266 + محرك سيرفو + طباعة ثلاثية الأبعاد): 5 خطوات (بالصور)
2024 مؤلف: John Day | [email protected]. آخر تعديل: 2024-01-30 07:36
يمر هذا المشروع بالعملية التي استخدمتها لإنشاء وعاء طعام قطط آلي لقطتي المسنة تشاز. انظر ، إنه يحتاج إلى تناول وجبة الإفطار قبل أن يتمكن من الحصول على الأنسولين ، لكنني غالبًا ما أنسى أن أحضر طبق طعامه قبل أن أخلد إلى الفراش ، مما يفسد شهيته ويلغي جدول الأنسولين الخاص به. يستخدم هذا الطبق محركًا مؤازرًا لإغلاق غطاء فوق الطعام بين ساعات منتصف الليل والساعة 7:30 صباحًا. يستخدم رسم Arduino الخاص بالمتحكم الدقيق NodeMCU ESP8266 بروتوكول وقت الشبكة (NTP) للتحكم في الجدول.
قد لا يكون هذا المشروع مناسبًا للقطط الأصغر سنًا والأكثر نشاطًا. تشاز قديم جدًا وضعيف ، ولا يميل إلى محاولة فتح الوعاء ، لكن هذا ممكن.
إذا كنت جديدًا على Arduino أو ESP8266 ، فيمكنك الاستمتاع بإرشادات المتطلبات المسبقة التالية:
- دروس اردوينو
- Instructables إنترنت الأشياء Class
اللوازم
- طابعة ثلاثية الأبعاد (أستخدم Creality CR-10s Pro)
- خيوط طابعة ثلاثية الأبعاد (أستخدم PLA ذهبي)
- متحكم واي فاي NodeMCU ESP8266
- كابل USB (من A إلى microB)
- محول طاقة USB
- محرك سيرفو صغير
- مفك صغير ومسامير
- وصل الأسلاك
- دبابيس الرأس
- مجلس بيرما بروتو
لمواكبة ما أعمل عليه ، تابعوني على YouTube و Instagram و Twitter و Pinterest واشترك في رسالتي الإخبارية. بصفتي شريكًا في Amazon ، أكسب من عمليات الشراء المؤهلة التي تقوم بها باستخدام الروابط التابعة الخاصة بي.
الخطوة 1: أجزاء مطبوعة ثلاثية الأبعاد
يعتمد حامل وعاء طعام القطط على تصميم Ardy Lai على Thingiverse. لقد جعلتها أكبر لاستيعاب وعاء قطتي ، وجعلتها أقصر أيضًا لأن توسيعها جعلها طويلة جدًا. أضفت حاملًا لمحرك مؤازر صغير ، وبضع فتحات للكابلات لتوجيهها إلى الداخل.
لقد صممت غطاءًا بسيطًا باستخدام Tinkercad ، المصمم لربطه بقرن المؤازرة الدقيقة. يمكنك الحصول على تصميمي مباشرة من Tinkercad ، و / أو تنزيل STLs المرفقة بهذه الخطوة.
لقد قمت بطباعة الأجزاء على طابعة Creality CR-10s Pro الخاصة بي بفتيل PLA ذهبي.
الإفصاح: في وقت كتابة هذا التقرير ، كنت موظفًا في Autodesk ، مما يجعل Tinkercad.
الخطوة 2: قم بتوصيل الغطاء بمحرك سيرفو
لقد استخدمت مثقابًا صغيرًا لزيادة حجم الثقوب الموجودة على بوق المؤازرة ، ثم استخدمت البراغي لإرفاق المؤازرة بالغطاء المطبوع ثلاثي الأبعاد.
الخطوة 3: بناء دائرة NodeMCU ESP8266
يتم التحكم في الدائرة بواسطة متحكم واي فاي NodeMCU ESP8266. لقد استخدمت دبابيس رأس على لوحة perma-proto لجعل محرك سيرفو الصغير قابل للفصل بسهولة. تتصل رؤوس المؤازرة بـ NodeMCU على النحو التالي:
سلك مؤازر أصفر: NodeMCU D1
سلك مؤازر أحمر: طاقة NodeMCU (3V3 أو VIN)
سلك مؤازر أسود: NodeMCU ground (GND)
الخطوة 4: قم بتحميل كود Arduino واختباره
قم بتثبيت مجموعة المحرك / الغطاء في الفتحة على شكل محرك على الجزء المطبوع ثلاثي الأبعاد لحامل الوعاء. قم بتوصيل رأس المحرك في دبابيس رأس لوحة التحكم الدقيق ، وقم بتوصيل الدائرة بجهاز الكمبيوتر الخاص بك باستخدام كبل USB.
يستخدم مخطط Arduino بروتوكول وقت الشبكة لجلب الوقت الحالي ثم يفتح الغطاء أو يغلقه وفقًا لجدول زمني مشفر. انسخ الكود التالي ، وقم بتحديث بيانات اعتماد wifi الخاصة بك وإزاحة التوقيت العالمي المنسق (UTC) ، وقم بتحميله على لوحة NodeMCU الخاصة بك باستخدام Arduino IDE.
#يشمل
# تتضمن # تتضمن # تتضمن 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 ؛ // إنشاء كائن مؤازر للتحكم في مؤازرة // يمكن إنشاء اثني عشر كائنًا مؤازرًا على معظم اللوحات int pos = 0 ؛ // متغير لتخزين إعداد الفراغ لموضع المؤازرة () {myservo.attach (5)؛ // يعلق المؤازرة على الدبوس 5 المعروف أيضًا باسم D1 بكائن المؤازرة // افتح الغطاء افتراضيًا Serial.println ("فتح الغطاء") ؛ لـ (pos = 95 ؛ pos> = 0 ؛ pos - = 1) {// ينتقل من 95 درجة إلى 0 درجة myservo.write (pos) ؛ // أخبر المؤازرة بالانتقال إلى الموضع في تأخير "نقاط البيع" المتغير (15) ؛ // ينتظر 15 مللي ثانية حتى تصل المؤازرة إلى الموضع} Serial.begin (115200) ؛ // بدء الاتصال التسلسلي لإرسال رسائل إلى تأخير الكمبيوتر (10) ؛ Serial.println ("\ r / n")؛ startWiFi () ، // حاول الاتصال ببعض نقاط الوصول المحددة. ثم انتظر بدء اتصال UDP () ؛ if (! 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 ؛ long lastNTPResponse = millis () بدون توقيع ، uint32_t timeUNIX = 0 ؛ prevActualTime طويل بدون توقيع = 0 ؛ حلقة فارغة () {تيار طويل غير موقعة ميليس = ميليس () ؛ if (currentMillis - prevNTP> interalNTP) {// إذا مرت دقيقة منذ آخر طلب 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 activeTime = timeUNIX + (currentMillis - lastNTPResponse) / 1000 ؛ uint32_t EasternTime = timeUNIX - 18000 + (currentMillis - lastNTPResponse) / 1000 ؛ if (activeTime! = prevActualTime && timeUNIX! = 0) {// إذا مرت ثانية منذ آخر طباعة prevActualTime = الفعليTime؛ Serial.printf ("\ rUTC time: / t٪ d:٪ d:٪ d"، getHours (realTime)، getMinutes (realTime)، getSeconds (realTime))؛ Serial.printf ("\ rEST (-5): / t٪ d:٪ d:٪ d" ، getHours (EasternTime) ، getMinutes (EasternTime) ، getSeconds (EasternTime)) ؛ Serial.println () ، } // 7:30 صباحًا إذا (getHours (EasternTime) == 7 && getMinutes (EasternTime) == 30 && getSeconds (EasternTime) == 0) {// open the lid Serial.println ("فتح الغطاء") ؛ لـ (pos = 95 ؛ pos> = 0 ؛ pos - = 1) {// ينتقل من 95 درجة إلى 0 درجة myservo.write (pos) ؛ // أخبر المؤازرة بالانتقال إلى الموضع في تأخير "نقاط البيع" المتغير (15) ؛ // ينتظر 15 مللي ثانية حتى تصل المؤازرة إلى الموضع}} // منتصف الليل إذا (getHours (EasternTime) == 0 && getMinutes (EasternTime) == 0 && getSeconds (EasternTime) == 0) {// أغلق الغطاء التسلسلي. println ("إغلاق الغطاء") ؛ لـ (pos = 0 ؛ pos <= 95 ؛ pos + = 1) {// ينتقل من 0 درجة إلى 95 درجة // في خطوات من درجة واحدة myservo.write (pos) ؛ // أخبر المؤازرة بالانتقال إلى الموضع في تأخير "نقاط البيع" المتغير (15) ؛ // ينتظر 15 مللي ثانية حتى تصل المؤازرة إلى الموضع}} / * // test if (getHours (EasternTime) == 12 && getMinutes (EasternTime) == 45 && getSeconds (EasternTime) == 0) {// أغلق الغطاء Serial.println ("إغلاق الغطاء") ؛ لـ (pos = 0 ؛ pos = 0 ؛ pos - = 1) {// ينتقل من 95 درجة إلى 0 درجة myservo.write (pos) ؛ // أخبر المؤازرة بالانتقال إلى الموضع في تأخير "نقاط البيع" المتغير (15) ؛ // wait 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) ؛ // اقرأ الحزمة في المخزن المؤقت // ادمج 4 بايتات طابع زمني واحد في رقم 32 بت واحد uint32_t NTPTime = (NTPBuffer [40] << 24) | (NTPBuffer [41] << 16) | (NTPBuffer [42] << 8) | NTPBuffer [43] ؛ // تحويل وقت NTP إلى طابع زمني UNIX: // يبدأ وقت Unix في 1 يناير 1970. هذا هو 2208988800 ثانية في وقت NTP: const uint32_t seventyYears = 2208988800UL؛ // طرح سبعين عامًا: uint32_t UNIXTime = NTPTime - سبعون عامًا ؛ إرجاع UNIXTime ؛ } sendNTPpacket باطل (عنوان IP وعنوان) {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) {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 أدناه!
إذا أعجبك هذا المشروع ، فقد تكون مهتمًا ببعض الآخرين:
- حامل موشور لصور قوس قزح
- جدار تخزين الخشب الرقائقي مع برج القط
- فوانيس برطمان ميسون LED (غطاء مطبوع ثلاثي الأبعاد)
- صندوق جاف من خيوط الطابعة ثلاثية الأبعاد
- مصدر طاقة USB للطوارئ (طباعة ثلاثية الأبعاد)
- متوهجة LED حلوى غائر
- زارع هندسي مطبوع ثلاثي الأبعاد مع الصرف الصحي
- زهور متوهجة ثلاثية الأبعاد مطبوعة
- كيفية تثبيت مصابيح LED تحت السكوتر (بالبلوتوث)
لمواكبة ما أعمل عليه ، تابعوني على YouTube و Instagram و Twitter و Pinterest.
موصى به:
متزلج كاميرا تتبع الكائن مع محور الدوران. طباعة ثلاثية الأبعاد ومبنية على وحدة تحكم محرك RoboClaw DC و Arduino: 5 خطوات (بالصور)
متزلج كاميرا تتبع الكائن مع محور الدوران. 3D مطبوعة ومبنية على RoboClaw DC Motor Controller & Arduino: كان هذا المشروع أحد مشاريعي المفضلة منذ أن تمكنت من الجمع بين اهتماماتي في صناعة الفيديو مع DIY. لطالما نظرت وأردت محاكاة تلك اللقطات السينمائية في الأفلام حيث تتحرك الكاميرا عبر الشاشة أثناء التحريك لتتبع
جهاز تغطية وعاء طعام القطط: 4 خطوات
جهاز تغطية وعاء طعام القطط: تم إنشاء هذا التوجيه للوفاء بمتطلبات المشروع الخاصة بـ Makecourse في جامعة جنوب فلوريدا (www.makecourse.com) في هذا الدليل سأوضح لك كيف صنعت جهاز Cat Food Bowl Covering الخاص بي. كان هذا الجهاز
التحكم في الوصول إلى Arduino YÚN باستخدام MySQL و PHP5 و Python: 11 خطوة (بالصور)
التحكم في الوصول إلى Arduino YÚN باستخدام MySQL و PHP5 و Python: مرحبًا أيها الأصدقاء! حسنًا ، كما تعلم ، في سبتمبر درع العرض الأول الجديد لـ Arduino ، Arduino YUN. هذا الصديق الصغير لديه نظام Linux مضمن يمكننا من خلاله تشغيل أي شيء يخطر ببالك (على الأقل حتى الآن). بينما هناك القليل جدًا من المعلومات
التحكم في الوصول إلى باب RFID مع عداد: 8 خطوات
التحكم في الوصول إلى باب RFID مع عداد: التحكم في الوصول إلى باب RFID مع برنامج تعليمي للعداد
قم بتحويل جهاز التحكم عن بعد IR الخاص بك إلى جهاز التحكم عن بعد RF: 9 خطوات (بالصور)
قم بتحويل جهاز التحكم عن بعد IR الخاص بك إلى جهاز التحكم عن بعد RF: في Instructable اليوم ، سأوضح لك كيف يمكنك استخدام وحدة RF العامة بدون وحدة تحكم دقيقة والتي ستقودنا في النهاية إلى بناء مشروع حيث يمكنك تحويل IR Remote لأي جهاز إلى RF بعيد. الميزة الرئيسية لتحويل