Ebyte LoRa E32 per Arduino, esp32 o esp8266: WOR (wake on radio) anche il microcontrollore ed il nuovo WeMos D1 shield – Parte 7

Spread the love

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 .

sx1278 sx1276 wireless lora uart module serial 3000m arduino 433 rf

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
WeMos D1 mini esp8266 piedinatura bassa risoluzione

Quindi il nuovo schema di connessione diventa così:

LoRa E32-TTL-100 and Wemos D1 mini fully connected
LoRa E32-TTL-100 and Wemos D1 mini fully connected

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.

LoRa e32 AUX pin on reception

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
LoRa E32-TTL-100 and Wemos D1 fully connected shield old version

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
Milled WeMos D1 Shield LoRa EBYTE E32

Ora andiamo a saldare i componenti

Pronto ad andare

WeMos D1 mini LoRa E32 shield start soldering
WeMos D1 mini LoRa E32 shield start soldering

Milled WeMos D1 Shield LoRa EBYTE E32 bottom
Milled WeMos D1 Shield LoRa EBYTE E32 bottom
Milled WeMos D1 Shield LoRa EBYTE E32 up
Milled WeMos D1 Shield LoRa EBYTE E32 up

Qui il risultato del PCB fresato

Milled WeMos D1 Shield LoRa EBYTE E32 mounted
Milled WeMos D1 Shield LoRa EBYTE E32 mounted

Here the result with ordered PCB

WeMos D1 Shield LoRa EBYTE E32 mounted
WeMos D1 Shield LoRa EBYTE E32 mounted

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
WeMos D1 mini shield photo UP with description

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)

AmountPart TypeProperties
1Lora E32-TTL-100variant 1; voltage 3-5V; type Basic
1DIP SWITCHchannels 1; package dipswitch-02
2Generic male header – 3 pinspins 3; pin spacing 0.1in (2.54mm); hole size 1.0mm,0.508mm; form ♂ (male); package THT; row single
1WeMos D1 minitype esp8266
34.7kΩ Resistorbands 4; tolerance ±5%; pin spacing 400 mil; package THT; resistance 4.7kΩ
32kΩ Resistorbands 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

Qui il mio regalo di Natale

PCBWay Cristmas box
PCBWay Cristmas box

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
WeMos D1 Shield LoRa EBYTE E32 mounted

Grazie

  1. LoRa E32 per Arduino, esp32 o esp8266: specifiche ed utilizzo base
  2. LoRa E32 per Arduino, esp32 o esp8266: libreria
  3. LoRa E32 per Arduino, esp32 o esp8266: configurazione
  4. LoRa E32 per Arduino, esp32 o esp8266: trasmissione fissa
  5. LoRa E32 per Arduino, esp32 o esp8266: power saving ed invio di dati strutturati
  6. LoRa E32 per Arduino, esp32 o esp8266: WOR (wake on radio) il microcontrollore e lo shield per Arduino
  7. LoRa E32 per Arduino, esp32 o esp8266: WOR (wake on radio) il microcontrollore e lo shield per il WeMos D1 mini
  8. LoRa E32 per Arduino, esp32 o esp8266 : WOR (wake on radio) del microcontrollore e lo shield per esp32
  9. LoRa E32 per STM32: WOR (wake on radio) del microcontrollore e lo shield per STM32

Github library


Spread the love

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *