gpt4 book ai didi

c++ - 具有深度 sleep 模式的低功耗ESP32 + LoRa (TTGO LoRa32 OLED Board V1.0)

转载 作者:行者123 更新时间:2023-11-30 03:16:08 28 4
gpt4 key购买 nike

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

ESP32 板:TTGO LoRa32 OLED 板 V1.0(herehere)。


在我写的 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 频段(我以 868 Mhz 传输)需要 <=1% 的占空比和 25mW (14db) 的最大功率。这意味着我每小时可以传输 36 秒(假设我传输 1 秒,然后 ESP32“休眠”99 秒)。我可以实现这种写作(这不是更准确的方法,但它应该有效):

    #define TIME_TO_SLEEP 99

    erp 呢?假设天线有 2db 增益,所以我可以将发射功率设置为 12db(12db + 2db -> 14db,很好。没关系!):

    LoRa.setTxPower(12);

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

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

最佳答案

看起来不错,你测试过深度 sleep 时的功耗吗?我有相同的板(带 OLED 的 TTGO ESP32 LORA),清醒时电流约为 38-50mA, sleep 时电流为 10mA。发送完毕后可以试试LoRa.end()LoRa.sleep()让芯片休眠,不过不知道功率有多大这节省了。

有一些讨论going on here关于进一步降低功率的方法,但我无法将 TTGO 的电流降至 10mA 以下。

关于c++ - 具有深度 sleep 模式的低功耗ESP32 + LoRa (TTGO LoRa32 OLED Board V1.0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56548700/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com