لفترة طويلة لم تتم تغطية مشروع FLProg في حبري. هذا يرجع إلى ضيق الوقت لكتابة المقالات ، وحتى مشاكلي الشخصية. لكن المشروع لم يمت ، إنه يعيش ويتطور. في المتوسط مرة واحدة في الشهر ، يتم إصدار الإصدار التالي من البرنامج. منذ الإصدار
الأخير ، تمت إعادة تقديم عرض الدائرة بالكامل (وبفضل هذا ، تم القضاء على أفاريز أثناء العرض) ، وظهر نظام Cross Reference للمشروع ونظام لتحليل المشروع بحثًا عن الأخطاء. تم نقل رمز البرنامج نفسه إلى إصدار أحدث من لغة البرمجة. بسبب هذا ، في الجانب الإيجابي (من وجهة نظري ، بالطبع ، حسناً ، المستخدمون يدعمونني) ، تغيرت واجهة البرنامج. تم إضافة العديد من الكتل المثيرة للاهتمام. تنفيذ مخطط التحجيم والبحث كتلة.
ومع ذلك ، لا تزال المشكلة الرئيسية للمشروع تتمثل في أن مطور البرنامج هو شخص واحد (هذا أنا) ، وأن عدد لوحات التحكم المختلفة ، وأجهزة الاستشعار ، وأجهزة الاستشعار ، وبطاقات التوسع المصنعة من قبل الصينيين ومؤخرًا من قبل الشركات المصنعة لدينا يتزايد باستمرار. ويريد المستخدمون تجربتهم ، أو استخدامها في مشاريعهم. بالنسبة للأجهزة الطرفية ، في وقت واحد ، تم حل هذه المشكلة إلى حد ما من خلالي بمساعدة إنشاء محرر كتلة مخصص. هذه الخطوة ، كما يقولون ، "تسديدة" ، والآن ، تقريبًا على معظم اللوحات الطرفية الموجودة ، على الإنترنت ، أو
في منتدى البرنامج ، يمكنك العثور على كتلة المستخدم المقابلة. حسنا ، أو في نفس المنتدى (أو في
مجموعة في فكونتاكتي ) اطلب من المعلمون المحليين أن يكتبوا واحدة. عادة يمكنك أن توافق بطريقة أو بأخرى.
الآن حان الوقت لحل المشكلة الثانية - هذه هي لوحات تحكم.
في الآونة الأخيرة ، تم إصدار نسخة تجريبية من البرنامج مع رقم 6.0. في هذا الإصدار ، يتم تطبيق محرر أوصاف المستخدم لوحدات التحكم. كما هو الحال مع الكتل المخصصة ، يمكن تجميع الأوصاف في المكتبات ، وحفظها كأوصاف منفصلة وكذلك المكتبات بأكملها كملف ، ومشاركتها.
باستخدام هذا المنشور ، أبدأ سلسلة من وظيفتين على الأقل سننظر في كيفية استخدام هذا المحرر. في المقالة الأولى ، بإذن من
shiotiny ، سأحاول وصف
لوحة ShIoTiny الخاصة به. في المقالة الثانية ، سنحاول فعليًا إنتاج نظير لوحدة تحكم صناعية حقيقية ، ووصفه.
لذلك دعونا نبدأ.
افتح برنامج FLProg. في قائمة "أدوات" ، حدد "محرر أوصاف وحدة التحكم المخصصة".

يتم فتح نافذة محرر الوصف.
يمكن دمج الأوصاف المخصصة في المكتبة مع أي عمق تداخل. لذلك ، نقوم أولاً بإنشاء مكتبة وصف.

اضبط اسم المكتبة.

بعد ذلك سنقوم بإنشاء وصف لوحدة التحكم في المكتبة.

ومنحه اسم:

عند إنشاء وصف وحدة تحكم ، نصل على الفور إلى فرع المعلمات العامة.

هنا يمكننا تغيير الاسم ، وتعيين نوع وحدة المعالجة المركزية ، وتعيين حجم EEPROM ، وتغيير رقم إصدار الوصف.
نظرًا لأن لوحة ShloTiny تعتمد على وحدة التحكم ESP8266 ، فإننا نختارها. عند اختيار وحدة التحكم ، يتم تثبيت وحدة تخزين EEPROM المقابلة تلقائيًا. إذا لزم الأمر ، يمكن تغيير هذه القيمة. يتم تعيين رقم الإصدار الافتراضي للوصف الجديد على 1.
في المستقبل ، عند تغيير الوصف الحالي ، يوصى بتغييره في اتجاه الزيادة. عند استخدام هذا الوصف في مشروع ، سيقوم البرنامج بمقارنة إصدار الوصف في المشروع وفي المكتبة. إذا كان رقم إصدار الوصف في المكتبة أكبر منه في المشروع ، فسيظهر عنصر تحديث الوصف في البرنامج في قائمة "المشروع" بالبرنامج. إذا كان العكس هو الصحيح ، فسيظهر عنصر لتحديث الوصف في المكتبة. حسنًا ، إذا لم يتم العثور على وصف وحدة التحكم المستخدمة في المشروع في المكتبة على الإطلاق ، فسيظهر العنصر الخاص بإدخال الوصف من المشروع في المكتبة في نفس القائمة.
أيضا في هذا الموضوع ، يمكنك كتابة وصف نصي لوحدة التحكم التي تساعد في تحديده.
لتطبيق التغييرات التي تم إجراؤها قبل التغيير إلى فرع آخر من معلمات وحدة التحكم ، انقر فوق الزر "تطبيق". إذا لم يتم ذلك ، فلن يتم حفظ التغييرات.
الآن فكر في مخطط الدائرة الخاص بلوحة ShloTiny.

تحتوي اللوحة على ثلاثة مدخلات رقمية ، وثلاثة مخرجات رقمية ، ومدخلات تناظرية ، ومدخلات للمستشعر. ما مجموعه ثمانية استنتاجات المجلس.
في المحرر ، انتقل إلى فرع "استنتاجات المراقب" وعيِّن عدد الاستنتاجات ، ولا تنس النقر على الزر "تطبيق" بعد ذلك.

سيقوم البرنامج بإنشاء العدد المطلوب من الاستنتاجات. نمر إلى أولهم.

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

في نفس الفرع من معلمات الإخراج الرئيسية ، تتم إضافة الوظائف التي يؤديها إليها.

يمكن تعيين الوظائف التالية لكل دبوس.

- I2C هي وظيفة أحد دبابيس ناقل I2C (SDA أو SCL).
- SPI هي وظيفة أحد دبابيس ناقل SPI (MISO ، MOSI ، SCK ، SS).
- UART هي وظيفة أحد دبابيس واجهة UART (RX أو TX).
- وظيفة المدخلات التناظرية
- وظيفة الإخراج التناظرية (لم تستخدم بعد في FLProg ، تراكم للمستقبل).
- وظيفة الإدخال / الإخراج الرقمي.
تعيين 1 وظيفة الإدخال / الإخراج الرقمي. عند تعيين وظيفة جديدة (لم تتم تهيئتها بعد) للإخراج ، سيظهر فرع "الأخطاء" في شجرة وحدة التحكم وسوف يتحول المسار بالكامل إلى فرع الوظيفة غير الصحيحة إلى اللون الأحمر. في فرع "الأخطاء" ، يمكنك رؤية قائمة بالأخطاء الموجودة في وصف وحدة التحكم.

في هذه الحالة ، لا يحدد الإدخال 1 في وظيفة "الإدخال / الإخراج الرقمي" عدد هذا الإدخال على أنه رقمي. ننتقل إلى فرع هذه الوظيفة (في المستقبل ، أخطط لإجراء انتقال مباشر إلى الفرع المطلوب عند النقر فوق خطأ).

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

في إعدادات هذه الوظيفة ، يجب عليك تحديد عدد هذا الإخراج كمدخل تمثيلي. وفقًا للمخطط ، هذا هو 0 (في ESP8266 هو واحد).

ثم انتقل إلى إعداد الإخراج "1WIRE". نضيف هنا وظيفة الإدخال / الإخراج الرقمي إليها ، لكننا نمنع استخدامها لكل من المدخلات والمخرجات. نتيجة لذلك ، ستكون متاحة للاختيار فقط في كتل الاستشعار ، ولن تكون متاحة عند إنشاء المدخلات والمخرجات.

تشبه إعدادات المخرجات "K1" - "K3" إعدادات المدخلات "Input1" - "Input3" فقط في حالة المخرجات ، نمنع استخدامها كمدخلات.


انتقل إلى فرع "الصور". في ذلك ، يمكننا إضافة الصور المحملة في وصف وحدة التحكم ، على سبيل المثال ، مع ظهور وحدة التحكم ، pinout ، إلخ.
يرجى ملاحظة أنه يتم تحميل الصور مباشرة في وصف وحدة التحكم ، ويتم تخزينها في مشروع تم إنشاؤه باستخدامه. لذلك ، لا تقم بتحميل صور كبيرة. سيترتب على ذلك زيادة في حجم المشروع ، وسوف يؤثر على سرعة افتتاحه.
تتم إضافة الصورة باستخدام زر "إضافة صورة".

بعد تحديد صورة وتحميلها (يتم دعم تنسيق PNG فقط) ، يتم إنشاء فرع منفصل لكل صورة في الشجرة. في هذا الفرع ، يمكنك تحديد اسم للصورة التي تم تنزيلها ، والتي سيتم عرضها في معلومات وحدة التحكم.

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


نمر إلى فرع "الكتل القياسية".

يعرض هذا الفرع الكتل التي يمكن تمثيلها في مكتبة الكتل القياسية للبرنامج وفقًا للإعدادات الحالية للبرنامج. ماذا يعني ذلك. بعض الكتل البرمجية الإنشائية للبرنامج مخصصة فقط لأنواع معينة من وحدات المعالجة المركزية. وتوافرها يعتمد على المعالج المحدد. وأيضًا ، ستظهر الكتل المصممة للعمل مع SPI و I2C و UART في هذه القائمة فقط إذا تم إضافة الوظائف المقابلة إلى دبابيس التحكم. ستظهر الكتل المصممة للعمل مع EEPROM فقط إذا كان حجم EEPROM المحدد في فرع معلمات وحدة التحكم العامة أكبر من الصفر ، أو تتم إضافة وظيفة I2C إلى دبابيس وحدة التحكم. افتراضيًا ، يُحظر استخدام جميع الكتل الموجودة في المكتبة (المميزة باللون البرتقالي). يمكنك السماح باستخدام إما كتلة منفصلة أو مجلد الكتلة بالكامل من خلال تمييز الفرع الضروري والنقر على الزر "سماح" ، أو من قائمة السياق.

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

في مجلد لا يُسمح فيه بعرض جميع الكتل ، يتم تمييزها بثلاثة علامات نجمية قبل الاسم وبعده.
نحن نمنع استخدام المحركات والساعات في الوقت الفعلي والشاشات ووحدات التحكم في الأشعة تحت الحمراء وأجهزة الاستشعار (باستثناء مجسات DS18B20 و DHT22 ، حيث أعلن مطور اللوحة حتى الآن عن دعمهم فقط) ورقاقات التوسيع ومكبر صوت بيزو.

سنفعل نفس الشيء للغة LAD

لا تنسى أن تطبقها بعد إجراء التغييرات.
ستتم مناقشة الفروع المتبقية من وصف وحدة التحكم في المنشور التالي ، في حين أن الإعدادات الحالية كافية لاستخدام هذه اللوحة المعينة في برنامج FLProg.
في الوقت الحالي ، سأقول باختصار أن فرع "الكتل الخاصة" يستخدم لتحميل الكتل المخصصة في الوصف ، والذي سيتم عرضه في مكتبة الكتل القياسية في البرنامج عند استخدام وحدة التحكم هذه. يتم استخدام فرع "رمز خاص" لتسجيل الرمز الذي سيتم إدراجه دائمًا في التعليمات البرمجية المترجمة ، ويستخدم فرع "المكتبات الخاصة" لتحميل المكتبات في وصف وحدة التحكم ، والذي سيتم تحميله إلى مجلد \ libraries ArduinoIDE الذي يعمل به البرنامج.
بعد كل التغييرات ، احفظ مكتبة وصف وحدة التحكم.

الآن دعونا نحاول استخدام وصف وحدة التحكم التي أنشأناها.
في برنامج FLProg ، نقوم بإنشاء مشروع جديد لوحدة التحكم.

افتح نافذة اختيار وحدة التحكم.

واختر الوصف الذي أنشأناه.

عند اختيار وحدة تحكم ، يمكنك رؤية صورها ، وإذا لزم الأمر ، قم بحفظ ما يلزم من ملف.


يمكنك أيضًا رؤية المعلمات الأخرى

بعد اختيار وحدة التحكم ، قم بتأكيد تحديدها:

نتيجة لذلك ، يتم فتح نافذة عمل المشروع الرئيسية ، والتي تم تكوينها وفقًا لوحدة التحكم المحددة.

الغرض من هذا المنشور لا يشمل مهمة التدريب للعمل مع برنامج FLProg. تم توضيح ذلك جيدًا في مشاركاتي
السابقة وعلى
موقع المشروع ومنتدى المشروع . بالإضافة إلى ذلك ، هناك بالفعل الكثير من القنوات على YouTube حيث يتم نشر مقاطع فيديو تعليمية حول العمل مع البرنامج. على سبيل المثال ، هناك قناة جيدة جدًا
"Key to Arduino" ، تجري الآن سلسلة من الدروس ، مع عرض تقديمي جيد جدًا للمواد.
لذلك ، على سبيل المثال ، نقوم ببساطة بإنشاء مشروع بسيط ومحاولة تجميعه.
أولا ، إضافة إدخال تحكم.

فقط تلك الاستنتاجات التي سُمح لنا بالعمل بهذه الصفة متوفرة للاختيار كمدخلات.

ثم قم بإنشاء الإخراج الرقمي. الاستنتاجات المسموح بها فقط متاحة هنا أيضًا.

نقوم بتجميع الدائرة بحيث يتم الضغط على المفتاح K1 (Relay1) عند الضغط على الزر الموجود في الإدخال 1 (الإدخال 1).
نقوم أيضًا بسحب الوحدة من أجل قراءة المعلومات من جهاز استشعار DS18B20 على لوحة دوائر في لوحة منفصلة.

انتقل إلى إعدادات كتلة. عند إنشاء ناقل OneWire الجديد ، نرى أن جميع المدخلات / المخرجات الرقمية متاحة للاختيار. هذا خطأ في الإصدار 6.0. ولكن نظرًا لأن هذا الإصدار لا يزال يشتمل على حالة تجريبية ، فمن المنطقي. في الإصدار 6.1 ، سيكون من الممكن حظر استخدام دبوس كمستشعر أو مستشعر أو لرقائق التوسيع. بالإضافة إلى ذلك ، في المنشور التالي ، سأخبرك عن طريقة أخرى لحل هذه المشكلة. الآن ، حدد دبوس 1WIRE.

نحن تكوين المستشعر لتعيين العنوان من خلال مجموعة.

نقوم بإدخال لوحة جديدة أمام اللوحة الأولى وسحب كتلة "OneWire Bus Scan" عليها.

نقوم بتكوينه على نفس ناقل OneWire ، وعلى نفس المصفوفة ، حيث تم تكوين وحدة القراءة من جهاز استشعار DS18B20.

نقوم بتجميع مخطط لبداية واحدة من فحص ناقل عند بدء تشغيل وحدة التحكم ، وذلك باستخدام كتلة R من المشغل (اختيار الحافة الأمامية).

على لوحة مع وحدة قراءة البيانات من جهاز استشعار DS18B20 ، نقوم بتجميع / إيقاف دائرة التتابع مع التباطؤ. لهذا ، نحن نستخدم اثنين من المقارنة ، وزناد ريال. بفضل هذا المخطط ، سيتم تشغيل التتابع 2 عندما تنخفض درجة الحرارة إلى أقل من 10 درجات ، وتتوقف عند ارتفاع درجة الحرارة عن 20 درجة.

نبدأ مخطط التجميع.

نتيجة لذلك ، سيتم فتح الكود الناتج في Arduino IDE. كلوحة ، نختار NodeMCU ، حيث يتم تثبيت الشريحة نفسها على ShloTiny. التحقق من الكود يوضح أنه صحيح ويمكن تنزيله.

التعليمات البرمجية المترجمة#include <OneWire.h> extern "C" { #include "user_interface.h"; } OneWire _ow13(13); byte _FLPArray133289689[9]; unsigned long _d18x2x1Tti = 0UL; float _d18x2x1O = 0.00; bool _trgr1 = 0; bool _bounseInputD2S = 0; bool _bounseInputD2O = 0; unsigned long _bounseInputD2P = 0UL; bool _trgrt1 = 0; bool _trgrt1I = 0; bool _sowb1_needScan = 0; bool _sowb1_ost = 0; bool _sowb1_Out_1 = 0; void setup() { pinMode(2, INPUT); pinMode(12, OUTPUT); pinMode(14, OUTPUT); _bounseInputD2O = digitalRead(2); } void loop() { bool _bounceInputTmpD2 = (digitalRead (2)); if (_bounseInputD2S) { if (millis() >= (_bounseInputD2P + 40)) { _bounseInputD2O = _bounceInputTmpD2; _bounseInputD2S = 0; } } else { if (_bounceInputTmpD2 != _bounseInputD2O ) { _bounseInputD2S = 1; _bounseInputD2P = millis(); } } //:1 if (1) { if (_trgrt1I) { _trgrt1 = 0; } else { _trgrt1 = 1; _trgrt1I = 1; } } else { _trgrt1 = 0; _trgrt1I = 0; }; if (_sowb1_needScan) { if ( _oneWireSeach (_FLPArray133289689, _ow13)) { _sowb1_Out_1 = 1; } _ow13.reset_search(); _sowb1_needScan = 0; } if (_trgrt1) { if (! _sowb1_ost) { _sowb1_ost = 1; _sowb1_needScan = 1; _sowb1_Out_1 = 0; } } else { _sowb1_ost = 0; } //:2 digitalWrite(12, !(_bounseInputD2O)); //:3 if (_isTimer(_d18x2x1Tti, 1000)) { _d18x2x1Tti = millis(); _d18x2x1O = _readDS18_ow13(_FLPArray133289689, _FLPArray133289689[8]); } if (((_d18x2x1O)) > (20)) _trgr1 = 0; if (((_d18x2x1O)) < (10)) _trgr1 = 1; digitalWrite(14, _trgr1); } bool _isTimer(unsigned long startTime, unsigned long period ) { unsigned long currentTime; currentTime = millis(); if (currentTime >= startTime) { return (currentTime >= (startTime + period)); } else { return (currentTime >= (4294967295 - startTime + period)); } } float _convertDS18x2xData(byte type_s, byte data[12]) { int16_t raw = (data[1] << 8) | data[0]; if (type_s) { raw = raw << 3; if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; } } else { byte cfg = (data[4] & 0x60); if (cfg == 0x00) raw = raw & ~7; else if (cfg == 0x20) raw = raw & ~3; else if (cfg == 0x40) raw = raw & ~1; } return (float)raw / 16.0; } float _readDS18_ow13(byte addr[8], byte type_s) { byte data[12]; byte i; _ow13.reset(); _ow13.select(addr); _ow13.write(0xBE); for ( i = 0; i < 9; i++) { data[i] = _ow13.read(); } _ow13.reset(); _ow13.select(addr); _ow13.write(0x44, 1); return _convertDS18x2xData(type_s, data); } bool _oneWireSeach (byte array[], OneWire ow ) { byte temp[8]; byte i; if ( !ow.search(temp)) { return false; } if (OneWire::crc8(temp, 7) != temp[7]) { return false; } switch (temp[0]) { case 0x10: array[8] = 1; break; case 0x28: array[8] = 0; break; case 0x22: array[8] = 0; break; default: return false; } for ( i = 0; i < 8; i++) { array[i] = temp[i]; } return true; }
→
وصف وحدة التحكم ShloTiny لبرنامج FLProgسننهي هذا الدرس ، في المنشور التالي ، سنحاول وصف شيء أكثر جدية وأقرب إلى وحدات التحكم الصناعية "الحقيقية".