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

توفير عمر البطارية مع السكون العميق: 20 خطوة
توفير عمر البطارية مع السكون العميق: 20 خطوة

فيديو: توفير عمر البطارية مع السكون العميق: 20 خطوة

فيديو: توفير عمر البطارية مع السكون العميق: 20 خطوة
فيديو: زيادة عمر بطارية الايفون | كيف تحافظ عليها وتخليها تدوم يومين! 2024, شهر نوفمبر
Anonim
Image
Image
طرق لتنبيه ESP32
طرق لتنبيه ESP32

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

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

الخطوة 1: مقدمة

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

لدينا عدة طرق لإيقاظ ESP32 عند النوم. يمكن إعداد مصادر الاستيقاظ في أي وقت قبل الدخول في وضع Deep Sleep.

الخطوة 2: طرق تنشيط ESP32

هناك خمس طرق لتنبيه ESP32:

• الموقت

• التنبيه الخارجي (ext0)

• التنبيه الخارجي (ext1)

• تنشيط المعالج المساعد ULP

• لوحة اللمس

الخطوة 3: الموقت

تحتوي وحدة التحكم RTC على مؤقت مدمج يمكن استخدامه لتنشيط الشريحة بعد فترة زمنية محددة مسبقًا. يتم تحديد الوقت بدقة ميكروثانية.

esp_deep_sleep_enable_timer_wakeup (uint64_t time_in_us)

time_in_us> هو الوقت بالميكروثانية

الخطوة 4: التنبيه الخارجي (ext0)

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

esp_deep_sleep_enable_ext0_wakeup (gpio_num_t gpio_num، int level)

gpio_num> رقم GPIO المستخدم كمصدر تنشيط. يمكن استخدام GPIOs التي تعمل بنظام RTC فقط: 0 ، 2 ، 4 ، 12-15 ، 25-27 ، 32-39.

المستوى> مستوى الإدخال الذي سيطلق الإنذار (0 = منخفض ، 1 = مرتفع)

الخطوة 5: التنبيه الخارجي (ext1)

تحتوي وحدة التحكم RTC على منطق لتشغيل المنبه باستخدام العديد من RTC GPIOs.

esp_deep_sleep_enable_ext1_wakeup (قناع uint64_t ، esp_ext1_wakeup_mode_t mode)

قناع> قناع بت لأرقام GPIO التي ستؤدي إلى التنشيط. يمكن استخدام GPIOs التي تدعم RTC فقط في هذه الصورة النقطية: 0 ، 2 ، 4 ، 12-15 ، 25-27 ، 32-39.

الوضع> حدد وظيفة المنطق المستخدمة لتحديد حالة التنشيط:

• ESP_EXT1_WAKEUP_ALL_LOW: تنبيه عندما تكون جميع كائنات GPI المحددة في LOW

• ESP_EXT1_WAKEUP_ANY_HIGH: التنبيه عندما تكون أي من كائنات GPI المحددة عالية

الخطوة 6: تنبيه المعالج المساعد ULP

يمكن أن يعمل المعالج المساعد ULP أثناء وجود الشريحة في وضع السكون العميق ويمكن استخدامه للبحث عن المستشعرات ، ومراقبة ADC أو قيم مستشعر اللمس السعوي ، وتنشيط الشريحة عند اكتشاف حدث معين.

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

الخطوة 7: لوحة اللمس

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

بعد ضبط المقاطعات ، قمنا بتمكين وضع الاستيقاظ لاستخدام المستشعرات.

// تكوين لوحة اللمس كمصدر تنبيه esp_sleep_enable_touchpad_wakeup () ؛

الخطوة 8: الدخول في وضع السكون العميق

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

esp_deep_sleep_start () ،

من هذا الأمر ، يغفو ESP32 ولا يقوم بتنفيذ الأسطر التالية من التعليمات البرمجية على سبيل المثال.

هام: يجب إجراء جميع إعدادات التنبيه قبل تنفيذ الأمر أعلاه.

الخطوة 9: إليك بعض المعلومات الأكثر أهمية

إليك بعض المعلومات الأكثر أهمية
إليك بعض المعلومات الأكثر أهمية

ترجع المكالمة أدناه سبب تنبيه ESP32.

1: EXT0 2: EXT1 3: TIMER 4: TOUCHPAD 5: ULP

esp_sleep_get_wakeup_cause () ،

إذا قمنا بتعيين التنبيه بواسطة لوحة اللمس ، فيمكننا استعادة GPIO الذي حدث اللمس من خلال الأمر

esp_sleep_get_touchpad_wakeup_status () ،

في كل مرة يستيقظ فيها ESP32 ، سوف يتنقل خلال الإعداد مرة أخرى. وبالتالي فإن جميع المتغيرات التي لم يتم تحديدها في ذاكرة RTC ستعود إلى حالتها الأصلية.

للاحتفاظ بالمتغيرات في الذاكرة حتى بعد النوم ، استخدم تعريف المتغير في المثال أدناه:

// RTC_DATA_ATTR aloca a varável na memória RTCRTC_DATA_ATTR int bootCount = 0 ؛

الخطوة 10: العرض التوضيحي

برهنة
برهنة

يظهر الفيديو البرنامج يعمل ، حسب الصورة.

الخطوة 11: WiFi NodeMCU-32S ESP-WROOM-32

واي فاي NodeMCU-32S ESP-WROOM-32
واي فاي NodeMCU-32S ESP-WROOM-32

الخطوة 12: التجميع

المجسم
المجسم

الخطوة 13: البرنامج

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

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

Library مطلوبة
Library مطلوبة

للتحكم في شاشة OLED ، نحتاج إلى مكتبة خارجية. لهذا ، سنقوم بتنزيل مكتبة U8g2.

في Arduino IDE ، انتقل إلى قائمة Sketch >> Include Library >> Manage Libraries….

الخطوة 15: المكتبات والمتغيرات

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

# تضمين // biblioteca para contole تعرض oled

// construtor da instancia do controlador do display // SDA = 21 e SCL = 22 U8X8_SSD1306_128X64_NONAME_SW_I2C display (SCL، SDA، U8X8_PIN_NONE) ؛ // RTC_DATA_ATTR aloca a varável na memoria RTC RTC_DATA_ATTR int bootCount = 0 ؛ // sensibilidade para aceitação do toque #define Threshold 40 // fator de convertão de microsegundos para segundos #define uS_TO_S_FACTOR 1000000 // tempo que o ESP32 ficará em modo sleep (em segundos) #define TIME_TO_SLEEP 3

الخطوة 16: الإعداد

في الإعداد ، نزيد عدد مرات حدوث التمهيد. نسمي الوظيفة لطباعة الحذاء الحافز. إذا كان رقم التمهيد هو PAR ، فسنقوم بتعيين ESP32 للاستيقاظ عبر الزر (EXT0). إذا كان من مضاعفات 3 ، فإننا نضبط ESP32 للاستيقاظ بعد وقت محدد. خلافًا لذلك ، قمنا بإعداد دبابيس اللمس السعوية لإيقاظ ESP32. أخيرًا ، قمنا بتعيين Touchpad كمصدر للاستيقاظ وأجبرنا ESP32 على الدخول في وضع السكون.

إعداد باطل () {Serial.begin (115200) ؛ تأخير (1000) ؛ // incrementa o numero de vezes que o BOOT ocorreu ++ bootCount؛ تكوين العرض () ، // chama a função para Imprimir o motivo do BOOT print_wakeup_reason () ؛ // se o numero de boot for PAR configuramos o ESP32 para despertar através do botão (EXT0) if (bootCount٪ 2 == 0) {esp_sleep_enable_ext0_wakeup (GPIO_NUM_39، 1) ؛ // 1 = مرتفع ، 0 = منخفض} // se for multiplo de 3 configuramos o ESP32 para despertar depois de um tempo Definido else if (bootCount٪ 3 == 0) {esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR) ؛ } // caso contario configuramos os pinos de touch capacitivo para despertar o ESP32 else {// Setup interrupt on Touch Pad 5 (GPIO12) touchAttachInterrupt (T5، callback، Threshold)؛ // تكوين لوحة اللمس كمصدر تنبيه esp_sleep_enable_touchpad_wakeup () ؛ } Serial.println (“entrando em modo sleep”)؛ esp_deep_sleep_start ()؛ // força o ESP32 entrar em modo SLEEP}

الخطوة 17: التكرار والرد وتكوين العرض

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

// nada a se fazer no loopvoid loop () {} // callback das interrupções void callback () {// caso queira fazer algo ao ocorrer a interrupção} void configurationDisplay () {// inicializa o display e configura alguns parametros display. يبدأ()؛ display.setPowerSave (0) ، // modo powerSave (0-Off؟ 1-On) display.setFont (u8x8_font_torussansbold8_u) ؛ // fonte utilizada // Imprime no display os numero de vezes que aconteceu o BOOT display.drawString (0، 0، "BOOT NUM:")؛ display.drawString (0، 2، String (bootCount).c_str ()) ؛ display.drawString (0، 4، "MOTIVO:")؛ }

الخطوة 18: Print_wakeup_reason (معرفة سبب الصحوة)

هنا ، لدينا وظيفة لطباعة سبب تنبيه ESP32. تحقق من الدبوس واطبع على الشاشة.

// função para imprimir a reasona do ESP32 despertarvoid print_wakeup_reason () {esp_sleep_wakeup_cause_t wakeup_reason؛ سبب السلسلة = "" ؛ wakeup_reason = esp_sleep_get_wakeup_cause () ، // recupera a reasona do despertar switch (wakeup_reason) {الحالة 1: السبب = "EXT0 RTC_IO BTN" ؛ استراحة؛ الحالة 2: السبب = "EXT1 RTC_CNTL" ؛ استراحة؛ الحالة 3: السبب = "TIMER" ؛ استراحة؛ الحالة 4: السبب = "TOUCHPAD" ؛ استراحة؛ الحالة 5: السبب = "برنامج ULP" ؛ استراحة؛ الافتراضي: السبب = "NO DS CAUSE" ؛ استراحة؛ } Serial.println (السبب) ؛ display.clearLine (6) ؛ // apaga a linha 6 do display.drawString (0، 6، reason.c_str ())؛ // Imprime a reasona do despertar no display // se despertou por TOUCHPAD، então vamos verificar em qual dos pinos ocorreu if (wakeup_reason == 4) {print_wakeup_touchpad ()؛ // verifica o pino e Imprime no display}}

الخطوة 19: Print_wakeup_touchpad (تعرف على GPIO Touch)

الآن ، في هذه الخطوة ، لدينا وظيفة طباعة الدبوس الذي تم لمسه. استعدنا GPIO الذي أيقظ ESP32 وطبعه على الشاشة.

// função para Imprimir o pino que foi tocadovoid print_wakeup_touchpad () {touch_pad_t touchPin؛ touchPin = esp_sleep_get_touchpad_wakeup_status () ، // recupera o GPIO que despertou o ESP32 String GPIO = ""؛ التبديل (touchPin) {الحالة 0: GPIO = "4" ؛ استراحة؛ الحالة 1: GPIO = "0" ؛ استراحة؛ الحالة 2: GPIO = "2" ؛ استراحة؛ الحالة 3: GPIO = "15" ؛ استراحة؛ الحالة 4: GPIO = "13" ؛ استراحة؛ الحالة 5: GPIO = "12" ؛ استراحة؛ الحالة 6: GPIO = "14" ؛ استراحة؛ الحالة 7: GPIO = "27" ؛ استراحة؛ الحالة 8: GPIO = "33" ؛ استراحة؛ الحالة 9: GPIO = "32" ؛ استراحة؛ الافتراضي: Serial.println ("Wakeup not by touchpad") ؛ استراحة؛ } Serial.println ("GPIO:" + GPIO) ؛ display.clearLine (7) ؛ // apaga a linha 7 do display.drawString (0، 7، "GPIO:")؛ display.drawString (6، 7، GPIO.c_str ()) ؛ // Imprime o GPIO}

الخطوة 20: قم بتنزيل الملفات

بي دي إف

انا لا

موصى به: