[iot] ESP32 + RFM95 + LoRaWAN LMIC
Thierry VAL
thierry.val at irit.fr
Sat Nov 2 14:10:31 CET 2019
Bonjour à toutes et tous,
après quelques tentatives infructueuses, et l'aide de plusieurs d'entre
vous, je suis arrivé à faire fonctionner un noeud LoRaWAN avec la lib
LMIC, constitué d'un ESP32 et d'un RFM95.
Le câblage est en commentaire dans le fichier source joint !
Bon WE sous la pluie...
Thierry
--
-------------- section suivante --------------
Une pièce jointe HTML a été nettoyée...
URL: <http://lists.tetaneutral.net/pipermail/iot/attachments/20191102/9d32c357/attachment-0001.html>
-------------- section suivante --------------
Une pièce jointe autre que texte a été nettoyée...
Nom: sign2014.jpg
Type: image/jpeg
Taille: 38405 octets
Desc: non disponible
URL: <http://lists.tetaneutral.net/pipermail/iot/attachments/20191102/9d32c357/attachment-0001.jpg>
-------------- section suivante --------------
/*******************************************************************************
* Copyright (c) 2015 Thomas Telkamp and Matthijs Kooijman
* Modifié par NG et RB (IUT de Blagnac)
* Modifié par yves (LinuxTarn)
* Modifié par Brice (AlbiLab)
* Modifié par Thierry (IRIT - UT2J - IUT Blagnac)
*
* This uses OTAA (Over-the-air activation), where where a DevEUI and
* application key is configured, which are used in an over-the-air
* activation procedure where a DevAddr and session keys are
* assigned/generated for use with all further communication.
*
* To use this sketch, first register your application and device with
* the tloraserver, to set or generate an AppEUI, DevEUI and AppKey.
* Multiple devices can use the same AppEUI, but each device has its own
* DevEUI and AppKey.
*
* Do not forget to define the radio type correctly in config.h.
*
*******************************************************************************/
#include <lmic.h>
#include <hal/hal.h>
#include <SPI.h>
#if defined(ARDUINO_SAMD_ZERO) && defined(SERIAL_PORT_USBVIRTUAL)
// Required for Serial on Zero based boards
#define Serial SERIAL_PORT_USBVIRTUAL
#endif
/******************************************************************************/
/* LoRaWAN */
/******************************************************************************/
// This EUI must be in *little-endian format* (least-significant-byte first)
// Necessaire pour le protocole mais inutile pour l'implémentation dans loraserver
// On peut donc mettre de l'aléatoire ou :
static const u1_t APPEUI[8]={ 0x99, 0x93, 0x28, 0x00, 0x0b, 0xa3, 0x04, 0x00 };
// DEVEUI should also be in *little endian format*
static const u1_t DEVEUI[8]={ 0x99, 0x93, 0x28, 0x00, 0x0b, 0xa3, 0x04, 0x00 };
// This key should be in big endian format
static const u1_t APPKEY[16] = { 0x00, 0x04, 0xa3, 0x0b, 0x00, 0x28, 0x93, 0x99, 0x00, 0x04, 0xa3, 0x0b, 0x00, 0x28, 0x93, 0x99 };
// Copie en mémoire des EUI et APPKEY
void os_getArtEui (u1_t* buf) { memcpy_P(buf, APPEUI, 8);}
void os_getDevEui (u1_t* buf) { memcpy_P(buf, DEVEUI, 8);}
void os_getDevKey (u1_t* buf) { memcpy_P(buf, APPKEY, 16);}
// Schedule TX every this many seconds (might become longer due to duty
// cycle limitations).
const unsigned TX_INTERVAL = 60;
/******************************************************************************/
/* pin mapping */
/******************************************************************************/
const lmic_pinmap lmic_pins = {
.nss = 5,
.rxtx = LMIC_UNUSED_PIN,
.rst = 14,
.dio = {26,33,32},//dio0 is connected to pin 26 of esp32, dio1: pin 33, dio2: pin 32
// mosi:23, miso:19, nss:5, sck: 18
};
/******************************************************************************/
/* payload */
/******************************************************************************/
static uint8_t mydata[] = "CaNET DATA";
/******************************************************************************/
/* Automate LMIC */
/******************************************************************************/
static osjob_t sendjob;
void onEvent (ev_t ev) {
Serial.print(os_getTime());
Serial.print(": ");
switch(ev) {
case EV_SCAN_TIMEOUT:
Serial.println(F("EV_SCAN_TIMEOUT"));
break;
case EV_BEACON_FOUND:
Serial.println(F("EV_BEACON_FOUND"));
break;
case EV_BEACON_MISSED:
Serial.println(F("EV_BEACON_MISSED"));
break;
case EV_BEACON_TRACKED:
Serial.println(F("EV_BEACON_TRACKED"));
break;
case EV_JOINING:
Serial.println(F("EV_JOINING"));
break;
case EV_JOINED:
Serial.println(F("EV_JOINED"));
// Disable link check validation (automatically enabled
// during join, but not supported by TTN at this time).
LMIC_setLinkCheckMode(1);
break;
case EV_RFU1:
Serial.println(F("EV_RFU1"));
break;
case EV_JOIN_FAILED:
Serial.println(F("EV_JOIN_FAILED"));
break;
case EV_REJOIN_FAILED:
Serial.println(F("EV_REJOIN_FAILED"));
break;
break;
case EV_TXCOMPLETE:
Serial.println(F("EV_TXCOMPLETE (includes waiting for RX windows)"));
if (LMIC.txrxFlags & TXRX_ACK)
Serial.println(F("Received ack"));
if (LMIC.dataLen) {
Serial.println(F("Received "));
Serial.println(LMIC.dataLen);
Serial.println(F(" bytes of payload"));
}
// Schedule next transmission
os_setTimedCallback(&sendjob, os_getTime()+sec2osticks(TX_INTERVAL), do_send);
break;
case EV_LOST_TSYNC:
Serial.println(F("EV_LOST_TSYNC"));
break;
case EV_RESET:
Serial.println(F("EV_RESET"));
break;
case EV_RXCOMPLETE:
// data received in ping slot
Serial.println(F("EV_RXCOMPLETE"));
break;
case EV_LINK_DEAD:
Serial.println(F("EV_LINK_DEAD"));
break;
case EV_LINK_ALIVE:
Serial.println(F("EV_LINK_ALIVE"));
break;
default:
Serial.println(F("Unknown event"));
break;
}
}
void do_send(osjob_t* j){
// Check if there is not a current TX/RX job running
if (LMIC.opmode & OP_TXRXPEND) {
Serial.println(F("OP_TXRXPEND, not sending"));
} else {
// Prepare upstream data transmission at the next possible time.
LMIC_setTxData2(1, mydata, sizeof(mydata)-1, 0);
Serial.println(F("Packet queued"));
}
// Next TX is scheduled after TX_COMPLETE event.
}
void setup() {
while (! Serial);
Serial.begin(115200);
while (millis() < 5000) {
Serial.print("millis() = "); Serial.println(millis());
delay(500);
}
Serial.println(F("Starting"));
#ifdef VCC_ENABLE
// For Pinoccio Scout boards
pinMode(VCC_ENABLE, OUTPUT);
digitalWrite(VCC_ENABLE, HIGH);
delay(1000);
#endif
// LMIC init
os_init();
// Reset the MAC state. Session and pending data transfers will be discarded.
LMIC_reset();
LMIC_setClockError(MAX_CLOCK_ERROR * 10 / 100);
// Start job (sending automatically starts OTAA too)
do_send(&sendjob);
}
void loop() {
os_runloop_once();
}
More information about the iot
mailing list