Bonjour
voila ma 1er application en domotique, un suivie des températures/humidités de l'habitat.
- un Arduino Uno et shiel Ethernet pour la partie client (du filaire)
- des capteurs DHT22
- JeeDom en supervision, avec serveur Mqtt ( mosquitto ) sur une base matériel Odroid C2.
plus d'info jeedom et plugin-mqtt
le croquis Arduino (mon 1er) et un mixe, un copier/coller et modif pour X capteurs.
Ma demande (bah oui
)
Après plusieurs tentative pour l'adapter avec la dernière version de robtillaart.
la DHTNEW <dhtnew.h> DHTNEW class for DHT11 and DHT12 and compatibles. - Libraries - Arduino Forum
voila le code fonctionnelle ' avec encore un ou deux détail a revoir) mais avec la Lib d'adafruit .
( suis toute ouie pour des coups de sabre et greffe dans le croquis)
// Arduino Mqtt et des capteurs DHT22 (temp/humidite )
//
// Exemple de reconnexion MQTT - non bloquant
// une recopie-modif du wiki FHEM : https://wiki.fhem.de/wiki/MQTT_Einführung_Teil_3
//
// base par: Rince du forum Fhem (adaptation 4 capteurs par JeeLet)
// croquis : Arduino1_mqtt_dht22_eth_v01.ino
// Biblio: PubSubClient.h (NickOLeary) et dht?? et pour dhtnew pas trouvé
// date/version: 2020 / v01 (4 capteurs DHT22 en pseudo on-wire )
//
// Ce croquis montre comment garder le client connecté en utilisant
// une fonction de reconnexion non bloquante, Si le client perd sa connexion,
// il tente de se reconnecter toutes les 5 secondes sans bloquer la boucle principale.
//
//
// -------------- debut ---------------
#include <DHT.h>
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
#define DHTPIN 6
#define DHTPIN1 7
#define DHTPIN2 8
#define DHTTYPE DHT22
#define DHTTYPE1 DHT22
#define DHTTYPE2 DHT22
DHT dht (DHTPIN, DHTTYPE);
DHT dht1 (DHTPIN1, DHTTYPE);
DHT dht2 (DHTPIN2, DHTTYPE);
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x85, 0xFF }; // adresses mac
IPAddress ip{ 192, 168, 1, 33}; //ip du client
IPAddress server{ 192, 168, 1, 21}; //ip du serveur MQTT (le Broker)
// ------------- mqtt ---------------//
void callback(char* topic, byte* payload, unsigned int length)
{
// gérer le message est arrivé
}
EthernetClient ethClient;
PubSubClient client(ethClient);
long lastReconnectAttempt = 0;
boolean reconnect()
{
if (client.connect("Arduino_1", "home/Arduino_1", 0, true, "offline"))
{
// Once connected, publish an announcement...
client.publish("home/Arduino_1","online", true);
// ... and resubscribe
client.subscribe("inTopic");
}
return client.connected();
}
// Réservez la zone de stockage pour sauver la clôture //
// capteur0
static char humidity[15];
static char temperature[15];
float h = 0.0;
float h_alt = 0.0;
float t = 0.0;
float t_alt = 0.0;
// capteur1
static char char_h1[15];
static char char_t1[15];
float h1 = 0.0;
float h1_alt = 0.0;
float t1 = 0.0;
float t1_alt = 0.0;
// capteur2
static char char_h2[15];
static char char_t2[15];
float h2 = 0.0;
float h2_alt = 0.0;
float t2 = 0.0;
float t2_alt = 0.0;
// remise a zero du compteur "millisecondes" depuis le dernier appel.
unsigned long previousMillis = 0;
// valeur intervalle de fréquence d'utilisation du capteur, en millisecondes (60000=1mn)
const long interval = 12000;
//***************** Setup **********************//
void setup()
{
client.setServer(server, 1883);
client.setCallback(callback);
Ethernet.begin(mac, ip);
delay(1500);
lastReconnectAttempt = 0;
Serial.begin(9600);
Serial.println("DHT22 - Test!");
dht.begin();
dht1.begin();
dht2.begin();
}
//***************** Loop **********************
void loop()
{
if (!client.connected())
{
long now = millis();
if (now - lastReconnectAttempt > 5000) // calcul temps pour reconnection client
{
lastReconnectAttempt = now;
// Tentative de reconnexion
if (reconnect())
{
lastReconnectAttempt = 0;
}
}
}
else
{
client.loop(); // Client connected
}
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) // calcul temps ecouler du capteur
{
previousMillis = currentMillis;
// ----- lecture des capteurs ------
h = dht.readHumidity(); //humidite 0
t = dht.readTemperature(); //Temperature 0
h1 = dht1.readHumidity(); //humidite 1
t1 = dht1.readTemperature(); //Temperature 1
h2 = dht2.readHumidity(); //humidite 2
t2 = dht2.readTemperature(); //Temperature 2
}
// Vérifiez si un numéro valide est retourné.
// Si "NaN" "Not a Number" (pas un nombre) est renvoyé, affiche erreurs capteur.
if (isnan(t) || isnan(h) || isnan(t1) || isnan(h1) || isnan(t2) || isnan(h2) )
{
Serial.println(" un DHT22 n'a pas pu être lu");
client.publish("home/Arduino_1","Erreur capteur",true);
// "true" envoie le message conservé, c'est-à-dire que le message reste sur le courtier
//jusqu'à ce que quelque chose de nouveau arrive.
}
else if (h == h_alt && t == t_alt && h1 == h1_alt && t1 == t1_alt && h2 == h2_alt && t2 == t2_alt )
{
//ne fais rien
}
else
{
client.publish("home/Arduino_1","en Ligne", true);
dtostrf(h,6, 1, humidity);
dtostrf(t,6, 1, temperature);
dtostrf(h1,6, 1, char_h1);
dtostrf(t1,6, 1, char_t1);
dtostrf(h2,6, 1, char_h2);
dtostrf(t2,6, 1, char_t2);
client.publish("home/Arduino_1/cuisine/humidite",humidity, true);
client.publish("home/Arduino_1/cuisine/Temperature",temperature, true);
client.publish("home/Arduino_1/bureau/humidite",char_h1, true);
client.publish("home/Arduino_1/bureau/Temperature",char_t1, true);
client.publish("home/Arduino_1/chambre/humidite",char_h2, true);
client.publish("home/Arduino_1/chambre/Temperature",char_t2, true);
h_alt = h; // annuler l'ancienne lecture ..
t_alt = t; // ... pour ne réagir qu'aux changements
h1_alt = h1;
t1_alt = t1;
h2_alt = h2;
t2_alt = t2;
// ------------ Visu sur terminal ------------------
Serial.print("humidite: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" C");
Serial.print("humidite 1: ");
Serial.print(h1);
Serial.print(" %\t");
Serial.print("Temperature 1: ");
Serial.print(t1);
Serial.println(" C");
Serial.print("humidite 2: ");
Serial.print(h2);
Serial.print(" %\t");
Serial.print("Temperature 2: ");
Serial.print(t2);
Serial.println(" C");
}
}
//-------- Fin Pgm --------------