Skip to content

Commit 459ac32

Browse files
Add LoRa communication example
1 parent 75d7c57 commit 459ac32

File tree

2 files changed

+315
-0
lines changed

2 files changed

+315
-0
lines changed
Lines changed: 213 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,213 @@
1+
/*
2+
* HelTec Automation(TM) LoRaWAN 1.0.2 OTAA example use OTAA, CLASS A
3+
*
4+
* Function summary:
5+
*
6+
* - use internal RTC(150KHz);
7+
*
8+
* - Include stop mode and deep sleep mode;
9+
*
10+
* - 15S data send cycle;
11+
*
12+
* - Informations output via serial(115200);
13+
*
14+
* - Only ESP32 + LoRa series boards can use this library, need a license
15+
* to make the code run(check you license here: http://www.heltec.cn/search/);
16+
*
17+
* You can change some definition in "Commissioning.h" and "LoRaMac-definitions.h"
18+
*
19+
* HelTec AutoMation, Chengdu, China.
20+
* 成都惠利特自动化科技有限公司
21+
* https://heltec.org
22+
23+
*
24+
*this project also release in GitHub:
25+
*https://github.com/HelTecAutomation/ESP32_LoRaWAN
26+
*/
27+
28+
#include <ESP32_LoRaWAN.h>
29+
#include "Arduino.h"
30+
31+
#define RF_FREQUENCY 868000000 // Hz
32+
33+
#define TX_OUTPUT_POWER 15 // dBm
34+
35+
#define LORA_BANDWIDTH 0 // [0: 125 kHz,
36+
// 1: 250 kHz,
37+
// 2: 500 kHz,
38+
// 3: Reserved]
39+
#define LORA_SPREADING_FACTOR 7 // [SF7..SF12]
40+
#define LORA_CODINGRATE 1 // [1: 4/5,
41+
// 2: 4/6,
42+
// 3: 4/7,
43+
// 4: 4/8]
44+
#define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx
45+
#define LORA_SYMBOL_TIMEOUT 0 // Symbols
46+
#define LORA_FIX_LENGTH_PAYLOAD_ON false
47+
#define LORA_IQ_INVERSION_ON false
48+
49+
50+
#define RX_TIMEOUT_VALUE 1000
51+
#define BUFFER_SIZE 30 // Define the payload size here
52+
53+
char txpacket[BUFFER_SIZE];
54+
char rxpacket[BUFFER_SIZE];
55+
char Repacket[BUFFER_SIZE];
56+
57+
static RadioEvents_t RadioEvents;
58+
void OnTxDone( void );
59+
void OnTxTimeout( void );
60+
void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr );
61+
void OnRxTimeout(void);
62+
void displayMcuInit();
63+
void displaySendReceive();
64+
65+
typedef enum
66+
{
67+
STATUS_LOWPOWER,
68+
STATUS_RX,
69+
STATUS_TX
70+
}States_t;
71+
72+
73+
int16_t txNumber;
74+
States_t state;
75+
bool sleepMode = false;
76+
int16_t Rssi,rxSize;
77+
78+
uint32_t license[4] = {0xD5397DF0, 0x8573F814, 0x7A38C73D, 0x48E68607};
79+
80+
// Add your initialization code here
81+
void setup()
82+
{
83+
displayMcuInit();
84+
85+
Serial.begin(115200);
86+
while (!Serial);
87+
SPI.begin(SCK,MISO,MOSI,SS);
88+
Mcu.init(SS,RST_LoRa,DIO0,DIO1,license);
89+
90+
91+
txNumber=0;
92+
Rssi=0;
93+
94+
RadioEvents.TxDone = OnTxDone;
95+
RadioEvents.TxTimeout = OnTxTimeout;
96+
RadioEvents.RxDone = OnRxDone;
97+
RadioEvents.RxTimeout = OnRxTimeout;
98+
99+
Radio.Init( &RadioEvents );
100+
Radio.SetChannel( RF_FREQUENCY );
101+
Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
102+
LORA_SPREADING_FACTOR, LORA_CODINGRATE,
103+
LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
104+
true, 0, 0, LORA_IQ_INVERSION_ON, 3000 );
105+
106+
Radio.SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
107+
LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
108+
LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON,
109+
0, true, 0, 0, LORA_IQ_INVERSION_ON, true );
110+
state=STATUS_TX;
111+
}
112+
113+
114+
void loop()
115+
{
116+
switch(state)
117+
{
118+
case STATUS_TX:
119+
delay(1000);
120+
txNumber++;
121+
sprintf(txpacket,"%s","hello");
122+
sprintf(txpacket+strlen(txpacket),"%d",txNumber);
123+
sprintf(txpacket+strlen(txpacket),"%s"," Rssi : ");
124+
sprintf(txpacket+strlen(txpacket),"%d",Rssi);
125+
126+
Serial.printf("\r\nsending packet \"%s\" , length %d\r\n",txpacket, strlen(txpacket));
127+
128+
Radio.Send( (uint8_t *)txpacket, strlen(txpacket) );
129+
state=STATUS_LOWPOWER;
130+
break;
131+
case STATUS_RX:
132+
Serial.println("into RX mode");
133+
Radio.Rx( 5000 );
134+
state=STATUS_LOWPOWER;
135+
break;
136+
case STATUS_LOWPOWER:
137+
LoRaWAN.sleep(CLASS_C,0);
138+
break;
139+
default:
140+
break;
141+
}
142+
}
143+
144+
void OnTxDone( void )
145+
{
146+
Serial.print("TX done......");
147+
sprintf(Repacket,"%s","");
148+
displaySendReceive();
149+
state=STATUS_RX;
150+
}
151+
152+
void OnTxTimeout( void )
153+
{
154+
Radio.Sleep( );
155+
Serial.print("TX Timeout......");
156+
sprintf(Repacket,"%s","TX Timeout,Retransmission");
157+
displaySendReceive();
158+
state=STATUS_TX;
159+
}
160+
161+
void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr )
162+
{
163+
Rssi=rssi;
164+
rxSize=size;
165+
memcpy(rxpacket, payload, size );
166+
rxpacket[size]='\0';
167+
Radio.Sleep( );
168+
169+
Serial.printf("\r\nreceived packet \"%s\" with Rssi %d , length %d\r\n",rxpacket,Rssi,rxSize);
170+
Serial.println("wait to send next packet");
171+
sprintf(Repacket,"%s","");
172+
displaySendReceive();
173+
174+
state=STATUS_TX;
175+
}
176+
177+
void OnRxTimeout( void )
178+
{
179+
Radio.Sleep( );
180+
Serial.print("RX Timeout......");
181+
sprintf(Repacket,"%s","RX Timeout,Retransmission");
182+
displaySendReceive();
183+
state=STATUS_TX;
184+
}
185+
186+
void displayMcuInit()
187+
{
188+
Display.wakeup();
189+
Display.init();
190+
delay(100);
191+
Display.flipScreenVertically();
192+
Display.setFont(ArialMT_Plain_10);
193+
Display.setTextAlignment(TEXT_ALIGN_LEFT);
194+
Display.clear();
195+
Display.drawString(18, 11, "ESP32_PINGPONG");
196+
Display.drawString(40, 31, "STARTING");
197+
198+
Display.display();
199+
delay(100);
200+
Display.clear();
201+
}
202+
203+
void displaySendReceive()
204+
{
205+
Display.drawString(0,0,"sending packet:");
206+
Display.drawString(0,11,(String)txpacket);
207+
Display.drawString(0,25,(String)Repacket);
208+
Display.drawString(0,40,"received packet:" );
209+
Display.drawString(0,51,(String)rxpacket);
210+
Display.display();
211+
delay(100);
212+
Display.clear();
213+
}
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
#ifndef IMAGES_H
2+
#define IMAGES_H
3+
4+
#define logo_width 128
5+
#define logo_height 53
6+
const static char logo_bits[] = {
7+
8+
0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9+
0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00,
10+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0xF0, 0x03,
11+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12+
0xC0, 0x07, 0xF0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
13+
0x00, 0x00, 0x00, 0x00, 0xC0, 0x0F, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00,
14+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0xF0, 0x1F,
15+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
16+
0xE0, 0x1F, 0xF0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
17+
0x00, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0xF8, 0x3F, 0x00, 0x00, 0x00, 0x00,
18+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x1F, 0xF8, 0x3F,
19+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
20+
0xE0, 0x1F, 0xF8, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
21+
0x00, 0x00, 0x00, 0x00, 0xF0, 0x1F, 0xF8, 0x1F, 0x00, 0x00, 0x00, 0x00,
22+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x1F, 0xFC, 0x1F,
23+
0x80, 0xFF, 0x8F, 0x7F, 0xC0, 0xFF, 0x7F, 0xC0, 0xFF, 0x03, 0xC0, 0x3F,
24+
0xF0, 0x1F, 0xFC, 0x1F, 0xE0, 0xFF, 0x87, 0x3F, 0xC0, 0xFF, 0x7F, 0xF0,
25+
0xFF, 0x01, 0xF8, 0xFF, 0xF0, 0x0F, 0xFC, 0x1F, 0xE0, 0xFF, 0x87, 0x3F,
26+
0xE0, 0xFF, 0x7F, 0xF8, 0xFF, 0x01, 0xFE, 0xFF, 0xF8, 0x0F, 0xFE, 0x0F,
27+
0xF0, 0xFF, 0x87, 0x3F, 0xE0, 0xFF, 0x7F, 0xFC, 0xFF, 0x01, 0xFF, 0xFF,
28+
0xF8, 0xFF, 0xFF, 0x0F, 0xF0, 0xFF, 0xC7, 0x3F, 0xE0, 0xFF, 0x3F, 0xFC,
29+
0xFF, 0x81, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0x0F, 0xF0, 0xFF, 0xC3, 0x1F,
30+
0xE0, 0xFF, 0x3F, 0xFC, 0xFF, 0xC0, 0xFF, 0x7F, 0xFC, 0xFF, 0xFF, 0x0F,
31+
0xF8, 0xFF, 0xC3, 0x1F, 0xE0, 0xFF, 0x3F, 0xFC, 0xFF, 0xE0, 0xFF, 0x7F,
32+
0xFC, 0xFF, 0xFF, 0x07, 0xF8, 0x03, 0xC0, 0x1F, 0x00, 0xFE, 0x01, 0xFE,
33+
0x00, 0xF0, 0x3F, 0x70, 0xFC, 0xFF, 0xFF, 0x07, 0xF8, 0x03, 0xE0, 0x0F,
34+
0x00, 0xFE, 0x00, 0xFE, 0x00, 0xF0, 0x1F, 0x60, 0xFC, 0xFF, 0xFF, 0x07,
35+
0xF8, 0x03, 0xE0, 0x0F, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xF0, 0x07, 0x20,
36+
0xFE, 0xFF, 0xFF, 0x07, 0xFC, 0xFF, 0xE1, 0x0F, 0x00, 0xFF, 0x00, 0xFF,
37+
0x7F, 0xF8, 0x07, 0x00, 0xFE, 0x83, 0xFF, 0x03, 0xFC, 0xFF, 0xF1, 0x0F,
38+
0x00, 0x7F, 0x00, 0xFF, 0x7F, 0xF8, 0x03, 0x00, 0xFE, 0x83, 0xFF, 0x03,
39+
0xFC, 0xFF, 0xF0, 0x07, 0x00, 0x7F, 0x00, 0xFF, 0x7F, 0xFC, 0x03, 0x00,
40+
0xFE, 0x81, 0xFF, 0x03, 0xFC, 0xFF, 0xF0, 0x07, 0x00, 0x7F, 0x00, 0xFF,
41+
0x3F, 0xFC, 0x03, 0x00, 0xFF, 0xC1, 0xFF, 0x01, 0xFE, 0xFF, 0xF0, 0x07,
42+
0x80, 0x3F, 0x80, 0xFF, 0x3F, 0xFC, 0x03, 0x00, 0xFF, 0xC1, 0xFF, 0x01,
43+
0xFE, 0xFF, 0xF8, 0x07, 0x80, 0x3F, 0x80, 0xFF, 0x3F, 0xFC, 0x03, 0x10,
44+
0xFF, 0xC1, 0xFF, 0x01, 0xFE, 0x00, 0xF8, 0x03, 0x80, 0x3F, 0x80, 0x3F,
45+
0x00, 0xFC, 0x03, 0x0C, 0xFF, 0xC0, 0xFF, 0x01, 0xFF, 0x00, 0xF8, 0x03,
46+
0xC0, 0x3F, 0x80, 0x3F, 0x00, 0xFC, 0x07, 0x0E, 0xFF, 0xE0, 0xFF, 0x00,
47+
0x7F, 0x00, 0xF8, 0x03, 0xC0, 0x1F, 0xC0, 0x3F, 0x00, 0xFC, 0xFF, 0x0F,
48+
0xFF, 0xE0, 0xFF, 0x00, 0xFF, 0x7F, 0xFC, 0xFF, 0xC1, 0x1F, 0xC0, 0xFF,
49+
0x1F, 0xFC, 0xFF, 0x0F, 0x7F, 0xE0, 0xFF, 0x00, 0xFF, 0x3F, 0xFC, 0xFF,
50+
0xC1, 0x1F, 0xC0, 0xFF, 0x0F, 0xF8, 0xFF, 0x07, 0x7E, 0xE0, 0xFF, 0x80,
51+
0xFF, 0x3F, 0xFC, 0xFF, 0xE0, 0x1F, 0xC0, 0xFF, 0x0F, 0xF8, 0xFF, 0x07,
52+
0x7C, 0xF0, 0x7F, 0x80, 0xFF, 0x3F, 0xFE, 0xFF, 0xE0, 0x0F, 0xE0, 0xFF,
53+
0x0F, 0xF0, 0xFF, 0x07, 0xF8, 0xF0, 0x7F, 0x80, 0xFF, 0x1F, 0xFE, 0xFF,
54+
0xE0, 0x0F, 0xE0, 0xFF, 0x0F, 0xE0, 0xFF, 0x07, 0xE0, 0xF0, 0x7F, 0x80,
55+
0xFF, 0x1F, 0xFE, 0xFF, 0xE0, 0x0F, 0xE0, 0xFF, 0x07, 0x80, 0xFF, 0x03,
56+
0x00, 0xF0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
57+
0x00, 0x00, 0x3C, 0x00, 0x00, 0xF8, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00,
58+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x3F, 0x00,
59+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
60+
0x00, 0xF8, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
61+
0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x8F, 0xF7, 0xFF, 0x7C,
62+
0xBC, 0xC7, 0xF3, 0xFF, 0xFC, 0xBC, 0x07, 0x00, 0x00, 0xFC, 0x1F, 0x00,
63+
0x8F, 0x73, 0xFF, 0xFE, 0xBE, 0xC7, 0xFB, 0xFF, 0xFE, 0xBD, 0x03, 0x00,
64+
0x00, 0xFC, 0x1F, 0x80, 0x8F, 0x73, 0xFF, 0xEF, 0xFE, 0xE7, 0xFB, 0x77,
65+
0xEF, 0xFD, 0x03, 0x00, 0x00, 0xFC, 0x1F, 0x80, 0xDF, 0x7B, 0x9C, 0xE7,
66+
0xFE, 0xF7, 0xE3, 0x71, 0xE7, 0xFD, 0x03, 0x00, 0x00, 0xFC, 0x0F, 0xC0,
67+
0xDF, 0x79, 0x9E, 0xE3, 0xFE, 0xF3, 0xE3, 0x78, 0xE7, 0xFF, 0x03, 0x00,
68+
0x00, 0xFC, 0x0F, 0xE0, 0xDF, 0x39, 0x8E, 0xF3, 0xFF, 0xFB, 0xE7, 0xF8,
69+
0xE7, 0xFE, 0x01, 0x00, 0x00, 0xFC, 0x0F, 0xE0, 0xDF, 0x3F, 0x8E, 0x7F,
70+
0xFF, 0xFF, 0xE7, 0x38, 0x7F, 0xEE, 0x01, 0x00, 0x00, 0xF8, 0x0F, 0x70,
71+
0xDC, 0x1F, 0x0E, 0x3F, 0xFF, 0x9D, 0xF7, 0x38, 0x3F, 0xEF, 0x01, 0x00,
72+
0x00, 0xF8, 0x0F, 0x00, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
73+
0x08, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
74+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x0F, 0x00,
75+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
76+
0x00, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
77+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00,
78+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
79+
80+
const char activeSymbol[] PROGMEM = {
81+
B00000000,
82+
B00000000,
83+
B00011000,
84+
B00100100,
85+
B01000010,
86+
B01000010,
87+
B00100100,
88+
B00011000
89+
};
90+
91+
const char inactiveSymbol[] PROGMEM = {
92+
B00000000,
93+
B00000000,
94+
B00000000,
95+
B00000000,
96+
B00011000,
97+
B00011000,
98+
B00000000,
99+
B00000000
100+
};
101+
102+
#endif

0 commit comments

Comments
 (0)