LoRa E32 per STM32: WOR (wake on radio) del microcontrollore e lo shield per STM32 – 9
Abbiamo visto come questo dispositivo (E32 UART LoRa basato sui popolari Moduli Wireless SX1276/SX1278) gestisce il risparmio energetico, ma se usiamo il risparmio energetico solo per l’e32, il microcontrollore continua a restare attivo, ma possiamo usare il pin AUX per risolvere questo problema.
Ecco la mia selezione di LoRa E32 AliExpress (433MHz 5Km) - AliExpress (433MHz 8Km) - AliExpress (433MHz 16Km) - AliExpress (868MHz 915MHz 5.5Km) - AliExpress (868MHz 915MHz 8Km)
Cablaggio STM32F1 Blue pill
Stiamo per realizzare questa connessione per supportare il wake on radio, usiamo Serial2 per la comunicazione, PB0 per M0 e PB10 per M1, e A0, il pin di wake, per AUX così possiamo svegliare il nostro dispositivo senza problemi.
Vi consiglio di leggere il tutorial sul risparmio energetico con STM32 “STM32 power saving”.
Quindi il nuovo schema di connessione diventa così:
Cablaggio STM32F4 Black pill
Stiamo per realizzare questa connessione per supportare il wake on radio, usiamo Serial2 per la comunicazione, PB0 per M0 e PB2 per M1, e A0, il pin di wake, per AUX così possiamo svegliare il nostro dispositivo senza problemi.
Vi consiglio di leggere il tutorial sul risparmio energetico con STM32 “STM32 power saving”.
Comportamento del pin AUX
Quando sei in modalità Sleep, l’e32 mette nel buffer i dati ricevuti e va immediatamente in LOW. Quando i dati sono pronti, ritorna HIGH, LOW è perfetto per svegliare il microcontrollore.
Sveglia STM32
Come il dispositivo e32, lo stm32 ha diversi tipi di modalità sleep, ma per questo test, useremo il Light sleep con risveglio tramite GPIO.
Si rimanda a “STM32 risparmio energetico” per una descrizione dettagliata della modalità sleep.
Come mettere in light sleep STM32
Il comando per mettere in modalità di spegnimento il microcontrollore è questo
Serial.println("Start SLEEP mode in ");
for (int i = 10;i>0;i--) { Serial.print(i); Serial.print(" "); } Serial.println( "OK!" );
delay(1000);
LowPower.sleep();
delay(1000);
Bisogna però specificare che il dispositivo deve riattivarsi quando il pin AUX va LOW
// Configure low power
LowPower.begin();
// Attach a wakeup interrupt on pin, calling repetitionsIncrease when the device is woken up
// Last parameter (LowPowerMode) should match with the low power state used: in this example LowPower.sleep()
LowPower.attachInterruptWakeup(pin, wakedUp, LOW, SLEEP_MODE);
Quindi il codice per ricevere l’allarme da una trasmissione dati diventa così:
/*
* EBYTE LoRa E32
* Stay in sleep mode and wait a wake up WOR message
*
* You must configure the address with 0 3 23 with WOR receiver enable
* and pay attention that WOR period must be the same of sender
*
*
* https://mischianti.org
*
* E32 ----- stm32
* M0 ----- PB0 (or 3.3v)
* M1 ----- PB10 (or GND)
* RX ----- PA2 TX2 (PullUP)
* TX ----- PA3 RX2 (PullUP)
* AUX ----- PA0 (PullUP)
* VCC ----- 3.3v/5v
* GND ----- GND
*
*/
// with this DESTINATION_ADDL 2 you must set
// WOR SENDER configuration to the other device and
// WOR RECEIVER to this device
#define DESTINATION_ADDL 2
#include "Arduino.h"
#include "LoRa_E32.h"
#include "STM32LowPower.h"
void wakedUp() {
// randomly you can read this, but normally reset block every time the execution
Serial.println("Wake-Up callback!");
}
void printParameters(struct Configuration configuration);
// ---------- esp8266 pins --------------
//LoRa_E32 e32ttl(RX, TX, AUX, M0, M1); // Arduino RX <-- e22 TX, Arduino TX --> e22 RX
//LoRa_E32 e32ttl(D3, D4, D5, D7, D6); // Arduino RX <-- e22 TX, Arduino TX --> e22 RX AUX M0 M1
//LoRa_E32 e32ttl(D2, D3); // Config without connect AUX and M0 M1
//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(D2, D3); // Arduino RX <-- e22 TX, Arduino TX --> e22 RX
//LoRa_E32 e32ttl(&mySerial, D5, D7, D6); // AUX M0 M1
// -------------------------------------
// ---------- Arduino pins --------------
//LoRa_E32 e32ttl(4, 5, 3, 7, 6); // Arduino RX <-- e22 TX, Arduino TX --> e22 RX AUX M0 M1
//LoRa_E32 e32ttl(4, 5); // Config without connect AUX and M0 M1
//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(4, 5); // Arduino RX <-- e22 TX, Arduino TX --> e22 RX
//LoRa_E32 e32ttl(&mySerial, 3, 7, 6); // AUX M0 M1
// -------------------------------------
// ---------- esp32 pins --------------
//LoRa_E32 e32ttl(&Serial2, 15, 21, 19); // RX AUX M0 M1
//LoRa_E32 e32ttl(&Serial2, 22, 4, 18, 21, 19, UART_BPS_RATE_9600); // esp32 RX <-- e22 TX, esp32 TX --> e22 RX AUX M0 M1
// -------------------------------------
// ---------------- STM32 --------------------
HardwareSerial Serial2(USART2); // PA3 (RX) PA2 (TX)
LoRa_E32 e32ttl(&Serial2, PA0, PB0, PB10); // RX AUX M0 M1
// -------------------------------------------------
const int pin = SYS_WKUP1;
//The setup function is called once at startup of the sketch
void setup()
{
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB
}
delay(100);
e32ttl.begin();
// After set configuration comment set M0 and M1 to low
// and reboot if you directly set HIGH M0 and M1 to program
// ResponseStructContainer c;
// c = e32ttl.getConfiguration();
// Configuration configuration = *(Configuration*) c.data;
// configuration.ADDL = 0x03;
// configuration.ADDH = 0x00;
// configuration.CHAN = 0x04;
// configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION;
// configuration.OPTION.wirelessWakeupTime = WAKE_UP_2000;
// e32ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);
// printParameters(configuration);
// c.close();
// ---------------------------
e32ttl.setMode(MODE_2_POWER_SAVING);
// Configure low power
LowPower.begin();
// Attach a wakeup interrupt on pin, calling repetitionsIncrease when the device is woken up
// Last parameter (LowPowerMode) should match with the low power state used: in this example LowPower.sleep()
LowPower.attachInterruptWakeup(pin, wakedUp, LOW, SLEEP_MODE);
Serial.println("Start SLEEP mode in ");
for (int i = 10;i>0;i--) { Serial.print(i); Serial.print(" "); } Serial.println( "OK!" );
delay(1000);
LowPower.sleep();
delay(1000);
// e32ttl.setMode(MODE_0_NORMAL);
// delay(1000);
Serial.println();
Serial.println("Wake and start listening!");
}
// The loop function is called in an endless loop
void loop()
{
if (e32ttl.available() > 1){
Serial.println("Message arrived!");
ResponseContainer rs = e32ttl.receiveMessage();
// First of all get the data
String message = rs.data;
Serial.println(rs.status.getResponseDescription());
Serial.println(message);
e32ttl.setMode(MODE_0_NORMAL);
delay(1000);
e32ttl.sendFixedMessage(0, DESTINATION_ADDL, 23, "We have received the message!");
}
}
void printParameters(struct Configuration configuration) {
Serial.println("----------------------------------------");
Serial.print(F("HEAD : ")); Serial.print(configuration.HEAD, BIN);Serial.print(" ");Serial.print(configuration.HEAD, DEC);Serial.print(" ");Serial.println(configuration.HEAD, HEX);
Serial.println(F(" "));
Serial.print(F("AddH : ")); Serial.println(configuration.ADDH, DEC);
Serial.print(F("AddL : ")); Serial.println(configuration.ADDL, DEC);
Serial.print(F("Chan : ")); Serial.print(configuration.CHAN, DEC); Serial.print(" -> "); Serial.println(configuration.getChannelDescription());
Serial.println(F(" "));
Serial.print(F("SpeedParityBit : ")); Serial.print(configuration.SPED.uartParity, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTParityDescription());
Serial.print(F("SpeedUARTDatte : ")); Serial.print(configuration.SPED.uartBaudRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTBaudRate());
Serial.print(F("SpeedAirDataRate : ")); Serial.print(configuration.SPED.airDataRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getAirDataRate());
Serial.print(F("OptionTrans : ")); Serial.print(configuration.OPTION.fixedTransmission, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFixedTransmissionDescription());
Serial.print(F("OptionPullup : ")); Serial.print(configuration.OPTION.ioDriveMode, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getIODroveModeDescription());
Serial.print(F("OptionWakeup : ")); Serial.print(configuration.OPTION.wirelessWakeupTime, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getWirelessWakeUPTimeDescription());
Serial.print(F("OptionFEC : ")); Serial.print(configuration.OPTION.fec, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFECDescription());
Serial.print(F("OptionPower : ")); Serial.print(configuration.OPTION.transmissionPower, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getTransmissionPowerDescription());
Serial.println("----------------------------------------");
}
Il risultato è che la Serial si ferma alla linea 98. Quando riceviamo il messaggio, l’e32 si sveglia da solo e mette AUX in LOW, così l’esp32 si sveglia con un’interruzione sul pin AUX.
Ecco lo sketch di invio:
/*
* LoRa E32
* Send fixed broadcast transmission message to a specified channel.
* https://mischianti.org/lora-e32-device-for-arduino-esp32-or-esp8266-fixed-transmission-part-4/
*
* E32 ----- stm32
* M0 ----- PB0 (or GND)
* M1 ----- PB10 (or GND)
* RX ----- PA2 TX2 (PullUP)
* TX ----- PA3 RX2 (PullUP)
* AUX ----- PA0 (PullUP)
* VCC ----- 3.3v/5v
* GND ----- GND
*
*/
#include "Arduino.h"
#include "LoRa_E32.h"
// ---------- esp8266 pins --------------
//LoRa_E32 e32ttl(RX, TX, AUX, M0, M1); // Arduino RX <-- e220 TX, Arduino TX --> e220 RX
//LoRa_E32 e32ttl(D3, D4, D5, D7, D6); // Arduino RX <-- e220 TX, Arduino TX --> e220 RX AUX M0 M1
//LoRa_E32 e32ttl(D2, D3); // Config without connect AUX and M0 M1
//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(D2, D3); // Arduino RX <-- e220 TX, Arduino TX --> e220 RX
//LoRa_E32 e32ttl(&mySerial, D5, D7, D6); // AUX M0 M1
// -------------------------------------
// ---------- Arduino pins --------------
// LoRa_E32 e32ttl(4, 5, 3, 7, 6); // Arduino RX <-- e220 TX, Arduino TX --> e220 RX AUX M0 M1
//LoRa_E32 e32ttl(4, 5); // Config without connect AUX and M0 M1
//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(4, 5); // Arduino RX <-- e220 TX, Arduino TX --> e220 RX
//LoRa_E32 e32ttl(&mySerial, 3, 7, 6); // AUX M0 M1
// -------------------------------------
// ------------- Arduino Nano 33 IoT -------------
// LoRa_E32 e32ttl(&Serial1, 2, 4, 6); // RX AUX M0 M1
// -------------------------------------------------
// ------------- Arduino MKR WiFi 1010 -------------
// LoRa_E32 e32ttl(&Serial1, 0, 2, 4); // RX AUX M0 M1
// -------------------------------------------------
// ---------- esp32 pins --------------
// LoRa_E32 e32ttl(&Serial2, 15, 21, 19); // RX AUX M0 M1
//LoRa_E32 e32ttl(&Serial2, 22, 4, 18, 21, 19, UART_BPS_RATE_9600); // esp32 RX <-- e220 TX, esp32 TX --> e220 RX AUX M0 M1
// -------------------------------------
// ---------------- STM32 --------------------
HardwareSerial Serial2(USART2); // PA3 (RX) PA2 (TX)
LoRa_E32 e32ttl(&Serial2, PA0, PB0, PB10); // RX AUX M0 M1
// -------------------------------------------------
void printParameters(struct Configuration configuration);
void printModuleInformation(struct ModuleInformation moduleInformation);
//The setup function is called once at startup of the sketch
void setup()
{
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB
}
delay(100);
e32ttl.begin();
// After set configuration comment set M0 and M1 to low
// and reboot if you directly set HIGH M0 and M1 to program
// ResponseStructContainer c;
// c = e32ttl.getConfiguration();
// Configuration configuration = *(Configuration*) c.data;
// configuration.ADDL = 0x03;
// configuration.ADDH = 0x00;
// configuration.CHAN = 0x05;
// configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION;
// e32ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);
// c.close();
//
//
// ResponseStructContainer c1;
// c1 = e32ttl.getConfiguration();
// Configuration configuration1 = *(Configuration*) c1.data;
// printParameters(configuration1);
// c1.close();
// ---------------------------
}
// The loop function is called in an endless loop
void loop()
{
delay(2000);
Serial.println("Send message to 00 03 04");
ResponseStatus rs = e32ttl.sendFixedMessage(0, 3, 0x04, "Message to 00 03 04 device");
Serial.println(rs.getResponseDescription());
}
void printParameters(struct Configuration configuration) {
Serial.println("----------------------------------------");
Serial.print(F("HEAD : ")); Serial.print(configuration.HEAD, BIN);Serial.print(" ");Serial.print(configuration.HEAD, DEC);Serial.print(" ");Serial.println(configuration.HEAD, HEX);
Serial.println(F(" "));
Serial.print(F("AddH : ")); Serial.println(configuration.ADDH, BIN);
Serial.print(F("AddL : ")); Serial.println(configuration.ADDL, BIN);
Serial.print(F("Chan : ")); Serial.print(configuration.CHAN, DEC); Serial.print(" -> "); Serial.println(configuration.getChannelDescription());
Serial.println(F(" "));
Serial.print(F("SpeedParityBit : ")); Serial.print(configuration.SPED.uartParity, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTParityDescription());
Serial.print(F("SpeedUARTDatte : ")); Serial.print(configuration.SPED.uartBaudRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTBaudRate());
Serial.print(F("SpeedAirDataRate : ")); Serial.print(configuration.SPED.airDataRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getAirDataRate());
Serial.print(F("OptionTrans : ")); Serial.print(configuration.OPTION.fixedTransmission, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFixedTransmissionDescription());
Serial.print(F("OptionPullup : ")); Serial.print(configuration.OPTION.ioDriveMode, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getIODroveModeDescription());
Serial.print(F("OptionWakeup : ")); Serial.print(configuration.OPTION.wirelessWakeupTime, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getWirelessWakeUPTimeDescription());
Serial.print(F("OptionFEC : ")); Serial.print(configuration.OPTION.fec, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFECDescription());
Serial.print(F("OptionPower : ")); Serial.print(configuration.OPTION.transmissionPower, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getTransmissionPowerDescription());
Serial.println("----------------------------------------");
}
void printModuleInformation(struct ModuleInformation moduleInformation) {
Serial.println("----------------------------------------");
Serial.print(F("HEAD BIN: ")); Serial.print(moduleInformation.HEAD, BIN);Serial.print(" ");Serial.print(moduleInformation.HEAD, DEC);Serial.print(" ");Serial.println(moduleInformation.HEAD, HEX);
Serial.print(F("Freq.: ")); Serial.println(moduleInformation.frequency, HEX);
Serial.print(F("Version : ")); Serial.println(moduleInformation.version, HEX);
Serial.print(F("Features : ")); Serial.println(moduleInformation.features, HEX);
Serial.println("----------------------------------------");
}
Qui l’uscita seriale dei 2 dispositivi è mista
Start SLEEP mode in
10 9 8 7 6 5 4 3 2 1 OK!
Send message to 00 03 04
Success
Wake and start listening!
Message arrived!
Success
Message to 00 03 04 deviceMessage to 00 03 04 device
Configurazione per lo Shield LoRa STM32
Ho rilasciato un nuovo shield per STM32F1 blue pill e
STM32F4 black pill, e penso che sia molto utile per il prototipaggio e altro.
La configurazione è questa:
// -------------------- STM32 ----------------------
HardwareSerial Serial2(USART2); // PA3 (RX) PA2 (TX)
LoRa_E32 e32ttl(&Serial2, PA0, PB0, PB10); // RX AUX M0 M1
// -------------------------------------------------
per questa configurazione dei jumper
Grazie
- LoRa E32 per Arduino, esp32 o esp8266: specifiche ed utilizzo base
- LoRa E32 per Arduino, esp32 o esp8266: libreria
- LoRa E32 per Arduino, esp32 o esp8266: configurazione
- LoRa E32 per Arduino, esp32 o esp8266: trasmissione fissa
- LoRa E32 per Arduino, esp32 o esp8266: power saving ed invio di dati strutturati
- LoRa E32 per Arduino, esp32 o esp8266: WOR (wake on radio) il microcontrollore e lo shield per Arduino
- LoRa E32 per Arduino, esp32 o esp8266: WOR (wake on radio) il microcontrollore e lo shield per il WeMos D1 mini
- LoRa E32 per Arduino, esp32 o esp8266 : WOR (wake on radio) del microcontrollore e lo shield per esp32
- LoRa E32 per STM32: WOR (wake on radio) del microcontrollore e lo shield per STM32
- Mischianti Arduino LoRa shield (Open source)
- Mischianti WeMos LoRa shield (Open source)
- Mischianti ESP32 DOIT DEV KIT v1 LoRa shield (Open source)
Buongiorno,
Devo fare un progetto con loRa….
Avrei bisogno di supporto…
Grazie 1000
Daniel Julio Abad
Ciao Daniel,
prova a scrivere il tuo problema sul forum.
Grazie RM
Salve,
Ho una serie di vecchie schede auto costruite, su cui ho montato dei sensori per rilevare temperature e altri parametri che trasmettono tali informazioni ad un nodo tramite LoRa. Sia le vecchie schede che il nodo hanno il chip SX1276 e non hanno dato problemi. Avrei bisogno di utilizzare le nuove Heltec WiFi LoRa 32(V3) come nodi riceventi che hanno il chip LoRa SX1262. Non sono riuscito a farli colloquiare, pensi che sia una battaglia persa o esiste la possibilità di farli mettere d’accordo?
Grazie
Ciao Claudio,
in teoria usano il chip sx1276 standard, ma fai attenzione che le frequenze corrispondano visto che offrono 4 versioni di frequenza:
Ciao RM