低功耗 ESP32 + 具有深度睡眠模式的 LoRa (TTGO LoRa32 OLED 板 V1.0).

Low-power ESP32 + LoRa with deep sleep mode (TTGO LoRa32 OLED Board V1.0)

本文关键字:LoRa32 TTGO OLED V1 LoRa ESP32 深度 模式 低功耗      更新时间:2023-10-16

>我正在尝试在低功耗模式下从 ESP32 LoRa 节点传输到另一个节点,并符合欧洲法规。

ESP32 板: TTGO LoRa32 OLED 板 V1.0 (这里和这里).


在我写的 LoRa 发送器草图下面:
/*
* LoRa (low-power) sender for IoT projects
*  
* Tested on a TTGO LoRa32 OLED Board V1.0 
* 
* Based on the LoRa examples and the board 
* documentation
* 
* More on the deep sleep with timer wake up: 
*  
*    Examples > ESP32 > Deep Sleep > TimerWakeUp sketch
*    
*    
* ERC Recommendation
* h1.4 frequency band requires <= 1% duty cycle and 25mW (14 db) maximum power
* => 36 seconds every hour (so: 1 sec transmitting, 99 secs idle) 
* 
* 
* Created 11 June 2019
* by DP 
*    
*/

#include <SPI.h>   // allows communication with SPI devices 
#include <LoRa.h>
#include <SSD1306.h>   // provides API to work with OLED displays
// defines the pins used by the transceiver module
#define SS 18   // GPIO18 - SX1278's CS   - LoRa radio chip select
#define RST 14   // GPIO14 - SX1278's RESET   - LoRa radio reset
#define DI0 26   // GPIO26 - SX1278's IRQ   - IRQ pin
#define BAND 868E6   // EU   - Italy
// deep sleep 
#define uS_TO_S_FACTOR 1000000  // conversion factor for micro seconds to seconds 
#define TIME_TO_SLEEP  5        // time ESP32 will go to sleep (in seconds)   - 99 for (about) 1% duty cycle  

// an object of class SSD1306 
// first parameter: the I2C address of the display
// second parameter: the number of the SDA
// third parameter: the SCL pin
SSD1306 display(0x3c, 4, 15);
// stores the data on the RTC memory so that it will not be deleted during the deep sleep
RTC_DATA_ATTR int bootCount = 0; 
RTC_DATA_ATTR int pckCounter = 0;   // sending packet number...

void setup() {   
Serial.begin(115200);   // initializes serial data transmission  
while(!Serial);   // waits for serial port to connect 
Serial.println("LoRa low-power Sender");

pinMode(16, OUTPUT);
digitalWrite(16, LOW);   // sets GPIO16 low to reset the OLED
delay(50);
digitalWrite(16, HIGH);   // while the OLED is running, GPIO16 must go to high  
pinMode(2, OUTPUT);
digitalWrite(2, LOW);   // sets the onboard LED low 

// LoRa transceiver module setup 
LoRa.setPins(SS, RST, DI0);   // overrides the default CS, reset, and IRQ pins used by the library
// initializes the transceiver module with a specified frequency
while (!LoRa.begin(BAND)) {   // LoRa.begin returns 1 on success, 0 on failure
Serial.println(".");
}
// changes the spreading factor to 12 -> slower speed but better noise immunity
LoRa.setSpreadingFactor(12);   // ranges from 6-12, default is 7 
// changes the sync word (0xF3) to match the receiver
// the sync word assures you don't get LoRa messages from other LoRa transceivers  
LoRa.setSyncWord(0xF3);   // ranges from 0-0xFF     

// LoRa.setTxPower(txPower);   // defaults to 17
// initializes the display by calling the init method of the display object 
display.init();   // receives no arguments and returns void
// display.flipScreenVertically();   // LCD is broken!
display.setFont(ArialMT_Plain_16);   // sets the current font
display.drawString(0, 0, "Initialization");   // x, y, message to show
display.drawString(0, 16, "completed");
display.display();
delay(1500);   // small delay so that the user can read it  
Serial.println("LoRa init completed");    
//Increments boot number and prints it every reboot
bootCount++;
Serial.println("Boot number: " + String(bootCount));
sendData();   // sends the data...
// deep sleep
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
Serial.println("Setup ESP32 to sleep for every " + String(TIME_TO_SLEEP) + " Seconds");
Serial.println("Going to sleep now");
Serial.flush();   // waits for the transmission of outgoing serial data to complete 
esp_deep_sleep_start();   // enters deep sleep with the configured wakeup options
}
void loop(){
// this is not going to be called
}
// sends the data to the receiver
void sendData() {

Serial.print("Sending packet: ");
Serial.println(pckCounter);
display.clear();   // clears the display
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.drawString(0, 0, "Sending ");
display.drawString(0, 16, "packet: " + String(pckCounter, DEC));
display.display();

digitalWrite(2, HIGH);   // LED is ON during transmission
// sends the LoRa packet to the receiver
LoRa.beginPacket();
LoRa.print("hello ");
LoRa.print(pckCounter);
LoRa.endPacket();

digitalWrite(2, LOW);   // turns the LED off after transmission
pckCounter++;
}

草图运行没有错误(商店页面上的代码包含一些错误,所以我鼓励你使用这个只是为了玩它)。我的问题:

  • 我忘了初始化 SPI 通信:

    SPI.begin (SCK, MISO, MOSI, SS);

    但尽管如此,它还是奏效了。我没想到。我的第一个问题是:我错过了什么?

  • 我住在欧洲。ERC推荐文件指出,h1.4频段(I以868 Mhz传输)需要<=1%占空比和25mW(14db)最大功率。这意味着我可以每小时传输 36 秒(假设我传输 1 秒,然后 ESP32 "休眠"99 秒)。我可以实现写作(这不是更准确的方式,但它应该有效):

    #define TIME_TO_SLEEP 99

    那么企业资源规划呢?假设天线有 2db 增益,所以我可以将发射功率设置为 12db(12db + 2db -> 14db,很棒。没关系!

    LoRa.setTxPower(12);

  • 我的第二个问题:我是否正确(关于两种设置)?我错过了什么吗?

  • 最后一个问题:请随时给我任何(如果您有)反馈/建议来改进此草图!

看起来不错,你测试过深度睡眠期间的功耗吗?我有相同的板(TTGO ESP32 LORA与OLED),清醒时获得约38-50mA,睡眠时获得10mA。您可以在完成发送后尝试LoRa.end()LoRa.sleep()将芯片送入睡眠状态,但我不确定这样可以节省多少电量。

这里有一些关于降低功率的进一步方法的讨论,但我无法将其降低到TTGO的10mA以下。

总的来说,我对LilyGo产品和低电流的体验很差。我测试了其中的几个 (不是 LoRa 的) 通常它们至少消耗 1mA.我认为真正省电的传感器可以像这样由 Atmel LoRa 节点制成.

补充: 仅供参考, 我有测试台 (868MHz LoRa 无线电节点 V1.0) 每小时发送一次 LoRa 消息,并且它使用电池运行数月.现在3个多月后,电池下降约为0.25V。

非常好,看起来和我的草图非常相似。我认为电池连接器使用的是低压降稳压器,但这仍然会消耗毫安。 正如我目前正在评估测试替代方案一样:您是否曾经尝试过使用 GND/3V3 连接器直接为电路板供电?使用标准的 3.7V 锂聚合物电池和一些合适的肖特基二极管产生约 0.2V 的压降,即使电池充满,也能正常工作,保持在 3.6V 以下。