ESP32 + LoRa с низким энергопотреблением и режимом глубокого сна (OLGO-плата TTGO LoRa32 V1.0) - PullRequest
1 голос
/ 11 июня 2019

Я пытаюсь передать данные с одного узла ESP32 LoRa на другой в режиме пониженного энергопотребления и в соответствии с европейскими правилами.

ESP32 плата: TTGO LoRa32 OLED Board 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 (я передаю на частоте 868 МГц) требуется рабочий цикл <= 1% и максимальная мощность 25 мВт (14 дБ). Это означает, что я могу передавать в течение 36 секунд каждый час (скажем, я передаю в течение 1 секунды, а затем ESP32 «спит» в течение 99 секунд). Я могу добиться этого написания (это не самый точный способ, но он должен работать): </p>

    #define TIME_TO_SLEEP 99

    А как же эрп? Допустим, антенна имеет усиление 2 дБ, поэтому я могу установить мощность передачи на 12 дБ (12 дБ + 2 дБ -> 14 дБ, отлично. Все нормально!):

    LoRa.setTxPower(12);

    Мой второй вопрос : я прав (по поводу обеих настроек)? Я что-то упустил?


  • Последний вопрос : пожалуйста, не стесняйтесь давать мне любые (если у вас есть) отзывы / предложения по улучшению этого эскиза!


Спасибо всем за помощь.

1 Ответ

2 голосов
/ 11 июня 2019

Это выглядит хорошо, вы тестировали энергопотребление во время глубокого сна? У меня такая же плата (TTGO ESP32 LORA с OLED), и я получаю около 38-50 мА в бодрствующем состоянии и 10 мА во время сна. Вы можете попробовать LoRa.end() и LoRa.sleep() после завершения отправки, чтобы отправить чип в спящий режим, но я не уверен, сколько энергии это экономит.

Здесь идут некоторые обсуждения о дальнейших способах отключения питания, но я не смог получить его ниже 10 мА для TTGO.

...