This is a continuation of an old posting on low power remote receivers, started and continued by William Lucid … quite a while ago now. I have finally gotten around to studying and implementing the eByte transceiver and have written a tutorial that can guide a curious “how does it work” person through its operation. These devices have software in them to allow it to sleep most of the time, and wake up every 1 second or so for a few milliseconds to see if anyone is trying to communicate … this is known as Wake-On-Receive (WOR). That’s what makes it ideal for an ultra low power remote receiver.
This is an interesting project and the tutorial is not of the stellar quality like Sara and Rui’s of course, but could be useful if someone wants to pursue testing/playing with/building a low-power remote receiver.
The link to that tutorial is: https://github.com/jamargevicius/eByteE220tutorial . There is a long pdf which is the explanation, and a zip file with the 9 test projects. Thank you Sara and Rui for the opportunity to post this.
Here are some things I determined:
1) the first consideration is availability of power. If AC is not available remotely, then of course a battery and/or a battery/solar combo is necessary, but there are issues to think through.
2) if AC is available remotely, and wifi is available remotely, forget using an eByte transceiver — an ESP32 is all you need.
3) these transceivers need a microcontroller to manage them. On the remote receiver side, a sleepable micro, like the ESP32, is necessary. On the transmitter side, which is AC powered via a plug-in power supply (USB or whatever), a sleepable micro isn’t necessary, so using a Raspberry Pi, or of course the ESP32, is possible.
4) there are development boards available for the eByte devices (see Lucid’s entry on the newer Ebyte EoRa-S3-900TB), however, they are “development boards”, and they need USB/solar power. Available supplies are designed to charge cellphones, and they “fall asleep” when the charge is very low and they drop the voltage, killing the ESP — you need a “keep alive” device to keep the ESP32 power on ( something I discuss in the tutorial). If someone has an alternative solution, please post it.
5) Ideally, using a bare-bones ESP32 module is a production-quality solution for ultra-low power, but it is for serious hardware geeks.
6) I found that the eByte transceiver is “sort of” reliable, but not 100%. For mission critical things (like turning off a lamp, or turning off water, or a relay), one must implement handshaking between the local transmitter and the remote receiver (also called ACK’ing for acknowledging)
7) The eByte communicates with the ESP via the 2nd serial port (Serial2). However, this port does not wake up immediately when an interrupt wakes up the ESP. So, receiving and reading a packet cannot be used to wake up the Serial2 port — an initial “wakeup” packet (just a letter for example) needs to be used, and then after a 100+mSec delay, send the “message” packet.
8) The big question is: what are you trying to control? If that “thing” is power hungry (e.g. a bright lamp, an irrigation valve, etc), then either this isn’t a good fit, or using big solar+battery is necessary.
9) with a bare-bones ESP32 module and an eByte E220 module, I’ve measure current drain of 20uA for the receiver when it is totally asleep. That means long life for a battery-operated system, but again, “what are you trying to control” ?
10) I found the available .h files that supports the eByte to be over the top in complexity … like taking a sledgehammer to a tack (something I avoid in the tutorial).
Hi Joe,
Happy to see you are are still working with low-power remote receivers. Have started reading your tutorial. Will finish in the morning.
Have you looked into using an ESP32S3?
You might use a combination of powering down the E220 and wake by timer to achieve lower power usage. This is what I am doing with the EoRa-S3-900TB.
void taskDispatcher(String storedTimestamp) {
// Wake over radio
digitalWrite(BUILTIN_LED, HIGH);
collectSensorData(); //BME280 data
sendSensorResponse(); //Send to Gateway
Serial.print(" Time: ");
Serial.println(storedTimestamp);
Serial.println(" Radio.sleep mode next 14 Min."); Power down E220 here
Serial.println(" ESP32-S3 going to sleep");
radio.sleep();
wakeByTimer();
Serial.println("✅ Timer Expired");
setupLoRa(); //Back to Duty Cycle listening
digitalWrite(BUILTIN_LED, LOW);
goToSleep();
}
Powering down the E220:
// Define pin connections
const int M0 = 2; // Connect M0 to digital pin 2
const int M1 = 3; // Connect M1 to digital pin 3
void setup() {
pinMode(M0, OUTPUT);
pinMode(M1, OUTPUT);
// Set M0 and M1 HIGH to enter deep sleep mode
digitalWrite(M0, HIGH);
digitalWrite(M1, HIGH);
}
void loop() {
// Module is now in deep sleep
// Wake up by setting M0 and M1 to LOW (0V) for normal mode
delay(1000);
}
Also, are you using a duty cycle? I use Radiolib library it has radio.setDutyCycleAuto(). I achieve a duty cycle of 1.4% active (3.71s) and 98.6% sleep with no parameters. I only use duty cycle; no continuous listening. 100% reliable; so far.
Deep Sleep: Call spi.end(); to conserve more current consumption before going to deep sleep..
Thanks for the E220 tutorial; 76 and still learning…
William