11-08-2022, 21:29
Witam, próbuję uruchomić projekt oparty o układ ESP32 (płytka DFRobot FireBeetle, projekt zaczerpnięty z internetu wraz z kodem pod tą płytkę) do którego mam podłączone dwa przyciski. Całość ma być zasilana z baterii. Po uruchomieniu któregoś z przycisków wysyłana jest wiadomość po MQTT. Po czym układ ma "iść spać" aż do następnego wykrycia załączenia przycisku.
Całość działa ale mam mały problem z usypianiem się układu. W punktach postaram się przybliżyć o co chodzi (do testów miałem podpięty miernik - sprawdzałem pobór prądu)
1. Po podaniu zasilania na układ - pierwsze uruchomienie - całość ładnie przechodzi do trybu Deep Sleep - ok 15uA
2. Wciskam któryś z przycisków - dostaję wiadomość MQTT po czym układ idzie spać ale pobór już jest na stałym poziomie 1,6mA - wygląda jak by się nie usypiał do końca.
Zamieszczam kod programu :
Kiedy dodałem przed linijką :
następujące wybudzanie programu po 30 sekundach:
pobór z 1.6mA spada do 15uA po upływie tego czasu i utrzymuje się na 15uA, naciskam przycisk mam 1,6mA aż znowu się automatycznie wybudzi, sprawdzi że nic nie wcisnąłem i spadnie do 15uA.
Czy może ktoś zerknąć w kod gdzie może być problem czemu procesor nie przechodzi w tryb całkowitego uśpienia po naciśnięciu przycisku ?
Z góry dziękuję za pomoc !
Całość działa ale mam mały problem z usypianiem się układu. W punktach postaram się przybliżyć o co chodzi (do testów miałem podpięty miernik - sprawdzałem pobór prądu)
1. Po podaniu zasilania na układ - pierwsze uruchomienie - całość ładnie przechodzi do trybu Deep Sleep - ok 15uA
2. Wciskam któryś z przycisków - dostaję wiadomość MQTT po czym układ idzie spać ale pobór już jest na stałym poziomie 1,6mA - wygląda jak by się nie usypiał do końca.
Zamieszczam kod programu :
Kod:
#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
// WiFi configuration
const char* ssid = "LOGIN WIFI";
const char* password = "PASSWORD";
// Using a static IP address to avoid using DHCP will save battery
const bool useDHCP = false; // use DHCP (true/false)
IPAddress ip(111, 111, 111, 111); // WiFi Client IP when useDHCP == false
IPAddress gateway(222, 222, 222, 222); // Statis client gateway when useDHCP == false
IPAddress subnet(255, 255, 255, 0); // Static client subnet when useDHCP == false
// MQTT configuration
const char* mqttServer = "333.333.333.333"; // MQTT broker IP
const char* mqttUser = "LOGIN MQTT"; // MQTT username
const char* mqttPassword = "PASSWORD MQTT"; // MQTT password
const int mqttPort = 1883; // MQTT port (default: 1883)
// Retry configuration
const int retryWaitTime = 30; // Retry wait time in minutes
const int retryMaxTimes = 5; // Maximum retry times
int wakePort;
RTC_DATA_ATTR int retryCount = 0;
RTC_DATA_ATTR int retryPort = 0;
void setup()
{
Serial.begin(115200);
Serial.println("Starting up...");
Serial.println();
int wakeupStatus = esp_sleep_get_ext1_wakeup_status();
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
Serial.println("wakeupStatus: " + String(wakeupStatus));
Serial.println("retryPort: " + String(retryPort));
Serial.println("retryCount: " + String(retryCount));
if (wakeupStatus == 0 && retryPort != 0) {
wakePort = retryPort;
Serial.println ("Retry previously triggered wakePort: " + String(wakePort));
} else {
if (wakeupStatus != 0) {
wakePort = log(wakeupStatus)/log(2);
} else {
if (digitalRead(25)) {
wakePort = 25;
} else if (digitalRead(26)) {
wakePort = 26;
}
}
if (wakePort != 0) Serial.println ("Wakeup triggered by port: " + String(wakePort));
if (wakePort != 0) Serial.println ("Wakeup triggered by port: " + String(wakePort));
}
if (wakePort == 25 || wakePort == 26) {
retryPort = wakePort;
Serial.print("Connecting to " + String(ssid));
// Setup WiFi
WiFiClient espClient;
if (!useDHCP) WiFi.config(ip, gateway, subnet);
WiFi.begin(ssid, password);
int trycount = 0;
// try to connect to WiFi for another 15 seconds
while (WiFi.status() != WL_CONNECTED && trycount <= 15) {
delay(500);
Serial.print(".");
trycount++;
}
Serial.println();
if (WiFi.status() == WL_CONNECTED) {
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
Serial.println("Connecting to MQTT...");
PubSubClient client(espClient);
client.setServer(mqttServer, mqttPort);
if (client.connect("Mailbox", mqttUser, mqttPassword)) {
if (wakePort == 25) {
for (int i = 0; i < 3; i++) {
client.publish("mailbox/action", "arrived");
delay(100);
}
Serial.println("A letter arrived, arming door");
esp_sleep_enable_ext1_wakeup(GPIO_SEL_26, ESP_EXT1_WAKEUP_ANY_HIGH);
gpio_pulldown_en(GPIO_NUM_26);
} else {
for (int i = 0; i < 3; i++) {
client.publish("mailbox/action", "emptied");
delay(100);
}
Serial.println("Mailbox emptied, arming flap");
esp_sleep_enable_ext1_wakeup(GPIO_SEL_25, ESP_EXT1_WAKEUP_ANY_HIGH);
gpio_pulldown_en(GPIO_NUM_25);
}
resetRetry();
}
else {
Serial.println("Unable to connect to MQTT server");
retry();
}
// disconnect from MQTT
client.disconnect();
}
else {
Serial.println("Unable to connect to WiFi network");
retry();
}
// disconnect WiFi
WiFi.disconnect();
} else {
gpio_pulldown_en(GPIO_NUM_25);
gpio_pulldown_en(GPIO_NUM_26);
esp_sleep_enable_ext1_wakeup(GPIO_SEL_25 | GPIO_SEL_26, ESP_EXT1_WAKEUP_ANY_HIGH);
}
// Go to deep sleep
Serial.println("Going to sleep now...");
esp_deep_sleep_start();
Serial.println("This will never be printed");
}
void retry()
{
if (retryCount < retryMaxTimes) {
Serial.println("An error has occurred, let's try again later");
++retryCount;
esp_sleep_enable_timer_wakeup(retryWaitTime * 60000000);
gpio_pulldown_en(GPIO_NUM_25);
gpio_pulldown_en(GPIO_NUM_26);
esp_sleep_enable_ext1_wakeup(GPIO_SEL_25 | GPIO_SEL_26, ESP_EXT1_WAKEUP_ANY_HIGH);
}
else {
Serial.println("Retry failed again. I give up, sorry.");
resetRetry();
}
}
void resetRetry()
{
Serial.println("Resetting retry data");
// reset any retry counts and states
retryCount = 0;
retryPort = 0;
}
void loop()
{
// This is not going to be called
}
Kiedy dodałem przed linijką :
Kod:
esp_deep_sleep_start();
Kod:
esp_sleep_enable_timer_wakeup(30 * 1000000);
pobór z 1.6mA spada do 15uA po upływie tego czasu i utrzymuje się na 15uA, naciskam przycisk mam 1,6mA aż znowu się automatycznie wybudzi, sprawdzi że nic nie wcisnąłem i spadnie do 15uA.
Czy może ktoś zerknąć w kod gdzie może być problem czemu procesor nie przechodzi w tryb całkowitego uśpienia po naciśnięciu przycisku ?
Z góry dziękuję za pomoc !