[TUTORIAL] Den verbleibenden Speicherinhalt des Regenwassertanks ermitteln

Hast du versucht, die Baudrate in deinem Programm auf 115200 statt 9600 zu setzen?

Wenn ich 9600 Baud verwende, erhalte ich dies:

������������������������
Oder
nur kleine Quadrate

Ersetze im Code von Jérôme einfach die Baudrate 9600 durch 115200.

Ich glaube, ich habe einen Teil der Lösung gefunden.
Indem ich den Code Schritt für Schritt neu schreibe, habe ich festgestellt, dass, wenn ich diese drei Codezeilen auskommentiere, ich dieses Ergebnis erhalte:

// pinMode(TRIGGER_PIN, OUTPUT);
// digitalWrite(TRIGGER_PIN, LOW); // Der TRIGGER-Pin muss im Ruhezustand auf LOW sein
// pinMode(ECHO_PIN, INPUT);

Ich erhalte dieses Ergebnis:

…
WiFi-Verbindung hergestellt
=> IP-Adresse: 192.168.1.59 MQTT-Test:
Verbindung zum MQTT-Server…FEHLER, Fehler: -2 Warten Sie 5 Sekunden, bevor Sie es erneut versuchen
Verbindung zum MQTT-Server…FEHLER, Fehler: -2 Warten Sie 5 Sekunden, bevor Sie es erneut versuchen

Wenn ich die Kommentare entferne, erhalte ich dies:

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

Es sind dieselben Informationen wie in meiner Nachricht 44
Keine WiFi-Verbindung mehr
Meiner Meinung nach liegt das Problem bei diesen drei Zeilen!
Aber warum?
Eine Idee?
:wink:

In deinem Code hast du diese Zeilen:

Wir machen Fortschritte.

Warum hat die MQTT-Verbindung nicht funktioniert?

Falls nicht, kannst du uns den vollständigen Code kopieren?

Bist du sicher, dass deine Pins D6 und D7 die richtigen sind? Digitale Pins und nicht Analogpins.

Hier ist der vollständige Code:

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
/* WIFI */
#define wifi_ssid « Txxxxxxxxxxx8 » // dein WLAN-Name
#define wifi_password « xxxxxxxxxxx » // dein WLAN-Passwort

/* MQTT */
#define mqtt_server « 192.168.1.1xx »
#define mqtt_user « gladys » // Benutzername
#define mqtt_password « bxxxxxxxxxxxxxxx » // MQTT-Passwort
#define gladys_topic « gladys/master/device/mqtt:citerne1:capteur-ultrason/feature/mqtt:citerne1:capteur-ultrason:quantite/state »
#define mqtt_cuve « mqtt:citerne1:capteur-ultrason » // Thema des Behältersensors

/* Puffer, der zum Dekodieren der empfangenen MQTT-Nachrichten verwendet wird */
char message_buff[100];
long lastMsg = 0; // Zeitstempel der letzten auf MQTT veröffentlichten Nachricht
long lastRecu = 0;
bool debug = false; // Zeigt in der Konsole an, wenn True

/* Konstanten für die Pins */
const byte TRIGGER_PIN = 7; // TRIGGER-Pin
const byte ECHO_PIN = 6; // ECHO-Pin

/* Konstanten für den Timeout */
const unsigned long MEASURE_TIMEOUT = 25000UL; // 25ms = ~8m bei 340m/s

/* Schallgeschwindigkeit in der Luft in mm/µs */
const float SOUND_SPEED = 340.0 / 1000;

//Erstellung der Objekte
WiFiClient espClient;
PubSubClient client(espClient);
//Verbindung zum WLAN-Netzwerk

void setup() {
Serial.begin(115200); // Optional für den Debug-Modus

/* Initialisiert die Pins */
//pinMode(TRIGGER_PIN, OUTPUT);
//digitalWrite(TRIGGER_PIN, LOW); // Der TRIGGER-Pin muss im Ruhezustand auf LOW sein
//pinMode(ECHO_PIN, INPUT);

setup_wifi(); // Verbindung zum WLAN-Netzwerk herstellen
client.setServer(mqtt_server, 1883); // Konfiguration der Verbindung zum MQTT-Server
}
void setup_wifi() {
delay(10);
Serial.println(« \r\n\r\nxxxxxxxxxxx START xxxxxxxxxxxxxxx »);
Serial.print(« Verbindung zu « );
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("WLAN-Verbindung hergestellt « );
Serial.print( »=> IP-Adresse: ");
Serial.print(WiFi.localIP());
}

//Wiederverbindung herstellen
void reconnect() {
Serial.println(" MQTT-Test: ");

// Schleife bis eine Wiederverbindung hergestellt ist
while (!client.connected()) {
Serial.print(« Verbindung zum MQTT-Server… »);
if (client.connect(« ESP8266Client », mqtt_user, mqtt_password)) {
Serial.println(« OK »);
} else {
Serial.print(« FEHLER, Fehler: « );
Serial.print(client.state());
Serial.println( » Warten Sie 5 Sekunden, bevor Sie es erneut versuchen »);
delay(5000);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
long now = millis();

/Sende eine Nachricht pro Minute/
if (now - lastMsg > 1000 * 60) {
lastMsg = now;

/* 1. Starte eine Entfernungsmessung, indem du einen HIGH-Impuls von 10µs an den TRIGGER-Pin sendest */
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);

/* 2. Messen Sie die Zeit zwischen dem Senden des Ultraschallimpulses und seinem Echo (falls vorhanden) */
long measure = pulseIn(ECHO_PIN, HIGH, MEASURE_TIMEOUT);

/* 3. Berechne die Entfernung aus der gemessenen Zeit */
int distance_mm = measure / 2.0 * SOUND_SPEED;
float c = 20 - distance_mm; // SEHR WICHTIG Ersetze 2000 durch die Höhe deines Behälters
c = c / 20;
c = c * 100;
//Es ist nicht nötig, weiterzumachen, wenn der Sensor nichts zurückgibt
if ( isnan(c)) {
  Serial.println("Lesefehler! Überprüfen Sie Ihren HRC-04-Sensor");
  return;
}
if ( debug ) {
  Serial.print("Behälter: ");
  Serial.print(c);
}
client.publish(gladys_topic, String(c).c_str(), true);   // Veröffentlicht den % des Behälters im Thema in Gladys

}
}

Ich muss das überprüfen

Ich weiß nicht!
Vielleicht die IP-Adresse!
Ist es die Adresse von eth0 oder wlan0, die angegeben werden muss?

Das, was du verwendest

Wenn du über WLAN verbunden bist => wlan
Kabel => eth

Zögere nicht, die Tags zu verwenden, um den Code zu formatieren, es gibt ein Tutorial

Das wird für uns lesbarer sein

Ich habe es gerade getestet, es ist tatsächlich lesbarer

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

/* WIFI */
#define wifi_ssid "Txxxxxxxxx8" // Ihr WLAN-Name
#define wifi_password "xxxxxxxxxx" // Ihr WLAN-Passwort

/* MQTT */
#define mqtt_server "192.168.1.1xx"
#define mqtt_user "gladys"            // Benutzername
#define mqtt_password "bxxxxxxxxxxxxxV" // MQTT-Passwort
#define gladys_topic "gladys/master/device/mqtt:citerne1:capteur-ultrason/feature/mqtt:citerne1:capteur-ultrason:quantite/state"
#define mqtt_cuve "mqtt:citerne1:capteur-ultrason"     // Sensor-Tank-Topic

/* Buffer, der die empfangenen MQTT-Nachrichten decodiert */

char message_buff[100];
long lastMsg = 0;   // Zeitstempel der letzten auf MQTT veröffentlichten Nachricht
long lastRecu = 0;
bool debug = false;  // Zeigt auf der Konsole an, wenn True

/* Konstanten für die Pins */
const byte TRIGGER_PIN = 7; // TRIGGER-Pin
const byte ECHO_PIN = 6;    // ECHO-Pin

/* Konstanten für den Timeout */
const unsigned long MEASURE_TIMEOUT = 25000UL; // 25ms = ~8m bei 340m/s

/* Schallgeschwindigkeit in der Luft in mm/us */
const float SOUND_SPEED = 340.0 / 1000;

//Erstellung der Objekte
WiFiClient espClient;
PubSubClient mqttclient(espClient);

//Verbindung zum WiFi-Netzwerk
void setup() {
  Serial.begin(115200);                    //Optional für Debugging
  /* Initialisiert die Pins */
  //pinMode(TRIGGER_PIN, OUTPUT);
  //digitalWrite(TRIGGER_PIN, LOW);          // Der TRIGGER-Pin muss im Ruhezustand auf LOW sein
  //pinMode(ECHO_PIN, INPUT);
  setup_wifi();                            //Verbindung zum WLAN-Netzwerk wird hergestellt
  mqttclient.setServer(mqtt_server, 1883);    //Konfiguration der Verbindung zum MQTT-Server
}

void setup_wifi() {
  delay(10);
  Serial.println("\r\n\r\nxxxxxxxxxxx START xxxxxxxxxxxxxxx");
  Serial.print("Verbindung zu ");
  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("WiFi-Verbindung hergestellt ");
  Serial.print("=> IP-Adresse: ");
  Serial.println(WiFi.localIP());
}


//Wiederverbindung
void reconnect() {
Serial.print("MQTT-Test: ");  
Serial.print("=> IP-Adresse: ");
Serial.println(mqtt_server);
  //Schleife bis eine Wiederverbindung hergestellt ist
  while (!mqttclient.connected()) {
    Serial.print("Verbindung zum MQTT-Server...");
    if (mqttclient.connect("ESP8266Client", mqtt_user, mqtt_password)) {
      Serial.println("OK");
    } else {
      Serial.print("FEHLER, Fehler: ");
      Serial.print(mqttclient.state());
      Serial.println(" 5 Sekunden warten, bevor es erneut versucht wird");
      delay(5000);
    }
  }
}


void loop() {

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

  long now = millis();

  /*Eine Nachricht pro Minute senden*/

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

    /* 1. Startet eine Entfernungsmessung, indem ein HIGH-Impuls von 10µs auf den TRIGGER-Pin gesendet wird */

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

    /* 2. Misst die Zeit zwischen dem Senden des Ultraschallimpulses und seinem Echo (falls vorhanden) */

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

    /* 3. Berechnet die Entfernung aus der gemessenen Zeit */

    int distance_mm = measure / 2.0 * SOUND_SPEED;
    float c = 20 - distance_mm; // SEHR WICHTIG Ersetzen Sie 2000 durch die Höhe Ihres Tanks
    c = c / 20;
    c = c * 100;

    //Es ist nicht notwendig, weiterzumachen, wenn der Sensor nichts zurückgibt
    if ( isnan(c)) {
      Serial.println("Lesefehler! Überprüfen Sie Ihren HRC-04-Sensor");
      return;
    }

    if ( debug ) {
      Serial.print("Tank: ");
      Serial.print(c);
    }
    mqttclient.publish(gladys_topic, String(c).c_str(), true);   //Veröffentlicht den % des Tanks im Topic in gladys
  }
}

Hier ist das Pinout-Diagramm:


Mir scheint, dass D6 und D7 die Pins von ARDUINO sind: Digital oder Analog?

Warum hast du nach Serial.begin(115200) bei pinMode // eingefügt?

Das dient dazu, Anmerkungen hinzuzufügen. Du musst sie entfernen, oder war das nur zum Test, von dem du oben gesprochen hast, um zu zeigen, dass die WLAN-Verbindung ohne diese Anmerkung hergestellt wurde?

Das ist ein Kommentar.

Hallo,

Betreffend des im Beitrag 84 gemeldeten Fehlers:

Ich habe die Lösung gefunden, um diese Meldungen nicht mehr zu erhalten:
Es ist das "while (! Serial)"

void setup() 
  Serial.begin(115200);                    // Optional für die Fehlersuche
  while (! Serial) {
    delay(1);  
    /* Initialisiert die Pins */
    pinMode(TRIGGER_PIN, OUTPUT);
    digitalWrite(TRIGGER_PIN, LOW);          // Der TRIGGER-Pin muss im Ruhezustand auf LOW sein
    pinMode(ECHO_PIN, INPUT);
  }

Und jetzt funktioniert es…
Siehe: https://arduino.stackexchange.com/questions/65017/arduino-ide-while-serial

Es geht langsam voran!
:wink:

Man muss nur etwas am USB-Port haben, aber wenn du es an deinem Tank einrichtest, wird dort nichts am Port sein, wenn ich mich nicht irre.

Hallo,
Ich setze meine Erkundung fort!
In diesem Teil des Skripts:

//Wiederverbindung
void reconnect() {
Serial.println("MQTT-Verbindung: ");  
Serial.println("=> IP-Adresse: ");
Serial.println(mqtt_server);
  //Schleife bis eine Wiederverbindung hergestellt ist
  while (!mqttclient.connected()) {
    Serial.print("Verbindung zum MQTT-Server...");
    if (mqttclient.connect("ESP8266Client", mqtt_user, mqtt_password)) {
      Serial.println("OK");
    } else {
      Serial.print("Fehler, Fehler: ");
      Serial.print(mqttclient.state());
      Serial.println(" Wir warten 5 Sekunden bevor wir es erneut versuchen");
      delay(5000);
    }
 }
}

Ergebnis:

........
WiFi-Verbindung hergestellt => IP-Adresse: 192.168.1.59
MQTT-Verbindung: => IP-Adresse: 192.168.1.188
Verbindung zum MQTT-Server...Fehler, Fehler: -2 Wir warten 5 Sekunden bevor wir es erneut versuchen
Verbindung zum MQTT-Server...Fehler, Fehler: -2 Wir warten 5 Sekunden bevor wir es erneut versuchen
Verbindung zum MQTT-Server...Fehler, Fehler: -2 Wir warten 5 Sekunden bevor wir es erneut versuchen

Wenn ich über « MQTT Explorer » teste, erhalte ich folgendes Ergebnis:


Disconnected from server

Muss ich eine spezielle Manipulation am Raspberry durchführen?
Meine MQTT-Konfiguration:

Eine Idee?
:wink:

Ich habe keine Idee. Ich hoffe, dass dir jemand helfen kann :wink:

Deine Adresse 192.168.1.188, ist das dein Gladys-Installer? Worauf ist es installiert, auf einem Raspberry Pi? Einem NAS-Server? Oder etwas anderem?

Ein Teil fragt: ‹ Bist du sicher, dass du das Passwort richtig notiert hast, wobei du auf Groß- und Kleinschreibung geachtet hast? ›, ich sehe es auch nicht…

Ja, das ist die IP-Adresse meines Raspberry, auf dem Gladys installiert ist.

Ich habe das Passwort aus der MQTT-Konfiguration kopiert.