et5 - Configuration du programme
Nous allons utiliser une version modifiée du programme donné en exemple par Heltec pour la communication utilisant le protocole OTTA : "OTAA_OLED_interrupt_CLASS_C.ino"
Notre but est d' envoyer une trame simulant une température de 22.1°C sur le serveur TTN, ceci afin de pouvoir l'observer sur la console TTN
Il vous faut copier et coller la version ci-dessous dans l'IDE Arduino.
//------ Zone 'etxx' dédiée aux variables / bibliothèques liées à la gestion de la température ------//
OneWire ds(13); // pin 13 impératif !
const byte ds_rom[8] = {0x28, 0x8E, 0xE5, 0xB0, 0x1B, 0x19, 0x01, 0xF5}; // à modifier----
const unsigned TempInterval = 60; // en seconde
long nextTime;
//-------------------------------- fin de la zone 'etxx'-------------------------------------------//
uint32_t license[4] = { };
/* OTAA para*/
uint8_t DevEui[] = { };
uint8_t AppEui[] = { };
uint8_t AppKey[] = { };
/* ABP para*/
uint8_t NwkSKey[] = { 0x15, 0xb1, 0xd0, 0xef, 0xa4, 0x63, 0xdf, 0xbe, 0x3d, 0x11, 0x18, 0x1e, 0x1e, 0xc7, 0xda, 0x85 };
uint8_t AppSKey[] = { 0xd7, 0x2c, 0x78, 0x75, 0x8c, 0xdc, 0xca, 0xbf, 0x55, 0xee, 0x4a, 0x77, 0x8d, 0x16, 0xef, 0x67 };
uint32_t DevAddr = ( uint32_t )0x007e6ae1;
/*LoraWan channelsmask, default channels 0-7*/
uint16_t userChannelsMask[6]={ 0x00FF,0x0000,0x0000,0x0000,0x0000,0x0000 };
/*LoraWan Class, Class A and Class C are supported*/
DeviceClass_t loraWanClass = CLASS_C;
/*the application data transmission duty cycle. value in [ms].*/
uint32_t appTxDutyCycle = 3600*24*1000;
/*OTAA or ABP*/
bool overTheAirActivation = true;
/*ADR enable*/
bool loraWanAdr = true;
/* Indicates if the node is sending confirmed or unconfirmed messages */
bool isTxConfirmed = true;
/* Application port */
uint8_t appPort = 2; //test pour cayenne ? avant 2;
/*!
Number of trials to transmit the frame, if the LoRaMAC layer did not
receive an acknowledgment. The MAC performs a datarate adaptation,
according to the LoRaWAN Specification V1.0.2, chapter 18.4, according
to the following table:
Transmission nb | Data Rate
----------------|-----------
1 (first) | DR
2 | DR
3 | max(DR-1,0)
4 | max(DR-1,0)
5 | max(DR-2,0)
6 | max(DR-2,0)
7 | max(DR-3,0)
8 | max(DR-3,0)
Note, that if NbTrials is set to 1 or 2, the MAC will not decrease
the datarate, in case the LoRaMAC layer did not receive an acknowledgment
*/
uint8_t confirmedNbTrials = 1;
/*LoraWan debug level, select in arduino IDE tools.
None : print basic info.
Freq : print Tx and Rx freq, DR info.
Freq && DIO : print Tx and Rx freq, DR, DIO0 interrupt and DIO1 interrupt info.
Freq && DIO && PW: print Tx and Rx freq, DR, DIO0 interrupt, DIO1 interrupt, MCU sleep and MCU wake info.
*/
uint8_t debugLevel = LoRaWAN_DEBUG_LEVEL; // Modifiable dans l'IDE Arduino (Outils -> LoRaWan Debug Level)
/*LoraWan region, select in arduino IDE tools*/
LoRaMacRegion_t loraWanRegion = ACTIVE_REGION; // Modifiable dans l'IDE Arduino (Outils -> LoRaWan Region)
uint8_t da2 = ; // octet de poids fort de la température
uint8_t da3 = ; // octet de poids faible de la température
static void prepareTxFrame( uint8_t port) // trame au format LPP
{
appDataSize = 4;
appData[0] = 0x01; //data channel 1
appData[1] = ; // C'est un capteur de température
appData[2] = da2;
appData[3] = da3;
}
void keyDown()
{
delay(10);
if (digitalRead(INT_PIN) == 1 && IsLoRaMacNetworkJoined)
{
deviceState = DEVICE_STATE_SEND;
}
}
// Add your initialization code here
void setup() {
if (mcuStarted == 0)
{
LoRaWAN.displayMcuInit();
}
Serial.begin(115200);
while (!Serial);
SPI.begin(SCK, MISO, MOSI, SS);
Mcu.init(SS, RST_LoRa, DIO0, DIO1, license);
delay(100);
pinMode(INT_PIN, INPUT_PULLUP);
attachInterrupt(INT_PIN, keyDown, RISING);
//------ Zone 'etxy' dédiée aux variables / bibliothèques liées à la gestion de la température -------//
//----------------------------- fin de la zone 'etxy' -----------------------------------------------//
deviceState = DEVICE_STATE_INIT;
}
// The loop function is called in an endless loop
void loop()
{
switch ( deviceState ) {
case DEVICE_STATE_INIT:
{
LoRaWAN.init(loraWanClass, loraWanRegion);
break;
}
case DEVICE_STATE_JOIN:
{
LoRaWAN.displayJoining();
LoRaWAN.join();
break;
}
case DEVICE_STATE_SEND:
{
LoRaWAN.displaySending();
prepareTxFrame( appPort );
LoRaWAN.send(loraWanClass);
deviceState = DEVICE_STATE_CYCLE;
break;
}
case DEVICE_STATE_CYCLE:
{
// Schedule next packet transmission
txDutyCycleTime = appTxDutyCycle + randr( -APP_TX_DUTYCYCLE_RND, APP_TX_DUTYCYCLE_RND );
LoRaWAN.cycle(txDutyCycleTime);
deviceState = DEVICE_STATE_SLEEP;
break;
}
case DEVICE_STATE_SLEEP:
{
LoRaWAN.displayAck();
LoRaWAN.sleep(loraWanClass, debugLevel);
break;
}
default:
{
deviceState = DEVICE_STATE_INIT;
break;
}
}
//------ Zone 'etxz' code pour envoyer la température toutes les 60 secondes ------//
if (millis() > nextTime) {
nextTime = nextTime + (1000 * TempInterval);
deviceState = DEVICE_STATE_INIT; // envoie la TxFrame
}
//--------------------------------fin de la zone 'etxz' fin temp -------------------------------------------------//
}
//---------------------------------- zone fonctions DS18B20 ---------------------------------------------------//
void DS18b20_ini(const byte rom[]) {
ds.reset();
ds.select(rom);
ds.write(0x4e);
ds.write(0x60); // th
ds.write(0xc0); // tl
ds.write(0x7f); // mode 12 bits
}
int DS18b20_temp(const byte rom[]) { // version en 1/10 de degré
ds.reset();
ds.select(rom);
ds.write(0x44);
while (!ds.read_bit()); // (environ 100ms)
ds.reset();
ds.select(rom);
ds.write(0xBE);
byte oct_0 = ds.read();
byte oct_1 = ds.read();
ds.reset(); //pas indispensable ??
int tp = (((oct_1 << 8) | oct_0) * 10);
return (tp / 16); // retourne la température en 1/10 de degré C
}
//-------------------------------- fin zone DS18B20 -------------------------------------------------//
Il vous faut :
Compléter le code en y recopiant le N° de licence obtenu précédemment (vers la ligne 15)
Puis, en dessous recopier les identifiants récupérés sur le serveur TTN (device EUI, Application EUI et Application Key)
Le codage Cayenne LPP :
Documentation is here -->https://community.mydevices.com/t/cayenne-lpp-2-0/7510
Le Data Channel sera fixé à '1', la valeur de température à envoyer est 22.1 °C soit 221 dixième de °C
Rechercher les 4 octets à envoyer (payload or txFrame in english) recopier ces 4 octets dans votre le compte-rendu
Compléter le code en y recopiant ces octets (les lignes à modifier doivent se trouver entre 65 et 90 ).
Test du programme :
Compiler et téléverser le programme
Aller sur le site de TTN, puis dans votre Application ou votre Device , sélectionner Data
Vous devriez voir un 'payload' contenant "temperature_1 : 22.1" arriver toute les minutes