جدول المحتويات:

الوظيفة الإضافية لمشغل البوابة التي يتحكم فيها تطبيق الويب (IoT): 20 خطوة (بالصور)
الوظيفة الإضافية لمشغل البوابة التي يتحكم فيها تطبيق الويب (IoT): 20 خطوة (بالصور)

فيديو: الوظيفة الإضافية لمشغل البوابة التي يتحكم فيها تطبيق الويب (IoT): 20 خطوة (بالصور)

فيديو: الوظيفة الإضافية لمشغل البوابة التي يتحكم فيها تطبيق الويب (IoT): 20 خطوة (بالصور)
فيديو: طلعت معا اوبر ومشوارها نص ساعه وهيا وصول😭😭#shorts #ترند_السعودية #السعودية #tiktok 2024, شهر نوفمبر
Anonim
الوظيفة الإضافية لمشغل البوابة التي يتحكم فيها تطبيق الويب (IoT)
الوظيفة الإضافية لمشغل البوابة التي يتحكم فيها تطبيق الويب (IoT)
الوظيفة الإضافية لمشغل البوابة التي يتحكم فيها تطبيق الويب (IoT)
الوظيفة الإضافية لمشغل البوابة التي يتحكم فيها تطبيق الويب (IoT)
الوظيفة الإضافية لمشغل البوابة التي يتحكم فيها تطبيق الويب (IoT)
الوظيفة الإضافية لمشغل البوابة التي يتحكم فيها تطبيق الويب (IoT)

لدي عميل لديه منطقة مسورة حيث يحتاج الكثير من الناس للحضور والذهاب. لم يرغبوا في استخدام لوحة المفاتيح في الخارج وكان لديهم فقط عدد محدود من أجهزة الإرسال الموجودة في قاعدة المفاتيح. كان من الصعب العثور على مصدر ميسور التكلفة لمفاتيح إضافية. اعتقدت أنها ستكون فرصة رائعة لترقية مشغل بوابة Liftmaster هذا ليكون متوافقًا مع IoT مع الأجهزة المخصصة وواجهة برمجة تطبيقات الويب وواجهة تطبيقات الويب. هذا لم يحل مشكلة الوصول الجماعي فحسب ، بل فتح وظائف إضافية أيضًا!

في الصورة الأخيرة أعلاه ، توجد وحدة الاختبار التي أجريتها لمدة عام تقريبًا في كيس ziplock. اعتقدت أن الوقت قد حان للترقية!

هذا حل يعمل بكامل طاقته مع جميع التعليمات البرمجية ومعلومات الأجهزة والتصميمات المدرجة هنا.

يتم أيضًا استضافة جميع ملفات المشاريع على GitHub: github.com/ThingEngineer/IoT-Gate-Operator-Addon

يتم استضافة مثال لواجهة CodeIgniter WebApp هنا: projects.ajillion.com/gate هذا المثيل غير متصل ببوابة مباشرة ، ولكنه يمثل الواجهة والرمز الدقيق الذي يتم تشغيله على البوابات (باستثناء بعض ميزات الأمان).

--

لمزيد من التكامل ، يمكنك استخدام مكتبة IFTTT لـ Electric Imp.

الخطوة 1: اجمع الأجزاء

اجمع الأجزاء
اجمع الأجزاء
  • ستحتاج إلى IMP كهربائي مع توفر 4 GPIOs على الأقل ، وأنا أستخدم IMP001 مع لوحة اندلاع لشهر أبريل.
  • منظم لتخفيض جهد المصدر إلى 5 فولت. أنا أستخدم وحدة تنحى محول DC-DC. نسخة eBoot's MP1584EN من أمازون.
  • وحدة ترحيل ثنائية (أو أكثر) أو جهاز تبديل مشابه يعمل مع إخراج IMPs. أنا أستخدم وحدة JBtek 4 Channel DC 5V Relay هذه من Amazon.
  • طرف برغي ذو 4 أسلاك. أنا أستخدم هذا الحاجز الطرفي المكون من 5 قطع 2 صفوف 12P سلك موصل برغي 300 فولت 20 أمبير من أمازون.

الخطوة الثانية: المستلزمات

اللوازم
اللوازم

ستحتاج أيضًا إلى:

  • الوصول إلى طابعة ثلاثية الأبعاد أو صندوق مشروع صغير
  • 4 مسامير صغيرة حوالي 4 مم × 6 مم لغطاء العلبة
  • وصل الأسلاك
  • قواطع للاسلاك
  • قواطع الأسلاك
  • مفكات صغيرة
  • لحام حديد
  • الغراء الساخن أو السيليكون
  • العلاقات البريدية

الخطوة 3: قياس حجم العلبة

قياس حجم العلبة
قياس حجم العلبة

قم بتخطيط الأجزاء الخاصة بك لتحديد حجم الحالة التي ستحتاج إليها. مع التصميم كما هو موضح في الصورة ، سأحتاج إلى علبة بعرض 140 ملم وعمق 70 ملم وطول 30 ملم.

الخطوة 4: محول السلك DC-DC

محول سلك DC-DC
محول سلك DC-DC

قم بقطع 3 أزواج من أسلاك التوصيل باللونين الأحمر والأسود لتوصيلات الطاقة داخل وخارج لوحة محول DC-DC.

  • الإدخال: 100 مم
  • الإخراج إلى IMP: 90mm
  • الإخراج إلى وحدة الترحيل: 130 مللي متر

جندهم في لوحك كما هو موضح.

الخطوة 5: توصيل الطاقة بالأجهزة

سلك الطاقة للأجهزة
سلك الطاقة للأجهزة
  • قم بتوصيل مدخلات محول DC-DC بنقطتين على كتلة طرف المسمار.
  • جندى أسلاك الإخراج القصيرة 5 فولت بـ IMP.
  • لحام أسلاك الإخراج 5V الأطول إلى وحدة الترحيل.

الخطوة 6: مدخلات وحدة ترحيل الأسلاك

مدخلات وحدة ترحيل الأسلاك
مدخلات وحدة ترحيل الأسلاك
  • قطع 4 × 90 مم من الأسلاك لوصلات إدخال وحدة الترحيل. لقد استخدمت 4 ألوان منفصلة لسهولة الرجوع إليها لاحقًا أثناء الترميز.
  • قم بتوصيل الأسلاك بمدخلات وحدة الترحيل 1-4 ثم إلى أول 4 نقاط IMP GPIO (Pin1 و 2 و 5 و 7) على التوالي.

الخطوة 7: IMP Power Jumper

IMP Power Jumper. وصلة طاقة IMP
IMP Power Jumper. وصلة طاقة IMP

قد تحتاج إلى استخدام طاقة USB أثناء برمجة واختبار IMP الخاص بك في البداية. عند الانتهاء ، تأكد من تحريك وصلة مرور الطاقة إلى جانب BAT.

الخطوة 8: مدخلات حالة بوابة الأسلاك

مدخلات حالة بوابة الأسلاك
مدخلات حالة بوابة الأسلاك
  • قم بقص أسلاك 2 × 80 مم لمدخلات حالة التشبع.
  • قم بتوصيل الأسلاك بالمطاريف اللولبية المتبقية.
  • أسلاك اللحام إلى بجوار نقاط IMP GPIO (Pin8 & 9) على التوالي.

الخطوة 9: طباعة أو شراء حالة

طباعة أو شراء حقيبة
طباعة أو شراء حقيبة

يمكنك تنزيل. STL أو. F3D الخاص بي لهذه الحالة على GitHub أو Thingiverse

إذا لم يكن لديك وصول إلى طابعة ثلاثية الأبعاد ، فستعمل حالة مشروع عام صغير.

الخطوة 10: تزيين حقيبتك

تزيين حقيبتك
تزيين حقيبتك

لأن!

لقد وضعت بعض النصوص ذات المسافة البادئة على نصي وقمت بتلوينه ببراعة سوداء. إذا كنت تشعر بالمغامرة ، يمكنك استخدام طلاء الأكريليك أو طلاء الأظافر أو أي شيء آخر لجعله أكثر رشاقة.

الخطوة 11: حفر حفرة للأسلاك

ثقب الحفر للأسلاك
ثقب الحفر للأسلاك

حفر حفرة صغيرة 10-15 ملم على الجانب بالقرب من منتصف حيث ستجتمع جميع الأسلاك.

لقد استخدمت Unibit لثقب نظيف وسلس في البلاستيك.

الخطوة 12: إعداد وتثبيت أسلاك التوصيل

تحضير وتثبيت أسلاك التوصيل
تحضير وتثبيت أسلاك التوصيل
تحضير وتثبيت أسلاك التوصيل
تحضير وتثبيت أسلاك التوصيل

قم بقطع أسلاك 9 × 5-600 مم لتوصيل أجهزتنا بلوحة مشغل البوابة.

  • 2 لإدخال الطاقة 24 فولت
  • 3 لحالة البوابة (2 مداخل وأرضية مشتركة)
  • 2 لإشارة البوابة المفتوحة
  • 2 لإشارة إغلاق البوابة

قم بلف كل مجموعة من المجموعات المذكورة أعلاه معًا باستخدام تمرين. هذا سيجعل كل شيء أسهل ويظهر بشكل أفضل.

قم بفصل كل من الأسلاك وتوصيلها بالأطراف المعنية كما هو موضح.

الخطوة 13: توجيه أسلاك التوصيل

مسار الأسلاك هوكوب
مسار الأسلاك هوكوب

قم بتوجيه أسلاك التوصيل عبر الفتحة كما هو موضح.

الخطوة 14: تركيب المكونات

مكونات جبل
مكونات جبل

ضع المكونات وقم بتركيبها باستخدام حبة صغيرة من الغراء الساخن أو السيليكون. لا تستخدم الكثير في حال احتجت إلى إزالة جزء ، استخدم فقط ما يكفي لتأمينها.

كنت أرغب في الأصل في طباعة العلبة بمقاطع / علامات تبويب لتثبيت اللوحات في مكانها ولكني كنت بحاجة إلى تثبيت هذا ولم يكن لدي الوقت. ستكون إضافة مقاطع اللوحة إلى قضيتك لمسة لطيفة.

الخطوة 15: ختم أسلاك التوصيل

أسلاك التوصيل الختم
أسلاك التوصيل الختم

ختم أسلاك التوصيل بالغراء الساخن أو السيليكون.

الخطوة 16: أغلق القضية

أغلق ملف القضية
أغلق ملف القضية

لقد استخدمت مسامير صغيرة بقطر 4 مم في قائمة هذه العلبة المطبوعة ثلاثية الأبعاد. إذا كنت قلقًا بشأن الأوساخ أو الرطوبة ، ضع قطعة من السيليكون أو الغراء الساخن حول مفصل الغطاء قبل إغلاقه.

الخطوة 17: التثبيت في Gate Operator

قم بالتثبيت في مشغل البوابة
قم بالتثبيت في مشغل البوابة
قم بالتثبيت في مشغل البوابة
قم بالتثبيت في مشغل البوابة

على اللوحة الرئيسية:

  • قم بتوصيل السلكين المتصلين بمخرج الترحيل 1 بمحطة Open Gate. (أحمر / بني في الصور)
  • قم بتوصيل السلكين المتصلين بمخرج الترحيل 2 بمحطة إغلاق البوابة. (أصفر / أزرق في الصور)
  • قم بتوصيل السلكين المتصلين بمدخل محول DC-DC بأطراف برغي طاقة الملحق 24 فولت (أحمر / أسود في الصور)

على لوحة التوسع

  • قم بتوصيل المحطات اللولبية المشتركة للترحيل مع قطعة صغيرة من الأسلاك
  • قم بتوصيل الأرضية المشتركة بأحد المحطات اللولبية المشتركة للترحيل (أخضر في الصور)
  • قم بتوصيل مدخلي حالة البوابة 2 (IMP Pin8 & 9) بأطراف التوصيل اللولبية العادية المفتوحة (NO) (رمادي / أصفر في الصور)

قم بتوجيه الأسلاك ، اربطها بسحّاب لتبدو أنيقة وابحث عن مكان لتركيب أو تثبيت حالتك.

هناك صور إضافية كاملة الدقة مستضافة على مستودع GitHub.

الخطوة 18: اضبط وضع Aux Relay

اضبط وضع الترحيل Aux
اضبط وضع الترحيل Aux

اضبط مفاتيح الترحيل الإضافية كما هو موضح في الصورة.

سيعطي هذا IMP الإشارات التي يحتاجها لتحديد ما إذا كانت البوابة مغلقة أو مفتوحة أو مفتوحة أو مغلقة.

الخطوة 19: وكيل IMP ورمز الجهاز

وكيل IMP ورمز الجهاز
وكيل IMP ورمز الجهاز

كود وكيل عفريت كهربائي:

  • قم بإنشاء نموذج جديد في Electric Imp IDE:
  • استبدل URL للإشارة إلى الخادم الخاص بك

// وظيفة معالج

الدالة httpHandler (req، resp) {try {local d = http.jsondecode (req.body) ؛ //server.log(d.c) ؛ إذا (d.c == "btn") {//server.log(d.val) ؛ device.send ("btn"، d.val) ؛ Resp.send (200، "OK") ؛ }} catch (ex) {// إذا كان هناك خطأ ، أرسله مرة أخرى في استجابة server.log ("error:" + ex)؛ resp.send (500، "خطأ خادم داخلي:" + ex) ؛ }} // تسجيل معالج HTTP http.onrequest (httpHandler) ؛ // GateStateChange وظيفة معالج وظيفة gateStateChangeHandler (بيانات) {// URL to web service local url = "https://projects.ajillion.com/save_gate_state"؛ // تعيين رأس نوع المحتوى إلى عناوين json المحلية = {"نوع المحتوى": "application / json"}؛ // ترميز البيانات المستلمة وتسجيل الهيئة المحلية = http.jsonencode (البيانات) ؛ server.log (جسم) ؛ // أرسل البيانات إلى خدمة الويب http.post (url ، headers ، body).sendsync () ؛ } // Register gateStateChange handler device.on ("gateStateChange"، gateStateChangeHandler) ؛

كود وكيل عفريت كهربائي:

  • قم بتعيين جهاز Imp لطرازك
  • تحقق من أن دبابيس الأجهزة مستعارة على أنها متصلة

// مكتبة Debouce

#require "Button.class.nut: 1.2.0" // الاسم المستعار للبوابة المفتوحة GPIO pin (منخفضة نشطة) gateOpen <- hardware.pin2؛ // الاسم المستعار لـ gateClose control GPIO pin (active low) gateClose <- Hardware.pin7 ؛ // تكوين 'gateOpen' ليكون إخراجًا رقميًا بقيمة بداية رقمية 1 (عالية) gateOpen.configure (DIGITAL_OUT ، 1) ؛ // تكوين 'gateClose' ليكون إخراجًا رقميًا بقيمة بداية رقمية 1 (عالية) gateClose.configure (DIGITAL_OUT ، 1) ؛ // الاسم المستعار لدبوس GPIO الذي يشير إلى أن البوابة تتحرك (NO) gateMovingState <- Button (Hardware.pin8، DIGITAL_IN_PULLUP) ؛ // الاسم المستعار لدبوس GPIO الذي يشير إلى أن البوابة مفتوحة بالكامل (NO) gateOpenState <- Button (Hardware.pin9، DIGITAL_IN_PULLUP) ؛ // المتغير العالمي لعقد حالة البوابة (فتح = 1 / مغلق = 0) lastGateOpenState المحلي = 0 ؛ // Latch Timer object local latchTimer = null agent.on ("btn"، function (data) {switch (data.cmd) {case "open": gateOpen.write (0)؛ if (latchTimer) imp.cancelwakeup (latchTimer). imp.wakeup (1800 ، releaseOpen) ؛ server.log ("تم تلقي أمر Latch30m") ؛ حالة الكسر "latch8h": gateOpen.write (0) ؛ if (latchTimer) imp.cancelwakeup (latchTimer) ؛ latchTimer = imp.wakeup (28800، releaseOpen)؛ server.log ("تم استلام الأمر Latch8h") ؛ حالة الكسر "إغلاق": if (latchTimer) imp.cancelwakeup (latchTimer)؛ gateOpen.write (1)؛ gateClose.write (0)؛ latchTimer = imp.wakeup (1، releaseClose)؛ server.log ("تم استلام أمر إغلاق الآن") ؛ كسر الافتراضي: server.log ("أمر الزر غير معروف") ؛}}) ؛ وظيفة releaseOpen () {if (latchTimer) imp.cancelwakeup (latchTimer) ؛ بوابة Open.write (1) ؛ //server.log("Timer أصدر جهة اتصال switchOpen switch ") ؛ } function releaseClose () {if (latchTimer) imp.cancelwakeup (latchTimer) ؛ بوابة إغلاق (1) ؛ //server.log("Timer حرر جهة اتصال تبديل gateClose ") ؛ } gateMovingState.onPress (function () {// تم تنشيط المرحل ، البوابة تتحرك //server.log("Gate is open ") ؛ البيانات المحلية = {" gatestate ": 1 ،" timer ": hardware.millis ()} ؛ agent.send ("gateStateChange" ، بيانات) ؛}). onRelease (الوظيفة () {// تم تحرير المرحل ، البوابة في حالة الراحة //server.log("Gate is closed ") ؛ البيانات المحلية = {"gatestate": 0، "timer": hardware.millis ()}؛ agent.send ("gateStateChange"، data)؛})؛ gateOpenState.onPress (function () {// تم تنشيط المرحل ، البوابة مفتوحة بالكامل //server.log("Gate is open ") ؛ البيانات المحلية = {" gatestate ": 2 ،" timer ": Hardware.millis ()} ؛ agent.send ("gateStateChange" ، بيانات) ؛}). onRelease (الوظيفة () {// تم تحرير المرحل ، البوابة ليست مفتوحة بالكامل //server.log(" البوابة تغلق ") ؛ البيانات المحلية = {"gatestate": 3، "timer": hardware.millis ()}؛ agent.send ("gateStateChange"، data)؛})؛

الخطوة 20: كود PHP لخدمة الويب

كود PHP لخدمة الويب
كود PHP لخدمة الويب

لقد كتبت هذا الرمز لإطار عمل CodeIgniter لأنني أضفته إلى مشروع قديم موجود. يمكن تكييف وحدة التحكم ورمز العرض بسهولة مع الإطار الذي تختاره.

لتبسيط الأمور ، قمت بحفظ بيانات JSON في ملف ثابت لتخزين البيانات. إذا كنت بحاجة إلى التسجيل أو وظائف ذات صلة بالبيانات أكثر تعقيدًا ، فاستخدم قاعدة بيانات.

يمكن تنزيل مكتبة ajax التي كتبتها واستخدمتها في هذا المشروع من مستودع GitHub: ThingEngineer / Codeigniter-jQuery-Ajax

كود تحكم PHP:

  • التطبيق / وحدات التحكم / projects.php
  • تأكد من أن مسار البيانات يمكن الوصول إليه من خلال نص PHP الخاص بك ، سواء من حيث الموقع أو امتيازات القراءة / الكتابة.

load-> helper (array ('file'، 'date')) ؛

$ data = json_decode (read_file ('../ app / logs / gatestate.data') ، TRUE) ؛ switch ($ data ['gatestate']) {case 0: $ view_data ['gatestate'] = 'Closed'؛ استراحة؛ الحالة 1: $ view_data ['gatestate'] = 'فتح…'؛ استراحة؛ الحالة الثانية: $ view_data ['gatestate'] = 'Open'؛ استراحة؛ الحالة 3: $ view_data ['gatestate'] = 'إغلاق…'؛ استراحة؛ } $ last_opened = json_decode (read_file ('../ app / logs / projects / gateopened.data') ، TRUE) ؛ $ view_data ['last_opened'] = الفترة الزمنية ($ last_opened ['last_opened'] ، الوقت ()). "منذ" ؛ // تحميل عرض $ t ['data'] = $ view_data؛ $ this-> load-> view ('gate_view'، $ t)؛ } function save_gate_state () {$ this-> load-> helper ('file')؛ $ data = file_get_contents ('php: // input') ؛ write_file ('../ app / logs / projects / gatestate.data'، $ data)؛ بيانات $ = json_decode ($ data، TRUE) ؛ if ($ data ['gatestate'] == 1) {$ last_opened = array ('last_opened' => time ())؛ write_file ('../ app / logs / projects / gateopened.data' ، json_encode ($ last_opened)) ؛ }} function get_gate_state () {$ this-> load-> helper (array ('file'، 'date'))؛ $ this-> load-> library ('ajax') ؛ $ data = json_decode (read_file ('../ app / logs / projects / gatestate.data') ، TRUE) ؛ $ last_opened = json_decode (read_file ('../ app / logs / projects / gateopened.data') ، TRUE) ؛ $ data ['last_opened'] = الفترة الزمنية ($ last_opened ['last_opened'] ، الوقت ()). "منذ" ؛ $ this-> ajax-> output_ajax ($ data، 'json'، FALSE)؛ // إرسال بيانات json ، لا تفرض طلب ajax}} / * End of file projects.php * / / * الموقع:./application/controllers/projects.php * /

كود عرض PHP:

لقد استخدمت Bootstrap للواجهة الأمامية لأنها سريعة وسهلة وسريعة الاستجابة. يمكنك تنزيله من هنا: https://getbootstrap.com (تم تضمين jQuery)

  • التطبيق / وحدات التحكم / gate_view.php
  • استبدل رمز وكيلك برمز وكيل Imp

IoT Gate Opperator Addon IoT Gate الملحق Opperator

  • الصفحة الرئيسية
  • مشرف

افتح مزلاج البوابة افتح المزلاج لمدة 30 دقيقة أغلق الآن حالة البوابة: تم فتحه مؤخرًا $ (مستند). agent.electricimp.com/YOUR-AGENT-CODE '؛ $.post (url، JSONout) ؛ } $ ("# open_gate"). انقر (الوظيفة () {var JSONout = '{"c": "btn"، "val": {"cmd": "open"}}'؛ sendJSON (JSONout)؛ $ ("# الحالة"). text ("فتح …") ؛}) ؛ $ ("# latch30m_gate"). انقر (الوظيفة () {var JSONout = '{"c": "btn"، "val": {"cmd": "latch30m"}}'؛ sendJSON (JSONout)؛ $ ("# الحالة"). text ("فتح…") ؛}) ؛ $ ("# latch8h_gate"). انقر (الوظيفة () {var JSONout = '{"c": "btn"، "val": {"cmd": "latch8h"}}'؛ sendJSON (JSONout)؛ $ ("# الحالة"). text ("فتح…") ؛}) ؛ $ ("# close_gate"). انقر (الوظيفة () {var JSONout = '{"c": "btn"، "val": {"cmd": "close"}}'؛ sendJSON (JSONout)؛ $ ("# الحالة"). text ("إغلاق…") ؛}) ؛ function resetStatus () {// Target url var target = 'https://projects.ajillion.com/get_gate_state'؛ // Request var data = {agent: 'app'} ؛ // أرسل طلب نشر ajax $.ajax ({url: target، dataType: 'json'، type: 'POST'، data: data، Success: function (data، textStatus، XMLHttpRequest) {switch (data.gatestate) {case 0: $ ("# status"). text ('Closed')؛ break؛ case 1: $ ("# status"). text ('Opening…')؛ break؛ case 2: $ ("# status").text ('Open')؛ break؛ case 3: $ ("# status"). text ('Closing…') ؛ فاصل ؛ افتراضي: $ ("# status"). text ('Error') ؛} $ ("#last_opened"). text (data.last_opened) ؛} ، خطأ: الوظيفة (XMLHttpRequest ، textStatus ، errorThrown) {// Error message $ ("# status"). text ('Server Error') ؛}}) ؛ setTimeout (resetStatus ، 3000) ؛ }

موصى به: