JSON et Arduino

Lorsqu'on conçoit un projet Arduino sans modules externes, le format des données peut ne pas avoir son importance puisque l'Arduino va agir en fonction de ses entrées ou de ses sorties. Toutefois lorsqu'il doit communiquer avec un ordinateur par exemple, il est important que les données soient structurées. Nous allons voir ensemble comment formatter ces données.

Introduction

Les données peuvent être structurées sous différents formats. XML et JSON sont les plus répandus. Ayant toujours travaillé avec le format JSON, j'ai choisi de l'utiliser pour illustrer ce tutoriel.

JSON (pour JavaScript Object Notation) est un format popularisé par le développement d'AJAX. Face à ses concurrents, il possède plusieurs avantages :

Matériel

Code

Pour illustrer ce tutoriel, nous allons considérer un système avec 2 capteurs DHT. Le code suivant va envoyer, en communication série, ces données structurées en JSON.

                    #include <JsonGenerator.h>
                    #include <DHT.h>

                    using namespace ArduinoJson::Generator;

                    DHT nCapteur1(2, DHT11);
                    DHT nCapteur2(4, DHT11);

                    void setup(){
                        nCapteur1.begin();
                        nCapteur2.begin();
                        Serial.begin(9600);
                    }

                    void loop(){
                        float nTemp1 = nCapteur1.readTemperature();
                        float nTemp2 = nCapteur2.readTemperature();
                        float nHum1 = nCapteur1.readHumidity();
                        float nHum2 = nCapteur2.readHumidity();

                        JsonObject<3> nPiece1, nPiece2;
                        nPiece1["nom"] = "salon";
                        nPiece1["t"] = nTemp1;
                        nPiece1["h"] = nHum1;
                        nPiece2["nom"] = "cuisine";
                        nPiece2["t"] = nTemp2;
                        nPiece2["h"] = nHum2;
                        
                        JsonArray<2> nArray;
                        nArray.add(nPiece1);
                        nArray.add(nPiece2);
                        Serial.print(nArray);
                    }

En sortie nous obtenons le résultat suivant :

                    [
                        {
                            "nom":"salon",
                            "t":22,
                            "h":69
                        },
                        {
                            "nom":"cuisine",
                            "t":26,
                            "h":65
                        }
                    ]

Lire la sortie

Nous allons maintenant lire les données en 3 langages de programmation.

JavaScript (jQuery)

                    $.getJSON("url_arduino", function(resultat){
                        $.each(resultat, function(index, piece){
                            piece.nom + " : " + piece.t + " - " + piece.h;
                        });
                    });

Java

                    try{
                        JSONArray nArr = new JSONArray(resultat);
                        for(int i = 0; i < nArr.length(); i++){
                            JSONObject nPiece = nArr.getJSONObject(i);
                            String nName = nPiece.getString("nom");
                            int nTemp = nPiece.getInt("t");
                            int nHum = nPiece.getInt("h");
                        }
                    }catch(Exception e){
                        //Gérer les erreurs
                    }

PHP

                    <?php

                    $arr = json_decode(resultat);
                    for($i = 0; $i < count($arr); $i++){
                        $nom = $arr[$i]->{'nom'};
                        $temp = $arr[$i]->{'t'};
                        $hum = $arr[$i]->{'h'};
                    }
                

A bientôt :)