Ebyte LoRa E32 per Arduino, esp32 o esp8266: WOR (wake on radio) anche il microcontrollore ed il nuovo WeMos D1 shield – Parte 7
Abbiamo visto come questo dispositivo (E32 UART LoRa basato sui popolari moduli wireless SX1276 / SX1278) gestisce il risparmio energetico, ma se utilizziamo il risparmio energetico solo per l’e32 il microcontrollore continua a rimanere attivo, e possiamo usare il pin AUX per risolvere questo problema .
Puoi trovare i moduli qui AliExpress (433MHz 5Km) - AliExpress (433MHz 8Km) - AliExpress (433MHz 16Km) - AliExpress (868MHz 915MHz 5.5Km) - AliExpress (868MHz 915MHz 8Km)
In caso di problemi come il blocco del dispositivo, è necessario inserire un resistore pull-up da 4,7k o collegare il pin AUX al dispositivo.
Per quanto riguarda lo schema che abbiamo usato fino ad ora, faremo qualche correzione, invece dei pins D2 e D3 useremo D3 e D4, quindi SDA e SCL (protocollo i2c) rimangono liberi.
Quindi il nuovo schema di connessione diventa così:
Quando si è in modalità sospensione, l’e32 inserisce nel buffer i dati ricevuti e passa immediatamente a LOW l’AUX, quando i dati sono pronti torna HIGH, ma il passaggio a LOW è perfetto per riattivare il microcontrollore.
Sveglia del WeMos D1 mini
Come il dispositivo e32, il nostro WeMos ha alcuni tipi di sospensione diversi, ma per questo test useremo il light-sleep con sveglia da GPIO.
Fai riferimento a “WeMos D1 mini (esp8266), i tre tipi di modalità di sospensione per gestire il risparmio energetico – Parte 4” per avere una descrizione dettagliata dai vari sleep mode del WeMos.
Come mettere in sospensione il WeMos D1 mini
Il comando per mettere in sospensione il microcontrollore è questo
wifi_set_opmode(NULL_MODE);
wifi_fpm_set_sleep_type(LIGHT_SLEEP_T);
wifi_fpm_open();
wifi_fpm_set_wakeup_cb(callback);
wifi_fpm_do_sleep(FPM_SLEEP_MAX_TIME);
delay(1000);
Ma dobbiamo specificare che il dispositivo deve riattivarsi quando il pin AUX va in LOW
// Allow wake up pin to trigger interrupt on low.
gpio_pin_wakeup_enable(GPIO_ID_PIN(AUX_PIN), GPIO_PIN_INTR_LOLEVEL);
// Enter light sleep.
wifi_set_opmode(NULL_MODE);
wifi_fpm_set_sleep_type(LIGHT_SLEEP_T);
wifi_fpm_open();
wifi_fpm_set_wakeup_cb(callback);
wifi_fpm_do_sleep(FPM_SLEEP_MAX_TIME);
delay(1000);
Quindi il codice per ricevere la trasmissione diventa così:
/*
* LoRa E32-TTL-100
* Receive fixed transmission message on channel and wake up.
* https://mischianti.org
*
* E32-TTL-100----- Arduino UNO or esp8266
* M0 ----- LOW
* M1 ----- HIGH
* RX ----- PIN D3 (PullUP)
* TX ----- PIN D4 (PullUP)
* AUX ----- PIN D5
* VCC ----- 5v
* GND ----- GND
*
*/
#include "Arduino.h"
#include "LoRa_E32.h"
#include <ESP8266WiFi.h>
#define FPM_SLEEP_MAX_TIME 0xFFFFFFF
void callback() {
Serial.println("Callback");
Serial.flush();
}
// ---------- esp8266 pins --------------
LoRa_E32 e32ttl(D3, D4, D5);
// -------------------------------------
void printParameters(struct Configuration configuration);
//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();
e32ttl.setMode(MODE_2_POWER_SAVING);
// e32ttl.resetModule();
// 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;
printParameters(configuration);
configuration.ADDL = 3;
configuration.ADDH = 0;
configuration.CHAN = 0x04;
configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION;
configuration.OPTION.wirelessWakeupTime = WAKE_UP_250;
configuration.OPTION.fec = FEC_1_ON;
configuration.OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS;
configuration.OPTION.transmissionPower = POWER_20;
configuration.SPED.airDataRate = AIR_DATA_RATE_010_24;
configuration.SPED.uartBaudRate = UART_BPS_9600;
configuration.SPED.uartParity = MODE_00_8N1;
e32ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);
printParameters(configuration);
// ---------------------------
delay(1000);
Serial.println();
Serial.println("Start sleep!");
//wifi_station_disconnect(); //not needed
gpio_pin_wakeup_enable(GPIO_ID_PIN(D5), GPIO_PIN_INTR_LOLEVEL);
wifi_set_opmode(NULL_MODE);
wifi_fpm_set_sleep_type(LIGHT_SLEEP_T);
wifi_fpm_open();
wifi_fpm_set_wakeup_cb(callback);
wifi_fpm_do_sleep(FPM_SLEEP_MAX_TIME);
delay(1000);
Serial.println();
Serial.println("Start listening!");
}
// The loop function is called in an endless loop
void loop()
{
if (e32ttl.available() > 1){
ResponseContainer rs = e32ttl.receiveMessage();
// First of all get the data
String message = rs.data;
Serial.println(rs.status.getResponseDescription());
Serial.println(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 il Serial si ferma sulla linea 91, quando riceviamo il messaggio e32 si sveglia e mette l’AUX a LOW, quindi Arduino si sveglia grazie all’interrupt sul pin AUX.
Ecco lo sketch di invio:
/*
* LoRa E32-TTL-100
* Send fixed broadcast transmission message to a specified channel.
* https://mischianti.org
*
* E32-TTL-100----- Arduino UNO or esp8266
* M0 ----- HIGH
* M1 ----- LOW
* RX ----- PIN D3 (PullUP)
* TX ----- PIN D4 (PullUP)
* AUX ----- PIN D5
* VCC ----- 5v
* GND ----- GND
*
*/
#include "Arduino.h"
#include "LoRa_E32.h"
LoRa_E32 e32ttl(D3, D4, D5);
// -------------------------------------
void printParameters(struct Configuration configuration);
//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);
while (!e32ttl.begin()) {
delay(2000); // wait for serial port to connect. Needed for native USB
}
e32ttl.setMode(MODE_1_WAKE_UP);
// e32ttl.resetModule();
// 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;
printParameters(configuration);
// configuration.SPED.uartBaudRate = UART_BPS_9600;
// configuration.SPED.airDataRate = AIR_DATA_RATE_010_24;
configuration.ADDL = 0x01;
configuration.ADDH = 0x00;
configuration.CHAN = 0x04;
configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION;
configuration.OPTION.wirelessWakeupTime = WAKE_UP_750;
configuration.OPTION.fec = FEC_1_ON;
configuration.OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS;
configuration.OPTION.transmissionPower = POWER_20;
configuration.SPED.airDataRate = AIR_DATA_RATE_010_24;
configuration.SPED.uartBaudRate = UART_BPS_9600;
configuration.SPED.uartParity = MODE_00_8N1;
e32ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);
printParameters(configuration);
// ---------------------------
}
int i = 0;
// The loop function is called in an endless loop
void loop()
{
i++;
String mess = "Message to 00 03 04 deviceMessage to ";
String compMEss = mess+i;
Serial.print(compMEss);
Serial.print(" - ");
ResponseStatus rs = e32ttl.sendFixedMessage(0, 3, 0x04, compMEss);
Serial.println(rs.getResponseDescription());
delay(8000);
}
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("----------------------------------------");
}
Shield per il WeMos D1 mini
Ho creato anche uno shield per il WeMos molto utile e pratico.
La configurazione da usare è:
LoRa_E32 e32ttl(D3, D4, D5, D7, D6);
Quindi puoi usare tutti gli esempi all’interno della libreria, puoi usare i pin D6 e D7 per fare una connessione completa o disabilitarli e mettere M0 e M1 come vuoi con il dip switch.
Ora andiamo a saldare i componenti
Pronto ad andare
Qui il risultato del PCB fresato
Here the result with ordered PCB
Lo shield ha alcuni jumper e dip switch per configurare M0 e M1. Se si desidera impostare M0 e M1 su un valore fisso, è necessario posizionare il ponticello su F, se si desidera il controllo tramite pin su P.
Se si imposta su F, è necessario impostare il dip switch sul valore Basso o Alto.
Lista della spesa
Puoi trovare i vari moduli qui AliExpress (433MHz 5Km) - AliExpress (433MHz 8Km) - AliExpress (433MHz 16Km) - AliExpress (868MHz 915MHz 5.5Km) - AliExpress (868MHz 915MHz 8Km)
Amount Part Type Properties 1 Lora E32-TTL-100 variant 1; voltage 3-5V; type Basic 1 DIP SWITCH channels 1; package dipswitch-02 2 Generic male header – 3 pins pins 3; pin spacing 0.1in (2.54mm); hole size 1.0mm,0.508mm; form ♂ (male); package THT; row single 1 WeMos D1 mini type esp8266 3 4.7kΩ Resistor bands 4; tolerance ±5%; pin spacing 400 mil; package THT; resistance 4.7kΩ 3 2kΩ Resistor bands 4; tolerance ±5%; pin spacing 400 mil; package THT; resistance 2kΩ 1 Generic female header – 7 pins Pin spacing 0.1in (2.54mm); 2 Generic male/female header – 8 pins Pin spacing 0.1in (2.54mm);
Puoi ordinare il PCB dello shield senza costi aggiuntivi da PCBWay
Qui il mio regalo di Natale
Ho scelto questo produttore perché allo stesso costo offre una qualità eccellente, nella prima schermata è possibile realizzare innumerevoli opzioni adatte ad ogni esigenza.
Video dell’assemblaggio
Ecco il video della saldatura.
Ecco il risultato
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)