Hé! Vous semblez être en United States, souhaitez-vous utiliser notre site English ?
Switch to English site
Skip to main content

Réaliser un détecteur d'eau LoRaWAN à l'aide d'un Arduino MKR WAN 1300 et d'un capteur d'humidité Grove

top2_e7b188f06c2bb32030c3af21b228acfc06b9d10b.jpg

Utilisation d'un capteur d'humidité connecté à une carte Arduino MKR WAN 1300 pour mesurer les niveaux d'humidité et envoyer les données au réseau The Things Network.

Après avoir utilisé le kit de démarrage Grove pour Arduino et le module de reconnaissance vocale Grove, j'ai désormais à ma disposition un éventail de modules Grove. Aussi, après avoir récemment examiné le Arduino MKR WAN 1300 j'ai hâte d'explorer ses possibilités de manière plus approfondie. J'ai donc été heureux de découvrir qu'un support de connecteur MKR (176-3646) me permettrait d'utiliser plus facilement les capteurs Grove avec le MKR Wan 1300.

Connexion des capteurs Grove les capteurs au MKR WAN 133

connector_carrier1_c628aa540917d03deb97ba2d2acdb6cb7c94424c.jpg

J'ai commencé par brancher MKR Arduino MKR WAN 1300 au support de connecteur et j'ai ensuite connecté un capteur de proximité Grove. J'ai transféré l'exemple de code sur l'Arduino, j'ai agité la main au-dessus du capteur et j'ai pu voir le résultat dans le Serial Monitor de l'IDE Arduino.J'ai ensuite essayé toute une variété d'autres capteurs et j'ai décidé de m'intéresser aux utilisations possibles du capteur d'humidité (174-3236) . Cela semble approprié car l'humidité est très élevée ici dans le Yorkshire, et j'ai pensé qu'il pourrait être utilisé pour détecter l'eau qui se trouve dans des endroits où elle ne le devrait pas.

Connexion au réseau The Things Network

Water_detector_-_screen_shot-1_2d5798165b05fcd08249968f4549ef73a543fb41.jpg

J'avais déjà connecté mon MKR WAN 1300 à The Things Network (TTN) et je l'avais présenté dans un article de blog précédent. Faire en sorte que le capteur envoie des données au TTN était assez simple - mais qu'il les envoie dans un format utile était une question plus complexe. J'ai créé un code initial sur la base du code "hello world" basique du MKR WAN 1300 de Gonzalo Casas GitHub et de l'exemple du capteur d'humidité Grove qui envoie des valeurs au Serial Monitor.

water_detector_hex1_dd5a302a417a8c75a0ef444697434a54c7e2e7c2.jpg

Je pouvais voir les données envoyées jusqu'au TTN mais elles n'avaient pas beaucoup de sens, donc je me suis efforcé de résoudre ce problème.

Envoi de données en octets

The Things Network utilise le LoRaWAN, une norme de communication sans fil comme le WiFi ou Bluetooth, qui est un type de Liaison sans fil à faible consommation énergétique (LPWAN). Il de l'envoi et de la réception aussi efficaces que possible des données afin de préserver la largeur de bande et le temps d'utilisation. Cela a également l'avantage d'économiser de l'énergie, ce qui est particulièrement utile dans le cas de dispositifs à piles. Cela signifie que les données doivent être codées pour utiliser le moins de temps de transmission que possible. Les données doivent donc être converties en octets plutôt qu'en caractères ASCII, avant d'être transmises - et il faut utiliser le moins d'octets possible. J'avais donc besoin de convertir les données que mon capteur générait en octets avant de les transmettre.

À cette fin, la première chose que j'avais à faire était de remplacer la ligne modem.print de mon code par modem.write. À la lecture de la documentation de référence MKR Wan, il est devenu clair que modem.write envoie des données sous forme d'un octet ou d'une série d'octets, alors que la fonction d'impression que j'avais utilisée à tort envoie les caractères représentant les chiffres d'un nombre.

Une fois que modem.print a été remplacée par modem.write, j'ai vu qu'elle envoyait bien des octets, mais que je pouvais améliorer les choses en compressant les données en un seul octet. La valeur maximale d'un octet est 255, mais selon sa fiche technique, le capteur Grove génère des valeurs de sortie comme suit :

 

Min

Max

Valeur de sortie

 

 

Capteur dans un sol sec

0

300

Capteur dans un sol humide

300

700

Capteur dans l'eau

700

950

 

water_test_d2e6931b22d47519709e114a7118ee1924763884.jpg

I tested how this looked in real life by dipping the sensor into a glass of water. The reading I got was just over 600. Shorting the contacts out with a key or screwdriver generated a value of around 800. This means if I divided the value by 3 it would give a value less than 255 in the wettest circumstances. In this instance, I did not need precision – i.e. 950 degrees of wetness, since 300 is fine for what I wanted. It could easily be edited in the future to divide by 3.5 or 4 just to be absolutely sure we stay within the maximum value of 255 limit for a single byte.

Code final

Mon code ressemble maintenant à ceci :

:

#include <MKRWAN.h>

LoRaModem modem;

#include "arduino_secrets.h"

// Please enter your sensitive data in the arduino_secrets.h tab

String appEui = SECRET_APP_EUI;
String appKey = SECRET_APP_KEY;
int sensorPin = A0;
int sensorValue = 0;
void setup() {

// put your setup code here, to run once:

Serial.begin(115200);
while (!Serial);

// change this to your regional band (eg. US915, AS923, ...)

if (!modem.begin(EU868)) {
Serial.println("Failed to start module");
while (1) {}

};

Serial.print("Your module version is: ");
Serial.println(modem.version());
Serial.print("Your device EUI is: ");
Serial.println(modem.deviceEUI());
int connected = modem.joinOTAA(appEui, appKey);

if (!connected) {

Serial.println("Something went wrong; are you indoors? Move near a window and retry");

while (1) {}

}

// Set poll interval to 60 secs.

modem.minPollInterval(60);

// NOTE: independently of this setting the modem will
// not send more than one message every 2 minutes,
// this is enforced by firmware and can not be changed.

}

void loop() {

// read the value from the sensor:

sensorValue = analogRead(sensorPin);

// scale the reading and fit into 1 byte

int scaledValue = sensorValue / 3;
byte payload = scaledValue;
Serial.print("Sensor reading = " );
Serial.println(sensorValue);
Serial.print("Scaled value = " );
Serial.println(scaledValue);

delay(1000);

modem.beginPacket();
modem.write(payload);
int err = modem.endPacket(false);
if (err > 0) {
Serial.println("Data Sent");
} else {
Serial.println("Error");
}
delay(100000 * 60);
}

Il vous faudra installer la bibliothèque MKR WAN pour faire fonctionner le code WAN ; j'ai déjà indiqué comment le faire dans mon blog sur le MKR WAN 1300.Le détecteur d'humidité Grove est un capteur analogique et n'a donc pas besoin d'une bibliothèque pour fonctionner.Il vous faudra également créer un fichier appelé arduino_secrets.h dans le même dossier que le code ci-dessus qui contient ce qui suit :

// Replace with keys obtained from TheThingsNetwork console

#define SECRET_APP_EUI "xxxxxxxxxxxxxxxx"

#define SECRET_APP_KEY "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Vous pouvez ensuite le modifier pour remplacer les x par l'App EUI et l'App Key que vous pouvez trouver sur la page Appareil de la console TTN.

Adding a Decoder in The Things Network Console

TTN_Payload_c26f979d95731731f9e95be223dc6e1bd9659930.png

Une fois que les données arrivent dans The Things Network, la valeur d'octet doit être convertie en un nombre compréhensible. On y parvient en utilisant le décodeur du côté TTN, qui se trouve à la page "Formats de charge utile" de la section Application de la console TTN. Il utilise Javascript et le décodeur suivant lit l'octet envoyé par le capteur et le transforme en un entier :

function Decoder(bytes, port) {
var decoded = {};
decoded.moisture = bytes[0];
return decoded;
}

Débogage

Selection_013_863b24ec46f4e4c93781f9ec74e8fce35c1d3486.png

Le code comprend les lignes qui écrivent au Serial Monitor afin de faciliter le débogage. Ceci permet de montrer l'entier envoyé mis par le capteur, ensuite, cette valeur est divisée par 3 pour faciliter la comparaison avec ce que nous voyons dans la fenêtre de données TTN. Il est ainsi facile de surveiller les valeurs inhabituelles générées si elles dépassent 255, par exemple.

Conclusion

Si j'avais simplement voulu un détecteur d'inondation, j'aurais pu utiliser le capteur d'eau Grove (174-3242) pour ce projet, mais le détecteur d'humidité offre plus de flexibilité. À part pour une inondation réelle, je pourrais l'utiliser pour voir à quel point le terrain derrière la maison est humide avant de sortir le chien pour une promenade, ou je pourrais l'utiliser en été pour voir quand les plantes ont besoin d'arrosage.

Je vais également étudier les moyens de le configurer pour envoyer un SMS ou une alerte tweet en cas d'excès (ou de manque) d'humidité.

I have a background in the arts, environmental conservation and IT support. In my spare time I do a bit of DJing and I like making things.