Capteur humidité et température, transmission LoRaWAN vers TTN
Matériel :
1) Carte de prototypage Seeeduino LoRaWAN/GPS acquise chez mouser.fr. Le Wiki de cette carte est ici.
Pour installer la carte sur l’IDE arduino, suivre ce tuto

2) Capteur température humidité Groove HDC1000. Il s’agit d’un capteur I2C qui se connecte sur n’importe quel port I2C de la carte.

Librairies arduino :
- wire.h (natif)
- Adafruit_HDC1000.h (ici)
- LoRaWan.h (natif)
Prérequis :
Avoir créé un compte sur thethingsnetwork, créé une application et un device en mode activation ABP (jusqu’ici mes essais de connexion OTAA n’ont pas fonctionné)
Le code :
Téléverser sur arduino :
#include <Wire.h>
#include <Adafruit_HDC1000.h>
#include <LoRaWan.h>
Adafruit_HDC1000 hdc = Adafruit_HDC1000();
char buffer[256];
void setup(void)
{
SerialUSB.begin(115200);
while(!SerialUSB);
SerialUSB.print("Lets Go !");
lora.init();
hdc.begin();
memset(buffer, 0, 256);
lora.getVersion(buffer, 256, 1);
SerialUSB.print(buffer);
memset(buffer, 0, 256);
lora.getId(buffer, 256, 1);
SerialUSB.print(buffer);
//remplacer par les valeurs issues de TTN
lora.setId("Device Address", "Device EUI", "Application EUI");
//remplacer par les valeurs issues de TTN
lora.setKey("Network Session Key", "App Session Key", NULL);
lora.setDeciveMode(LWABP);
lora.setDataRate(DR0, EU868);
lora.setAdaptiveDataRate(1);
lora.setChannel(0, 868.1);
lora.setChannel(1, 868.3);
lora.setChannel(2, 868.5);
lora.setReceiceWindowFirst(0, 868.3);
lora.setReceiceWindowSecond(869.5, DR3);
lora.setDutyCycle(false);
lora.setJoinDutyCycle(false);
lora.setPower(20);
lora.setPort(1);
}
void loop(void)
{
bool result = false;
//On lit les valeurs et on les multiplient par 100 pour ne pas gérer les décimales
int temperature = hdc.readTemperature()*100;
int hymidity = hdc.readHumidity()*100;
SerialUSB.println(temperature);
//Encodage de chaque entier sur deux bits
byte data[4];
data[0] = temperature >> 8;
data[1] = temperature & 0xFF;
data[2] = hymidity >> 8;
data[3] = hymidity & 0xFF;
//result = lora.transferPacket("Hello Worl", 10);
result = lora.transferPacket(data, 4);
//Lecture de la réponse si un paquet est envoyé via TTN en DOWNLINK
if(result)
{
short length;
short rssi;
memset(buffer, 0, 256);
length = lora.receivePacket(buffer, 256, &rssi);
if(length)
{
SerialUSB.print("Length is: ");
SerialUSB.println(length);
SerialUSB.print("RSSI is: ");
SerialUSB.println(rssi);
SerialUSB.print("Data is: ");
for(unsigned char i = 0; i < length; i ++)
{
SerialUSB.print("0x");
SerialUSB.print(buffer[i], HEX);
SerialUSB.print(" ");
}
SerialUSB.println();
}
}
delay(10000);
}
Sur TTN, il faut ensuite décoder le payload encodé sur 4 bits. Dans application/payload formats, renseigner ce décodeur :
function Decoder(bytes, port) {
var temperature = (bytes[0] << 8) | bytes[1];
var humidity = (bytes[2] << 8) | bytes[3];
return {
Temp : temperature/100,
HR : humidity/100
}
}
Résultat :
Si la magie opère, vous devriez voir ceci sur TTN dans application/device/data
