Bonjour,
J'ai un code pour faire communiquer mon arduino avec mqtt.
Mon broker est Mosquitto sur Home Assistant.J'essaye de faire communiquer 10 dht22.
Lorsque j'utilise mqtt explorer, je ne vois pas mon arduino, mais lorsque j'envoie des
messages avec mqttlens, ils apparaissent.
Je précise que dans mosquitto, il voit l'adresse IP de mon arduino et me dit qu'il y est
connecté mais aucun message ne passe.
Dans la console arduino, je vois les messages.
Petite précision: sans rien changer au code ou autre, parfois il se connecte mais pour
très peu de temps.
Est-ce que quelqu'un sait comment m'aider?
Voici mon code (en partie car le forum me dit que j'excède les 9000 caractères):
#include <DHT.h>
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
#define DHTPIN1 24
#define DHTPIN2 26
#define DHTPIN3 28
#define DHTPIN4 30
#define DHTPIN6 34
#define DHTPIN7 36
#define DHTPIN8 38
#define DHTPIN9 40
#define DHTTYPE1 DHT22
#define DHTTYPE2 DHT22
#define DHTTYPE3 DHT22
#define DHTTYPE4 DHT22
#define DHTTYPE6 DHT22
#define DHTTYPE7 DHT22
#define DHTTYPE8 DHT22
#define DHTTYPE9 DHT22
DHT dht1 (DHTPIN1, DHTTYPE1);
DHT dht2 (DHTPIN2, DHTTYPE1);
DHT dht3 (DHTPIN3, DHTTYPE1);
DHT dht4 (DHTPIN4, DHTTYPE1);
DHT dht6 (DHTPIN6, DHTTYPE1);
DHT dht7 (DHTPIN7, DHTTYPE1);
DHT dht8 (DHTPIN8, DHTTYPE1);
DHT dht9 (DHTPIN9, DHTTYPE1);
byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED }; // adresses mac
const char* mqtt_server = "192.168.1.2";
const char* client_name = "speakerswitch";
// ------------- 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_rez", "home/Arduino_rez", 0, true, "offline"))
{
// Once connected, publish an announcement...
client.publish("home/Arduino_rez","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;
// capteur3
static char char_h3[15];
static char char_t3[15];
float h3 = 0.0;
float h3_alt = 0.0;
float t3 = 0.0;
float t3_alt = 0.0;
// capteur4
static char char_h4[15];
static char char_t4[15];
float h4 = 0.0;
float h4_alt = 0.0;
float t4 = 0.0;
float t4_alt = 0.0;
// capteur5
static char char_h5[15];
static char char_t5[15];
float h5 = 0.0;
float h5_alt = 0.0;
float t5 = 0.0;
float t5_alt = 0.0;
// capteur6
static char char_h6[15];
static char char_t6[15];
float h6 = 0.0;
float h6_alt = 0.0;
float t6 = 0.0;
float t6_alt = 0.0;
// capteur7
static char char_h7[15];
static char char_t7[15];
float h7 = 0.0;
float h7_alt = 0.0;
float t7 = 0.0;
float t7_alt = 0.0;
// capteur8
static char char_h8[15];
static char char_t8[15];
float h8 = 0.0;
float h8_alt = 0.0;
float t8 = 0.0;
float t8_alt = 0.0;
// capteur9
static char char_h9[15];
static char char_t9[15];
float h9 = 0.0;
float h9_alt = 0.0;
float t9 = 0.0;
float t9_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 = 6000;
//***************** Setup **********************//
void setup()
{
client.setServer(server, 1883);
client.setCallback(callback);
Ethernet.begin(mac, ip);
delay(1500);
lastReconnectAttempt = 0;
Serial.begin(9600);
if (Ethernet.begin(mac) == 0)
{
Serial.println("Failed to configure Ethernet using DHCP");
return;
}
Serial.print("My IP address: ");
for (byte thisByte = 0; thisByte < 4; thisByte++) {
// print the value of each byte of the IP address:
Serial.print(Ethernet.localIP()[thisByte], DEC);
Serial.print(".");
}
Serial.println();
dht1.begin();
dht2.begin();
dht3.begin();
dht4.begin();
dht6.begin();
dht7.begin();
dht8.begin();
dht9.begin();
}
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;
h1 = dht1.readHumidity(); //humidite 1
t1 = dht1.readTemperature(); //Temperature 1
h2 = dht2.readHumidity(); //humidite 2
t2 = dht2.readTemperature(); //Temperature 2
h3 = dht3.readHumidity(); //humidite 3
t3 = dht3.readTemperature(); //Temperature 3
h4 = dht4.readHumidity(); //humidite 4
t4 = dht4.readTemperature(); //Temperature 4
h6 = dht6.readHumidity(); //humidite 6
t6 = dht6.readTemperature(); //Temperature 6
h7 = dht7.readHumidity(); //humidite 7
t7 = dht7.readTemperature(); //Temperature 7
h8 = dht8.readHumidity(); //humidite 8
t8 = dht8.readTemperature(); //Temperature 8
h9 = dht9.readHumidity(); //humidite 9
t9 = dht9.readTemperature(); //Temperature 9
}
// 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) || isnan(t3) || isnan(h3) || isnan(t4) || isnan(h4) || isnan(t5) || isnan(h5) || isnan(t6) || isnan(h6) || isnan(t7) || isnan(h7) || isnan(t8) || isnan(h8) || isnan(t9) || isnan(h9) )
{
Serial.println(" un DHT22 n'a pas pu être lu");
client.publish("home/Arduino_rez","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 && h3 == h3_alt && t3 == t3_alt && h4 == h4_alt && t4 == t4_alt && h5 == h5_alt && t5 == t5_alt && h6 == h6_alt && t6 == t6_alt && h7 == h7_alt && t7 == t7_alt && h8 == h8_alt && t8 == t8_alt && h9 == h9_alt && t9 == t9_alt )
{
//ne fais rien
}
else
{
client.publish("home/Arduino_rez","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);
dtostrf(h3,6, 1, char_h3);
dtostrf(t3,6, 1, char_t3);
dtostrf(h4,6, 1, char_h4);
dtostrf(t4,6, 1, char_t4);
dtostrf(h5,6, 1, char_h5);
dtostrf(t5,6, 1, char_t5);
dtostrf(h6,6, 1, char_h6);
dtostrf(t6,6, 1, char_t6);
dtostrf(h7,6, 1, char_h7);
dtostrf(t7,6, 1, char_t7);
dtostrf(h8,6, 1, char_h8);
dtostrf(t8,6, 1, char_t8);
dtostrf(h9,6, 1, char_h9);
dtostrf(t9,6, 1, char_t9);
client.publish("home/Arduino_rez/ch_heather/humidite",humidity, true);
client.publish("home/Arduino_rez/ch_heather/Temperature",temperature, true);
Merci