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.

1
#include <ESP32_LoRaWAN.h>
2
#include "Arduino.h"
3
//------ Zone 'etxx' dédiée aux variables / bibliothèques liées à la gestion de la température ------//
4
#include <OneWire.h>
5
OneWire ds(13);  //  pin 13 impératif !
6
const byte ds_rom[8] = {0x28, 0x8E, 0xE5, 0xB0, 0x1B, 0x19, 0x01, 0xF5}; // à modifier----
7
8
9
10
11
const unsigned TempInterval = 60; // en seconde
12
long nextTime;
13
//--------------------------------  fin de la zone 'etxx'-------------------------------------------//
14
#define INT_PIN 12
15
uint32_t  license[4] = {     };
16
/* OTAA para*/
17
uint8_t DevEui[] = {         };
18
uint8_t AppEui[] = {         };
19
uint8_t AppKey[] = {         };
20
21
/* ABP para*/
22
uint8_t NwkSKey[] = { 0x15, 0xb1, 0xd0, 0xef, 0xa4, 0x63, 0xdf, 0xbe, 0x3d, 0x11, 0x18, 0x1e, 0x1e, 0xc7, 0xda, 0x85 };
23
uint8_t AppSKey[] = { 0xd7, 0x2c, 0x78, 0x75, 0x8c, 0xdc, 0xca, 0xbf, 0x55, 0xee, 0x4a, 0x77, 0x8d, 0x16, 0xef, 0x67 };
24
uint32_t DevAddr =  ( uint32_t )0x007e6ae1;
25
26
/*LoraWan channelsmask, default channels 0-7*/
27
uint16_t userChannelsMask[6]={ 0x00FF,0x0000,0x0000,0x0000,0x0000,0x0000 };
28
/*LoraWan Class, Class A and Class C are supported*/
29
DeviceClass_t  loraWanClass = CLASS_C;
30
/*the application data transmission duty cycle.  value in [ms].*/
31
uint32_t appTxDutyCycle = 3600*24*1000;
32
/*OTAA or ABP*/
33
bool overTheAirActivation = true;
34
/*ADR enable*/
35
bool loraWanAdr = true;
36
/* Indicates if the node is sending confirmed or unconfirmed messages */
37
bool isTxConfirmed = true;
38
/* Application port */
39
uint8_t appPort = 2; //test pour cayenne ? avant 2;
40
41
/*!
42
  Number of trials to transmit the frame, if the LoRaMAC layer did not
43
  receive an acknowledgment. The MAC performs a datarate adaptation,
44
  according to the LoRaWAN Specification V1.0.2, chapter 18.4, according
45
  to the following table:
46
  Transmission nb | Data Rate
47
  ----------------|-----------
48
  1 (first)       | DR
49
  2               | DR
50
  3               | max(DR-1,0)
51
  4               | max(DR-1,0)
52
  5               | max(DR-2,0)
53
  6               | max(DR-2,0)
54
  7               | max(DR-3,0)
55
  8               | max(DR-3,0)
56
57
  Note, that if NbTrials is set to 1 or 2, the MAC will not decrease
58
  the datarate, in case the LoRaMAC layer did not receive an acknowledgment
59
*/
60
uint8_t confirmedNbTrials = 1;
61
/*LoraWan debug level, select in arduino IDE tools.
62
  None : print basic info.
63
  Freq : print Tx and Rx freq, DR info.
64
  Freq && DIO : print Tx and Rx freq, DR, DIO0 interrupt and DIO1 interrupt info.
65
  Freq && DIO && PW: print Tx and Rx freq, DR, DIO0 interrupt, DIO1 interrupt, MCU sleep and MCU wake info.
66
*/
67
uint8_t debugLevel = LoRaWAN_DEBUG_LEVEL;  // Modifiable dans l'IDE Arduino (Outils -> LoRaWan Debug Level)
68
69
/*LoraWan region, select in arduino IDE tools*/
70
LoRaMacRegion_t loraWanRegion = ACTIVE_REGION; // Modifiable dans l'IDE Arduino (Outils -> LoRaWan Region)
71
72
uint8_t da2 =       ;  // octet de poids fort de la température
73
uint8_t da3 =       ;  // octet de poids faible de la température
74
75
static void prepareTxFrame( uint8_t port) // trame au format LPP
76
{
77
  appDataSize = 4;
78
  appData[0] = 0x01;   //data channel  1
79
  appData[1] =       ;  // C'est un capteur de température 
80
  appData[2] = da2;
81
  appData[3] = da3;
82
}
83
84
void keyDown()
85
{
86
  delay(10);
87
  if (digitalRead(INT_PIN) == 1 && IsLoRaMacNetworkJoined)
88
  {
89
    deviceState = DEVICE_STATE_SEND;
90
  }
91
}
92
// Add your initialization code here
93
void setup() {
94
  if (mcuStarted == 0)
95
  {
96
    LoRaWAN.displayMcuInit();
97
  }
98
  Serial.begin(115200);
99
  while (!Serial);
100
  SPI.begin(SCK, MISO, MOSI, SS);
101
  Mcu.init(SS, RST_LoRa, DIO0, DIO1, license);
102
  delay(100);
103
  pinMode(INT_PIN, INPUT_PULLUP);
104
  attachInterrupt(INT_PIN, keyDown, RISING);
105
  //------ Zone 'etxy' dédiée aux variables / bibliothèques liées à la gestion de la température -------//
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
  
124
  //----------------------------- fin de la zone 'etxy' -----------------------------------------------//
125
  deviceState = DEVICE_STATE_INIT;
126
}
127
128
// The loop function is called in an endless loop
129
void loop()
130
{
131
  switch ( deviceState )  {
132
    case DEVICE_STATE_INIT:
133
      {
134
        LoRaWAN.init(loraWanClass, loraWanRegion);
135
        break;
136
      }
137
    case DEVICE_STATE_JOIN:
138
      {
139
        LoRaWAN.displayJoining();
140
        LoRaWAN.join();
141
        break;
142
      }
143
    case DEVICE_STATE_SEND:
144
      {
145
        LoRaWAN.displaySending();
146
        prepareTxFrame( appPort );
147
        LoRaWAN.send(loraWanClass);
148
        deviceState = DEVICE_STATE_CYCLE;
149
        break;
150
      }
151
    case DEVICE_STATE_CYCLE:
152
      {
153
        // Schedule next packet transmission
154
        txDutyCycleTime = appTxDutyCycle + randr( -APP_TX_DUTYCYCLE_RND, APP_TX_DUTYCYCLE_RND );
155
        LoRaWAN.cycle(txDutyCycleTime);
156
        deviceState = DEVICE_STATE_SLEEP;
157
        break;
158
      }
159
    case DEVICE_STATE_SLEEP:
160
      {
161
        LoRaWAN.displayAck();
162
        LoRaWAN.sleep(loraWanClass, debugLevel);
163
        break;
164
      }
165
    default:
166
      {
167
        deviceState = DEVICE_STATE_INIT;
168
        break;
169
      }
170
  }
171
  //------  Zone 'etxz'  code pour envoyer la température toutes les 60 secondes ------//
172
  if (millis() > nextTime) {
173
    nextTime = nextTime + (1000 * TempInterval);
174
175
176
177
178
179
180
  
181
    deviceState = DEVICE_STATE_INIT; // envoie la TxFrame
182
  }
183
  //--------------------------------fin de la zone 'etxz'  fin temp -------------------------------------------------//
184
}
185
186
//---------------------------------- zone fonctions DS18B20 ---------------------------------------------------//
187
void DS18b20_ini(const byte rom[]) {
188
  ds.reset();
189
  ds.select(rom);
190
  ds.write(0x4e);
191
  ds.write(0x60); // th
192
  ds.write(0xc0); // tl
193
  ds.write(0x7f); // mode 12 bits
194
}
195
int DS18b20_temp(const byte rom[]) {  //  version en 1/10 de degré
196
  ds.reset();
197
  ds.select(rom);
198
  ds.write(0x44);
199
  while (!ds.read_bit());    // (environ 100ms)
200
  ds.reset();
201
  ds.select(rom);
202
  ds.write(0xBE);
203
  byte oct_0 = ds.read();
204
  byte oct_1 = ds.read();
205
  ds.reset();   //pas indispensable ??
206
  int tp = (((oct_1 << 8) | oct_0) * 10);
207
  return (tp / 16);                      // retourne la température en 1/10 de degré C
208
}
209
//--------------------------------  fin zone DS18B20 -------------------------------------------------//
210

Il vous faut :

  1. Compléter le code en y recopiant le N° de licence obtenu précédemment (vers la ligne 15)

  2. 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 :

  1. Compiler et téléverser le programme

  2. 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