Всем привет! хочу организовать работу 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: }
оно не предназначено для питания от батареек. Слишком много энергии тратится на осблуживание протокола Wi-Fi. Для питания от батареек BLE.
Именно по этому оно у меня нигде и не инициализирует WiFi. В данной прошивке даже BLE не инициализируется. И более того, с этой прошивкой и потребление не конское. Вопрос именно в моменте включения.
А зачем ESP32 тогда? Есть более интересные МК в плане энергопотребления. Есть такая шутка: если не учить физику в школе, то вся жизнь будет состоять из сплошных чудес.
При чем тут чудеса, и не учение физики? конденсатор подключаю к регулятору напряжения на выходе, конденсатор на 20 мкФ. Какая физика и на каком уроке говорила, что делать нужно как-то иначе?
Ну и сколько же энергии необходимо для инициализации ESP32 и сколько энергии способен накопить конденсатор емкостью 20 мкФ?
Спасибо за ответ. В итоге понял что провода до батарейного имели очень большое сопротивление. заменил на более толстые, стало все работать. Хочется все-же разобраться с потреблением при инициализации, хотелось бы уменьшить ток до минимума. Кто нибудь читал про различные бутлоадеры, чем они отличаются, какие есть. Какие из них работают на минимальной частоте. А еще не совсем понимаю почему не отработало Код (C++): WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); по идее это должно было отключить brownout detector
Омическое сопротивление проводов не играет никакой роли. Гораздо важнее индуктивное сопротивление. Компенсацию этого сопротивления осуществляет керамический конденсатор 100nF.