Sommaire
Ce tutoriel est sur le principe identique à celui-ci : Créer un capteur de température, humidité et luminosité connecté sauf que nous allons utiliser un ESP-01 beaucoup plus petit et moins cher qu’un D1 Mini Pro.
Nous assemblerons l’ESP8266 et le capteur de luminosité TSL2561 dans une prise 220v avec un convertisseur 220v -> 3v3.
Prérequis
- Un serveur Constellation
- Un ESP8266 comme l’ESP-01 (entre 1,5€ et 2€)
- Un capteur de luminosité TSL2561 (environ 2€)
- Un convertisseur 220v -> 3v3 (environ 2€)
- Un boitier/prise 220v (entre 5 et 15 €)
Le montage
Le capteur TSL2561 se connecte en I²C, il suffit donc de l’alimenter en 3v3 et de connecter les deux GPIO de l’ESP-01 (GPIO-0 et GPIO-2) aux pins SCL et SDA du capteur.
Le schéma de connexion est donc le suivant :
Sur le bornier 220v de notre prise nous allons souder deux fils (la phase et le neutre) vers l’entrée convertisseur 220v AC. En sortie du convertisseur, on a une tension de 3v3 DC que nous connecterons à l’ESP-01 ainsi qu’au TSL2561.
N’oubliez pas également de relier le port « CH_PD » de l’ESP-01 au 3v3 pour activer le Wifi.
Pour plus d’information, je vous invite à lire cet article.
Disposez les différents composants dans le boitier en prenant soin d’isoler les parties 220v (avec de la colle thermofusibles ou du ruban isolant).
Le code
L’ESP-01 ne dispose pas comme le D1 Mini Pro vu dans ce tutoriel d’une interface USB intégrée. Il vous faudra donc une interface USB/FTDI pour le programmer. Pour plus d’information, je vous invite à lire cet article.
A l’inverse du tutoriel précédent, ce code utilise la libraire TSL2561-Arduino-Library et non la « Unifed Sensor Library » afin de nous permettre de récupérer le Broadband et l’IR en plus des Lux.
Il faudra donc installer la libraire « TSL2561-Arduino-Library » depuis le Gestionnaire de bibliothèque. De plus on utilise ici « ArduinoThread » pour ordonner les mesures à intervalle régulier. Vous devrez également installer cette librairie.
Attention : si tout cela est nouveau pour vous, je vous recommande de suivre ce guide d’introduction à l’API Constellation pour Arduino/ESP8266.
Le code complet est :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
#include <ESP8266WiFi.h> const char* ssid = "MON SSID"; const char* password = "lacléeWifi!!!!"; #include <Constellation.h> Constellation<WiFiClient> constellation("IP ou DNS du serveur Constellation", 8088, "ESP-LightSensorSalon", "LightSensor", "123456789"); #include <Wire.h> #include <TSL2561.h> TSL2561 tsl(TSL2561_ADDR_FLOAT); #include <Thread.h> Thread thrPushLux = Thread(); void pushLuxOnConstellation() { uint32_t lum = tsl.getFullLuminosity(); uint16_t ir, full; ir = lum >> 16; full = lum & 0xFFFF; uint32_t lux = tsl.calculateLux(full, ir); constellation.pushStateObject("Lux", stringFormat("{ 'Lux':%d, 'Broadband':%d, 'IR':%d }", lux, full, ir), "LightSensor.Lux", 300); } void setup(void) { Serial.begin(115200); delay(10); if (tsl.begin()) { Serial.println("Found sensor"); } else { Serial.println("No sensor?"); while (1); } // You can change the gain on the fly, to adapt to brighter/dimmer light situations //tsl.setGain(TSL2561_GAIN_0X); // set no gain (for bright situtations) tsl.setGain(TSL2561_GAIN_16X); // set 16x gain (for dim situations) // Changing the integration time gives you a longer time over which to sense light // longer timelines are slower, but are good in very low light situtations! //tsl.setTiming(TSL2561_INTEGRATIONTIME_13MS); // shortest integration time (bright light) //tsl.setTiming(TSL2561_INTEGRATIONTIME_101MS); // medium integration time (medium light) tsl.setTiming(TSL2561_INTEGRATIONTIME_402MS); // longest integration time (dim light) // Set Wifi mode if (WiFi.getMode() != WIFI_STA) { WiFi.mode(WIFI_STA); delay(10); } // Connect to Wifi Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("WiFi connected. IP: "); Serial.println(WiFi.localIP()); Serial.println(constellation.getSentinelName()); JsonObject& settings = constellation.getSettings(); int interval = 10000; //ms if(settings.containsKey("Interval")) { interval = settings["Interval"].as<int>(); } thrPushLux.onRun(pushLuxOnConstellation); thrPushLux.setInterval(interval); constellation.addStateObjectType("LightSensor.Lux", TypeDescriptor().setDescription("Lux data informations").addProperty("Broadband", "System.Int32").addProperty("IR", "System.Int32").addProperty("Lux", "System.Int32")); constellation.declarePackageDescriptor(); constellation.writeInfo("ESP LightSensor '%s' is started (Push interval: %d sec)", constellation.getSentinelName(), interval); } void loop(void) { if(thrPushLux.shouldRun()){ thrPushLux.run(); } } |
Pour démarrer vous devez dans Constellation déclarer une sentinelle associée à une clé d’accès et un package virtuel. Ici notre ESP8266 est représenté par la sentinelle nommée “ESP-LightSensorSalon” et le package virtuel se nomme “LightSensor”.
Ensuite il faut définir le nom de notre réseau Wifi (SSID) ainsi que sa clé d’accès puis nous configurerons le client Constellation en spécifiant l’identité de notre package virtuel, sa clé d’accès et l’adresse/port de notre serveur Constellation.
Dans la méthode « setup()« , on initialise le capteur TSL puis on se connecte au Wifi et enfin on déclare l’intervalle de temps entre chaque mesure, par défaut de 10 secondes qu’on peut modifier en ajoutant un setting « Interval » sur notre package virtuel.
On configure ensuite un « thread » qui exécutera à l’intervalle de temps spécifié la méthode « pushLuxOnConstellation« . Pour finir on déclare la description du StateObject par la méthode « constellation.addStateObjectType » et on affiche un log. Dans la loop(), on déclenche le thread.
La méthode « pushLuxOnConstellation » récupère les données du capteur et publie le StateObject « Lux » avec les trois propriétés :
1 |
constellation.pushStateObject("Lux", stringFormat("{ 'Lux':%d, 'Broadband':%d, 'IR':%d }", lux, full, ir), "LightSensor.Lux", 300); |
Une fois le programme téléversé, votre prise publiera le StateObject à l’intervalle régulier la luminosité ambiante.
Exploiter le capteur
Comme vous le savez, une fois les données mesurées publiées dans un StateObject n’importe quel système connecté dans Constellation peut récupérer ou s’abonner en temps réel au StateObject.
On peut donc écrire des pages Web, des scripts, des packages .NET ou Python, Arduino, etc… qui exploiteront ces mesures en temps réel.
Je vous renvoie sur cette page ou cette autre page pour avoir quelques idées.
Pour ma part ce capteur installé dans le salon est affiché en temps réel sur un dashboard Web, stocké dans ElasticSearch et Cacti et exploité dans un package .NET nommé « MyBrain » car cette information sur la luminosité ambiante sert dans beaucoup de scénario : gestion des éclairages ou des volets.
Bonjour,
Le boitier vient de Conrad et le transfo sur eBay.
Cordialement