Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
tutos:mqtt [2018/11/02 12:37] – ygangat | tutos:mqtt [2020/11/02 11:45] (Version actuelle) – [Raspberry Pi : Installation du broker] mdelsaut | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== MQTT (mosquitto) ====== | ====== MQTT (mosquitto) ====== | ||
- | A faire | + | Fait : |
- [x] Comparatif | - [x] Comparatif | ||
- [x] MQTT sur Raspberry Pi | - [x] MQTT sur Raspberry Pi | ||
Ligne 7: | Ligne 7: | ||
- [x] Relay + Capteur courant | - [x] Relay + Capteur courant | ||
- [x] MQTT et Node-Red | - [x] MQTT et Node-Red | ||
- | - [ ] MQTT & InfluxDB | + | - [X] MQTT & InfluxDB |
+ | - [X] MQTT & Java | ||
+ | <WRAP center round important 60%> | ||
+ | L' | ||
+ | </ | ||
+ | //(Note : ces informations ont été compilées à partir de différentes sources anglaises/ | ||
===== Les technologies ===== | ===== Les technologies ===== | ||
Ligne 178: | Ligne 183: | ||
} | } | ||
</ | </ | ||
+ | Remarque : | ||
+ | - // | ||
+ | - Faire '' | ||
- | < | ||
- | < | ||
- | < | ||
< | < | ||
interface wlan0 | interface wlan0 | ||
Ligne 187: | Ligne 192: | ||
static routers=192.168.1.1 | static routers=192.168.1.1 | ||
static domain_name_servers=192.168.1.1 | static domain_name_servers=192.168.1.1 | ||
- | </code>< | + | </ |
- | + | | |
- | < | + | |
- | < | + | |
- | < | + | |
- | < | + | |
- | < | + | |
- | < | + | |
- | < | + | |
- | < | + | |
- | < | + | |
- | < | + | |
- | < | + | |
- | < | + | |
- | < | + | |
- | < | + | |
- | < | + | |
-remove-home pi%%'' | -remove-home pi%%'' | ||
- | --lock pi%%'' | + | --lock pi%%'' |
- | < | + | |
- | < | + | |
- | < | + | |
- | < | + | |
- | < | + | |
- | < | + | |
==== Raspberry Pi : Installation du broker ==== | ==== Raspberry Pi : Installation du broker ==== | ||
+ | |||
+ | L' | ||
< | < | ||
Ligne 226: | Ligne 232: | ||
allow_anonymous false | allow_anonymous false | ||
password_file / | password_file / | ||
- | </ | + | </ |
- | < | + | Ensuite il faut faire : < |
- | < | + | < |
+ | Faire '' | ||
< | < | ||
Nous interdisons l’accès en anonyme et nous allons autoriser les connexions uniquement avec un identifiant mot de passe (dont la liste se trouve le fichier '' | Nous interdisons l’accès en anonyme et nous allons autoriser les connexions uniquement avec un identifiant mot de passe (dont la liste se trouve le fichier '' | ||
- | Remarque : la commande '' | + | //**Remarque : **// la commande '' |
+ | -b passwordfile user password%%'' | ||
* Pour tester la connexion depuis un autre appareil, il est possible d' | * Pour tester la connexion depuis un autre appareil, il est possible d' | ||
Ligne 290: | Ligne 297: | ||
Le déroulement du programme est le suivant : | Le déroulement du programme est le suivant : | ||
- Imports & Initialisations | - Imports & Initialisations | ||
- | - Connexion au WiFi | + | - Connexion au Wifi |
- Inscription au flux '' | - Inscription au flux '' | ||
- Boucle : | - Boucle : | ||
- | - Connection | + | - Connexion |
- Ecoute au flux '' | - Ecoute au flux '' | ||
- Publication d'un entier (croissant au fur et à mesure) sur le flux '' | - Publication d'un entier (croissant au fur et à mesure) sur le flux '' | ||
Ligne 504: | Ligne 511: | ||
</ | </ | ||
Remarques sur ce code : | Remarques sur ce code : | ||
- | - Le '' | + | - Le '' |
- Le mot de passe du wifi est stocké dans '' | - Le mot de passe du wifi est stocké dans '' | ||
- | - Dès que la mémoire dynamique (vive) est utilisé | + | - Dès que la mémoire dynamique (vive) est utilisée |
- La solution la plus rapide pour diminuer ce nombre a été de remplacer '' | - La solution la plus rapide pour diminuer ce nombre a été de remplacer '' | ||
- | - Une autre solution est de mettre '' | + | - Une autre solution est de mettre '' |
- | - Une solution plus complexe mais envisageable à la fin est d' | + | - Une solution plus complexe, mais envisageable à la fin est d' |
- | - Sachant que les '' | + | - Sachant que les '' |
- de le supprimer lorsque tout fonctionne | - de le supprimer lorsque tout fonctionne | ||
- d' | - d' | ||
Ligne 524: | Ligne 531: | ||
#endif | #endif | ||
</ | </ | ||
- | Plus d' | + | Plus d' |
- | - en français sur [[https:// | + | - En français sur [[https:// |
- | - en anglais sur [[https:// | + | - En anglais sur [[https:// |
Le fichier '' | Le fichier '' | ||
Ligne 539: | Ligne 546: | ||
Pour la suite du test, nous avons fait le montage suivant sur le Arduino : | Pour la suite du test, nous avons fait le montage suivant sur le Arduino : | ||
- | - Nous avons branché un [[https:// | + | - Nous avons branché un [[https:// |
- | {{http:// | + | {{http:// |
- | * Nous avons utilisé un [[http:// | + | * Nous avons utilisé un [[http:// |
- | {{https:// | + | {{https:// |
<code c> | <code c> | ||
Ligne 598: | Ligne 605: | ||
Ensuite nous avons modifié le code original de notre Arduino (voir [[# | Ensuite nous avons modifié le code original de notre Arduino (voir [[# | ||
- | - Le relay s' | + | - Le relai s' |
- Le capteur permet de mesurer le courant que nous ferons varier avec un potentiomètre. L' | - Le capteur permet de mesurer le courant que nous ferons varier avec un potentiomètre. L' | ||
Ligne 839: | Ligne 846: | ||
</ | </ | ||
Remarque : | Remarque : | ||
- | - on est toujours confronté au problème de mémoire dynamique. Dans les logs de téléversement de Arduino, si dans la phrase '' | + | - on est toujours confronté au problème de mémoire dynamique. Dans les logs de téléversement de Arduino, si dans la phrase '' |
====== Bonus(es) ====== | ====== Bonus(es) ====== | ||
Ligne 847: | Ligne 854: | ||
Il est possible d' | Il est possible d' | ||
- | ===== Mosquitto | + | ===== MQTT et Node-RED ===== |
- | Node-RED est un outil puissant pour construire des applications de l' | + | Node-RED est un outil puissant pour construire des applications de l' |
La vocation de cette solution est de permettre de lier aisément des sources de données à des composants de traitement, locaux ou distants, et de créer des chaines de valeurs en quelques clics. | La vocation de cette solution est de permettre de lier aisément des sources de données à des composants de traitement, locaux ou distants, et de créer des chaines de valeurs en quelques clics. | ||
- | Node-RED est compatible avec MQTT : [[https:// | + | Node-RED est compatible avec MQTT : [[https:// |
- | ===== Installation Node-RED | + | ==== Installation Node-RED ==== |
Sur le raspberry-pi, | Sur le raspberry-pi, | ||
Ligne 863: | Ligne 870: | ||
Si déjà installé, il est possible (voire préférable) de faire un '' | Si déjà installé, il est possible (voire préférable) de faire un '' | ||
- | Node-red peut fonctionner tel quel, cependant, pour pouvoir rajouter des modules, il faut avoir '' | + | Node-RED peut fonctionner tel quel, cependant, pour pouvoir rajouter des modules, il faut avoir '' |
- | -g%%'' | + | -g%%'' |
Une autre possibilité est de lancer la commande suivante, qui permet de faire tout ce qu'il y a à faire : '' | Une autre possibilité est de lancer la commande suivante, qui permet de faire tout ce qu'il y a à faire : '' | ||
-sL https:// | -sL https:// | ||
- | {{https:// | + | {{https:// |
- | ===== Démarrage | + | ==== Démarrage ==== |
- | Pour démarrer Node-Red dans **" | + | Pour démarrer Node-RED dans **" |
-> Programmation | -> Programmation | ||
- | -> Node-Red"**. On peut également démarrer depuis le Terminal avec la commande '' | + | -> Node-RED"**. On peut également démarrer depuis le Terminal avec la commande '' |
Remarque : | Remarque : | ||
- Pour permettre d' | - Pour permettre d' | ||
- | - On accéde à Node-Red avec http: | + | - On accéde à Node-RED avec http: |
{{https:// | {{https:// | ||
- | ===== Module Dashboard | + | ==== Module Dashboard ==== |
- | ==== Installation du module | + | === Installation du module === |
- | Pour contrôler nos objets MQTT nous allons utiliser le module Dashboard. Pour cela: | + | Pour contrôler nos objets MQTT, nous allons utiliser le module Dashboard. Pour cela: |
- | - Allez dans le menu de Node-Red en haut à droite | + | - Aller dans le menu de Node-RED en haut à droite |
- | - Cliquez | + | - Cliquer |
- | - Dans l' | + | - Dans l' |
- | ==== Configuration du module | + | === Configuration du module === |
- | * Allez dans le menu de Node-Red en haut à droite | + | * Aller dans le menu de Node-RED en haut à droite |
- | * Cliquez | + | * Cliquer |
-> Dashboard"// | -> Dashboard"// | ||
- | * Cliquez | + | * Cliquer |
- | ==== Création de Nodes ==== | + | === Création de Nodes === |
- | Une fois les nodes créés et lié, en cliquant sur **" | + | Une fois les nodes créés et liés, en cliquant sur **" |
- | === Nodes MQTT === | + | == Nodes MQTT == |
* Faire un drag & drop d'un node MQTT **A** en input | * Faire un drag & drop d'un node MQTT **A** en input | ||
Ligne 914: | Ligne 921: | ||
* Configurer le topic %%// | * Configurer le topic %%// | ||
- | === Nodes Dashboard | + | == Nodes Dashboard == |
* Faire un drag & drop d'un node switch (input du dashboard) | * Faire un drag & drop d'un node switch (input du dashboard) | ||
Ligne 928: | Ligne 935: | ||
* Le configurer (on peut laisser ce qu'il y a par défaut) | * Le configurer (on peut laisser ce qu'il y a par défaut) | ||
- | === Pour test: === | + | == Pour test: == |
Pour aller plus rapidement, il est possible de faire directement un import du code json du flow au lieu de créer les nodes précédents : | Pour aller plus rapidement, il est possible de faire directement un import du code json du flow au lieu de créer les nodes précédents : | ||
Ligne 1204: | Ligne 1211: | ||
] | ] | ||
</ | </ | ||
+ | ===== MQTT et InfluxDB ===== | ||
+ | |||
+ | En partant du principe que InfluxDB a été installé (voir [[https:// | ||
+ | |||
+ | <code bash> | ||
+ | [[inputs.mqtt_consumer]] | ||
+ | ## MQTT broker URLs to be used. The format should be scheme:// | ||
+ | ## schema can be tcp, ssl, or ws. | ||
+ | | ||
+ | |||
+ | ## MQTT QoS, must be 0, 1, or 2 | ||
+ | qos = 0 | ||
+ | ## Connection timeout for initial connection in seconds | ||
+ | | ||
+ | |||
+ | ## Topics to subscribe to | ||
+ | | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ] | ||
+ | |||
+ | # if true, messages that can't be delivered while the subscriber is offline | ||
+ | # will be delivered when it comes back (such as on service restart). | ||
+ | # NOTE: if true, client_id MUST be set | ||
+ | | ||
+ | # If empty, a random client ID will be generated. | ||
+ | | ||
+ | |||
+ | ## username and password to connect MQTT server. | ||
+ | | ||
+ | | ||
+ | |||
+ | ## Optional SSL Config | ||
+ | # ssl_ca = "/ | ||
+ | # ssl_cert = "/ | ||
+ | # ssl_key = "/ | ||
+ | ## Use SSL but skip chain & host verification | ||
+ | # insecure_skip_verify = false | ||
+ | |||
+ | ## Data format to consume. | ||
+ | ## Each data format has its own unique set of configuration options, read | ||
+ | ## more about them here: | ||
+ | ## https:// | ||
+ | | ||
+ | | ||
+ | |||
+ | </ | ||
+ | Les valeurs sont ensuite stocké avec les tag appropriés (par exemple '' | ||
+ | |||
+ | //Exemple local de dashboard : http: | ||
+ | |||
+ | ===== MQTT et Java ===== | ||
+ | |||
+ | L' | ||
+ | |||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | On utilisera les variables suivantes : | ||
+ | |||
+ | <code java> | ||
+ | | ||
+ | | ||
+ | int qos = 2; | ||
+ | | ||
+ | </ | ||
+ | La création de la connexion au broker se fait comme suit : | ||
+ | |||
+ | <code java> | ||
+ | | ||
+ | </ | ||
+ | On peut rajouter des options de connexions comme suit : | ||
+ | |||
+ | <code java> | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | puis on se connecte avec : | ||
+ | |||
+ | <code java> | ||
+ | | ||
+ | </ | ||
+ | Pour publier un message, il suffit de faire : | ||
+ | |||
+ | <code java> | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | Pour souscrire à un topic, il faut créer une classe qui reçoit et traite les messages : | ||
+ | |||
+ | <code java> | ||
+ | // Latch used for synchronizing b/w threads | ||
+ | final CountDownLatch latch = new CountDownLatch(1); | ||
+ | |||
+ | // Topic filter the client will subscribe to | ||
+ | final String subTopic = " | ||
+ | |||
+ | // Callback | ||
+ | - Anonymous inner-class for receiving messages | ||
+ | | ||
+ | |||
+ | | ||
+ | // Called when a message arrives from the server that | ||
+ | // matches any subscription made by the client | ||
+ | | ||
+ | | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | | ||
+ | } | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | | ||
+ | } | ||
+ | |||
+ | }); | ||
+ | |||
+ | // Subscribe client to the topic filter and a QoS level of 0 | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | // Wait for the message to be received | ||
+ | try { | ||
+ | | ||
+ | } catch (InterruptedException e) { | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | Un [[https:// | ||
+ | |||
+ | //Source : https: | ||
+ | |||
====== Code final ====== | ====== Code final ====== | ||
- | (à modifier et mettre plus tard) | + | ===== Arduino ===== |
+ | |||
+ | <code c> | ||
+ | / | ||
+ | Adafruit MQTT Library WINC1500 Modified by Yassine | ||
+ | |||
+ | Demo written by Limor Fried/ | ||
+ | Modified by Yassine Gangat for LE²P. | ||
+ | |||
+ | MIT license, all text above must be included in any redistribution | ||
+ | | ||
+ | #include < | ||
+ | #include " | ||
+ | #include " | ||
+ | #include < | ||
+ | |||
+ | // | ||
+ | ---------------------------- GROVE LCD Lib | ||
+ | ------------------------- | ||
+ | //#include < | ||
+ | #include " | ||
+ | |||
+ | #include " | ||
+ | /////// | ||
+ | const char ssid[] = SECRET_SSID; | ||
+ | const char pass[] = SECRET_PASS; | ||
+ | int status = WL_IDLE_STATUS; | ||
+ | // int keyIndex = 0; // your network key Index number (needed only for WEP) | ||
+ | |||
+ | // Initialise the Arduino data pins for INPUT/ | ||
+ | const int analogInPin = A0; | ||
+ | const int RELAY2 = 8; | ||
+ | const int mVperAmp = 185; // use 100 for 20A Module and 66 for 30A Module | ||
+ | |||
+ | |||
+ | / | ||
+ | |||
+ | #define SERVER | ||
+ | #define SERVERPORT | ||
+ | #define USERNAME | ||
+ | - CtrlLoad | ||
+ | - SolarPan | ||
+ | #define PWD " | ||
+ | |||
+ | / | ||
+ | |||
+ | //Set up the wifi client & Adafruit MQTT Client | ||
+ | WiFiClient client; | ||
+ | Adafruit_MQTT_Client mqtt(& | ||
+ | |||
+ | #define halt(s) { Serial.println(F( s )); while(1); | ||
+ | |||
+ | / | ||
+ | |||
+ | // Setup a feed called ' | ||
+ | // Notice MQTT paths for AIO follow the form: < | ||
+ | Adafruit_MQTT_Publish numbers = Adafruit_MQTT_Publish(& | ||
+ | |||
+ | // Setup a feed called ' | ||
+ | Adafruit_MQTT_Subscribe onoffmsg = Adafruit_MQTT_Subscribe(& | ||
+ | |||
+ | |||
+ | |||
+ | / | ||
+ | |||
+ | // | ||
+ | --------------------------- Variables & others | ||
+ | -------------------------------- | ||
+ | rgb_lcd lcd; | ||
+ | byte heart[8] = { | ||
+ | 0b00000, | ||
+ | 0b01010, | ||
+ | 0b11111, | ||
+ | 0b11111, | ||
+ | 0b11111, | ||
+ | 0b01110, | ||
+ | 0b00100, | ||
+ | 0b00000 | ||
+ | }; | ||
+ | |||
+ | void setup() { | ||
+ | // | ||
+ | ------------------------- Initialization Serial | ||
+ | ------------------------------ | ||
+ | while (!Serial); | ||
+ | Serial.begin(9600); | ||
+ | |||
+ | // Serial.println(F(" | ||
+ | |||
+ | // | ||
+ | ---------------------- Initialization Wifi WINC1500 | ||
+ | -------------------------- | ||
+ | // Initialise the Client | ||
+ | // Serial.print(F(" | ||
+ | // check for the presence of the breakout | ||
+ | if (WiFi.status() == WL_NO_SHIELD) { | ||
+ | Serial.println(F(" | ||
+ | // don't continue: | ||
+ | while (true); | ||
+ | } | ||
+ | // Serial.println(F(" | ||
+ | |||
+ | // | ||
+ | ------------------------------ Physical part | ||
+ | ---------------------------------- | ||
+ | |||
+ | // Serial.println(F(" | ||
+ | // set up the LCD's number of columns and rows: | ||
+ | lcd.begin(16, | ||
+ | |||
+ | // Print a message to the LCD. | ||
+ | #if 1 | ||
+ | lcd.createChar(0, | ||
+ | #endif | ||
+ | lcd.setCursor(0, | ||
+ | lcd.print(F(" | ||
+ | lcd.write((unsigned char)0); | ||
+ | lcd.setCursor(0, | ||
+ | lcd.print(F(" | ||
+ | |||
+ | pinMode(RELAY2, | ||
+ | |||
+ | // | ||
+ | --------------------------- Variables & others | ||
+ | -------------------------------- | ||
+ | mqtt.subscribe(& | ||
+ | } | ||
+ | |||
+ | // uint32_t x = 0; | ||
+ | |||
+ | void loop() { | ||
+ | // | ||
+ | ------------------------------ MQTT Connection | ||
+ | -------------------------------- | ||
+ | // Ensure the connection to the MQTT server is alive (this will make the first | ||
+ | // connection and automatically reconnect when disconnected). | ||
+ | MQTT_connect(); | ||
+ | // lcd.setRGB(255, | ||
+ | // | ||
+ | ------------------------------ Subscription | ||
+ | ----------------------------------- | ||
+ | Adafruit_MQTT_Subscribe *subscription; | ||
+ | while ((subscription = mqtt.readSubscription(5000))) { | ||
+ | if (subscription == & | ||
+ | Serial.print(F(" | ||
+ | Serial.println((char *)onoffmsg.lastread); | ||
+ | |||
+ | if (0 == strcmp((char *)onoffmsg.lastread, | ||
+ | lcd.setRGB(255, | ||
+ | lcd.setCursor(0, | ||
+ | lcd.print(F(" | ||
+ | lcd.print(F(USERNAME)); | ||
+ | digitalWrite(RELAY2, | ||
+ | } | ||
+ | if (0 == strcmp((char *)onoffmsg.lastread, | ||
+ | lcd.setRGB(0, | ||
+ | lcd.setCursor(0, | ||
+ | lcd.print(F(" | ||
+ | lcd.print(F(USERNAME)); | ||
+ | digitalWrite(RELAY2, | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // | ||
+ | ------------------------------ Publication | ||
+ | ---------------------------------- | ||
+ | int32_t val = mesureSimple(analogInPin); | ||
+ | if (val < 0) { | ||
+ | lcd.setRGB(245, | ||
+ | } else { | ||
+ | lcd.setRGB(0, | ||
+ | } | ||
+ | |||
+ | |||
+ | // int32_t val = mesure(analogInPin) * 100; | ||
+ | |||
+ | Serial.print(F(" | ||
+ | Serial.print(val); | ||
+ | lcd.setCursor(0, | ||
+ | lcd.print(F(" | ||
+ | lcd.setCursor(0, | ||
+ | lcd.print(F(USERNAME)); | ||
+ | lcd.setCursor(9, | ||
+ | lcd.print(val); | ||
+ | |||
+ | // Si on met double au lieu de int32_t, plantage !!! | ||
+ | if (! numbers.publish(val)) { | ||
+ | Serial.println(F(" | ||
+ | } else { | ||
+ | Serial.println(F(" | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | // Function to connect and reconnect as necessary to the MQTT server. | ||
+ | // Should be called in the loop function and it will take care if connecting. | ||
+ | void MQTT_connect() { | ||
+ | int8_t ret; | ||
+ | |||
+ | // attempt to connect to Wifi network: | ||
+ | while (WiFi.status() != WL_CONNECTED) { | ||
+ | Serial.print(F(" | ||
+ | Serial.println(ssid); | ||
+ | // Connect to WPA/WPA2 network. Change this line if using open or WEP network: | ||
+ | status = WiFi.begin(ssid, | ||
+ | |||
+ | // wait 10 seconds for connection: | ||
+ | uint8_t timeout = 10; | ||
+ | while (timeout && (WiFi.status() != WL_CONNECTED)) { | ||
+ | timeout--; | ||
+ | delay(1000); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Stop if already connected. | ||
+ | if (mqtt.connected()) { | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | Serial.print(F(" | ||
+ | |||
+ | while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected | ||
+ | Serial.println(mqtt.connectErrorString(ret)); | ||
+ | Serial.println(ret); | ||
+ | Serial.println(F(" | ||
+ | mqtt.disconnect(); | ||
+ | delay(5000); | ||
+ | } | ||
+ | Serial.println(F(" | ||
+ | } | ||
+ | double mesure(int analogPin) { | ||
+ | |||
+ | const int ACSoffset = 2500; | ||
+ | double Amps = 0; | ||
+ | /*double Voltage = 0; | ||
+ | int RawValue= 0; | ||
+ | RawValue = analogRead(analogPin); | ||
+ | /*Voltage = (RawValue / 1024.0) * 5000; // Gets you mV | ||
+ | Amps = ((Voltage | ||
+ | - ACSoffset) / mVperAmp); | ||
+ | |||
+ | Amps = (((analogRead(analogPin) / 1024.0) * 5000 | ||
+ | - ACSoffset) / mVperAmp); | ||
+ | |||
+ | / | ||
+ | Serial.print(RawValue); | ||
+ | Serial.print(" | ||
+ | Serial.print(Voltage, | ||
+ | // the ' | ||
+ | Serial.print(" | ||
+ | Serial.println(Amps, | ||
+ | // the ' | ||
+ | delay(2500); | ||
+ | return (Amps); | ||
+ | } | ||
+ | int mesureSimple(int analogPin) { | ||
+ | |||
+ | int Valeur = analogRead(analogPin); | ||
+ | |||
+ | return (Valeur); | ||
+ | } | ||
+ | </ | ||
+ | ===== Node-RED ===== | ||
+ | |||
+ | < | ||
+ | [ | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | } | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | } | ||
+ | }, | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | [ | ||
+ | " | ||
+ | ] | ||
+ | ] | ||
+ | }, | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | [ | ||
+ | " | ||
+ | " | ||
+ | ] | ||
+ | ] | ||
+ | }, | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | "# | ||
+ | "# | ||
+ | "# | ||
+ | "# | ||
+ | "# | ||
+ | "# | ||
+ | "# | ||
+ | "# | ||
+ | "# | ||
+ | ], | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | [], | ||
+ | [] | ||
+ | ] | ||
+ | }, | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | [ | ||
+ | " | ||
+ | ] | ||
+ | ] | ||
+ | }, | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | [ | ||
+ | " | ||
+ | ] | ||
+ | ] | ||
+ | }, | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | [ | ||
+ | " | ||
+ | ] | ||
+ | ] | ||
+ | }, | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | "# | ||
+ | "# | ||
+ | "# | ||
+ | "# | ||
+ | "# | ||
+ | "# | ||
+ | "# | ||
+ | "# | ||
+ | "# | ||
+ | ], | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | [], | ||
+ | [] | ||
+ | ] | ||
+ | } | ||
+ | ] | ||
+ | </ |