[TUTORIEL] Connaitre la capacité restante de sa cuve eau de pluie

He bien je pense avoir trouvé une partie de la solution.
En refaisant le code étape par étape, j’ai constaté que, lorsque je mets ces trois lignes de code en remarque, j’ai un résultat

// pinMode(TRIGGER_PIN, OUTPUT);
// digitalWrite(TRIGGER_PIN, LOW); // La broche TRIGGER doit être à LOW au repos
// pinMode(ECHO_PIN, INPUT);

j’obtiens ce résultat :


Connexion WiFi etablie
=> Adresse IP : 192.168.1.59 Test MQTT :
Connexion au serveur MQTT…KO, erreur : -2 On attend 5 secondes avant de recommencer
Connexion au serveur MQTT…KO, erreur : -2 On attend 5 secondes avant de recommencer

si j’enlève les remarques, j’obtiens ceci :

ets Jan 8 2013,rst cause:4, boot mode:(3,6)
wdt reset
load 0x4010f000, len 3460, room 16
tail 4
chksum 0xcc
load 0x3fff20b8, len 40, room 4
tail 4
chksum 0xc9
csum 0xc9
v00045410
~ld

Ce sont les mêmes infos que dans mon message 44
Plus de connexion WiFi
Selon moi, le problème vient de ces trois lignes !
Mais pourquoi ?
Une idée ?
:wink:

Dans ton code tu as bien ces lignes :

On avance un peu.

Pk la connexion mqtt n’a pas fonctionné ?

Sinon tu peux nous copier le code complet ?

Est ce que tu es sur que tes pin D6 et D7 sont les bons ? Pins Digitals et non Analogiques

Voici le code complet :

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
/* WIFI */
#define wifi_ssid « Txxxxxxxxxxx8 » // votre ssid wifi
#define wifi_password « xxxxxxxxxxx » // votre mot de passe wifi

/* MQTT */
#define mqtt_server « 192.168.1.1xx »
#define mqtt_user « gladys » // username
#define mqtt_password « bxxxxxxxxxxxxxxx » // mot de passe MQTT
#define gladys_topic « gladys/master/device/mqtt:citerne1:capteur-ultrason/feature/mqtt:citerne1:capteur-ultrason:quantite/state »
#define mqtt_cuve « mqtt:citerne1:capteur-ultrason » //Topic capteur cuve

/* Buffer qui permet de décoder les messages MQTT reçus */
char message_buff[100];
long lastMsg = 0; //Horodatage du dernier message publié sur MQTT
long lastRecu = 0;
bool debug = false; //Affiche sur la console si True

/* Constantes pour les broches */
const byte TRIGGER_PIN = 7; // Broche TRIGGER
const byte ECHO_PIN = 6; // Broche ECHO

/* Constantes pour le timeout */
const unsigned long MEASURE_TIMEOUT = 25000UL; // 25ms = ~8m à 340m/s

/* Vitesse du son dans l’air en mm/us */
const float SOUND_SPEED = 340.0 / 1000;

//Création des objets
WiFiClient espClient;
PubSubClient client(espClient);
//Connexion au réseau WiFi

void setup() {
Serial.begin(115200); //Facultatif pour le debug

/* Initialise les broches */
//pinMode(TRIGGER_PIN, OUTPUT);
//digitalWrite(TRIGGER_PIN, LOW); // La broche TRIGGER doit être à LOW au repos
//pinMode(ECHO_PIN, INPUT);

setup_wifi(); //On se connecte au réseau wifi
client.setServer(mqtt_server, 1883); //Configuration de la connexion au serveur MQTT
}
void setup_wifi() {
delay(10);
Serial.println(« \r\n\r\nxxxxxxxxxxx START xxxxxxxxxxxxxxx »);
Serial.print(« Connexion à « );
Serial.println(wifi_ssid);
//WiFi.disconnect();
//WiFi.mode(WIFI_STA);
WiFi.begin(wifi_ssid, wifi_password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print( ». »);
}
Serial.println(« . »);
Serial.println("Connexion WiFi etablie « );
Serial.print( »=> Adresse IP : ");
Serial.print(WiFi.localIP());
}

//Reconnexion
void reconnect() {
Serial.println(" Test MQTT : ");

//Boucle jusqu’à obtenir une reconnexion
while (!client.connected()) {
Serial.print(« Connexion au serveur MQTT… »);
if (client.connect(« ESP8266Client », mqtt_user, mqtt_password)) {
Serial.println(« OK »);
} else {
Serial.print(« KO, erreur : « );
Serial.print(client.state());
Serial.println( » On attend 5 secondes avant de recommencer »);
delay(5000);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
long now = millis();

/Envoi d’un message par minute/
if (now - lastMsg > 1000 * 60) {
lastMsg = now;

/* 1. Lance une mesure de distance en envoyant une impulsion HIGH de 10µs sur la broche TRIGGER */
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);

/* 2. Mesure le temps entre l'envoi de l'impulsion ultrasonique et son écho (si il existe) */
long measure = pulseIn(ECHO_PIN, HIGH, MEASURE_TIMEOUT);

/* 3. Calcul la distance à partir du temps mesuré */
int distance_mm = measure / 2.0 * SOUND_SPEED;
float c = 20 - distance_mm; // TRES IMORTANT Remplacer 2000 par la hauteur de votre cuve
c = c / 20;
c = c * 100;
//Inutile d'aller plus loin si le capteur ne renvoi rien
if ( isnan(c)) {
  Serial.println("Echec de lecture ! Verifiez votre capteur HRC-04");
  return;
}
if ( debug ) {
  Serial.print("Cuve : ");
  Serial.print(c);
}
client.publish(gladys_topic, String(c).c_str(), true);   //Publie le % de la cuve sur le topic dans gladys

}
}

Il faut que je vérifie

Je ne sais pas !
Peut-être l’adresse IP !
C’est l’adresse eth0 ou wlan0 qu’il faut indiquer ?

Celle que tu utilise

Si tu es en wifi => wlan
Cable => eth

Hésite pas à utiliser les balises pour formater le code, il y’a un tuto

Ça sera plus lisible pour nous

Je viens de tester c’est en effet plus lisible

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

/* WIFI */
#define wifi_ssid "Txxxxxxxxx8" // votre ssid wifi
#define wifi_password "xxxxxxxxxx" // votre mot de passe wifi

/* MQTT */
#define mqtt_server "192.168.1.1xx"
#define mqtt_user "gladys"            // username
#define mqtt_password "bxxxxxxxxxxxxxV" // mot de passe MQTT
#define gladys_topic "gladys/master/device/mqtt:citerne1:capteur-ultrason/feature/mqtt:citerne1:capteur-ultrason:quantite/state"
#define mqtt_cuve "mqtt:citerne1:capteur-ultrason"     //Topic capteur cuve

/* Buffer qui permet de décoder les messages MQTT reçus */

char message_buff[100];
long lastMsg = 0;   //Horodatage du dernier message publié sur MQTT
long lastRecu = 0;
bool debug = false;  //Affiche sur la console si True

/* Constantes pour les broches */
const byte TRIGGER_PIN = 7; // Broche TRIGGER
const byte ECHO_PIN = 6;    // Broche ECHO

/* Constantes pour le timeout */
const unsigned long MEASURE_TIMEOUT = 25000UL; // 25ms = ~8m à 340m/s

/* Vitesse du son dans l'air en mm/us */
const float SOUND_SPEED = 340.0 / 1000;

//Création des objets
WiFiClient espClient;
PubSubClient mqttclient(espClient);

//Connexion au réseau WiFi
void setup() {
  Serial.begin(115200);                    //Facultatif pour le debug
  /* Initialise les broches */
  //pinMode(TRIGGER_PIN, OUTPUT);
  //digitalWrite(TRIGGER_PIN, LOW);          // La broche TRIGGER doit être à LOW au repos
  //pinMode(ECHO_PIN, INPUT);
  setup_wifi();                            //On se connecte au réseau wifi
  mqttclient.setServer(mqtt_server, 1883);    //Configuration de la connexion au serveur MQTT
}

void setup_wifi() {
  delay(10);
  Serial.println("\r\n\r\nxxxxxxxxxxx START xxxxxxxxxxxxxxx");
  Serial.print("Connexion à ");
  Serial.println(wifi_ssid);
  //WiFi.disconnect();
  //WiFi.mode(WIFI_STA);
  WiFi.begin(wifi_ssid, wifi_password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  Serial.println(".");
  Serial.print("Connexion WiFi établie ");
  Serial.print("=> Adresse IP : ");
  Serial.println(WiFi.localIP());
}


//Reconnexion
void reconnect() {
Serial.print("Test MQTT : ");  
Serial.print("=> Adresse IP : ");
Serial.println(mqtt_server);
  //Boucle jusqu'à obtenir une reconnexion
  while (!mqttclient.connected()) {
    Serial.print("Connexion au serveur MQTT...");
    if (mqttclient.connect("ESP8266Client", mqtt_user, mqtt_password)) {
      Serial.println("OK");
    } else {
      Serial.print("KO, erreur : ");
      Serial.print(mqttclient.state());
      Serial.println(" On attend 5 secondes avant de recommencer");
      delay(5000);
    }
  }
}


void loop() {

  if (!mqttclient.connected()) {
    reconnect();
  }
  mqttclient.loop();

  long now = millis();

  /*Envoi d'un message par minute*/

  if (now - lastMsg > 1000 * 60) {
    lastMsg = now;

    /* 1. Lance une mesure de distance en envoyant une impulsion HIGH de 10µs sur la broche TRIGGER */

    digitalWrite(TRIGGER_PIN, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIGGER_PIN, LOW);

    /* 2. Mesure le temps entre l'envoi de l'impulsion ultrasonique et son écho (si il existe) */

    long measure = pulseIn(ECHO_PIN, HIGH, MEASURE_TIMEOUT);

    /* 3. Calcul la distance à partir du temps mesuré */

    int distance_mm = measure / 2.0 * SOUND_SPEED;
    float c = 20 - distance_mm; // TRES IMORTANT Remplacer 2000 par la hauteur de votre cuve
    c = c / 20;
    c = c * 100;

    //Inutile d'aller plus loin si le capteur ne renvoi rien
    if ( isnan(c)) {
      Serial.println("Echec de lecture ! Verifiez votre capteur HRC-04");
      return;
    }

    if ( debug ) {
      Serial.print("Cuve : ");
      Serial.print(c);
    }
    mqttclient.publish(gladys_topic, String(c).c_str(), true);   //Publie le % de la cuve sur le topic dans gladys
  }
}

Voici le schéma de brochage :


Il me semble que D6 et D7 ce sont les pin ARDUINO : Digitals ou Analogiques ?

Pourquoi après Serial.begin(115200), au niveau de pinmode tu as mis //

Cela sert à mettre des annotations. Il faut que tu les enlèves ou cela était juste pour le test que tu parlais plus haut pour montrer que la connexion WIFI était établi sans cela

C’est pour mettre un commentaire

Hello,

Concernant l’erreur signalée dans mon post 84 :

J’ai trouvé la solution pour ne plus avoir ces messages :
c’est le "while (! Serial)"

void setup() 
  Serial.begin(115200);                    //Facultatif pour le debug
  while (! Serial) {
    delay(1);  
    /* Initialise les broches */
    pinMode(TRIGGER_PIN, OUTPUT);
    digitalWrite(TRIGGER_PIN, LOW);          // La broche TRIGGER doit être à LOW au repos
    pinMode(ECHO_PIN, INPUT);
  }

Et là ça passe …
voir : https://arduino.stackexchange.com/questions/65017/arduino-ide-while-serial

Ca avance doucement !
:wink:

Ça oblige juste à avoir quelques chose sur le port usb, le jour où tu met en place sur ta cuve tu n’aura rien sur ce port si je ne me trompe pas.

Hello,
Je continue mon exploration !
Dans cette partie ci du script :

//Reconnexion
void reconnect() {
Serial.println("Connection MQTT : ");  
Serial.println("=> Adresse IP : ");
Serial.println(mqtt_server);
  //Boucle jusqu'à obtenir une reconnexion
  while (!mqttclient.connected()) {
    Serial.print("Connexion au serveur MQTT...");
    if (mqttclient.connect("ESP8266Client", mqtt_user, mqtt_password)) {
      Serial.println("OK");
    } else {
      Serial.print("KO, erreur : ");
      Serial.print(mqttclient.state());
      Serial.println(" On attend 5 secondes avant de recommencer");
      delay(5000);
    }
 }
}

Résultat :

........
Connexion WiFi établie => Adresse IP : 192.168.1.59
Connection MQTT : => Adresse IP : 192.168.1.188
Connexion au serveur MQTT...KO, erreur : -2 On attend 5 secondes avant de recommencer
Connexion au serveur MQTT...KO, erreur : -2 On attend 5 secondes avant de recommencer
Connexion au serveur MQTT...KO, erreur : -2 On attend 5 secondes avant de recommencer

Lorsque je teste via « MQTT Explorer », j’ai le résultat suivant :


Disconnected from server

Faut-il faire une manip spéciale sur le raspberry ?
Ma configuration MQTT :

Une idée ?
:wink:

De mon coté non pas d’idée. j’espère que quelqu’un pourra t’aider :wink:

Ton adresse 192.168.1.188 c’est ton install gladys ? elle est installé sur quoi, PI ? Serveur Nas ? ou autres ?

A part demander ‹ t’es sûr d’avoir bien noté le mot de passe en faisant attention aux minuscules et majuscules? ›, je ne vois pas non plus…

Effectivement c’est bien l’adresse IP de mon Raspberry sur lequel est installé Gladys

J’ai fait un copié/collé du mot de passe qui se trouve dans la configuration MQTT

Desactive le « Validate certificate »

L’erreur 2 correspond à une connexion refusée par le server.

Donc pour en savoir plus, il faut les logs du conteneur mqtt

Je viens d’essayer, même résultat

J’arrive pourtant à me connecter en SSH à mon PI via mon smartphone
Je me connecte également via mon pc
Capture
Capture1

Ok mais ça c’est pas le même protocole, d’où le fait d’avoir les logs mqtt pour savoir pourquoi il refuse la connexion

docker logs eclipse-mosquitto

Et pour voir la conf

sudo cat /var/lib/gladysassistant/mosquitto/mosquitto.conf