Seeeduino Lorawan

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

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *