vendredi 30 août 2013

Data logging avec Carriots (Arduino et shield Ethernet)

Dans ma précédente rubrique, j'avais exploré les possibilités de Carriots pour la mise au point d'une alerte: Carriots vous envoyait un email , un texto ou un tweet lorsque votre Arduino mesurait un paramètre dont la valeur indiquait une situation anormale.

Je vais maintenant utiliser Carriots pour faire du data logging:  l'Arduino, muni de son shield ethernet, va envoyer des mesures au serveur de Carriots à intervalles réguliers, de façon à ce qu'elles y soient enregistrées.  Ces données seront ensuite accessibles à partir de n'importe quel ordinateur branché à internet (à condition d'avoir les autorisations d'accès nécessaires, bien entendu).

Marche à suivre:

1)  Ouvrir un compte gratuit chez Carriots.

2)  Accéder au "control panel" de Carriots et prendre en note votre "Full Privileges APIkey" (en passant par My Settings / My Account).  Vous aurez besoin de cet identifiant dans le sketch de l'Arduino.

3)  Noter également le nom de l'appareil (device developer ID).  Vous avez droit de brancher jusqu'à 10 appareils gratuitement sur Carriots.  Si vous utilisez l'appareil qui a été créé par défaut lors de votre inscription,  cet ID sera de la forme  "defaultDevice@votre_nom_d'utilisateur".

4)  Le montage est constitué d'un Arduino muni de son shield Ethernet, auquel j'ai ajouté trois potentiomètres branchés aux entrées A0, A1 et A2, afin de simuler des capteurs analogiques.  Le shield ethernet est évidemment branché à internet, par l'entremise d'un câble ethernet.

5)  Le sketch ci-dessous envoie à Carriots trois mesures (prises par des capteurs analogiques branchés aux entrées A0, A1 et A2) toutes les 30 secondes.  Je crois qu'il sera facile de modifier ce sketch pour qu'il réponde à vos besoins spécifiques (en modifiant, par exemple, le délai entre les différentes prises de mesures).


/********************* Carriots_Data_Logger.ino ***********************
*
* Exemple de Data Logger avec carriots.com
*
* Les valeurs de trois capteurs analogiques branchés à A0, A1 et A2
* sont envoyées à carriots.com à intervalles réguliers
*
* http://electroniqueamateur.blogspot.com/2013/08/data-logging-avec-carriots-arduino-et.html
*
**********************************************************************/
#include <SPI.h>
#include <Ethernet.h>
// Votre "full device APIKey" se trouve dans le control panel de carriots.com: My Settings -> My Account
// "id_developer" de votre "device" est de la forme defaultDevice@votre_login
const String APIKEY = "Mettre ici votre Full Privileges Apikey"; // Mettre ici votre Full Privileges Apikey
const String DEVICE = "Mettre le id_developer de votre appareil"; // Mettre le "id_developer" de votre "device"
// Adresse MAC de votre Shield Ethernet. Il faut simplement éviter que deux appareils de votre réseau
// local aient la même adresse MAC (vous pouvez laisser la ligne suivante telle quelle dans la plupart
// des cas.
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server(82,223,244,60); // C'est l'adresse IP de api.carriots.com
EthernetClient client;
int capteurPin1 = A0; // premier capteur à la pin A0
int capteurPin2 = A1; // premier capteur à la pin A1
int capteurPin3 = A2; // premier capteur à la pin A2
long previousMillis = 0;
long interval = 30000; // nombre de millisecondes entre 2 prises de mesure consécutives
void setup() {
Serial.begin(9600);
Serial.println("Demarrage");
// DHCP (dynamic host configuration protocol): on cherche une adresse ip pour
// notre shield Ethernet.
if (Ethernet.begin(mac) == 0) {
Serial.println("Echec de la configuration DHCP Ethernet");
while(true); // alors pas la peine d'aller plus loin
}
Serial.println("Reussite de la configuration DHCP Ethernet");
delay(1000); // on se laisse le temps de souffler
}
void loop() {
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
sendStream(); // on envoie les données au serveur carriots
}
// Si on reçoit des données de l'internet, on les envoit au moniteur
// série (utile pour déboguer).
while (client.available()) {
char c = client.read();
Serial.print(c);
}
if (!client.connected()) {
client.stop();
}
}
// Envoi des données
void sendStream()
{
int valeur;
// on lit les valeurs des capteurs et on en fait des strings
valeur = analogRead(capteurPin1);
String txt1 = String(valeur); //String contenant la valeur du premier capteur
Serial.print("Valeur du premier capteur: " );
Serial.println(txt1); // pour débogage
valeur = analogRead(capteurPin2);
String txt2 = String(valeur); //String contenant la valeur du deuxieme capteur
Serial.print("Valeur du deuxieme capteur: " );
Serial.println(txt2); // pour débogage
valeur = analogRead(capteurPin3);
String txt3 = String(valeur); //String contenant la valeur du troisieme capteur
Serial.print("Valeur du troisieme capteur: " );
Serial.println(txt3); // pour débogage
if (client.connect(server, 80)) { // Si la connexion fonctionne
Serial.println("Connection etablie");
String json = "{\"protocol\":\"v2\",\"device\":\""+DEVICE+"\",\"at\":\"now\",\"data\":{\"valeur1\":\""+txt1+"\",\"valeur2\":\""+txt2+"\",\"valeur3\":\""+txt3+"\"}}";
// HTTP request
client.println("POST /streams HTTP/1.1");
client.println("Host: api.carriots.com");
client.println("Accept: application/json");
client.println("User-Agent: Arduino-Carriots");
client.println("Content-Type: application/json");
client.print("carriots.apikey: ");
client.println(APIKEY);
client.print("Content-Length: ");
int thisLength = json.length();
client.println(thisLength);
client.println("Connection: close");
client.println();
client.println(json);
}
else {
// la connexion n'a pas fonctionné
Serial.println("Echec de la connexion!");
}
}


Le moniteur série vous permettra de vérifier si le transfert de données s'effectue correctement (30 secondes après le démarrage du sketch, si vous n'y avez rien changé).  Vous pouvez également consulter les données envoyées en allant dans la section "Data Streams" du control panel de Carriots (il faut rafraîchir la page pour voir les données s'ajouter).


Pour afficher les données sous forme de graphique, Carriots met à notre disposition un Wizard Widget Graphs (dans la section Publish Data).  Cet outil construit pour vous un bout de script que vous pouvez ensuite coller dans une page web (j'ai utilisé le logiciel KompoZer).  Voici le résultat obtenu avec mes données:


Ça fonctionne très bien.  Par contre il serait utile de pouvoir visionner les graphique en cliquant un simple bouton directement sur le control panel de Carriots, sans qu'il nous soit nécessaire de créer une page web.

Qu'arrive-t-il si vous voulez récupérer vos données brutes afin, par exemple, de les traiter dans Excel?  Ici ça se complique un peu.  Comme je l'ai déjà mentionné, vous pouvez toujours aller les lire dans la section "Data Streams" du control panel de Carriots, mais ce n'est pas très pratique (surtout si vous avez une grande quantité de données à traiter).

Une autre option consiste à utiliser la commande "LIST" de l'API de Carriots.  Pour ce faire, je suis allé sur la page "hurl.it" et j'y ai entré les informations suivantes:


J'ai obtenu en retour la totalité de mes données enregistrée sous la forme suivante:

    {
      "_id": "5218a0467c5d75dd148b5478",
      "_t": "str",
      "at": 1377345608,
      "device": "DataLogger@xyz",
      "protocol": "v2",
      "data": {
        "valeur2": "271",
        "valeur3": "1023",
        "valeur1": "0"
      },
      "id_developer": "blablabla",
      "created_at": 1377345607,
      "owner": "xyz"
    },

À première vue, ça ne semble pas trop compliqué de faire un script en Python qui extraira les données pertinentes, mais ce serait quand même pratique d'avoir un bouton dans le control panel qui nous permettrait d'extraire les données rapidement sous la forme d'un fichier Excel.

Même difficulté pour effacer nos données:  on peut les effacer une par une avec hurl.it. mais je n'ai pas trouvé de bouton dans le control panel de Carriots qui nous permettrait d'effacer facilement des données indésirables ou de tout effacer pour repartir à zéro.  Ce serait bien utile!

Addendum:

Les gens de chez Carriots m'informent qu'un outil permettant d'exporter les données vers Excel sera bientôt disponible. :-)

Yves Pelletier (Twitter: @ElectroAmateur)

Aucun commentaire:

Enregistrer un commentaire