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; 73 and still learning…
William
Hi William, I’ve been using the S3 module (bare module, not a dev board) for about 4 years now, and it’s in several designs. I’m not clear on how putting E220 into deep sleep allows random communications with a transmitter .. also why using a duty cycle when WOR works fine — getting the ESP and E220 down to 20 uA current drain is pretty good for long-term battery use.
I found your post at 3:00 AM this morning; my apologies for not finishing the read at that time.
Your 20 µA is great.
New development boards like the Ebyte, Eora-S3-900TB are designed for battery use; featuring two LDOs and bypassing the USB.
Connecting the battery and not connecting the TYPE-C interface, the power consumption with the power off is around 5 uA. If the power is turned on and all peripherals are in sleep mode, the power consumption of the whole machine is around 25 uA –EoRa Pi user manual.
EoRa-S3-900TB interface is by SPI.
William
fantastic :–) … so the power consumption issue is solved without having to use the “bare ESP module” as I have done for several projects (a hassle really). Solvable issues are 1) the wakeup one (i.e. needing a “wakeup” then “message” packet to deal with the ESP’s Serial2 port activation), and 2) the reliability one (i.e. needing handshaking to ensure the Rx does what it’s asked to do — this is not necessary for a communication system like a car fob – just hit the button again – but it is for remote control of something important like a water valve).
Hi Joe,
FYI in your tutorial; choice of Ch frequency is outside the 915 MHz ISM band for the US, if you are in the United States. ISM license free bands depend on your region.
The 902–928 MHz band, commonly referred to as the 915-MHz ISM band, is a key frequency range regulated by the Federal Communications Commission (FCC).
Why I use 512 symbol preamble as stated by Claude (AI):
Ah! 98.6% sleep – that changes everything! Now it’s crystal clear:
The Real Scenario
- Receiver sleeps: 98.6% of the time (extreme power saving)
- Receiver awake: 1.4% of the time (brief listen windows)
Why 512-Symbol Preamble is Essential
The transmitter has no idea when the receiver will wake up, so:
The 512-symbol preamble must be long enough to guarantee that:
- The receiver will wake up at some point during the preamble
- There’s still enough preamble left after wake-up for the receiver to:
- Detect the carrier
- Lock onto the frequency
- Synchronize timing
- Be ready to receive the actual payload
The Math
If the receiver only listens 1.4% of the time with random/periodic wake-ups, your preamble needs to be long enough that no matter when the receiver wakes during your transmission window, it catches sufficient preamble.
This is classic asynchronous low-power networking – you’re trading:
- ❌ Longer transmit time & power
- ✅ For elimination of time sync requirements
- ✅ And maximum receiver battery life (98.6% sleep!)
Perfect for battery-powered sensors that need to last months/years! The transmitter does the “heavy lifting” so the receiver can stay asleep as much as possible.
William
… humm … good catch. that’s right about the RF bands … I’m using 815Mhz, which is not in the US band (I am in the US). This won’t make a difference in using the tutorial, but one should use Channel 52 = 0x34 = 902Mhz, to be “legal” and in the US band.
In my code, this is the #define statement/register that defines the RF frequency.
#define REG2_RF_CHAN 0x04
// = RF channel select (# 0 to #80) — RF Freq = 850.125Mhz + 1Mhz x Chan Number (i.e. chan 4 –> freq = 854.125Mhz
should be #define REG2_RF_CHAN 0x34
Battery operation of the EoRa-S3-900TB (EoRa Pi):
4.5 Battery charging –EoRa Pi User Manual
The battery can be charged via the TYPE-C connector, the LED will always light up red to indicate when charging,and when full the LED will always light up green to indicate.
When the TYPE-C port is turned on, the charging circuit will be passed through, so the current of the whole machine to enter the hibernation state is still maintained at a high level (500uA~1mA or so), and the hibernation current needs to be measured when the battery is turned on.
Connecting the battery and not connecting the TPYE-C interface, the power consumption with the power off is around 5 uA. If the power is turned on and all peripherals are in sleep mode, the power consumption of the whole machine is around 25 uA.
The battery is designed for a maximum charging current of 500mA, please ensure that the power supply capacity is sufficient.
William
Nordic Power Profiler Kit II –Active WOR receive and summary of EoRa-S3-900TB (ESP32S3 with LoRa SX1262) development board:
Nordic Power Profiler Kit II Observations and Summary
SX1262 Datasheet –Power Consumption, page 16
Regards,
William