ESP32-C6 Low Power hanging device?
ESP32-C6 Low Power hanging device?
I bought a DFROBOT FireBeetle ESP32-c6 device and I did some testing with light power saving. So far it just hangs the device.
My code is quite simple
[Codebox]
#include <esp_wifi.h>
#include "driver/uart.h"
#define TIMER_WAKEUP_TIME_US (2 * 1000 * 1000)
void GoToLightSleep() {
if (IsSafeToUseSleep()) {
Serial.println("Going tolight sleep now!");
// To make sure the complete line is printed before entering sleep mode, need to wait until UART TX FIFO is empty
uart_wait_tx_idle_polling(CONFIG_ESP_CONSOLE_UART_NUM);
Serial.println("SLEEP!");
Serial.flush();
esp_wifi_stop();
esp_light_sleep_start();
esp_wifi_start();
Serial.println("Wakeup from light sleep now!");
} else {
Serial.println("Light sleep mode was supposed to be enabled - but A2 (PIN3) is not held high!");
delay(1000);
}
}
void setup() {
//set the analog resolution to 12 bits (0-4096)66
// analogReadResolution(12);
uint64_t err = esp_sleep_enable_timer_wakeup(TIMER_WAKEUP_TIME_US);
if (err != ESP_OK) {
Serial.println("Configure timer as wakeup source failed");
}
pinMode(LED_BUILTIN, OUTPUT);
// Start the serial
Serial.begin(9600);
delay(500);
}
// This code checks if it is safe to use sleep mode. Sleep mode will only be enabled if 3.3v is applied to pin 3 (A2) basically via a jumper from the 3.3v rail. This
// will allow us to disconnect the wire incase of bricking the device due to it sleeping to quickly.
bool IsSafeToUseSleep() {
int A2 = analogRead(3);
return A2 > 3000;
}
void loop() {
Serial.println("Loop");
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
GoToLightSleep();
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
Serial.println("Loop after sleep");
delay(1000);
}
[/Codebox]
I have a wire connecting from 3V3 to Pin3 (A2) so that I can disable the sleeping if it sort of locks up on restart. This is not needed but since the USB drops I wanted a way to not just kill the ability to reset the device without it going back to sleep.
What I have found is that the device hangs and does not return from light sleep mode. I have no problem using deep sleep.
But I would like to use light sleep for 1-5 seconds. What happens is that the LED should turn on when it goes to sleep and turn off when it comes out of sleep. It however does not, the device hangs or appears to. The USB connection also fails but I believe this is a side effect of light sleep and the USB hardware on the C6.
Any thoughts?
This is a bare bones device being tested so light sleep should work and the code seems to be what I am supposed to use based on examples online.
How would I debug this?
I am using Arduino IDE 2.3.2 and DF Robot Firebeetle C6 board using 3.0.0-a ESP by Espressif
Chris
Chris
My code is quite simple
[Codebox]
#include <esp_wifi.h>
#include "driver/uart.h"
#define TIMER_WAKEUP_TIME_US (2 * 1000 * 1000)
void GoToLightSleep() {
if (IsSafeToUseSleep()) {
Serial.println("Going tolight sleep now!");
// To make sure the complete line is printed before entering sleep mode, need to wait until UART TX FIFO is empty
uart_wait_tx_idle_polling(CONFIG_ESP_CONSOLE_UART_NUM);
Serial.println("SLEEP!");
Serial.flush();
esp_wifi_stop();
esp_light_sleep_start();
esp_wifi_start();
Serial.println("Wakeup from light sleep now!");
} else {
Serial.println("Light sleep mode was supposed to be enabled - but A2 (PIN3) is not held high!");
delay(1000);
}
}
void setup() {
//set the analog resolution to 12 bits (0-4096)66
// analogReadResolution(12);
uint64_t err = esp_sleep_enable_timer_wakeup(TIMER_WAKEUP_TIME_US);
if (err != ESP_OK) {
Serial.println("Configure timer as wakeup source failed");
}
pinMode(LED_BUILTIN, OUTPUT);
// Start the serial
Serial.begin(9600);
delay(500);
}
// This code checks if it is safe to use sleep mode. Sleep mode will only be enabled if 3.3v is applied to pin 3 (A2) basically via a jumper from the 3.3v rail. This
// will allow us to disconnect the wire incase of bricking the device due to it sleeping to quickly.
bool IsSafeToUseSleep() {
int A2 = analogRead(3);
return A2 > 3000;
}
void loop() {
Serial.println("Loop");
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
GoToLightSleep();
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
Serial.println("Loop after sleep");
delay(1000);
}
[/Codebox]
I have a wire connecting from 3V3 to Pin3 (A2) so that I can disable the sleeping if it sort of locks up on restart. This is not needed but since the USB drops I wanted a way to not just kill the ability to reset the device without it going back to sleep.
What I have found is that the device hangs and does not return from light sleep mode. I have no problem using deep sleep.
But I would like to use light sleep for 1-5 seconds. What happens is that the LED should turn on when it goes to sleep and turn off when it comes out of sleep. It however does not, the device hangs or appears to. The USB connection also fails but I believe this is a side effect of light sleep and the USB hardware on the C6.
Any thoughts?
This is a bare bones device being tested so light sleep should work and the code seems to be what I am supposed to use based on examples online.
How would I debug this?
I am using Arduino IDE 2.3.2 and DF Robot Firebeetle C6 board using 3.0.0-a ESP by Espressif
Chris
Chris
Re: ESP32-C6 Low Power hanging device?
You only set esp_sleep_enable_timer_wakeup once. After the first sleep+wakeup, there is no wakeup source configured so it's expected that it remains in light sleep forever.
Try moving esp_sleep_enable_timer_wakeup to the line before esp_light_sleep_start.
Try moving esp_sleep_enable_timer_wakeup to the line before esp_light_sleep_start.
Re: ESP32-C6 Low Power hanging device?
I found that if I put a delay after digitalWrite(LED_BUILTIN, HIGH); like delay(1000) it is working. But the esp32-c6 has some sort of broken/limited usb support. When it goes to light sleep the usb chip is disabled but it does not get reenabled after coming out of light sleep. Hence usb serial never works after light sleep.
Chris
Chris
-
- Posts: 829
- Joined: Mon Jul 22, 2019 3:20 pm
Re: ESP32-C6 Low Power hanging device?
The esp32-c series only has a hardware USB-CDC device. This would need to be reinitialized every time you come out of deep sleep (the host end is likely to decide the device is unresponsive and dead during light sleep). I personally find that the HWCDC is entirely inappropriate for development. You may note the the Espressif devkits all come a USB->UART adapter on board.
Re: ESP32-C6 Low Power hanging device?
May I ask how you added the library esp_wifi.h to Arduino IDE? The library documentation shows it belongs to esp-idf.
I am looking for a way to test sleep modes with DFRobot Beetle or Firebeetle. Platformio does not seem to support the boards yet (it only supports stable versions of esp-idf extension), and I could not find a way to control sleep functions via Arduino IDE.
Any help is appreciated.
I am looking for a way to test sleep modes with DFRobot Beetle or Firebeetle. Platformio does not seem to support the boards yet (it only supports stable versions of esp-idf extension), and I could not find a way to control sleep functions via Arduino IDE.
Any help is appreciated.
Re: ESP32-C6 Low Power hanging device?
This is my Preferences / Additional Boards
http://download.dfrobot.top/FireBeetle/ ... index.json
https://espressif.github.io/arduino-esp ... index.json
I believe you need to have the 3.0.0.alpha3 or later library. By default I think when you click to install the board it defaults to the non alpha v2 version
After that I think the wifi.h libraries worked for me.
http://download.dfrobot.top/FireBeetle/ ... index.json
https://espressif.github.io/arduino-esp ... index.json
I believe you need to have the 3.0.0.alpha3 or later library. By default I think when you click to install the board it defaults to the non alpha v2 version
After that I think the wifi.h libraries worked for me.
-
- Posts: 829
- Joined: Mon Jul 22, 2019 3:20 pm
Re: ESP32-C6 Low Power hanging device?
Jason2866 maintains a repo with frequent release packages for platformio.
https://github.com/tasmota/platform-espressif32/
Re: ESP32-C6 Low Power hanging device?
I should have mentioned that I want to test sleep modes on DFRobot C6 boards.
So my question is which toolchain does provide support (including sleep functions) for Beetle 2 ESP32 C6 or Firebeetle 2 ESP32 C6.
@iisfaq: in your initial post, esp_wifi is included in your code. You mention that you use Arduino IDE 2.3.2.
How can esp_wifi be installed/linked in Arduino IDE? I found no hint how to do that.
I would rather use PlatformIO but was not able to install esp-idf extension in a version that supports the DFRobot C6 boards.
Sorry if I am missing something very basic.
So my question is which toolchain does provide support (including sleep functions) for Beetle 2 ESP32 C6 or Firebeetle 2 ESP32 C6.
@iisfaq: in your initial post, esp_wifi is included in your code. You mention that you use Arduino IDE 2.3.2.
How can esp_wifi be installed/linked in Arduino IDE? I found no hint how to do that.
I would rather use PlatformIO but was not able to install esp-idf extension in a version that supports the DFRobot C6 boards.
Sorry if I am missing something very basic.
Re: ESP32-C6 Low Power hanging device?
I would do this
Go to File - Preferences
In the settings tab at the bottom there should be a title called "Additional board manager Urls" enter the following
http://download.dfrobot.top/FireBeetle/ ... index.json
https://espressif.github.io/arduino-esp ... index.json
Click OK
Now go to tools and under boards select boards manager (CTRL+SHIFT-B)
In board manager you should find a board called "DFRobot ESP32 Boards" by DFROBOT
Install the latest version
Then scroll down to "esp32" by Espessif Systems
Select the latest version of 3.0.0-rc1 or 3.0.0-alpha and select install.
After that you should be able to see the ESP32-C6 board and others and the WIFI should work.
-
- Posts: 829
- Joined: Mon Jul 22, 2019 3:20 pm
Re: ESP32-C6 Low Power hanging device?
The development version is currently at 3.0.0-beta1, which has support for the C6 (and H2) boards.
If you prefer to use platformio, you can use Jason2866's packages that I linked above. The link shows what you add to platformio.ini.
arduino-esp32 is built on top of ESP-IDF. So, you can use almost all the code from the IDF in arduino. You just include the header you want. They are part of the install package. I think esp-wifi.h is pretty safe, but there may be some functionality that will interfere with the arduino core libraries.
You mentioned the esp-idf extension (for VSCode, I assume), which is a separate package from platformio. It is not necessary if you want to program with primarily Arduino code and don't need to modify the sdkconfig.
If you prefer to use platformio, you can use Jason2866's packages that I linked above. The link shows what you add to platformio.ini.
arduino-esp32 is built on top of ESP-IDF. So, you can use almost all the code from the IDF in arduino. You just include the header you want. They are part of the install package. I think esp-wifi.h is pretty safe, but there may be some functionality that will interfere with the arduino core libraries.
You mentioned the esp-idf extension (for VSCode, I assume), which is a separate package from platformio. It is not necessary if you want to program with primarily Arduino code and don't need to modify the sdkconfig.
Who is online
Users browsing this forum: No registered users and 66 guests