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 herevoid 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 loopvoid 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 transmissiontxDutyCycleTime = 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
