kopia lustrzana https://github.com/helium/longfi-arduino
Merge pull request #28 from leroyle/rak_wisblock
commit
000c6472af
|
@ -0,0 +1,16 @@
|
|||
|
||||
# Helium Basic Example
|
||||
|
||||
Here you will find a very basic example of a WisBlock/Helium embedded project that uses the Arduino IDE.
|
||||
This version will join the Helium network and periodically send a "Hello" to the Helium network.
|
||||
|
||||
### Hardware
|
||||
The only hardware required is:
|
||||
* the [WisBlock Starter Kit](https://store.rakwireless.com/products/wisblock-starter-kit) containing the base board with the core module installed.
|
||||
* one USB 2.0 A-Male to Micro B interface cable.
|
||||
|
||||
#### Antenna Type/location
|
||||
The WisBlock starter kit comes with two antenna types,
|
||||
* the one that resembles an "I" is the LoRa antenna, this one connects to the connector on the core moduke marked LoRa, which is below the large K in the RAK logo.
|
||||
* the one that resembles a "T" is the BLE antenna, this one connects to the connector on the core module marked BLE
|
||||
|
|
@ -0,0 +1,254 @@
|
|||
#include <Arduino.h>
|
||||
|
||||
/**
|
||||
* @file LoRaWAN_OTAA.ino
|
||||
* @author rakwireless.com
|
||||
* @brief LoRaWan node example with OTAA registration
|
||||
* @version 0.1
|
||||
* @date 2020-08-21
|
||||
*
|
||||
* @copyright Copyright (c) 2020
|
||||
*
|
||||
* @note RAK5005-O GPIO mapping to RAK4631 GPIO ports
|
||||
RAK5005-O <-> nRF52840
|
||||
IO1 <-> P0.17 (Arduino GPIO number 17)
|
||||
IO2 <-> P1.02 (Arduino GPIO number 34)
|
||||
IO3 <-> P0.21 (Arduino GPIO number 21)
|
||||
IO4 <-> P0.04 (Arduino GPIO number 4)
|
||||
IO5 <-> P0.09 (Arduino GPIO number 9)
|
||||
IO6 <-> P0.10 (Arduino GPIO number 10)
|
||||
SW1 <-> P0.01 (Arduino GPIO number 1)
|
||||
A0 <-> P0.04/AIN2 (Arduino Analog A2
|
||||
A1 <-> P0.31/AIN7 (Arduino Analog A7
|
||||
SPI_CS <-> P0.26 (Arduino GPIO number 26)
|
||||
*/
|
||||
#include <Arduino.h>
|
||||
#include <LoRaWan-RAK4630.h> //http://librarymanager/All#SX126x
|
||||
#include <SPI.h>
|
||||
|
||||
// RAK4630 supply two LED
|
||||
#ifndef LED_BUILTIN
|
||||
#define LED_BUILTIN 35
|
||||
#endif
|
||||
|
||||
#ifndef LED_BUILTIN2
|
||||
#define LED_BUILTIN2 36
|
||||
#endif
|
||||
|
||||
bool doOTAA = true;
|
||||
#define SCHED_MAX_EVENT_DATA_SIZE APP_TIMER_SCHED_EVENT_DATA_SIZE /**< Maximum size of scheduler events. */
|
||||
#define SCHED_QUEUE_SIZE 60 /**< Maximum number of events in the scheduler queue. */
|
||||
#define LORAWAN_DATERATE DR_0 /*LoRaMac datarates definition, from DR_0 to DR_5*/
|
||||
#define LORAWAN_TX_POWER TX_POWER_5 /*LoRaMac tx power definition, from TX_POWER_0 to TX_POWER_15*/
|
||||
#define JOINREQ_NBTRIALS 3 /**< Number of trials for the join request. */
|
||||
DeviceClass_t gCurrentClass = CLASS_A; /* class definition*/
|
||||
lmh_confirm gCurrentConfirm = LMH_UNCONFIRMED_MSG; /* confirm/unconfirm packet definition*/
|
||||
uint8_t gAppPort = LORAWAN_APP_PORT; /* data port*/
|
||||
|
||||
/**@brief Structure containing LoRaWan parameters, needed for lmh_init()
|
||||
*/
|
||||
static lmh_param_t lora_param_init = {LORAWAN_ADR_ON, LORAWAN_DATERATE, LORAWAN_PUBLIC_NETWORK, JOINREQ_NBTRIALS, LORAWAN_TX_POWER, LORAWAN_DUTYCYCLE_OFF};
|
||||
|
||||
// Foward declaration
|
||||
static void lorawan_has_joined_handler(void);
|
||||
static void lorawan_join_failed_handler(void);
|
||||
static void lorawan_rx_handler(lmh_app_data_t *app_data);
|
||||
static void lorawan_confirm_class_handler(DeviceClass_t Class);
|
||||
static void send_lora_frame(void);
|
||||
|
||||
/**@brief Structure containing LoRaWan callback functions, needed for lmh_init()
|
||||
*/
|
||||
static lmh_callback_t lora_callbacks = {BoardGetBatteryLevel, BoardGetUniqueId, BoardGetRandomSeed,
|
||||
lorawan_rx_handler, lorawan_has_joined_handler, lorawan_confirm_class_handler, lorawan_join_failed_handler};
|
||||
|
||||
//OTAA keys !!!! KEYS ARE MSB !!!!
|
||||
NOTE: FILL IN THE THREE REQUIRED HELIUM NETWORK CREDENTIALS WITH YOUR VALUES AND DELETE THIS LINE
|
||||
|
||||
uint8_t nodeDeviceEUI[8] = {0x00, 0x00, 0xDA, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||
uint8_t nodeAppEUI[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||
uint8_t nodeAppKey[16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||
|
||||
|
||||
|
||||
// Private defination
|
||||
#define LORAWAN_APP_DATA_BUFF_SIZE 64 /**< buffer size of the data to be transmitted. */
|
||||
#define LORAWAN_APP_INTERVAL 20000 /**< Defines for user timer, the application data transmission interval. 20s, value in [ms]. */
|
||||
static uint8_t m_lora_app_data_buffer[LORAWAN_APP_DATA_BUFF_SIZE]; //< Lora user application data buffer.
|
||||
static lmh_app_data_t m_lora_app_data = {m_lora_app_data_buffer, 0, 0, 0, 0}; //< Lora user application data structure.
|
||||
|
||||
TimerEvent_t appTimer;
|
||||
static uint32_t timers_init(void);
|
||||
static uint32_t count = 0;
|
||||
static uint32_t count_fail = 0;
|
||||
|
||||
void setup()
|
||||
{
|
||||
pinMode(LED_BUILTIN, OUTPUT);
|
||||
digitalWrite(LED_BUILTIN, LOW);
|
||||
|
||||
// Initialize LoRa chip.
|
||||
lora_rak4630_init();
|
||||
delay(5000);
|
||||
// Initialize Serial for debug output
|
||||
Serial.begin(115200);
|
||||
while (!Serial)
|
||||
{
|
||||
delay(10);
|
||||
}
|
||||
Serial.println("=====================================");
|
||||
Serial.println("Welcome to RAK4630 LoRaWan!!!");
|
||||
Serial.println("Type: OTAA");
|
||||
|
||||
#if defined(REGION_AS923)
|
||||
Serial.println("Region: AS923");
|
||||
#elif defined(REGION_AU915)
|
||||
Serial.println("Region: AU915");
|
||||
#elif defined(REGION_CN470)
|
||||
Serial.println("Region: CN470");
|
||||
#elif defined(REGION_CN779)
|
||||
Serial.println("Region: CN779");
|
||||
#elif defined(REGION_EU433)
|
||||
Serial.println("Region: EU433");
|
||||
#elif defined(REGION_IN865)
|
||||
Serial.println("Region: IN865");
|
||||
#elif defined(REGION_EU868)
|
||||
Serial.println("Region: EU868");
|
||||
#elif defined(REGION_KR920)
|
||||
Serial.println("Region: KR920");
|
||||
#elif defined(REGION_US915)
|
||||
Serial.println("Region: US915");
|
||||
#elif defined(REGION_US915_HYBRID)
|
||||
Serial.println("Region: US915_HYBRID");
|
||||
#else
|
||||
Serial.println("Please define a region in the compiler options.");
|
||||
#endif
|
||||
Serial.println("=====================================");
|
||||
|
||||
//creat a user timer to send data to server period
|
||||
uint32_t err_code;
|
||||
err_code = timers_init();
|
||||
if (err_code != 0)
|
||||
{
|
||||
Serial.printf("timers_init failed - %d\n", err_code);
|
||||
}
|
||||
|
||||
// Setup the EUIs and Keys
|
||||
lmh_setDevEui(nodeDeviceEUI);
|
||||
lmh_setAppEui(nodeAppEUI);
|
||||
lmh_setAppKey(nodeAppKey);
|
||||
|
||||
// Initialize LoRaWan
|
||||
err_code = lmh_init(&lora_callbacks, lora_param_init, doOTAA);
|
||||
if (err_code != 0)
|
||||
{
|
||||
Serial.printf("lmh_init failed - %d\n", err_code);
|
||||
}
|
||||
|
||||
// Start Join procedure
|
||||
Serial.println("Starting Join");
|
||||
lmh_join();
|
||||
Serial.println("Return from join");
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
// Handle Radio events
|
||||
Radio.IrqProcess();
|
||||
}
|
||||
|
||||
/**@brief LoRa function for handling HasJoined event.
|
||||
*/
|
||||
void lorawan_has_joined_handler(void)
|
||||
{
|
||||
Serial.println("OTAA Mode, Network Joined!");
|
||||
|
||||
lmh_error_status ret = lmh_class_request(gCurrentClass);
|
||||
if (ret == LMH_SUCCESS)
|
||||
{
|
||||
delay(1000);
|
||||
TimerSetValue(&appTimer, LORAWAN_APP_INTERVAL);
|
||||
TimerStart(&appTimer);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**@brief LoRa function for handling Join Failed event.
|
||||
*/
|
||||
void lorawan_join_failed_handler(void)
|
||||
{
|
||||
Serial.println("OTAA Mode, Network Join Failed!");
|
||||
|
||||
Serial.printf("Join Attempt failed after JOINREQ_NBTRIALS count of %d\r\n", JOINREQ_NBTRIALS);
|
||||
Serial.println("No more network joins will be attempted");
|
||||
}
|
||||
|
||||
/**@brief Function for handling LoRaWan received data from Gateway
|
||||
*
|
||||
* @param[in] app_data Pointer to rx data
|
||||
*/
|
||||
void lorawan_rx_handler(lmh_app_data_t *app_data)
|
||||
{
|
||||
Serial.printf("LoRa Packet received on port %d, size:%d, rssi:%d, snr:%d, data:%s\n",
|
||||
app_data->port, app_data->buffsize, app_data->rssi, app_data->snr, app_data->buffer);
|
||||
}
|
||||
|
||||
void lorawan_confirm_class_handler(DeviceClass_t Class)
|
||||
{
|
||||
Serial.printf("switch to class %c done\n", "ABC"[Class]);
|
||||
// Informs the server that switch has occurred ASAP
|
||||
m_lora_app_data.buffsize = 0;
|
||||
m_lora_app_data.port = gAppPort;
|
||||
lmh_send(&m_lora_app_data, gCurrentConfirm);
|
||||
}
|
||||
|
||||
void send_lora_frame(void)
|
||||
{
|
||||
if (lmh_join_status_get() != LMH_SET)
|
||||
{
|
||||
//Not joined, try again later
|
||||
return;
|
||||
}
|
||||
|
||||
uint32_t i = 0;
|
||||
memset(m_lora_app_data.buffer, 0, LORAWAN_APP_DATA_BUFF_SIZE);
|
||||
m_lora_app_data.port = gAppPort;
|
||||
m_lora_app_data.buffer[i++] = 'H';
|
||||
m_lora_app_data.buffer[i++] = 'e';
|
||||
m_lora_app_data.buffer[i++] = 'l';
|
||||
m_lora_app_data.buffer[i++] = 'l';
|
||||
m_lora_app_data.buffer[i++] = 'o';
|
||||
m_lora_app_data.buffer[i++] = '!';
|
||||
m_lora_app_data.buffsize = i;
|
||||
|
||||
lmh_error_status error = lmh_send(&m_lora_app_data, gCurrentConfirm);
|
||||
if (error == LMH_SUCCESS)
|
||||
{
|
||||
count++;
|
||||
Serial.printf("lmh_send ok count %d\n", count);
|
||||
}
|
||||
else
|
||||
{
|
||||
count_fail++;
|
||||
Serial.printf("lmh_send fail count %d\n", count_fail);
|
||||
}
|
||||
}
|
||||
|
||||
/**@brief Function for handling user timerout event.
|
||||
*/
|
||||
void tx_lora_periodic_handler(void)
|
||||
{
|
||||
TimerSetValue(&appTimer, LORAWAN_APP_INTERVAL);
|
||||
TimerStart(&appTimer);
|
||||
Serial.println("Sending frame now...");
|
||||
send_lora_frame();
|
||||
}
|
||||
|
||||
/**@brief Function for the Timer initialization.
|
||||
*
|
||||
* @details Initializes the timer module. This creates and starts application timers.
|
||||
*/
|
||||
uint32_t timers_init(void)
|
||||
{
|
||||
TimerInit(&appTimer, tx_lora_periodic_handler);
|
||||
return 0;
|
||||
}
|
|
@ -25,4 +25,5 @@ Here you will find a collection of Arduino sketch examples of transmitting on th
|
|||
### Heltec WiFi LoRa 32 V2
|
||||
* [longfi-us915](Heltec-WiFi-LoRa-32-V2/longfi-us915)
|
||||
|
||||
|
||||
### RAKWireless WisBlock
|
||||
* [longfi-us915](RAKWireless-WisBlock/longfi-us915/)
|
||||
|
|
Ładowanie…
Reference in New Issue