LoRa E32 device for Arduino, esp32 or esp8266: specs and basic usage – Part 1

Spread the love
  • 19
  •  
  •  
  • 7
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
    26
    Shares

LoRa EBYTE E32-TTL-100 Arduino Basics
LoRa EBYTE E32-TTL-100 Arduino Basics

LoRa or Long Range wireless data telemetry is a technology pioneered by Semtech that operates at a lower frequency than NRF24L01 (433 MHz, 868 MHz or 916 MHz agains 2.4 GHz for the NRF24L01) but at thrice the distance (from 3000m to 8000m).

LoRa E32-TTL-100

You can find It here

We are going to test E32-TTL-100. It is a wireless transceiver module, operates at 410 441 MHz based on original RFIC SX1278 from SEMTECH, transparent transmission is available, TTL level. The module adopts LORA spread spectrum technology.

The module features FEC Forward Error Correction algorithm, which ensure its high coding efficiency & good correction performance. In the case of sudden interference, it can correct the interfered data packets automatically, so that the reliability and transmission range are improved correspondingly. But without FEC, those da te packets can only be dropped.
And with the rigorous encryption & decryption, data interception becomes pointless. The function of data compression can decrease the transmission time & probability of being interference, while improving the reliability & transmission efficiency.

Operating and transmission type

This device have some interesting function:

Transmission

LoRa E32 transmitting scenarios
Transparent transmission

This can be considered like a “Demo mode”, by default you can send message to all device of same configured address and channel.

Fixed transmission

This type of transmission you can specify an address and a channel where where you want send the message.
You can send message to a:

  • Specified device with a predeterminated Address Low, Address High and Channel.
LoRa E32 Fixed message to a specified device
  • Broadcast a message on predeterminated Channel.
Broadcast message to a set of channel devices

Normal mode

Simply send message.

Wake-up mode and power-saving mode

As you can intend if a device is in Wake-up mode can “wake” one or more devices that are in power-saving mode with a preamble communication.

Program/sleep mode

With this configuration you can change configuration of your device.

Specifications

Here’s the specifications for the module:

  • Module size: 21*36mm
  • Antenna type: SMA-K (50Ω impedance)
  • Transmission distance: 3000m(max)
  • Maximum power: 2dB(100mW)
  • Air rates: 2.4Kbps (6 optional level (0.3, 1.2, 2.4, 4.8, 9.6, 19.2kbps)
  • Emission length: 512Byte
  • Receive length: 512Byte
  • Communication Interface: UART – 8N1, 8E1, 8O1, Eight kinds of UART baud Rate, from 1200 to 115200bps (Default: 9600)
  • RSSI support: No (Built-in intelligent processing)
  • Working frequency: 410MHz-441MHz (Default 433MHz), Channel: 32
Electronic parameter Min. Typ. Max. Unit
Power supply 2.3 3.3 5.5 V
Communication level 3.0 3.3 3.6 V
Transmitting current 102 110 118 mA
Receiving current 121518mA
Sleep current 358 μA
Operating temperature -40 20 +85
Operating humidity 10 60 90 %
Storage temperature -40 20 +125

You must pay attention on communication level that differ from power supply, the second can receive voltage like 3.3v (esp8266 and esp32) and 5v (Arduino), but the first want a 3.3v, so to connecto to an Arduino you must use a Voltage divider (Voltage divider: calculator and application) to prevent damage to the device.

Pinout

E32 TTL 100
Pin No. Pin item Pin direction Pin application
1M0Input(weak pull-up)Work with M1 & decide the four operating modes.Floating is not allowed, can be ground.
2M1Input(weak pull-up)Work with M0 & decide the four operating modes.Floating is not allowed, can be ground.
3RXDInputTTL UART inputs, connects to external (MCU, PC) TXD outputpin. Can be configured as open-drain or pull-up input.
4TXDOutputTTL UART outputs, connects to external RXD (MCU, PC) inputpin. Can be configured as open-drain or push-pull output

5

AUX

Output
To indicate module’s working status & wakes up the external MCU. During the procedure of self-check initialization, the pin outputs low level. Can be configured as open-drain output orpush-pull output (floating is allowed).
6VCC
Power supply 2.3V~5.5V DC
7GND
Ground

As you can see you can set various modes via M0 and M1 pins.

Mode M1 M0 Explanation
Normal00UART and wireless channel is good to go
Wake-Up01Same as normal but a preamble code is added to transmitted data for waking-up the receiver.
Power-Saving10UART is disable and wireless is on WOR(wake on radio) mode which means the device will turn on when there is data to be received. Transmission is not allowed.
Sleep11Used in setting parameters. Transmitting and receiving disabled.

For the next simple test we are going to use Normal mode.

Connecting Wemos D1 mini (esp8266) for a basic usage

esp8266 have the advantage to have same voltage of communication interface so the connection schema is more simple than Arduino.

LoRa E32-TTL-100 Wemos D1 breadboard

It’s important to add pull-up resistor (4,7Kohm) to get good stability.

M0GND (Set normal mode)
M1GND (Set normal mode)
RXPIN D2 (PullUP 4,7KΩ)
TXPIN D3 (PullUP 4,7KΩ)
AUXNot connected
VCC3.3v
GNDGND

Connecting Arduino for a basic usage

Arduino working voltage is 5v, so we need to add a voltage divider on RX pin of LoRa module to prevent damage, you can get more information here Voltage divider: calculator and application.

You can use a 2Kohm resistor to GND and 1Kohm from signal than put together on RX.

LoRa E32-TTL-100 Arduino breadboard
M0GND (Set normal mode)
M1GND (Set normal mode)
RXPIN D2 (PullUP 4,7KΩ & Voltage divider)
TXPIN D3 (PullUP 4,7KΩ)
AUXNot connected
VCC3.3v
GNDGND

Simple communication sketch

If you put to 0 M1 and M0 pin you enter in “Normal” mode, than you can receive and trasmit all the data from device A to B, this modality is defined “Trasparent transmission”.

You can use 2 Arduinos or 2 Wemos D1 mini or one of kind.

At start send a message and if you write on serial from one of device the text is transferred to the other device. You can use 2 Arduinos or 2 Wemos or one and one as you prefer.

Arduino sketch:

/*
 * LoRa E32-TTL-100
 * Start device or reset to send a message
 * https://www.mischianti.org
 *
 * E32-TTL-100----- Arduino UNO
 * M0         ----- GND
 * M1         ----- GND
 * TX         ----- PIN 2 (PullUP)
 * RX         ----- PIN 3 (PullUP & Voltage divider)
 * AUX        ----- Not connected
 * VCC        ----- 3.3v/5v
 * GND        ----- GND
 *
 */
#include "Arduino.h"

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3); // e32 TX e32 RX

void setup() {
  Serial.begin(9600);
  delay(500);

  Serial.println("Hi, I'm going to send message!");

  mySerial.begin(9600);
  mySerial.println("Hello, world?");
}

void loop() {
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
    mySerial.write(Serial.read());
  }
}

Wemos D1 mini sketch:

/*
 * LoRa E32-TTL-100
 * Start device or reset to send a message
 * https://www.mischianti.org
 *
 * E32-TTL-100----- Wemos D1 mini
 * M0         ----- GND
 * M1         ----- GND
 * TX         ----- PIN D2 (PullUP)
 * RX         ----- PIN D3 (PullUP)
 * AUX        ----- Not connected
 * VCC        ----- 3.3v/5v
 * GND        ----- GND
 *
 */
#include "Arduino.h"
#include <SoftwareSerial.h>

SoftwareSerial mySerial(D2, D3); // e32 TX e32 RX

void setup() {
  Serial.begin(9600);
  delay(500);

  Serial.println("Hi, I'm going to send message!");

  mySerial.begin(9600);
  mySerial.println("Hello, world?");
}

void loop() {
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
    mySerial.write(Serial.read());
  }
}

But this basic usage is quite unusefully, so in the next chapter we are going to use my library and go in deep of device features.

Library

Here the last example with my library:

Arduino sketch:

/*
 * LoRa E32-TTL-100
 * Write on serial to transfer a message to other device
 * https://www.mischianti.org
 *
 * E32-TTL-100----- Arduino UNO
 * M0         ----- GND
 * M1         ----- GND
 * TX         ----- PIN 2 (PullUP)
 * RX         ----- PIN 3 (PullUP &amp; Voltage divider)
 * AUX        ----- Not connected
 * VCC        ----- 3.3v/5v
 * GND        ----- GND
 *
 */
#include "Arduino.h"
#include "LoRa_E32.h"

LoRa_E32 e32ttl100(2, 3); // e32 TX e32 RX

void setup() {
  Serial.begin(9600);
  delay(500);

  Serial.println("Hi, I'm going to send message!");

  // Startup all pins and UART
  e32ttl100.begin();

  // Send message
  ResponseStatus rs = e32ttl100.sendMessage("Hello, world?");
  // Check If there is some problem of succesfully send
  Serial.println(rs.getResponseDescription());
}

void loop() {
	// If something available
  if (e32ttl100.available()>1) {
	  // read the String message
	ResponseContainer rc = e32ttl100.receiveMessage();
	// Is something goes wrong print error
	if (rc.status.code!=1){
		rc.status.getResponseDescription();
	}else{
		// Print the data received
		Serial.println(rc.data);
	}
  }
  if (Serial.available()) {
	  String input = Serial.readString();
	  e32ttl100.sendMessage(input);
  }
}

Here the Wemos D1 (esp8266) sketch:

/*
 * LoRa E32-TTL-100
 * Start device or reset to send a message
 * https://www.mischianti.org
 *
 * E32-TTL-100----- Wemos D1 mini
 * M0         ----- GND
 * M1         ----- GND
 * TX         ----- PIN D2 (PullUP)
 * RX         ----- PIN D3 (PullUP)
 * AUX        ----- Not connected
 * VCC        ----- 3.3v/5v
 * GND        ----- GND
 *
 */
#include "Arduino.h"
#include "LoRa_E32.h"

LoRa_E32 e32ttl100(D2, D3); // e32 TX e32 RX

void setup() {
  Serial.begin(9600);
  delay(500);

  Serial.println("Hi, I'm going to send message!");

  // Startup all pins and UART
  e32ttl100.begin();

  // Send message
  ResponseStatus rs = e32ttl100.sendMessage("Hello, world?");
  // Check If there is some problem of succesfully send
  Serial.println(rs.getResponseDescription());
}

void loop() {
	// If something available
  if (e32ttl100.available()>1) {
	  // read the String message
	ResponseContainer rc = e32ttl100.receiveMessage();
	// Is something goes wrong print error
	if (rc.status.code!=1){
		rc.status.getResponseDescription();
	}else{
		// Print the data received
		Serial.println(rc.data);
	}
  }
  if (Serial.available()) {
	  String input = Serial.readString();
	  e32ttl100.sendMessage(input);
  }
}

If you have already change configuration you must restore base parameter:

//  If you have ever change configuration you must restore It
	ResponseStructContainer c;
	c = e32ttl100.getConfiguration();
	Configuration configuration = *(Configuration*) c.data;
	Serial.println(c.status.getResponseDescription());
	configuration.CHAN = 0x17;
	configuration.OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION;
	e32ttl100.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);

but we are going to see It better in the next article.

Thanks

But this kind of usage is very very reductive, in the next articles we are going more in deep, and we start to use massively the library to simplify the complex configuration and settings.

  1. LoRa E32 device for Arduino, esp32 or esp8266: settings and basic usage
  2. LoRa E32 device for Arduino, esp32 or esp8266: library
  3. LoRa E32 device for Arduino, esp32 or esp8266: configuration
  4. LoRa E32 device for Arduino, esp32 or esp8266: fixed transmission
  5. LoRa E32 device for Arduino, esp32 or esp8266: power saving and sending structured data
  6. LoRa E32 device for Arduino, esp32 or esp8266: WOR (wake on radio) microcontroller and Arduino shield
  7. LoRa E32 device for Arduino, esp32 or esp8266: WOR (wake on radio) microcontroller and WeMos D1 shield

Github library


Spread the love
  • 19
  •  
  •  
  • 7
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
    26
    Shares

You may also like...

54 Responses

  1. Great library
    Is it possible to get quality parameters such as Signal strength, Signal to noise ratio & frequency error between sender & reciever in E32 module
    These are available in Ai Thinker RA-02 module & help in setting up a reliable network

  2. Llyodie says:

    Hi can i get example of two lora e32 devices to send and receive message? thanks 🙂 great tutorial btw

    • Hi Llyodie,
      In the next article (Part 4) I explain step by step a typical transmission point to point, but at the moment you can get the examples from the library, like this:

      sendFixedTransmission

      receiveFixedTransmission

      Pay attention to the configuration, and how to configure they, check the article Part 3.

      But in this article you can get the examples of a transparent transmission, send and receive from device with same Address and Channel.

      If you need more information you can write port in the forum or write here.

      Bye Renzo

  3. Daniel says:

    is it possible with this module to know the signal quality between 2 devices?

  4. Ivan says:

    Can i use this module to control rc boat(transmitting data) and receiving data at the same time?

  5. Chan Hon says:

    Hello, I am new to using the LoRa radio module and am currently working on configuring a pair of E32s. However when I run the code to retrieve the configuration settings, first line printed is always “Data size not match”.

    Also, when I change the message to be sent using the sendFixedTransmission and receiveFixedTransmission code, the message sent is only changed when the code is re-uploaded on both the transmitting and receiving module. Shouldn’t the receiving module print the new message without re-uploading the code since the message transmitted has changed? Using the reset button on the arduino uno also does not change the message printed by the receiver module.

    • Hi Chan,
      I’m going to check this issue, with which device are you testing with?
      Thanks Renzo

    • Hi Chan,
      I tested the library probably you have a wiring problem, check che pins configuration and your wiring.
      Tell me if you fix this.

      I also add an additional error type that check if no response is received to help to find error, I’m going to resease It soon.

      Thanks Renzo

    • wooduino says:

      Hello Chan,
      Excellent tutorials and library!
      I have a pair of E32 100mW LoRa modules connected to ESP8266 D1 Minis and and I am successfully exchanging information between them. Like you, when I run the code to retrieve the configuration settings, first lines printed are always “Data size not match”, 7 and then the ESP crashes. I have checked the configuration and both M0 and M1 are at 3.3v. Did you ever get this resolved??

      Many thanks,

      … Adrian

  6. Cat says:

    Thank you VERY MUCH for this; I’m looking forward to have some time to look into this!
    I just wish you used real schematics instead of Fritzing.
    I think that while Fritzing may be easy to reproduce if you have the same components it makes it very hard to follow and quickly understand what is connected to what.
    Please consider schematics drawn in KiCad (free).
    Thanks,
    Cat

  7. Leonardo Galardi says:

    Hello, I’m using your library with success with an arduino pro mini (btw great work !); however, with a D1 mini I’m having problems in getting the data from the serial port.
    For example with ArduinoGetConfiguration.ini and a full connection (M0, M1, AUX) by instantiating
    LoRa_E32 e32ttl100(D2, D4, D5, D7, D6, UART_BPS_RATE_9600);
    I see with an oscilloscope that data are sent on D3 to the LORA module that replies on D2 but the library always gives me “Data size not match!”.
    The same setup on an arduino pro mini is working perfectly so should be a problem with D1 mini. Any idea ?
    Thanks in advance,
    Leonardo

    • Hi Leonardo,
      I had the same problem with low power supply or when I connect 3.3v instead of 5v, first check this than tell me if you resolve.
      With Wemos i connect 5v and the usb port of my pc is quite powerfull, and i don’t use an hub usb.
      Bye Renzo

      • Leonardo Galardi says:

        Hi Renzo, thank you for the prompt reply. I am powering the E32 TTL-100 at 5 volt with a lab supply. The pull-ups are connected to 3V3 according to your diagrams. A strange thing is that even if I disconnect D2 I get the same message, i.e. data size not match. Do you think that could be related to the implementation of the serial port for the Wemos ? It is not clear to me if it is a software or hardware serial port.

        • It’s software serial port, but from your description seems that It’s wrong connection. In the previous comment you write that you check d3 but in the code you have d2 and d4. Check the wiring and try change pin with the same of the examples, some wemos pin have built in pull resistor.
          Bye Renzo

          • Leonardo Galardi says:

            Unfortunately the connections seem to be ok, I tried to change the pins, that’s why I wrote D4 by mistake. I see on the oscilloscope the datas and the reply. I have also compared the waveforms with the arduino circuit and they appear the same. I continue investigating…

  8. Leonardo Galardi says:

    Problem Solved ! For some unknown reasons I had the version 6.4.0 of EspSoftwareSerial used when one compiles for Wemos. I have found an updated version (6.8.0) here: https://github.com/plerup/espsoftwareserial.
    Updating such library, it works perfectly!
    Thank you for the support.

    Cheers,
    Leonardo

  9. Leonardo Galardi says:

    Hi Renzo, sorry to bother you again, I have another issue. I’m trying to use the example sendReceiveTransparentTransmissionE32_TTL_1W and it is working but the reception is really slow. In my opinion, although I have connected the aux pin and instantiated it with
    LoRa_E32 e32ttl100(D2, D3, D5, D7, D6, UART_BPS_RATE_9600); // RX, TX

    It seems that Aux is not tested and a timeout (long few seconds) is applied. Indeed if I disconnect the aux pin from the receiver the behavior does not change whilst I would expect to receive a timeout error if aux was checked.
    Am I wrong ?

  10. wooduino says:

    Hello Renzo,
    Excellent tutorials and library!
    I have a pair of E32 100mW LoRa modules connected to ESP8266 D1 Minis and and I am successfully exchanging information between them.
    However, like Chan Hon (above), when I run the code to retrieve the configuration settings, first lines printed are “Data size not match”, 7 and then the ESP crashes. I have checked the configuration and both M0 and M1 are at 3.3v.
    Any ideas??

    • Hi wooduino,
      have you try with an external power source??
      Bye Renzo

      • wooduino says:

        Thanks for your timely response, Renzo.
        Yes, I have. Both on external power and USB power.
        I have two identical set-ups with the LORa 100mW module and an ESP8288 WeMos D1 Mini. I also have a small OLED to see activity and the units are communicating appropriately with each other.
        However, both return ““Data size not match”, 7 ” when trying to access their configuration data.
        I also updated the ESPSoftSerial library as suggested to version 6.8.0, but this has made no change.
        Any other ideas?

  11. wooduino says:

    PROBLEM IDENTIFIED. There appears to be some issue with using your library with the OLED “SSD1306.h” library. It is connected using I2C. Thoughts??

  12. ivan says:

    Hi, when i uploaded to my wemos, i got error like this. can u help me please?

    Arduino: 1.8.5 (Windows 10), Board: "LOLIN(WEMOS) D1 R2 & mini, 80 MHz, Flash, Disabled, All SSL ciphers (most compatible), 4M (no SPIFFS), v2 Lower Memory, Disabled, None, Only Sketch, 921600"

    WARNING: Category 'Communication protocol' in library E32_TTL is not valid. Setting to 'Uncategorized'
    In file included from \Documents\Arduino\libraries\ LoRa_E32_Series_Library-master\LoRa_E32.h:45:0,

    from \Documents\Arduino\libraries\ LoRa_E32_Series_Library-master\LoRa_E32.cpp:28:

    \AppData\Local\Arduino15\ packages\esp8266\hardware\ esp8266\2.5.2\libraries\ SoftwareSerial\src/SoftwareSerial.h:113:2: error: 'ssize_t' does not name a type

    ssize_t m_swsInstsIdx = -1;

    ^

    exit status 1
    Error compiling for board LOLIN(WEMOS) D1 R2 & mini.

    • Hi Ivan,
      It’s a bug on 2.5.2 core of esp8266, I fixed my local version, If I remember how I’m going to add here.
      For now I think you can change core.
      Bye Renzo

    • ivan says:

      thanks, i got no error on this library.
      i face new problem that i send a message every second but i cant receive the message for every second.
      any advise?

      • Check the configuration of the device, If you use Transparent transmission check the channel that must be the samo for all devices.


        ResponseStructContainer c;
        c = e32ttl100.getConfiguration();
        // It's important get configuration pointer before all other operation
        Configuration configuration = *(Configuration*) c.data;
        Serial.println(c.status.getResponseDescription());
        Serial.println(c.status.code);

        printParameters(configuration);
        configuration.ADDL = 0x3;
        configuration.ADDH = 0x0;
        configuration.CHAN = 0x4;

        configuration.OPTION.fec = FEC_1_ON;
        configuration.OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION;
        configuration.OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS;
        configuration.OPTION.transmissionPower = POWER_20;
        configuration.OPTION.wirelessWakeupTime = WAKE_UP_250;

        configuration.SPED.airDataRate = AIR_DATA_RATE_010_24;
        configuration.SPED.uartBaudRate = UART_BPS_9600;
        configuration.SPED.uartParity = MODE_00_8N1;

        // Set configuration changed and set to not hold the configuration
        ResponseStatus rs = e32ttl100.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);
        Serial.println(rs.getResponseDescription());
        Serial.println(rs.code);
        printParameters(configuration);

        Change only the ADDL for the other device.

        Bye Renzo

  13. Paulo says:

    Hi,

    I’m trying to do this tutorial, but using a ESP32 devkit v1, but I always get this error:

    l23:25: error: ‘D2’ was not declared in this scope

    SoftwareSerial mySerial(D2, D5); // RX, TX

    What can I do to solve this. I already tried a lot of stuff.

    Att,

    Paulo

    • Hi Paulo,
      esp32 don’t have SoftwareSerial, you must use hardwareserial and you can specify pins as described here.
      D1, D2 ecc. is a esp8266 notation, not exists in esp32 environment.
      Bye Renzo

      • Paulo says:

        Hi, Renzo! Thank you for the help! And your tutorial is awesome, but I’m new in the LoRa World, so I’m having some doubts. I solved the problem using your answer, but now, I have another question. How can I specify the pins? I used the follow code:

        HardwareSerial *serial;
        UART_BPS_RATE bpsRate = UART_BPS_RATE_9600;
        LoRa_E32 e32ttl1w(*serial, bpsRate);

        Att,

        Paulo

        • Paulo says:

          I solved the problem. Just made:

          HardwareSerial serialRX(16);
          HardwareSerial serialTX(17);
          UART_BPS_RATE bpsRate = UART_BPS_RATE_9600;
          LoRa_E32 e32ttl1w(serialRX, serialTX, bpsRate);

          • Hi Paulo, check the link i posted in the previous comment, there are specified constructor for esp32, I think in that manner you can have problems.
            Bye Renzo

          • Isabele says:

            Hi Paulo, I´m having the same problem because I´m using esp32, can you send me your code to help me please?

  14. Paulo says:

    Thank you!!

  15. Alejandro says:

    Hello, I can’t get my LoRa e32 modules working. I have developed two sketch. One of them generates and sends a random number. The other reads the packet sent by writer. I am working with ESP32. Thanks in advance for your advice.

    Discussion and all the code MOVED ON FORUM AT THIS LINK

Leave a Reply

Your email address will not be published. Required fields are marked *