Батарейное питание esp32

Тема в разделе "ESP8266, ESP32", создана пользователем maximov_ru, 5 фев 2021.

Метки:
  1. maximov_ru

    maximov_ru Нуб

    Всем привет!

    хочу организовать работу esp32 от батареек. Сейчас питания не хватает даже от 6 вольт(четырех пальчиковых батареек). При старте esp32 потребляет какой-то нереальный ток. Скорее всего есть способ загрузить другое ядро которое будет при старте не потреблять столько. Использую прошивку которая держит esp в deep_sleep большую часть времени.

    Фото модуля приложено к посту.
    При питании от usb всё хорошо.
    если запитывать от батареек, то уходит в вечный ребут(часто мигает лампочка).
    Если запитывать от батареек и usb, а потом отключить usb, то модуль работает, потребляет менее 40 мА
    Конденсатор по какой-то неведомой причине не помогает, да и это не то решение которого хотелось бы. Хочется научиться модуль изначально держать на малом потреблении и только иногда делать-что нибудь более энергозатратное.

    прошивка:
    Код (C++):
    /*
        Video: https://www.youtube.com/watch?v=oCMOYS71NIU
        Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleNotify.cpp
        Ported to Arduino ESP32 by Evandro Copercini
        updated by chegewara
       Create a BLE server that, once we receive a connection, will send periodic notifications.
       The service advertises itself as: 4fafc201-1fb5-459e-8fcc-c5c9c331914b
       And has a characteristic of: beb5483e-36e1-4688-b7f5-ea07361b26a8
       The design of creating the BLE server is:
       1. Create a BLE Server
       2. Create a BLE Service
       3. Create a BLE Characteristic on the Service
       4. Create a BLE Descriptor on the characteristic
       5. Start the service.
       6. Start advertising.
       A connect hander associated with the server starts a background task that performs notification
       every couple of seconds.
    */

    #include <BLEDevice.h>
    #include <BLEServer.h>
    #include <BLEUtils.h>
    #include <BLE2902.h>


    // See the following for generating UUIDs:
    // https://www.uuidgenerator.net/

    #define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
    #define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
    #define uS_TO_S_FACTOR 1000000  /* Conversion factor for micro seconds to seconds */
    #define TIME_TO_SLEEP  5        /* Time ESP32 will go to sleep (in seconds) */
    #define RTC_CNTL_BROWN_OUT_REG 0x78028000
    RTC_DATA_ATTR int bootCount = 0;
    RTC_DATA_ATTR char bleMessage[16] = "Hello World";

    class BLECallbacks: public BLECharacteristicCallbacks {
        void onWrite(BLECharacteristic *pCharacteristic) {
          //bleMessage = pCharacteristic->getValue();
          std::string value = pCharacteristic->getValue();
          strcpy(bleMessage, value.c_str());

          /*if (value.length() > 0) {
            //Serial.println("*********");
            //Serial.print("New value: ");
            for (int i = 0; i < 16; i++)
              Serial.print(bleMessage[i]);

            Serial.println();
            Serial.println("*********");
          }*/

        }
    };

    void createServerTask() {
      BLEDevice::init("ESP32");
      BLEServer *pServer = BLEDevice::createServer();
      BLEService *pService = pServer->createService(SERVICE_UUID);
      BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                             CHARACTERISTIC_UUID,
                                             BLECharacteristic::PROPERTY_READ |
                                             BLECharacteristic::PROPERTY_WRITE
                                           );
      pCharacteristic->setCallbacks(new BLECallbacks());
      pCharacteristic->setValue(bleMessage);
      pService->start();
      // BLEAdvertising *pAdvertising = pServer->getAdvertising();  // this still is working for backward compatibility
      BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
      pAdvertising->addServiceUUID(SERVICE_UUID);
      pAdvertising->setScanResponse(true);
      pAdvertising->setMinPreferred(0x06);  // functions that help with iPhone connections issue
      pAdvertising->setMinPreferred(0x12);
      BLEDevice::startAdvertising();
      delay(300);
      // BLEDevice::stopAdvertising();
    }

    void print_wakeup_reason(){
      esp_sleep_wakeup_cause_t wakeup_reason;

      wakeup_reason = esp_sleep_get_wakeup_cause();

      switch(wakeup_reason)
      {
        case ESP_SLEEP_WAKEUP_EXT0 : Serial.println("Wakeup caused by external signal using RTC_IO"); break;
        case ESP_SLEEP_WAKEUP_EXT1 : Serial.println("Wakeup caused by external signal using RTC_CNTL"); break;
        case ESP_SLEEP_WAKEUP_TIMER :Serial.println("Wakeup caused by timer");break;
        case ESP_SLEEP_WAKEUP_TOUCHPAD : Serial.println("Wakeup caused by touchpad"); break;
        case ESP_SLEEP_WAKEUP_ULP : Serial.println("Wakeup caused by ULP program"); break;
        default : Serial.printf("Wakeup was not caused by deep sleep: %d\n",wakeup_reason); break;
      }
    }
    void setup() {
      WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);
      Serial.begin(115200);
      //delay(1000); //Take some time to open up the Serial Monitor
     
     
      //delay(1000);
      //Increment boot number and print it every reboot
      //Print the wakeup reason for ESP32
      print_wakeup_reason();

      /*
      First we configure the wake up source
      We set our ESP32 to wake up every 5 seconds
      */

      //createServerTask();
      esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
      /*Serial.println("Setup ESP32 to sleep for every " + String(TIME_TO_SLEEP) +
      " Seconds");*/


      /*
      Next we decide what all peripherals to shut down/keep on
      By default, ESP32 will automatically power down the peripherals
      not needed by the wakeup source, but if you want to be a poweruser
      this is for you. Read in detail at the API docs
      http://esp-idf.readthedocs.io/en/latest/api-reference/system/deep_sleep.html
      Left the line commented as an example of how to configure peripherals.
      The line below turns off all RTC peripherals in deep sleep.
      */

      //esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF);
      //Serial.println("Configured all RTC Peripherals to be powered down in sleep");

      /*
      Now that we have setup a wake cause and if needed setup the
      peripherals state in deep sleep, we can now start going to
      deep sleep.
      In the case that no wake up sources were provided but deep
      sleep was started, it will sleep forever unless hardware
      reset occurs.
      */

      esp_sleep_enable_touchpad_wakeup();
      //Serial.println("Going to sleep now");
      //delay(1000);
      //Serial.flush();
      esp_deep_sleep_start();
      }

    void loop() {
      // put your main code here, to run repeatedly:
    }
     

    Вложения:

    • esp32 module.jpg
      esp32 module.jpg
      Размер файла:
      841,2 КБ
      Просмотров:
      238
  2. parovoZZ

    parovoZZ Гуру

    оно не предназначено для питания от батареек. Слишком много энергии тратится на осблуживание протокола Wi-Fi. Для питания от батареек BLE.
     
  3. maximov_ru

    maximov_ru Нуб

    Именно по этому оно у меня нигде и не инициализирует WiFi. В данной прошивке даже BLE не инициализируется. И более того, с этой прошивкой и потребление не конское. Вопрос именно в моменте включения.
     
  4. parovoZZ

    parovoZZ Гуру

    А зачем ESP32 тогда? Есть более интересные МК в плане энергопотребления.

    Есть такая шутка: если не учить физику в школе, то вся жизнь будет состоять из сплошных чудес.
     
  5. maximov_ru

    maximov_ru Нуб

    При чем тут чудеса, и не учение физики? конденсатор подключаю к регулятору напряжения на выходе, конденсатор на 20 мкФ. Какая физика и на каком уроке говорила, что делать нужно как-то иначе?
     
  6. parovoZZ

    parovoZZ Гуру

    Ну и сколько же энергии необходимо для инициализации ESP32 и сколько энергии способен накопить конденсатор емкостью 20 мкФ?
     
    issaom и Рокки1945 нравится это.
  7. Рокки1945

    Рокки1945 Гуру

  8. maximov_ru

    maximov_ru Нуб

    Спасибо за ответ. В итоге понял что провода до батарейного имели очень большое сопротивление. заменил на более толстые, стало все работать. Хочется все-же разобраться с потреблением при инициализации, хотелось бы уменьшить ток до минимума. Кто нибудь читал про различные бутлоадеры, чем они отличаются, какие есть. Какие из них работают на минимальной частоте. А еще не совсем понимаю почему не отработало
    Код (C++):
    WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);
    по идее это должно было отключить brownout detector
     
  9. maximov_ru

    maximov_ru Нуб

    По вашей ссылке 2 конденсатора, один 100 нанофарад, другой 10 микрофарад.
     
  10. Рокки1945

    Рокки1945 Гуру

    так и надо поближе их к выводам
     
  11. parovoZZ

    parovoZZ Гуру

    Омическое сопротивление проводов не играет никакой роли. Гораздо важнее индуктивное сопротивление. Компенсацию этого сопротивления осуществляет керамический конденсатор 100nF.
     
  12. Рокки1945

    Рокки1945 Гуру

    А я думал LC фильтр образуется - пойду Степаненко перечитывать....:(