Use of the ESP32 Deep Sleep mode for our cat flap

Welcome to the second part of the series "Smart Cat Flap".

In today's last part of the series, we address a very important issue: saving energy!

Those who have recreated the cat flap from part 1 will surely have "stumbled" on the question of energy supply, because such an electronics on the door wants to be supplied with electricity, but many cables on the door do not want to be laid for optical reasons. Especially not across the door. So one only sensible option is left with a battery supply for our cat flap. However, this should supply our circuit with electricity for as long as possible. The equation is that the smaller the power consumption, the longer the battery lasts at the same capacity.

In mathematical terms, this means: A(mpere)*H(our) = Ah (ampere hour). The capacity of a battery is indicated in Ah, so we change the formula after the time: time (in hours) = ampere hours of the battery / ampere (consumer current consumption). Let's take as an example, we operate our cat flap with a 5Ah 5 volt power bank. For simplicity, we neglect the power dissipation of the voltage regulators. Our circuit requires for operation at 5 volts - 122 mA.

0.122A

 

If we put this value in the above formula, we can calculate the estimated operating time of the circuit on our battery: 5 Ah / 0.122 A = 40.98 hours / 24 hours = 1.71 days. Not much, considering that every time we have to recharge the battery after it time. To change this. Let's upload the following code to our ESP:

 

#include <Wifi.H>
#include <BlynkSimpleEsp32.H>

Port definition button
#define Cat_Go_SW  15    Cat goes
#define Cat_Comes_SW 2    Cat comes

#define BLYNK_PRINT Serial
#define BLYNK_NO_BUILTIN
#define BLYNK_NO_FLOAT

#define BUTTON_PIN_BITMASK 0x8004
#define BLYNK_DEBUG

Global Variables
Char Auth[] = "Hihpj9P8wjhUiTClwNGAa4RW7kx4XDax"; Enter your Blynk app here (email) according to instructions Auth Token.
Bool result = 0;

RTC_DATA_ATTR Int bootCount = 0;

Your WiFi credentials.
Char Ssid[] = "WLANGW1339";
Char Pass[] = "A09703471882406B";  Set password to "" for open networks.
Unsigned Long Switch_ServiceCall_Handler = 0;  Delay Variable for Delay between Moisure Readings
Bool State_Cat_Go_old = False;
Bool State_Cat_Comes_old = False ;
Int GPIO_reason = 0;
Byte TryCounter = 0;

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.println("Wakeup was not caused by deep sleep."); Break;   }
}

Void print_GPIO_wake_up()
{   If (GPIO_reason != 0)   {     Serial.Print("GPIO that triggered the wake up: GPIO ");     Serial.println((Log(GPIO_reason)) / Log(2), 0);   }
}

Void Setup()
{   ++bootCount;                    Increment boot number and print it every reboot   pinMode(Cat_Go_SW, Input);   pinMode(Cat_Comes_SW, Input);   Serial.Begin(9600);             initialize serial communication at 9600bits per second   while (!Serial) { }             wait for serial port to connect. Needed for native USB   Serial.println(Q(""));   Serial.println("Boot number: " + String(bootCount));   print_wakeup_reason();          Print wakeup Reason   GPIO_reason = esp_sleep_get_ext1_wakeup_status();   print_GPIO_wake_up();           Print wakeup Reason Port   Wifi.Persistent(False);   Wifi.Begin(Ssid, Pass);   Serial.Print("Trying to establish connection to WiFi");   while ((Wifi.Status() != WL_CONNECTED) && (TryCounter < 10))   {     Delay(1000);     TryCounter++;     Serial.Print(".");   }   Serial.println(".");   If (Wifi.Status() == WL_CONNECTED)   {     If (GPIO_reason != 0)     {       Blynk.Config(Auth);       while (Blynk.Connect() == False) {  }   Wait until connected       Serial.println(Q("Connected to Blynk Server."));       Send_Handy_Message ();       for (Byte A = 0; A > 254; A++) {         Blynk.Run();       }       Delay(10000);     }   } else   {     Serial.println("Counld NOT establish Connection to WiFi Network.");   }   Wifi.disconnect();   esp_sleep_enable_ext1_wakeup(BUTTON_PIN_BITMASK, ESP_EXT1_WAKEUP_ANY_HIGH);   Serial.println("Going to sleep now.");   esp_deep_sleep_start();
}

Void Send_Handy_Message ()   //
{   Byte Convert = 0;   Convert = Log(GPIO_reason) / Log(2);   If (Convert == 2)   {     Serial.println("Cat is coming.");     Blynk.Notify ("Note: Cat Comes");   }   If (Convert == 15)   {     Serial.println("Cat is going.");     Blynk.Notify ("Note: Cat goes");   }
}

Main Loop
Void Loop()
{   This is not going to be called
}

Our circuit now needs for operation at 5 volts and the same! Function now only 10 mA.

0.010A

 

There is no need to change the hardware compared to Part 1.
If we put this value back into the formula, we can calculate the new estimated operating time of the circuit: 5 Ah / 0.010 A = 500 hours / 24 hours = 20.83 days. This is a twelvefold increase in runtime by adjusting the code and using the deep sleep mode of the ESP32 chip! Not bad for the time being.

Ausgabe_Serieller_Monitor_Katzenklappe

However, if you want to optimize your circuit even further, you can reduce the power consumption by removing the USB-to-Serial Converter CP2102 on the DEV board by half. The placement of the chip CP2102 I have bordered red on the board:

ESP32 Dev Kit C - CP2102 marked

After the removal of this chip, the reduced current consumption would result in a running time of approx. 41 days per charge.

Enough for convenient operation, but the chip can no longer be programmed directly via USB. According to the data sheet, the ESP32 consumes some microampers in deep sleep. It is therefore quite possible, e.g. by removing the voltage regulator and directly supplying 3.3 volts, to save some mA again. However, in this case, I recommend only one ESP32 Chip or the ESP32 chip with adapter card and no longer the ESP DEV Board.

 

ESP32 Chip    ESP32 chip with adapter card in the AZ-Delivery Shop

 

 

I wish you a lot of fun rebuilding and until the next project.

Esp-32Projects for advancedSmart home

4 comments

Oliver

Oliver

@Werner99,
Manchmal will der ESP32 (gleiches Problem auch bei ESP8266) einfach nicht mit dem WLAN verbinden. Da hilft dann nur ein Reset und anschließender Neustart.
Ich hab das so gelöst:
- Nach dem Aufwachen aus dem Deepsleep Modus wird ein WLAN Verbindungsversuch unternommen und ca. 5 Sekunden auf die Verbindung mit dem WLAN gewartet.
- Verbindet das WLAN ist alles ok, die gewünschte Aktion wird ausgeführt und der Chip geht erneut in den Deepsleep und wartet auf den nächsten Wakeup.
- Verbindet das WLAN aus welchem Grund auch immer nicht wird der Deepsleep auf z.b. 10 Sekunden Dauer gesetzt und der Chip wird mit dieser kurzen Deeplsleepzeit wieder schlafen geschickt.
- Nach Ablauf der kurzen Deepsleep Zeit erfolgt ein neuer Verbindungsversuch.
Im Prinzip wird dadurch nur ein Reset nach relativ kurzer Deepsleepzeit provoziert
Ich setze diese Methode schon seit Langem bei einem Außensensor ein, der alle 6 Stunden einen Messwert liefern soll. Klappt bisher wunderbar.

Gruß,
Oliver

Werner99

Werner99

Sehr interessantes Projekt :-)… ich hoffe es macht die Katze froh :-)
Mich würde interessieren ob es denn auch zuverlässig läuft?
Blöde Frage möchte man meinen, aber meine Erfahrung mit Deep Sleep und WLAN reconnect ist:
Es läuft nicht stabil, sprich der ESP versucht x-Mal den reconnect nach den Deep sleep wake up.. und verbrät dabei soviel Energie das auch ein LiPo mit 3000mAh bei nach 2Tagen leer ist… Es gibt im Netz genügend dieser Fehlerbeschreibung. Bislang habe ich noch keine funktionierte Lösung finden können.
Manchmal läuft das ganze auch eine Woche ohne Probleme und man denkt, ja prima aber nach den nächsten Aufladen ist wieder alles beim Alten..
Solange man aber kein WLAN (und MQTT) braucht, z.B. nur lokale Messwert auf einen eInkDisplay anzeigen, klappt das mit den Deep sleep hervorragend.

Ralf Bauerfeind

Ralf Bauerfeind

Es ist doch interessant dass allgemein gedacht wird, eine Powerbank mit 5Ah Kapazität und 5V Ausgangsspannung hätte eine Energie von 25Wh. Leider wird die Energie auf Powerbanks – im Gegensatz zu Laptopakkus – nicht angegeben.
Ich denke eher, die 5Ah sind die Kapazität der verbauten, parallel geschalteten Li-Ionen Akkus. Mal rund gerechnet 3,5V * 5Ah ergäbe dann aber nur noch 17,5Wh – mal ganz abgesehen davon dass die Wandlung von 3,5V auf 5V auch nicht ganz ohne Verluste abgeht.

CrazyNepo

CrazyNepo

Hi, Cooles Projekt.

Ihr habt nur vergessen die Zugangsdaten zu Blynk und Wlan zu schwärzen.

Leave a comment

All comments are moderated before being published

Recommended blog posts

  1. Install ESP32 now from the board manager
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA - Over the Air - ESP programming via WLAN