- المتطلبات
- مخطط دائرة وضع السكون ESP32
- نظرة عامة على أوضاع النوم في ESP32
- برمجة ESP32 لوضع السكون العميق
- اختبار ESP32 في وضع السكون العميق
ESP32 هي واحدة من أكثر وحدات التحكم الدقيقة القائمة على Wi-Fi شيوعًا وهي خيار شائع في العديد من تطبيقات إنترنت الأشياء المحمولة. إنها وحدة تحكم قوية تدعم البرمجة ثنائية النواة ولديها أيضًا دعم Bluetooth منخفض الطاقة (BLE) مما يجعلها خيارًا جيدًا للتطبيقات المحمولة مثل أجهزة iBeacon وأجهزة تعقب GPS وما إلى ذلك ، ومع ذلك ، في التطبيقات التي تعمل بالبطارية مثل هذه ، الشاغل الرئيسي هو البطارية الاحتياطية. يمكن زيادة هذه النسخة الاحتياطية للبطارية عن طريق التحكم الأكثر ذكاءً في وحدة التحكم الدقيقة مثل أنه يمكن للمرء برمجة ESP32 في وضع السكون أثناء الحالة المثالية لزيادة البطارية الاحتياطية للجهاز.
في هذا المشروع ، سوف نتحقق من الاستهلاك الحالي لوحدة التحكم الدقيقة ESP32 بتقنية Wi-Fi و Bluetooth الشائعة على نطاق واسع في وضع العمل العادي ووضع السكون العميق. أيضًا ، سنختبر الفرق ونتحقق من كيفية وضع ESP32 في وضع السكون العميق. يمكنك أيضًا مراجعة المقالة حول كيفية تقليل استهلاك الطاقة في وحدات التحكم الدقيقة للحصول على نصائح أخرى يمكن استخدامها لجعل تصميمك أكثر كفاءة في استخدام الطاقة. علاوة على ذلك ، إذا كنت مهتمًا بوضع السكون لوحدات التحكم الدقيقة الأخرى ، فيمكنك تحديد وضع Arduino Sleep ووضع ESP8266 NodeMCU Sleep أيضًا.
المتطلبات
للقيام بذلك ، سوف نستخدم Devkit V4.0 المستند إلى ESP32 من Espressif الذي يحتوي على USB إلى جسر UART بالإضافة إلى وصلات ESP32 الأخرى لسهولة الاتصال. ستتم البرمجة باستخدام Arduino IDE. إذا كنت جديدًا تمامًا ، فبالنسبة لبدء استخدام ESP32 باستخدام Arduino ، اقرأ المقالة المرتبطة قبل المتابعة.
متطلبات هذا المشروع هي:
- سوف ينتقل إلى وضع السكون العميق بضغطة زر.
- سوف يستيقظ من وضع السكون العميق بالضغط على زر آخر.
- لاكتشاف حالة ESP32 ، سيومض مؤشر LED مع وقت تشغيل يبلغ 1000 مللي ثانية. أثناء وضع السكون ، سيتم إيقاف تشغيله.
لذلك ، تتطلب المكونات الإضافية-
- LED - 1 جهاز كمبيوتر
- زر الضغط (مفتاح اللمس) - 2 قطعة
- 4.7 كيلو مقاومات - 2 قطعة
- 680R المقاوم - 1 جهاز كمبيوتر
- اللوح
- وصل الأسلاك
- محول 5 فولت أو وحدة تزويد الطاقة
- كابل micro-USB
- Arduino IDE مع واجهة برمجة ESP32 في جهاز كمبيوتر شخصي أو كمبيوتر محمول.
مخطط دائرة وضع السكون ESP32
الرسم التخطيطي لوضع ESP32 في وضع السكون مع زر ضغط موضح أدناه.
التخطيطي بسيط جدا. لديها زرين. سيضع زر السكون ESP32 في وضع السكون العميق ويستخدم مفتاح آخر لإيقاظ ESP32 من وضع السكون. تم توصيل كلا الزرين في PIN 16 و PIN 33. تم تكوين كلا الزرين على أنهما نشط منخفض عند الضغط عليهما ، وبالتالي يتم توفير سحب إضافي. ومع ذلك ، لاكتشاف ما إذا كان ESP 32 في وضع السكون أو وضع حالة العمل العادي ، يتم توصيل LED بـ IO Pin 4.
نظرة عامة على أوضاع النوم في ESP32
هناك العديد من أوضاع الطاقة المختلفة لـ ESP32 ، وهي الوضع النشط ، ووضع سكون المودم ، ووضع السكون الخفيف ، ووضع السكون العميق ، ووضع الإسبات.
أثناء ظروف العمل العادية ، يعمل ESP32 في الوضع النشط. أثناء الوضع النشط ESP32 ، يتم تنشيط كل من وحدة المعالجة المركزية وأجهزة WiFi / BT وذاكرة RTC والأجهزة الطرفية RTC والمعالجات المشتركة ULP وتعمل وفقًا لحجم العمل. ومع ذلك ، في أوضاع الطاقة المختلفة ، يتم إيقاف تشغيل واحد أو أكثر من الأجهزة الطرفية. للتحقق من عمليات وضع الطاقة المختلفة ، اتبع الجدول أدناه-
المعدات |
الوضع النشط |
وضع السكون المودم |
وضع النوم الخفيف |
وضع النوم العميق |
السبات الشتوي |
وحدة المعالجة المركزية |
على |
على |
وقفة |
إيقاف |
إيقاف |
واي فاي / BT |
على |
إيقاف |
إيقاف |
إيقاف |
إيقاف |
ملحقات RTC و RTC |
على |
على |
على |
على |
إيقاف |
معالج ULP-Co |
على |
على |
على |
ON / OFF |
إيقاف |
كما نرى في الجدول أعلاه ، في وضع السكون العميق ESP32 الذي يُطلق عليه غالبًا نمط مراقبة مستشعر ULP - يتم إيقاف تشغيل وحدة المعالجة المركزية وواي فاي / BT وذاكرة RTC والأجهزة الطرفية ومعالجات ULP المشتركة. يتم تشغيل فقط ذاكرة RTC والأجهزة الطرفية RTC.
أثناء حالة الاستيقاظ ، يحتاج ESP32 إلى أن يتم إخطاره من خلال مصدر إيقاظ يقوم بإيقاظ ESP32 من وضع السكون العميق. ومع ذلك ، منذ تشغيل الأجهزة الطرفية RTC ، يمكن تنشيط ESP32 من خلال GPIOs التي تم تمكين RTC لها. هناك خيارات أخرى أيضا. يمكن إيقاظه من خلال دبابيس مقاطعة الاستيقاظ الخارجية أو باستخدام مؤقت لإيقاظ ESP32. في هذا المشروع ، نستخدم التنبيه ext0 على الرقم 33.
برمجة ESP32 لوضع السكون العميق
يمكن العثور على البرنامج الكامل في أسفل هذه الصفحة. إنه مكتوب لـ Arduino IDE ويمكن بالتالي تكييفه بسهولة مع متطلباتك. شرح الكود كالتالي.
في بداية الكود ،
// إنشاء متغير PushButton PushBnt pushBtn = {GPIO_NUM_16، 0، false} ؛ // تعريف Led Pin uint8_t led_pin = GPIO_NUM_4 ؛ // تعريف رمز التنبيه uint8_t wakeUp_pin = GPIO_NUM_33 ؛
تحدد الأسطر الثلاثة أعلاه دبوس التنبيه ودبوس LED ودبوس وضع السكون.
إعداد باطل () { // ضع رمز الإعداد هنا ، للتشغيل مرة واحدة: // اضبط المنفذ التسلسلي على 115200 Serial.begin (115200) ؛ تأخير (1000) ؛ // قم بتعيين دبوس pushButton كمدخل مع وضع الدبوس الداخلي PullUp (pushBtn.pin ، INPUT_PULLUP) ؛ // قم بتعيين معالج المقاطعة مع دبوس pushButton في وضع السقوط attachInterrupt (pushBtn.pin، isr_handle، FALLING) ؛ // قم بتعيين دبوس Led كـ ouput pinMode (led_pin ، OUTPUT) ؛ // إنشاء مهمة سيتم تنفيذها في وظيفة blinkLed () ، مع الأولوية 1 وتنفيذها على core 0 xTaskCreate ( وميض ، / * وظيفة المهمة. * / "blinkLed" ، / * اسم المهمة. * / 1024 * 2 ، / * حجم مكدس المهمة * / NULL ، / * معلمة المهمة * / 5 ، / * أولوية المهمة * / & taskBlinkled) ؛ / * مقبض المهمة لتتبع المهمة التي تم إنشاؤها * / تأخير (500) ؛ // تكوين Pin 33 كمصدر تنبيه ext0 بمستوى منطقي منخفض esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin، 0) ؛ }
في ما سبق ، يتم تعيين المقاطعة على وضع السقوط بواسطة مقتطف الشفرة
attachInterrupt (pushBtn.pin، isr_handle، FALLING) ؛
لذلك ، كلما تم الضغط على المفتاح ، سيتغير المستوى المنطقي من المنطق 1 (3.3V) إلى المنطق 0 (0V). سينخفض جهد دبوس الزر وسيحدد ESP32 أن المفتاح مضغوط. هناك أيضًا مهمة تم إنشاؤها لميض LED.
xTaskCreate ( وميض ، / * وظيفة المهمة. * / "blinkLed" ، / * اسم المهمة. * / 1024 * 2 ، / * حجم مكدس المهمة * / NULL ، / * معلمة المهمة * / 5 ، / * الأولوية من المهمة * / & taskBlinkled) ؛ / * مقبض المهمة لتتبع المهمة التي تم إنشاؤها * / تأخير (500) ؛
تم تكوين الدبوس 33 أيضًا باستخدام مقتطف الشفرة أدناه كمصدر تنبيه خارجي تم تحديده على أنه ext0.
esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin، 0) ؛
التالي ، في حلقة while-
حلقة باطلة () { // ضع الكود الرئيسي هنا ، للتشغيل بشكل متكرر: if (pushBtn.pressed) { Serial.printf ("PushButton (٪ d) Pressed \ n"، pushBtn.pin)؛ Serial.printf ("Suspend the 'blinkLed' Task \ n")؛ // تعليق مهمة blinkLed vTaskSuspend (TaskBlinkled) ؛ الكتابة الرقمية (led_pin ، منخفضة) ؛ Serial.printf ("Going to sleep….. \ n"، pushBtn.pin)؛ pushBtn.pressed = خطأ ؛ // اذهب إلى النوم الآن esp_deep_sleep_start () ؛ } esp_sleep_wakeup_cause_t wakeupReason ؛ wakeupReason = esp_sleep_get_wakeup_cause () ، switch (wakeupReason) { case ESP_SLEEP_WAKEUP_EXT0: Serial.println ("استخدام إشارة خارجية ext0 لـ WakeUp From sleep") ؛ استراحة؛ الحالة ESP_SLEEP_WAKEUP_EXT1: Serial.println ("استخدام إشارة خارجية ext1 لـ WakeUp From sleep") ؛ استراحة؛ الحالة ESP_SLEEP_WAKEUP_TIMER: Serial.println ("استخدام إشارة Timer لـ WakeUp From sleep") ؛ استراحة؛ الحالة ESP_SLEEP_WAKEUP_TOUCHPAD: Serial.println ("استخدام إشارة لوحة اللمس للاستيقاظ من السكون") ؛ استراحة؛ الحالة ESP_SLEEP_WAKEUP_ULP: Serial.println ("استخدام إشارة ULP للاستيقاظ من السكون") ؛ استراحة؛ الافتراضي: كسر ؛ Serial.printf ("استئناف مهمة 'blinkLed' \ n")؛ // إعادة تشغيل مهمة blinkLed vTaskResume (TaskBlinkled) ؛ } }
تتحقق حلقة while باستمرار من الضغط على زر السكون أم لا. إذا تم الضغط على الزر ، فسيتم إيقاف أو تعليق مهمة وميض LED وتشغيل وظيفة esp deep sleep start-
esp_deep_sleep_start () ،
في هذه الحالة ، إذا تم الضغط على زر المقاطعة الخارجية ext0 ، فسيستيقظ على الفور من وضع السكون العميق ، ويستأنف مهمة وميض LED.
أخيرًا ، يمكن رؤية وظيفة وميض LED في المقتطفات أدناه ، وستومض LED 1000 مللي ثانية.
وميض باطل (باطل * بارام) { while (1) { static uint32_t pin_val = 0؛ // تبديل قيمة الدبوس pin_val ^ = 1 ؛ الكتابة الرقمية (led_pin ، pin_val) ؛ Serial.printf ("Led -----------------٪ s \ n"، pin_val؟ "On": "Off")؛ / * ما عليك سوى تبديل مؤشر LED كل 1000 مللي ثانية أو 1 ثانية * / vTaskDelay (1000 / portTICK_PERIOD_MS) ؛ } taskBlinkled = NULL ؛ vTaskDelete (NULL) ، }
اختبار ESP32 في وضع السكون العميق
يتم إنشاء الدائرة في لوح تجارب ويستخدم مقياس متعدد إصدار Metravi XB لقياس التيار. يبلغ التيار الذي رسمته الدائرة في الوضع النشط 58 مللي أمبير تقريبًا ولكن في وضع السكون العميق ، يبلغ التيار 4.10 مللي أمبير تقريبًا. تُظهر الصورة أدناه الاستهلاك الحالي للوضع النشط ESP32 -
في وضع السكون العميق ، يتم تسجيل الاستهلاك الحالي منخفضًا إلى حوالي 3.95 مللي أمبير ، وتُظهر الصورة أدناه الاستهلاك الحالي لوضع السكون العميق ESP32-
ومع ذلك ، في وضع السكون العميق ، يبلغ استهلاك ESP32 الحالي حوالي 150 uA. لكن الاستهلاك الحالي المسجل للوحة ESP32 Devkit يبلغ 4.10 مللي أمبير. ويرجع ذلك إلى CP2102 والمنظم الخطي. هذان متصلان بخط الطاقة 5 فولت. يوجد أيضًا مصباح LED للطاقة متصل في خط الطاقة الذي يستهلك 2 مللي أمبير من التيار.
لذلك ، يمكن التعرف بسهولة على أن ESP32 يستهلك كمية منخفضة جدًا من الطاقة في حالة وضع السكون العميق وهو أمر مفيد جدًا لعمليات تشغيل البطارية. لمزيد من المعلومات حول كيفية عملها ، تحقق من الفيديو المرتبط أدناه. إذا كانت لديك أي أسئلة ، فاتركها في قسم التعليقات أدناه أو استخدم منتدياتنا للأسئلة الفنية الأخرى.