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 .
![](https://mischianti.org/wp-content/uploads/2019/09/sx1278-sx1276-wireless-lora-uart-module-serial-3000m-arduino-433-rf-robotedu-1705-13-robotedu@101.jpg)
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.
![WeMos D1 mini esp8266 piedinatura bassa risoluzione](https://mischianti.org/wp-content/uploads/2021/04/WeMos-D1-mini-esp8266-pinout-mischianti-low-1024x467.jpg)
Quindi il nuovo schema di connessione diventa così:
![LoRa E32-TTL-100 and Wemos D1 mini fully connected](https://mischianti.org/wp-content/uploads/2019/12/LoRa_E32-TTL-100_WemosD1_VD_PU_FullyConnected_bb_FREE_sda_scl-e1577781112844.jpg)
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.
![](https://mischianti.org/wp-content/uploads/2019/10/e32auxPinOnReception-1024x342.jpg)
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.
![LoRa E32-TTL-100 and Wemos D1 fully connected shield old version](https://mischianti.org/wp-content/uploads/2019/12/LoRa_E32-TTL-100_WemosD1_VD_PU_FullyConnected_shield_5v_pcb-e1577781252697.jpg)
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.
![Milled WeMos D1 Shield LoRa EBYTE E32](https://mischianti.org/wp-content/uploads/2019/12/MilledWeMosD1Shield_LoRa_EBYTE_E32_01-1024x696.jpg)
Ora andiamo a saldare i componenti
Pronto ad andare
![WeMos D1 mini LoRa E32 shield start soldering](https://mischianti.org/wp-content/uploads/2019/12/WeMosD1mini_LoRa_E32_shield_start_soldering-1-1024x750.jpg)
![Milled WeMos D1 Shield LoRa EBYTE E32 bottom](https://mischianti.org/wp-content/uploads/2020/01/MilledWeMosD1Shield_LoRa_EBYTE_E32_02-1024x671.jpg)
![Milled WeMos D1 Shield LoRa EBYTE E32 up](https://mischianti.org/wp-content/uploads/2020/01/MilledWeMosD1Shield_LoRa_EBYTE_E32_03-1024x682.jpg)
Qui il risultato del PCB fresato
![Milled WeMos D1 Shield LoRa EBYTE E32 mounted](https://mischianti.org/wp-content/uploads/2020/01/MilledWeMosD1Shield_LoRa_EBYTE_E32_04_-mounted-1024x510.jpg)
Here the result with ordered PCB
![WeMos D1 Shield LoRa EBYTE E32 mounted](https://mischianti.org/wp-content/uploads/2020/01/WeMosD1ShieldMountedE32LoRa_min.jpg)
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.
![WeMos D1 mini shield photo UP with description](https://mischianti.org/wp-content/uploads/2020/01/WeMos-shield-description.jpg)
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
![PCB from PCBWay](https://www.pcbway.com/project/img/images/frompcbway.png?from=mischianti702)
Qui il mio regalo di Natale
![PCBWay Cristmas box](https://mischianti.org/wp-content/uploads/2019/12/pcbWayCristmas-e1577725922484.jpg)
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
![WeMos D1 Shield LoRa EBYTE E32 mounted](https://mischianti.org/wp-content/uploads/2020/01/WeMosD1ShieldMountedE32LoRa_min.jpg)
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)