العمليات الأساسية على وحدة wifi ESP8266 من Arduino

العمليات الأساسية على وحدة wifi ESP8266 من Arduino

العمليات الأساسية على وحدة wifi ESP8266 من Arduino

عندما قهوة اسبريسف أطلقت الوحدات الأولى في السوق واي فاي (WIFI) مع المتكاملة ESP8266 و الثابتة للتعامل معها باستخدام أوامر AT، ما كنا مهتمين به نحن المستخدمين هو دمجه في التجميعات باستخدام ميكروكنترولر واختصرت المشاكل في معرفة الظلام (سابقًا). ESP8266 في جدول الأوامر، احتياجات التغذية أو تحديث البرامج الثابتة ESP8266.

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

    ثم وصلت البدائل بسرعة لبرمجة ESP8266 وتنفيذ الوحدة النمطية واي فاي (WIFI) بأشكال مختلفة جدًا أثارت مخاوف أخرى: أي وحدة واي فاي ESP8266 للاختيار اعتمادًا على نطاق الهوائيات المختلفة (بما في ذلك الهوائيات الخارجية) أو التكامل المادي لهذه الوحدات الجديدة في مجموعاتنا.

    بالتأكيد، بسبب كل هذه التغييرات، ربما لم يتم التركيز على الجوانب الأساسية، الإدارة الأساسية للمنظمة وحدة واي فاي ESP8266. برغم من قطبية.es يمكنك العثور على معلومات حول استخدام ESP8266 وهناك بعض التطبيقات التي تهدف إلى شرح تشغيل ملف وحدة واي فاي ESP8266 باستخدام أوامر AT، وخاصة في المادة على مكتبة لإجراء استعلامات HTTP من Arduino باستخدام وحدة wifi ESP8266، تشير انطباعات القراء إلى أنه قد يكون من المفيد إضافة بعض المعلومات الأساسية لمساعدة مستخدمي الموقع ESP8266 لتنفيذ عمليات التنفيذ الخاصة بهم.

    مناقشة العمليات الأساسية للعمل مع ESP8266 واقتراح حلول عامة هو هدف يتكون من عدة أجزاء مختلفة للغاية؛ للمساعدة في متابعة محتوى المقالة، يمكن استخدام الفهرس التالي كدليل:

    التحكم في وحدة wifi ESP8266 من الكمبيوتر من خلال المنفذ التسلسلي

    من طبق اردوينو واستخدام الخاص بك IDE من الممكن مراقبة تشغيل أ وحدة واي فاي ESP8266، ارسل ESP8266 في الأوامر وشاهد الإجابة ولكن من الملائم جدًا القيام بذلك من جهاز كمبيوتر باستخدام تطبيق من النوع الطرفي.

    استخدام برنامج CuteCom لاختبار وحدة wifi ESP8266 من خلال المنفذ التسلسلي

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

    في ما هو البرنامج الذي يجب استخدامه لمراقبة ESP8266 باستخدام المنفذ التسلسلي، هناك الكثير للاختيار من بينها حسب الاحتياجات والتفضيلات؛ في الآونة الأخيرة أنا أستخدم الكلاسيكية أكثر كيوتكوم (الموجود في لقطة الشاشة أعلاه) لأنه من المريح جدًا بالنسبة لي أن أكرر بعضًا وحدة واي فاي ESP8266 في الطلبات في اختبار المشروع.

    لقد تم بالفعل تقديم بعض التوصيات هنا بشأن البرامج التي تعمل كوحدة تحكم تسلسلية؛ على سبيل المثال، عندما نتحدث عن PuTTY للتحكم في أجهزة UART التسلسلية من الكمبيوتر. المعجونبالإضافة إلى كونه تطبيقًا ممتازًا، فهو متاح لمعظم أنظمة تشغيل سطح المكتب. علاوة على ذلك، كما المعجون يمكن استخدامها لتكون بمثابة وحدة تحكم مع كل من المنفذ التسلسلي و عائلة بروتوكول الإنترنت (TCP/IP)، بما في ذلك تلك التي تعمل عليها TLS، تصبح أداة شائعة تعوض أكثر من الوقت (القليل) الذي أمضيته في تكوينها والتعود على استخدامها.

    استخدام PuTTY لاختبار وحدة wifi ESP8266 من خلال المنفذ التسلسلي

    بالإضافة إلى برامج الاتصالات التسلسلية، لتوصيل وحدة واي فاي ESP8266 الى الميناء ذراع USB‏ يتطلب الكمبيوتر أيضًا محولًا ذراع USB‏ سلسلة TTL. كما هو الحال في البرامج، هناك العديد من الإصدارات، والتي يتم استخدامها فقط لتحويل المنفذ ذراع USB‏ على المنفذ التسلسلي TTL (والتي يمكن الحصول عليها من يورو واحد) إلى تلك التي يمكنها محاكاة بروتوكولات مختلفة (مثل SPI o I2C).

    تمامًا مثل البرنامج الذي يعمل كوحدة تحكم تسلسلية، يتم توصيل الأجهزة بالكمبيوتر عبرها ذراع USB‏ مع دائرة منطقية (وليس فقط ESP8266) ستكون أداة شائعة في عمل مطور التطبيقات الذي يتم التحكم فيه بشكل دقيق، ومن الجدير وضعها في صندوق الأدوات في أقرب وقت ممكن والعمل معها وحدة واي فاي ESP8266 إنها فرصة ممتازة للحصول على واحدة.

    أجهزة للاتصالات التسلسلية USB UART لمراقبة وحدة wifi ESP8266

    المحول ذراع USB‏ a UART TTL ويمكن استخدامه أيضًا لمراقبة سلوك الدائرة التي تستخدم ESP8266للقيام بذلك، يتم توصيل المخرجات التي تريد مراقبتها على التوالي بمدخل البيانات (RX) الخاص بالمحول باستخدام الصمام الثنائي السريع ( 1N4148، على سبيل المثال) والمقاوم (2K2، على سبيل المثال) على التوازي مع بعضها البعض. يعمل مثل هذا الإعداد مثل جهاز الشم التسلسلي للأجهزة.

    مثال Sniffer لـ ESP8266 متصل بـ Arduino باستخدام محول USB UART TTL

    على الرغم من أن أداة الشم الموجودة في الصورة أعلاه بدائية بالتأكيد (من بين أشياء أخرى، فهي لا تحتوي على العازلة) يكفي لمراقبة تشغيل التجميع اردوينو و ESP8266.

    إزالة الشم من المخطط السابق، رسم تخطيطي يوضح كيفية توصيل أ وحدة واي فاي ESP8266 إلى لوحة اردوينو. بالإضافة إلى تغذيته عند 3V3، يجب توصيل دبوس إعادة الضبط ودبوس التنشيط الخاصين بالجهاز المدمج بمستوى عالٍ (تمكين). بالطبع، يجب أن يتصل طرف RX الخاص بأحدهما بمنفذ TX الخاص بالآخر.

    لتبسيط الرسم التخطيطي السابق، تم تمثيل لوحة اردوينو يتم تشغيله عند 3V3 والذي يُفترض أيضًا أن الجهد الكهربي الموجود على المنفذ التسلسلي له هو 3V3. إذا كنت تستخدم أ متحكم مع مستوى إشارة مختلف على المنفذ التسلسلي (عادة 5 فولت) سيكون من الضروري، حتى لا يتلف ESP8266، إستخدم محول المستوى مثل تلك الموجودة في المخططات أدناه. توجد هذه الدائرة بشكل متكرر في العديد من تطبيقات الوحدات التجارية الجاهزة.

    محول مستوى الإشارة 5 فولت إلى 3V3 لوحدة WiFi ESP8266 وArduino

    تحديث البرامج الثابتة ESP8266

    ال ESP8266 في الأوامر، وإنهائها، والسرعة الافتراضية للوحدة... تعتمد على إصدار البرامج الثابتة ESP8266. من الأفضل التأكد من أن لديك نفس الإصدار في جميع الوحدات، وإذا أمكن، فهو الإصدار الأحدث.

    لسوء الحظ ، فإن معظم نماذج وحدة واي فاي ESP8266 لديهم 4 ميجابت فقط، لذلك لا يمكن تثبيت الإصدار الأحدث عليهم. أحدث إصدار (رسمي) من البرنامج الثابت الذي يمكن تثبيته عليه وحدات واي فاي ESP8266 مع 4 ميجابت (الأكثر) هو 0.9.4 والذي يتضمن الإصدار 0.2 من ESP8266 في الأوامر.

    باختصار، لتحديث البرنامج الثابت تحتاج إلى:

    1. قم بتنزيل إصدار البرنامج الثابت المقابل. ال أحدث إصدار (رسمي) للوحدة التي تحتوي على 4 ميجابت من الذاكرة، موجود في مجلد Espressif على جيثب. في موقع اسبريسيف يمكنك تنزيل أحدث إصدار من البرنامج الثابت، ولكن من المهم جدًا التحقق من أن الوحدة التي تم تثبيت البرنامج عليها بها ذاكرة كافية.

    2. قم بتنزيل أحدث إصدار من أداة تثبيت البرامج الثابتة. المفضل لدي esptool الذي هو مكتوب في بايثون، لذلك فهو يعمل على أي منصة. بالإضافة إلى إمكانية تنزيله، يمكن أيضًا تثبيته باستخدام pip install esptool (o pip2 o python -m pip…). بالطبع، قهوة اسبريسف كما يقدم أيضًا أداة خاصة به ولكنه متاح حاليًا لنظام التشغيل Windows فقط.

    3. تحضير الملفات التي تم تنزيلها; قم بفك ضغطها في مجلد يمكن الوصول إليه، وإذا لزم الأمر، اجعل الأداة قابلة للتنفيذ esptool، في حالتي، منذ ذلك الحين جنو / لينكس، مع chmod +x esptool

    4. قم بتوصيل الوحدة بالكمبيوتر باستخدام المحول ذراع USB‏ UART TTL الذي يعمل على 3V3 أو استخدم محول المستوى إذا كان يعمل عند 5 فولت. بالإضافة إلى الطاقة، سيتعين عليك توصيل TX إلى RX للمحول ذراع USB‏ UART TTLو RX إلى TX و GPIO0 على مستوى منخفض (GND) وربما GPIO2 على مستوى عالٍ (في اختباراتي عملت على توصيله على مستوى منخفض وفصله). إذا كانت الوحدة تحتوي على اتصال GPIO15 مجاني (كما يحدث في ESP-12)، فيجب توصيلها بمستوى منخفض. يمكن ترك RESET، الذي يكون عادة على مستوى عالٍ أثناء التشغيل، غير متصل أو متصلاً بمستوى عالٍ عن طريق المقاوم (10K، على سبيل المثال)، لأنه قبل بدء التسجيل قد يكون من الضروري إعادة ضبط الجهاز عن طريق توصيله إلى مستوى منخفض .
      من خلال تشغيل الوحدة، ستكون متاحة للتحديث، ولكن، إذا تم عرض خطأ في الاتصال، فسيكون من الضروري إعادة تعيينه توصيل RESET بمستوى منخفض للحظة ثم تركه على الهواء (بدون توصيل) لعملية التحديث.
      الوحدة لديها ذروة استهلاك نصف أمبير (حتى 600 مللي أمبير، وفقًا لبعض المستخدمين) لذلك من المهم استخدام مصدر طاقة قادر على دعم هذا الاستهلاك، خاصة لتحديث البرامج الثابتة.

      اتصال وحدة واي فاي ESP8266 ESP-01 إلى USB UART TTL تحديث البرنامج الثابت

    5. قم بتشغيل الأداة لتحديث البرامج الثابتة. في حالتي، قمت بحفظ مستندات الأداة والبرامج الثابتة في الخطوة 3 في نفس المجلد، لذلك أقوم بتشغيلها من وحدة التحكم:
      cd ~/Datos/firmwareESP8266 (قم بالتغيير إلى المجلد الذي يحتوي على الأداة والبرامج الثابتة)
      ./esptool.py --baud 115200 --port /dev/ttyUSB0 write_flash \
      0x00000 ./boot_v1.1.bin \
      0x01000 ./user1.bin \
      0x7C000 ./esp_init_data_default.bin \
      0x7E000 ./blank.bin

      --baud يحدد سرعة ESP8266 (115200 باود في حالتي) و --port المنفذ التسلسلي الذي يتصل به (في حالتي، تمت محاكاة أول USB). يتم تجاهل المستندات المختلفة التي تشكل البرنامج الثابت write_flash يسبقه العنوان، مع مستند user1.bin الذي يحتوي على حمولة التحديث.

      تحديث البرامج الثابتة wifi ESP8266 esptool التقاط وحدة التحكم

    إرسال الأوامر إلى وحدة wifi ESP8266

    للسيطرة على ESP8266 من جهاز كمبيوتر سيتعين علينا أن نبدأ به تكوين التطبيق والذي سيكون كافيًا①اختيار المنفذ الذي يتصل به المحول ذراع USB‏ UART TTL، شيء مثل /dev/USB0 في جنو/لينكس وما شابه ذلك أو شيء من هذا القبيل COM6 في نظام التشغيل Windows، ② اختر السرعة التي يتم بها ESP8266، ربما 115200 باود، ③ قم بتعيين 8 بتات بيانات بالإضافة إلى بت توقف واحد، بدون تكافؤ أو مصافحة، و④ قم بتعيين نهاية السطر، اعتمادًا على الثابتة، دائمًا تقريبًا CR+LF.

    قم بتكوين برنامج CuteCom لمراقبة وحدة wifi ESP8266 باستخدام محول USB UART TTL

    قم بتكوين PuTTY لمراقبة وحدة wifi ESP8266 باستخدام محول USB UART TTL

    بمجرد تكوين التطبيق (أو تخزينه واختياره حيثما يكون ذلك مناسبًا)، يصبح كذلك افتح الاتصال ("فتح الجهاز" و"فتح"، على التوالي، في لقطات شاشة الأمثلة أعلاه باستخدام كيوتكوم y المعجون) ويمكنك البدء في إرسال الطلبات إلى ESP8266.

    كما يتبين في ESP8266 في جدول الأوامر، تنسيق التنشيط وإلغاء التنشيط وتعيين القيمة والإشارة إليها يمكن التنبؤ به تمامًا، ولكن بشكل عام ليس من السهل تذكرها جميعًا وربما ستحتاج إلى أن تكون في متناول يدك للإشارة إليها.

    طريقة إرسال في أوامر al وحدة واي فاي ESP8266 من اردوينو الأمر بسيط للغاية: ① تكوين الاتصالات مع Serial.begin(115200); (أو Serial1، Serial2... على اللوحات ذات المنافذ التسلسلية المتعددة للأجهزة) و② أرسل الأوامر باستخدام التنسيق Serial.print(orden+"\r\n");

    يوضح المثال أعلاه كيفية إرسال وحدة واي فاي ESP8266 في الطلبات من اردوينو. في هذه الحالة هو موضح AT+CWJAP، والذي يستخدم للاتصال بنقطة الوصول. يستخدم هذا الأمر معرف نقطة الوصول (SSID) والمفتاح، كلاهما بين علامتي اقتباس، حتى يصبحا كائنًا Srtring وأرفقها بين علامتي اقتباس باستخدام رمز الهروب (\"). لإكمال الطلب، استخدم \r\n الذي يتوافق مع CR y LF.

    تذكر أن المنفذ التسلسلي لا يتم التعرف عليه دائمًا Serial (على لوحات معينة يمكن أن يكون Serial1, Serial2…) تم تعريف كائن المنفذ المستخدم عن طريق تعيينه للماكرو PUERTO_SERIE. اكتشاف نوع اللوحة المستخدمة يمكن أن يضيف القليل من الذكاء إلى اختيار المنفذ التسلسلي؛ سنتحدث لاحقًا عن كيفية معرفة نوعه اردوينو. بقية التعريفات هي التعريفات المعتادة التي تسمح لك "بتسمية" القيم الثابتة لتجنب تكرارها (وارتكاب الأخطاء) وتسهيل تغييرها.

    من المفترض أن يقوم المثال أعلاه بتوصيل ملف وحدة واي فاي ESP8266 إلى نقطة الوصول المشار إليها ولكن هل كانت متصلة بالفعل من قبل؟ هل نجح الاتصال؟ لمعرفة ذلك، نحن بحاجة إلى "الاستماع" إلى ما ESP8266

    تلقي البيانات من وحدة واي فاي ESP8266

    من خلال توصيل أداة شم البيانات الموضحة أعلاه بالكمبيوتر، يمكنك معرفة ما يحدث اردوينو قد أرسل إلى ESP8266 ورده. للقراءة من اردوينو ومعالجة المعلومات الموجودة فيه، سيكون من الضروري الكشف عنها Serial.available() إذا وصلت أي بيانات، وإذا كان الأمر كذلك، قم بتحميلها Serial.read(). يوضح المثال التالي كيفية قراءة الرد من AT+CWJAP?، والذي سيقوم بالإبلاغ عما إذا كان هناك اتصال بأي نقطة وصول.

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

    تلقي البيانات من وحدة wifi ESP8266 من Arduino. مثال أساسي

    قم بتحليل الاستجابة المرسلة بواسطة وحدة wifi ESP8266

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

    هناك طريقة بسيطة لإدارة هذا الظرف كرر البيانات الواردة بحثًا عن إجابات محددة والتي من خلالها، على سبيل المثال، يتم تنشيط المؤشرات (الأعلام أو المتغيرات المنطقية) التي ستحدد ما إذا كان سيتم مواصلة البحث في النص المستلم وما هي الإجراءات التي يجب تنفيذها بناءً على المعلومات الواردة من ESP8266. بينما يصل الرد متحكم يمكن أن يخصص لمهام أخرىعلى سبيل المثال، تلقي البيانات من أجهزة الاستشعار ومعالجتها.

    ابحث عن نص في المعلومات الواردة من ESP8266

    للبحث في النص الذي يأتي من ESP8266 يمكن أن يكون قارن كل حرف مستلم بالحرف الذي يتوافق مع الرسالة التي تبحث عنها. سيكون من الضروري استخدام عداد (أو مؤشر) يشير إلى الحرف المراد مقارنته؛ إذا كان الحرف الذي يصل من ESP8266 هو نفسه الذي يتم فحصه في الرسالة، يتقدم العداد، إذا كان مختلفًا يتم تهيئته.

    ولمعرفة أنه تم الوصول إلى النهاية يتم الرجوع إلى الحرف التالي للرسالة التي تم البحث عنها والذي سيكون صفراً (\0) أو يتم تخزين طول الرسالة من خلال مقارنتها بالعداد لمعرفة ما إذا كانت المقارنة قد انتهت وبالتالي وحدة واي فاي ESP8266 لقد أرسل الرسالة المطلوبة.

    يستخدم المثال التالي الأمر AT+CWLAP والتي ستعرض قائمة بنقاط الوصول وداخلها يتم البحث عن نقطة تسمى "wifi Polaridad.es". على الرغم من أننا اخترنا التحقق من أن الحرف الأخير هو صفر، كما هو الحال في العازلة فهو يقوم فقط بتخزين النص الذي تم البحث عنه ويكون طوله معروفًا، ويمكن أيضًا التحقق مما إذا كان قد تم استلام هذا العدد من الحروف الصحيحة. مع LED متصلاً بالدبوس 2، تم الإبلاغ عن العثور على النص المتوقع.

    في كود المثال السابق يمكنك أيضًا رؤية طريقة اختر المنفذ التسلسلي حسب نوع اللوحة اردوينو مستخدم. يفترض هذا المثال أن لديك ثلاثة أنواع من اللوحات للمشروع: واحد اردوينو أونو، واحد اردوينو ميجا 2560 وعلى اردوينو ليوناردو. إذا كنت تعمل مع أ اردوينو أونو سيتم استخدامه Serial وعلى خلاف ذلك Serial1.

    إذا كنت تعمل مع لوحة اردوينو ليوناردو يمكنك استخدام نفس الطريقة لإيقاف البرنامج وانتظار وحدة التحكم (المنفذ التسلسلي المرتبط بـ Serial) متاح.

    ابحث في النصوص المختلفة في استجابة ESP8266

    يتم استخدام الكود الموجود في المثال السابق للبحث عن نص في المعلومات المرسلة بواسطة ESP8266 لكن الرد قد يتضمن معلومات مختلفة حسب العملية. لنفترض، للبدء بحالة بسيطة في المثال التالي، أن النص المرسل بواسطة MCU ESP8266 es OK عندما يتم تنفيذ العملية بشكل صحيح و ERROR خلاف ذلك، كما هو الحال مع النظام AT+CWJAP?، والذي يعمل على التحقق مما إذا كان وحدة واي فاي ESP8266 متصل بالفعل بنقطة وصول.

    يتيح لك هذا التطبيق الجديد لنفس الطريقة، والذي يبحث عن تطابق مع العديد من الرسائل المحتملة، الاختيار بين إجراءات مختلفة اعتمادًا على الاستجابة المستلمة من ESP8266، ببساطة قم بتشغيل LED المقابلة.

    تحديد الوقت المستغرق لتلقي الرد

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

    للتحقق من مرور فترة زمنية معينة (على الأقل). عادة ما يتم طرح "الوقت" للحظة التي بدأ فيها الحساب من "الوقت" الحالي ويتم التحقق من أن الفرق أكبر من الحد المطلوب. لا يجب أن يكون هذا "الوقت" وقتًا حقيقيًا، فهو عادةً ما يتوافق مع الفاصل الزمني الذي انقضى منذ MCU البدء في حساب الوقت؛ وهذا لا يؤثر على البرنامج لأن المهم هو الوقت المنقضي وليس الوقت المطلق.

    عادةً، للتحقق من انقضاء فترة زمنية معينة، يتم استخدام تعبير من النوع:

    متغير milisegundos_al_empezar يحتوي على قيمة millis() لحظة معينة في التنفيذ يتم توقيتها، لذلك ليس من غير المألوف أن يشير اسمها إلى كلمة "الكرونومتر". المتغير intervalo_de_tiempo يحتوي على الحد الأقصى لعدد المللي ثانية التي تجعل التعبير السابق صحيحًا، أي أنه يمثل المهلة؛ وعادة ما يكون ثابتًا (أو ماكرو)، وكما في الحالة السابقة، غالبًا ما تظهر كلمة "TIMEOUT" في اسمه. إذا كنت تعمل بفترات زمنية قصيرة جدًا، يمكنك استخدامها micros() بدلا من millis() (ميكروثانية بدلاً من ميلي ثانية) على الرغم من أنها أقل شيوعًا وأقل دقة بكثير.

    عدد صحيح طويل في اردوينو (unsigned long) تشغل 4 بايت (32 بت)، وبالتالي فإن أكبر قيمة يمكن أن تمثلها هي 4294967295 (2 أس 32 ناقص واحد، لأنها تبدأ من الصفر). على طبق اردوينو أثناء التشغيل المستمر، سيتم إعادة ضبط عداد المللي ثانية (العودة إلى الصفر) كل 50 يومًا تقريبًا. عند الطرح باستخدام أنواع البيانات غير الموقعة، يتم إعادة إنتاج نفس السلوك (قلب العداد)، لذلك يكون من الممكن التحكم في المهلة إلى أجل غير مسمى.

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

    تنفيذ عملية معقدة تحددها أوامر AT متعددة

    للحصول على مثال مرجعي للغرض من التطبيق الذي يستغل وحدة واي فاي ESP8266لنفترض أنه كذلك تخزين المعلومات في قاعدة بيانات يتم الوصول إليها من خلال خدمة ويب لتتبع درجة الحرارة. يقرأ التعليمة البرمجية التالية المستشعر المتصل بإدخال تناظري كل فترة زمنية معينة، ويحسب القيمة المتوسطة، وبعد فترة زمنية أطول، يرسلها إلى خادم الويب (النمط IOT) من خلال أ عريضة HTTP (انشر، احصل...).

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

    العمليات التي تشكل المهمة المطلوب تنفيذها لإرسال درجة الحرارة هي:

    • إعادة ضبط وحدة wifi
    • قطع الاتصال بنقطة الوصول الحالية (في حالة وجود اتصال افتراضي)
    • اضبط الإعدادات. على سبيل المثال، من المفترض أنه يجب تكوين وضع الاتصال (البسيط) والدور في اتصالات Wi-Fi (المحطة).
    • الاتصال بنقطة الوصول
    • تأكد من صحة الاتصال (في الواقع هذه هي نقطة الدخول) إذا لم يكن هناك اتصال، ابدأ العملية من البداية
    • اتصل بالخادم
    • أرسل الطلب HTTP مع البيانات التي سيتم تخزينها

    ليس من الضروري أن يكون ترتيب العمليات على هذا النحو تمامًا (على الرغم من أن العملية كذلك) وقد تتطلب كل خطوة عدة خطوات ESP8266 في الأوامرعلى سبيل المثال، سيحتاج التكوين المذكور أعلاه إلى اثنين: AT+CIPMUX=0 y AT+CWMODE=1.

    بنية بيانات لتمثيل العمليات على ESP8266

    في الأمثلة السابقة، على الرغم من أنه بطريقة أساسية جدًا، تم بالفعل اقتراح حل عام للمشكلة: استخدم بنية بيانات تخزن الاستجابات المحتملة والإجراءات التي يجب اتخاذها في كل حالة; أرسل إجراءً، وانتظر الرد، ثم تابع وفقًا لما يعنيه الرد. لأن كل عملية معقدة سوف تتطلب عدة ESP8266 في الأوامريجب أن تربط بنية البيانات عملية مع أخرى، لاحقة أو سابقة، والتي يجب تنفيذها في كل حالة حسب استجابة ESP8266.

    في الأمثلة السابقة تم البحث عن رسالة ضمن رد الـ ESP8266 وتم تفسيره على أنه نجاح أو خطأ. بالإضافة إلى استقبال (وتحليل) جميع النصوص الواردة، للحصول على حد أدنى عام، يُنصح أيضًا بالاهتمام بإكمال الرسالة أو بمعنى آخر مدى توفرها وحدة واي فاي ESP8266 لتلقي الطلبات الجديدة. بهذه الطريقة، التغيير إلى الحالة التي يمكن أن نطلق عليها، على سبيل المثال، "wifi متاح"، يمكن أن يكون تلقي اسم نقطة الوصول واستلام النص ERROR أو النص OK قد يعني أن ESP8266 لقد انتهيت من الرد ويمكنك الآن إرسال الرد التالي في الأمر إلى ESP8266.

    يستخدم الكود أعلاه ناقلًا (operacion) لتخزين نص العمليات المتعاقبة التي تشكل المهمة الكاملة. يتم استخدام مصفوفة ثنائية الأبعاد (mensaje) مع الاستجابات الثلاثة التي تم تحليلها. كما وضحنا أعلاه، من الضروري البحث عن الرسائل التي تمثل نهاية الرد بالإضافة إلى الرسالة التي تمثل إجابة صحيحة أو غير صحيحة. لن تحتوي جميع العمليات على نفس عدد الإجابات المحتملة؛ عندما يكون هناك عدد أقل من الاستجابات، يمكن استخدام رسالة فارغة تستهلك أقل عدد ممكن من الدورات في تحليلها (ومع ذلك، فهي ليست الطريقة الأمثل). ومن الناحية المنطقية، سيكون من الضروري أن يشمل الحد الأدنى لعدد الإجابات المطلوبة (ثلاثة في المثال) جميع الاحتمالات التشغيلية، حتى لو لم تكن كلها ممكنة.

    عند الحديث عن الإجابات المحتملة، يمكن أن نرى بالفعل أن هذا المثال ليس مفيدًا جدًا لتلقي البيانات بتنسيق عشوائي من ملف وحدة واي فاي ESP8266، ولكن الشيء هو أنه في سياق الاستخدام مع ميكروكنترولر ليس من المعتاد؛ الشيء الأكثر شيوعًا هو إرسال البيانات التي تم جمعها بواسطة أجهزة الاستشعار التي تم توصيلها و/أو تلقي معلومات حول ما يجب فعله بالمشغلات التي تتحكم فيها. معلومات قيمة للغاية، ويمكن التنبؤ بها بشكل جيد للغاية.

    في بنية البيانات السابقة، تمامًا كما يتم التعبير عن الاستجابات المحتملة التي يتم تحليلها، يتم أيضًا استخدام مصفوفة ثنائية الأبعاد لتحديد العملية التي يجب إجراؤها في كل حالة (siguiente_operacion). على وجه التحديد، اخترنا الرد على ثلاثة أنواع من الرسائل: ① نص عشوائي (LITERAL) للتحقق مما إذا كان هناك اتصال بنقطة وصول Wi-Fi والخادم، ② نص لاكتشاف الأخطاء في العملية (FALLO) و③ نص يشير إلى أن العملية قد تمت بنجاح (ACIERTO).

    أخيرًا، هناك متجهان آخران لتعيين الحد الأقصى لوقت الانتظار قبل الاستسلام (timeout) وحدد (configuracion) إذا انتهت العملية دون انتظار الرد (ESPERAR_RESPUESTA) والرسائل التي تشير إلى انتهاء الاتصال. هذا المتجه الأخير، لتوضيح مثال لكيفية حفظ الذاكرة، يعمل مع وحدات بايت التكوين للإشارة إلى الحالات المختلفة.

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

    عندما تتصل بالخادم، يتغير النمط. في هذه الحالة، من الضروري①إرسال طول حزمة البيانات المراد إرسالها و②إنشاء الطلب HTTP بنص ثابت بالإضافة إلى القيمة (درجة الحرارة) التي يتم إرسالها لتخزينها على الخادم. يتم تحضير هذه البيانات في كل شحنة ومن الضروري تقسيمها إلى قسمين (إخطار بالطول) أو ثلاثة (إرسال الطلب) HTTP) ل ESP8266 عند الطلب. فقط الجزء الأخير من الأجزاء التي تم تقسيم العملية إليها سينتظر الرد.

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

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

    كما هو الحال في نقاط مختلفة في الكود، سيتم إرسال العملية (عندما يحين وقت إرسال متوسط ​​درجة الحرارة، إذا تم تجاوز وقت انتظار العملية، عندما تكتمل العملية الحالية بنجاح...) ولكن كيفية القيام بذلك هي أنشئت على الصعيد العالمي، وقد تم تعريفه على نطاق واسع ENVIAR_OPERACION الذي يجمع الخطوات المتبعة في الشحن.

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

    منطقيًا، يمكن تنفيذ العديد من إجراءات التحسين على الكود السابق، ولكن بما أن هذا مثال لفهم كيفية تنفيذ ESP8266 بشكل عام، لا يستحق الأمر سوى التركيز على بعض الجوانب، أولها بنية البيانات. ويبدو أن الشيء المنطقي هو استخدام بنية بيانات لغة البرمجة (struct) لتمثيل المعلومات التي تتم معالجتها: ال ESP8266 في الأوامر والرسائل التي يتم تحليلها.

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

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

    في خط تحسين الكود، من المثير للاهتمام أن نتذكر أنه في برنامج من هذا النوع، والذي يستخدم كمية كبيرة من النص، يمكن توفير مساحة الذاكرة SRAM تخزين السلاسل النصية في ذاكرة البرنامج (فلاش) مع الماكرو F(). في لقطات الشاشة التالية، يمكنك رؤية البرنامج المختلف وتوزيع الذاكرة الديناميكي مع الاستخدام العادي للنص واستخدام الماكرو F().

    مثال على كود اردوينو باستخدام النص المخزن في ذاكرة البرنامج (فلاش)
    مثال على كود اردوينو باستخدام النص في SRAM

    فيما يتعلق بالإجراءات التي يتم تنفيذها بناءً على المعلومات الواردة من وحدة واي فاي ESP8266، كبديل للتحقق من الرسالة من الكود وتنفيذ واحدة أو أخرى وفقًا لما تم استلامه، يمكن تخزينها في بنية البيانات هذه مؤشرات إلى الوظائف التي تؤدي كل مهمة بدلاً من مؤشرات الحالة (الأعلام) التي تحذر من حالة معينة يكون التطبيق مسؤولاً عن إدارتها، على سبيل المثال، داخل الحلقة الرئيسية.

    فيما يلي مثال على بنيات تخزين بيانات الطلبات المقدمة إلى ESP8266 (نوع البيانات operacion_esp8266) واستجاباتهم (نوع البيانات respuesta_esp8266).

    نظرًا لأن الهيكل الذي يمثل العملية (البيانات التي يتم إرسالها إلى ملف وحدة واي فاي ESP8266) يشير إلى الهيكل الذي يتم من خلاله تحديد الاستجابات، وهيكل الاستجابات لهيكل العمليات، من الضروري الإعلان عن كليهما أولاًوذلك من خلال تحديد نوع البيانات الجديد، ومن ثم تحديد محتوياته.

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

    وكما ذكرنا من قبل، سيكون هناك بديل آخر، إما لاستبدال مؤشر الحالة أو استكماله تخزين وظيفة في البنية المرجعية (مؤشر) سيتم استدعاؤه عند مواجهة نص معين في الرد من ملف وحدة واي فاي ESP8266.

    في المثال السابق، تمت إضافته إلى بنية البيانات المستخدمة لمعالجة الاستجابة من وحدة واي فاي ESP8266 مؤشر إلى دالة (مفترضة) تقوم بإرجاع بيانات من النوع float (يمكن أن تكون القيمة المرجحة للقراءة التناظرية) والتي يتم توفير بايتين لها كوسائط (اثنان unsigned char والذي يمكن أن يكون هو الدبوس الذي تتم قراءة الإدخال التناظري منه والذي يقوم بتنشيط ENABLE للمتكامل الافتراضي).

    قيد التطوير ل MCU، على عكس ما يحدث في أسلوب التطوير للأنظمة الأكبر، ليس من غير المألوف استخدام المتغيرات العامة عند تحديد السلوك (العالمي) للتطبيق الذي يتحكم في التجميع، لذلك لن يكون من النادر بشكل خاص العثور على هذا النوع من التعريفات كوظائف بدون معلمات ولا تُرجع قيمًا، شيء من هذا القبيل void (*accion)();

    إذا كنت تعمل بهذه الطريقة لتمثيل البيانات، فاستخدم struct من البيانات ذات الطول المتغير، سيكون من الضروري تخصيص الذاكرة ديناميكيًا malloc() (o new()، إذا تم استخدام الكائنات)، والتي ستستخدم مقدار الذاكرة المخصصة كمعلمة وتعيد المؤشر إلى بداية منطقة الذاكرة المحجوزة. مع sizeof() بالنسبة للنوع الذي يتم تخزينه، مضروبًا في عدد العناصر المستخدمة، يمكنك الحصول على مقدار الذاكرة المطلوبة. يمكن رؤية مثال مع وبدون استخدامه في لقطات الشاشة أدناه. malloc(); كن حذرا مع الذاكرة التي يستخدمها البرنامج. في الحالة الأولى، تحتاج إلى تحميل المكتبة التي تحتوي على هذه الوظيفة.

    مثال لتخصيص الذاكرة مع malloc على اردوينو

    مثال على تعيين النص بدون malloc في اردوينو

    إذا كانت العمليات على وحدة واي فاي ESP8266 سوف تختلف طوال تنفيذ البرنامج، سيكون من الضروري تحرير الذاكرة التي لم يتم استخدامها معها free() (o delete()، في حالة كونها كائنات). على الرغم من أنه من المعقول أن نتوقع أن المترجم (الخليج) سيعمل على تحسين البرنامج لتجنب تقسيم الذاكرة، وبالتأكيد لن يكون الأداء مثاليًا مثل العمل مع الذاكرة المخصصة بشكل ثابت.

    على الرغم من أنه في هذا المثال (في كلا التطبيقين) ليس له معنى كبير، من أجل تعميم العملية حتى تتمكن من تطبيقها على حالات أخرى، تجدر الإشارة إلى أن إرسال البيانات يكرر دائمًا نفس البروتوكول: قم بإعلام عدد البايتات التي سيتم إرسالها، وانتظر المؤشر (>) وأرسل البيانات.

    نظرًا لأنه في هذا المثال يتم استخدامه في مناسبة واحدة فقط (يتم تقديم الطلب بالكامل في حزمة واحدة)، فإنه لا يبدو مفيدًا جدًا، ولكن بشكل عام، قد يكون من الضروري إجراء عدة عمليات إرسال في نفس العملية، بما في ذلك الحالات التي يجب أن يتم إرسال كميات كبيرة من البيانات التي يجب تجزئتها لتجنب تجاوز سعة ذاكرة الجهاز ESP8266.

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

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

    تعليق

    مستخدم التعليقات
    dūbxls̄d

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

    أكتب تعليق

    ربما تكون قد فاتتك