Нужна помощь Помогите с LIGHT_SLEEP и пробуждением по таймеру

Bobrius

New member
Делаю часы, понимаю что выбрал не самый лучший микроконтроллер, но хочу его заставить работать.
Дело в том, что не могу заставить esp8266 выйти из сна на 150ms (или чуть больше или чуть меньше). Причем deep_sleep использовать нельзя.
В режиме light_sleep пробуждение происходит только по внещним GPIO.

Для засыпания использую следующую функцию:
Код:
void driver_powerManager_GoSleep(uint16_t time) {
            wifi_set_opmode_current(NULL_MODE);
            wifi_fpm_set_sleep_type(LIGHT_SLEEP_T);
            wifi_fpm_open();
            
            PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U,
            gpio_pin_wakeup_enable(btns_pins[0], GPIO_PIN_INTR_HILEVEL);   
            gpio_pin_wakeup_enable(btns_pins[1], GPIO_PIN_INTR_HILEVEL);   
            gpio_pin_wakeup_enable(btns_pins[2], GPIO_PIN_INTR_HILEVEL);   

            wifi_fpm_set_wakeup_cb(wake_cb);
           
            wifi_fpm_do_sleep(time*1000);
            delay (time+1);
           
            #ifdef debug
              Serial.println("Going to sleep");
              Serial.println(millis());
            #endif

        }
Все работает отлично, потребление полностью устраивает с одним "но" - микроконтроллер не просыпается по истечению uint16_t time. А значит не проснется через 150ms и не проверить акселерометр или другой датчик. Просыпание происходит только по нажатиям на кнопки.

Уже сижу и думаю встроить в плату attiny, которая будет по таймеру слать импульсы для пробуждения esp8266, но это костыль. Подскажите как заставить esp просыпаться самому.
 

nikolz

Well-known member
Делаю часы, понимаю что выбрал не самый лучший микроконтроллер, но хочу его заставить работать.
Дело в том, что не могу заставить esp8266 выйти из сна на 150ms (или чуть больше или чуть меньше). Причем deep_sleep использовать нельзя.
В режиме light_sleep пробуждение происходит только по внещним GPIO.

Для засыпания использую следующую функцию:
Код:
void driver_powerManager_GoSleep(uint16_t time) {
            wifi_set_opmode_current(NULL_MODE);
            wifi_fpm_set_sleep_type(LIGHT_SLEEP_T);
            wifi_fpm_open();
           
            PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U,
            gpio_pin_wakeup_enable(btns_pins[0], GPIO_PIN_INTR_HILEVEL);  
            gpio_pin_wakeup_enable(btns_pins[1], GPIO_PIN_INTR_HILEVEL);  
            gpio_pin_wakeup_enable(btns_pins[2], GPIO_PIN_INTR_HILEVEL);  

            wifi_fpm_set_wakeup_cb(wake_cb);
          
            wifi_fpm_do_sleep(time*1000);
            delay (time+1);
          
            #ifdef debug
              Serial.println("Going to sleep");
              Serial.println(millis());
            #endif

        }
Все работает отлично, потребление полностью устраивает с одним "но" - микроконтроллер не просыпается по истечению uint16_t time. А значит не проснется через 150ms и не проверить акселерометр или другой датчик. Просыпание происходит только по нажатиям на кнопки.

Уже сижу и думаю встроить в плату attiny, которая будет по таймеру слать импульсы для пробуждения esp8266, но это костыль. Подскажите как заставить esp просыпаться самому.
вместо кнопки ставите конденсатор
перед сном его заряжаете так чтобы разрядился через 150 мс
он разрядится и нажмет на пин
и будет вам счастье
 

Bobrius

New member
вместо кнопки ставите конденсатор
перед сном его заряжаете так чтобы разрядился через 150 мс
он разрядится и нажмет на пин
и будет вам счастье
Спасибо. Идея хорошая, попробую.
Видимо никак не обойтись без внешнего RTC. Если по внутренним часам еще можно было +- погрешность определить время в сутках, то с конденсатором никак не отследить продолжительность сна
 

nikolz

Well-known member
Спасибо. Идея хорошая, попробую.
Видимо никак не обойтись без внешнего RTC. Если по внутренним часам еще можно было +- погрешность определить время в сутках, то с конденсатором никак не отследить продолжительность сна
я так делаю
 

nikolz

Well-known member
Уже все отключил, удалось добиться 15мА, а это только 33 часа работы максимум от 500мАh аккумулятора.
С light_sleep можно добиться результата в 30 раз лучше
тогда либо прерывания либо дополнительный чип либо BLE чип
либо сон глубокий
 

Bobrius

New member
тогда либо прерывания либо дополнительный чип либо BLE чип
либо сон глубокий
Обидно что производители не довеля до нормальной работы легкий сон.
С глубоким сном тоже все сложно, сохранять данные и восстанавливать по несколько раз секунду совсем не дело. Придется костылями обходиться наверное
 

nikolz

Well-known member
Обидно что производители не довеля до нормальной работы легкий сон.
С глубоким сном тоже все сложно, сохранять данные и восстанавливать по несколько раз секунду совсем не дело. Придется костылями обходиться наверное
вы почитайте управление питанием в документации на SDK
 

Bobrius

New member
Bobrius,
почитайте это 3.7 стр 69
Спасибо, посмотрел, но в документах явно указано что пробуждению происходит только по пину. По таймеру только для MODEN_SLEEP_T или DEEP_SLEEP. Хотя время и передается. Обидно, что SDK не допилили до идеала. Попробовал подключить керамический конденсатор + подобрать сопротивление, чтобы вышло 0.1-0.2. Пока это лучший вариант, не надо никаких внешних микроконтроллеров. Но время сна надо будет получать из RTC, ведь время сна зависит от слишком большого количества случайных велечин
 

Bobrius

New member
Спасибо, посмотрел, но в документах явно указано что пробуждению происходит только по пину. По таймеру только для MODEN_SLEEP_T или DEEP_SLEEP. Хотя время и передается. Обидно, что SDK не допилили до идеала. Попробовал подключить керамический конденсатор + подобрать сопротивление, чтобы вышло 0.1-0.2. Пока это лучший вариант, не надо никаких внешних микроконтроллеров. Но время сна надо будет получать из RTC, ведь время сна зависит от слишком большого количества случайных велечин
И точное потребление выяснить не получилось, все мои амперметры показывают около максимальную силу тока. Видимо слишком часто происходит смена сна и работы для измерения. Тут буду считать за сколько часов сядет аккумулятор
 
Сверху Снизу