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

بناءً على لوحة ESP8266 مع NodeMCU (
مثل هذا ) ، تمت إضافة زوج من الترانزستورات والمقاومات إليها. تحتوي الوحدات المختارة على منظم جهد من 3-20 فولت ، مما يسمح بتشغيله من نفس مصدر الشريط. تعطي مخرجات esp جهد 3 فولت مع حد تيار 12mA ، لذلك استخدمت الترانزستورات ثنائية القطب التقليدية للتحكم في الشريط.

حتى لا يخرج الدخان الأبيض من وحدة التحكم الدقيقة ، أضع مقاومًا 220 أوم بين الإخراج والقاعدة. إسبانيا لديها برنامج pwm ، بعض الدبابيس لها غرض خاص ، لقد اخترت تجريبيًا.
البرامج الثابتة
قبل الاستخدام ، يحتاج esp8266 إلى وميض ، وأنا أستخدم NodeMCU مع lua ، على الرغم من أنه يحتوي على ميزات أقل قليلاً من Arduino مع C ++. لذا ، فإن أسهل طريقة للبدء هي باستخدام البرامج الثابتة
الجاهزة من
nodemcu-build.com . بالنسبة لمشروعنا ، سنحتاج إلى إضافة وحدة pwm. بعد فترة ، سينخفض رابط الصورة إلى البريد. عليك أن تأخذ واحدة مع تعويم.
يمكنك وميضه مع أي مبرمج
من هنا ، وأنا استخدم NodeMCU Flasher.
يحتوي NodeMCU على نظام ملفات ، يبدأ التنفيذ بوحدة init.lua ، أستخدم برنامج
ESPlorer للتنزيل.
الصمام الثنائي الوامض
في اللحظة التالية ضللتني. يستخدم الترقيم الداخلي (GPIO0-16) فقط في البرامج الأصلية (Arduino / C ++). من لوا ، يتم استخدام تدوين من اللوحة. على سبيل المثال ، لاستخدام GPIO16 / D0 (LED مدمج). من Lua ، تحتاج إلى كتابة gpio.write (0 ، gpio.HIGH). يمكنك وميض الصمام الثنائي مباشرة من وحدة تحكم ESPlorer.

على عكس Arduino ،
لا يمكن لـ nodemcu استخدام التأخير وحلقة الانشغال ، تستخدم وحدة التحكم و wifi نفس المعالج للعمل. يتم أيضًا إنشاء جهاز رقابة في اللوحة ، والذي سيعيد تشغيله إذا كان كودك يعمل أكثر من 500 مللي ثانية. يوصى بعدم شغل المعالج أكثر من 2 مللي ثانية. لحل المشكلة ، هناك وظائف
node.task.post و
tmrاختيار بيئة التطوير
في البداية كنت أرغب في استخدام سكراتش ، لكنه لا يناسبني ، لأنه لا يسمح لي بالعمل دون اتصال بالإنترنت - يعمل البرنامج على جهاز كمبيوتر في بيئة خدش ، وتعمل جميع لوحاته بشكل سلبي. بعد تفشي الإنترنت ،
تعرفت على Google Blockly . اتضح أن هذا هو ما تحتاجه بالضبط: فهو يدعم إنشاء التعليمات البرمجية في lua ، وإنشاء الكتل الخاصة به. بعد التجربة ، قررت أن أجعل مشروعي القائم على الويب ، واخترت nodejs كخادم ، و Blockly كواجهة أمامية. كان من الضروري للغاية إنشاء كتلتين - تحديد اللون والتأخير. يحتوي Blockly على وظائف مضمنة للعمل مع الألوان بالتنسيق #ffffff ، ولم يكن إنشاء وظيفة لتعيين اللون يمثل مشكلة.
عنوان المفسدBlockly.Lua['set_color'] = function (block) { var parseColor = Blockly.Lua.provideFunction_( 'set_colour_rgb', ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(s)', ' local rs,gs,bs = s.match(s, "#(..)(..)(..)");', ' setColor(tonumber(rs, 16),tonumber(gs, 16),tonumber(bs, 16));', 'end']); var value_color = Blockly.Lua.valueToCode(block, 'Color', Blockly.Lua.ORDER_ATOMIC); var code = `set_colour_rgb(${value_color})\n`; return code; };
وبالتالي ، تم إغلاق 2 من أصل 3 متطلبات.
وظيفة النوم ()
هنا كان علي أن أفكر على وجه التحديد في كيفية الجمع بين العملية الموثوقة لـ OTA وتنفيذ التعليمات البرمجية المخصصة. لحسن الحظ ، لدى لوا مكتبة
كوروتينبعد التفكير وقراءة الوثائق بعناية ، أدركت أنه يجب تشغيل جميع التعليمات البرمجية للعميل في coroutine ، واستخدام العائد بدلاً من النوم بحيث يمكن للوحدة الرئيسية ضبط جهاز ضبط الوقت.
أيضًا ، لحماية اللوحة من حلقة لا نهائية ، قمت بتصحيح الكود بعد المولد عن طريق إدخال العائد (0) في بداية كل تكرار لكل حلقة
function MCUPostProcessLua(code) { return code.replace(/ do[ ]?\n/, ' do \ncoroutine.yield(0);\n'); }
تنزيل OTA
قررت تنفيذ أبسط حل للشبكة المحلية ، حيث تتصل اللوحة بشبكة wifi منزلية ، وتتصل بالخادم على عنوان ثابت ، وترسل معرفًا فريدًا (من أجل معالجة عمليات إعادة الاتصال بشكل صحيح) ، وتتوقع تحديثات البرنامج من خلال هذا المقبس.
النتيجة
github.com/farafonoff/BlocklyESP8266يمكنك إضافة الكثير ، على سبيل المثال ، نوع من خيار التفويض للعمل من خلال الشبكات العامة ، ومكوِّن سهل الاستخدام في وضع hostap ، وتحسين وحدات نمط init.lua ودعم تحديث OTA (يتم الآن تحديث الوحدة النمطية مع البرنامج المحمل فقط).