Poursuivons donc:
Je suis passer sur Graphana pour le tableau de bord, le rendu est meilleur, et on peu en importer des tout prêt pour les modifier...

-
Graphana.PNG (153.35 Kio)
Vu 12334 fois
Pour transformé notre box en serveur météo, je cherche encore à amélioré le code, notamment pour faire des objets connecté pouvant interagir entre eux., et à maximiser l'autonomie pour la sonde extérieure. Je vais car même vous présenter le projet en l’état actuel:
Objectif:
- Centraliser un ensemble de capteurs sans fils qui pourront conditionné des actions (interrupteurs ou autre), on commence par un capteur météo.
- Garder un historique des donnés.
- Avoir un affichage sympa.
Materiels:
Tout vas dépendre de vos choix, avec des esp8366 esp01 et des bm380 sur aliexpresse on est à moins de 5€, mon projet avec le kit de départ est à 45€:
-Pour la base, j'ai opter pour un kit de départ arduino à 15€ pour avoir les fils, plaques d'essais, diodes , résistances, petits capteurs et un arduino uno.
- Pour le contrôleur wifi, il faut un esp8266 ou esp32. Plusieurs version existent, qui vas de moins de deux euros à une quinzaine d'euros, pour l instant je teste sur un NodeMCU Lua Lolin V3 Module ESP8266 (ESP-12E) à 5€ - 7€ sur ebay plus simple à programmer que les esp8288 esp 01. Ces modules peuvent se programmer simplement, avec beaucoup d exemple et didac disponible.
https://www.amazon.fr/gp/product/B06Y1Z ... =UTF8&th=1
https://www.aliexpress.com/item/4000143 ... 4c4dYnEdFM
- Pour le capteur, j'ai prit un bm680 à 20€, mais on peu partir sur des capteurs plus simple à quelques euros.
https://www.amazon.fr/gp/product/B07GQQ ... UTF8&psc=1
https://www.aliexpress.com/item/3299204 ... 4c4dYnEdFM
- De quoi alimenter le tout (cordon usb ou batterie)

-
20200119_120157.jpg (85.96 Kio)
Vu 12334 fois
Logiciels:
-Arduino IDE, disponible sur toutes les plateforme, il vas nous servir à programmer nos esp. Il faudra importer les bibliothèques en fonction de notre matériel et le 'drivers' de la carte:
https://projetsdiy.fr/programmer-esp826 ... ur-client/
Bibliothèque: Onwire, adafruit unified sensor, adafruit bme 680, influxdb, dallas temperature, sht1x sensor library for espx, espmqt, pubsubclient.
La plupart des bibliothèques seront accessible via le logiciel, un ou deux devront être importer manuellement.
-Sur notre ou nos serveur, au choix: Influxdb et graphana pour un dash board, et ou un serveur mqtt (mosquitto par exempla) et Node RED. Je suis en pleine découverte de nodered et du protocole mqtt, mais cela devrait permettre de reprendre les données facilement avec moins de consommation pour l’envoi, et la gestion par un home assistant. A noté que nodered peu s occuper de l’envoi en base de donné.
https://gist.github.com/gyassine/a5eda1 ... f22ac96c0d
On branche l'esp8266 avec le bme680:
D1 -> scl
D2 -> sda
3v -> 2-6V
G -> gnd
Il ne nous reste plus qu'as mettre le programmes dans notre esp via Arduino IDE, je vous partage mon code actuel sur lequel il reste pas mal de travaille, mais qui peu donner des idées de modification. Le code permetle branchement de la sonde bme680, sht10 et DS18B20 (n'hésitez pas à demander pour plus d'infos).
Attention ce code est un assemblage de plusieurs exemples, il est trés imparfais!
Code : Tout sélectionner
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <InfluxDb.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#include <SHT1x.h>
#include "PubSubClient.h"
// Data wire is connected to GPIO15
#define ONE_WIRE_BUS 15
#define INFLUXDB_HOST "192.168.0.xx" // Mettre l'adresse ip d influxdb
#define INFLUXDB_USER "user_meteo" // Mettre l'utilisateur d influxdb
#define INFLUXDB_PASS "xxxxxxxxxxx" // Mettre le passe influxdb
#define dataPin 12 // NodeMCU pin D6 pour sht1x
#define clockPin 14 // NodeMCU pin D5 pour sht1x
SHT1x sht1x(dataPin, clockPin); // instantiate SHT1x object
// GPIO where the DS18B20 is connected to
const int oneWireBus = 15; // pin D8 pour DS18B20
//////////////////////////////////////////
const char* mqtt_server = "192.168.0.xxxxxx"; // Adr de serveur mosquitto
//const char* mqtt_user = "admin"; // login sur serveur mosquitto
//const char* mqtt_password = "xxxxxxxxxxx"; // Passe sur serveur mosquitto
char msg_envoye[50];
char ch_result[10];
const char* ssid = "xxxxxx // Mettre le SSID de votre connection wifi
const char* password = "xxxxxxxx"; // Mettre le passe de votre connection wifi
WiFiClient espClient; // déclaration Objet wifi
PubSubClient client(espClient); // déclaration objet mosquitto
unsigned long lastMsg = 0;
#define MSG_BUFFER_SIZE (50)
char msg[MSG_BUFFER_SIZE];
char msg1[MSG_BUFFER_SIZE];
char msg2[MSG_BUFFER_SIZE];
char msg3[MSG_BUFFER_SIZE];
char msg4[MSG_BUFFER_SIZE];
char msg5[MSG_BUFFER_SIZE];
int value = 0;
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
// Switch on the LED if an 1 was received as first character
if ((char)payload[0] == '1') {
digitalWrite(BUILTIN_LED, LOW); // Turn the LED on (Note that LOW is the voltage level
// but actually the LED is on; this is because
// it is active low on the ESP-01)
} else {
digitalWrite(BUILTIN_LED, HIGH); // Turn the LED off by making the voltage HIGH
}
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Create a random client ID
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
// Attempt to connect
if (client.connect(clientId.c_str())) {
Serial.println("connected");
// Once connected, publish an announcement...
client.publish("outTopic", "hello world");
// ... and resubscribe
client.subscribe("inTopic");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
////////////////////////////////////////////
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(oneWireBus);
// Pass our oneWire reference to Dallas Temperature sensor
DallasTemperature sensors(&oneWire);
int temint;
int humi;
int pressi;
int gasres;
ESP8266WiFiMulti WiFiMulti;
Influxdb influx(INFLUXDB_HOST);
Adafruit_BME680 bme; // I2C
void setup() {
Serial.println(" ### Hello ###");
pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
influx.setDbAuth("Test01", INFLUXDB_USER, INFLUXDB_PASS);
Serial.println("Setup done");
while (!Serial);
Serial.println(F("BME680 test"));
if (!bme.begin(0x76))
{
Serial.println("Could not find a valid BME680 sensor, check wiring!");
while (1);
}
// Set up oversampling and filter initialization
bme.setTemperatureOversampling(BME680_OS_8X);
bme.setHumidityOversampling(BME680_OS_2X);
bme.setPressureOversampling(BME680_OS_4X);
bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
bme.setGasHeater(320, 150); // 320*C for 150 ms
}
void loop() {
if (! bme.performReading())
{
Serial.println("Failed to perform reading :(");
return;
}
temint = bme.temperature;
humi = bme.humidity;
pressi = bme.pressure / 100.0;
gasres = bme.gas_resistance / 1000.0;
Serial.print("Temperature = ");
Serial.print(bme.temperature);
Serial.println(" *C");
Serial.print("Pressure = ");
Serial.print(bme.pressure / 100.0);
Serial.println(" hPa");
Serial.print("Humidity = ");
Serial.print(bme.humidity);
Serial.println(" %");
Serial.print("Gas = ");
Serial.print(bme.gas_resistance / 1000.0);
Serial.println(" KOhms");
sensors.requestTemperatures();
float temperatureC = sensors.getTempCByIndex(0);
Serial.print("Temp sonde = ");
Serial.print(temperatureC);
Serial.println(" ºC");
float temp_terre;
float humidity_terre;
temp_terre = sht1x.readTemperatureC(); // Read values from the sensor
humidity_terre = sht1x.readHumidity();
Serial.print("Temperature terre: "); // Print the values to the serial port
Serial.print(temp_terre, DEC);
Serial.print(" °C");
Serial.print("Humidité terre = ");
Serial.print(humidity_terre);
Serial.println(" % /n");
InfluxData row("temperature");
row.addValue("htemperature", bme.temperature - 1);
row.addValue("Pression", bme.pressure / 100.0);
row.addValue("Humidite", bme.humidity);
row.addValue("Gas", bme.gas_resistance / 1000.0);
row.addValue("dtemperature", temperatureC);
row.addValue("temp_terre", temp_terre);
row.addValue("humidity_terre", humidity_terre);
influx.write(row);
Serial.println("Setup done");
pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
if (!client.connected()) {
reconnect();
}
client.loop();
unsigned long now = millis();
if (now - lastMsg > 2000) {
lastMsg = now;
++value;
snprintf (msg, MSG_BUFFER_SIZE, "%.2f ", bme.temperature - 1);
Serial.print("Publish message: ");
Serial.println(msg);
client.publish("sensor/temperature", msg);
snprintf (msg1, MSG_BUFFER_SIZE, "%.2f", bme.humidity);
Serial.print("Publish message1: ");
Serial.println(msg1);
client.publish("sensor/humidite", msg1);
snprintf (msg2, MSG_BUFFER_SIZE, "%.2f ", bme.pressure / 100.0);
Serial.print("Publish message2: ");
Serial.println(msg2);
client.publish("sensor/pression", msg2);
snprintf (msg3, MSG_BUFFER_SIZE, "%.2f ", bme.gas_resistance / 1000.0);
Serial.print("Publish message3: ");
Serial.println(msg3);
client.publish("sensor/gas", msg3);
snprintf (msg4, MSG_BUFFER_SIZE, "%.2f ", temp_terre);
Serial.print("Publish message4: ");
Serial.println(msg4);
client.publish("sensor/temp_terre", msg4);
snprintf (msg5, MSG_BUFFER_SIZE, "%.2f ", humidity_terre);
Serial.print("Publish message5: ");
Serial.println(msg5);
client.publish("sensor/humidity_terre", msg5);
}
delay(5000);
}
Il vous faudra renseigner votre SSID wifi, passe wifi, adresse d influxbd, ustilisateur et passe (la table se crera a la premiere connection), adresse ext. pour le serveur mqtt., et modifier à votre convenence (et sortir les carteurs non utilisé). Le code remplis la base donné et envois les infos sur le serveur mqtt, le mieux est de choisir entre les deux, le mqtt devant permettre de tout gerer, par nodered ou autres serveur domotique (je cherche encore de ce coté là encore).

-
20200202_145830.jpg (126.86 Kio)
Vu 12334 fois
Il me reste encore à exploité les donné par nodered, faire interagir capteur et par example des relais, voir si nodered fais de jolie graphique ex.... Les possibilitées sont nombreuse, de la detection de présence, luminositée, comera...
J'espére avoir donné envis à ceux qui ne connaissaient pas ces petites bestioles, avec quelque bons sites et vidéos, on arrivent à faire des choses que je pensait réservé aux ingénieurs lol. Si vous voyez des erreurs, améliorations, n'hésitez pas à le dire, la découverte ne date que de quelque semaine pour moi. De même si vous souhaitez plus d'infos!
Avos projets!