INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 2 Bewertungen - 3 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Wemos d1 Ph Sonde - Hilfe bei Daten per MQTT senden
07.05.2021, 22:42
Beitrag #1
Wemos d1 Ph Sonde - Hilfe bei Daten per MQTT senden
Moin Zs,

ich bin leider recht neu in der Arduino Welt und habe mein bestes gegeben.. Ich hänger aber leider am publish per MQTT bzw der Syntax fest.


Das Program an sich läuft. Wifi geht auch. Ich möchte nun nur noch die Daten per Mqtt an xxx.xxx.xxx.165 senden, port 1884 Topic wäre mir egal, wenn keine Umstände macht Pool und sub Ph Wert

Arduino spuckt den Fehler class PubSub has no member named avaiable

Kann mir evtl jemand helfen?
Danke im vorraus!!

Code:
#include <SPI.h>
#include <ESP8266WiFi.h>
#include<Adafruit_GFX.h>
#include<Adafruit_SSD1306.h>
#include <PubSubClient.h>

#define OLED_RESET 4  

char ssid[] = "###";      
char pass[] = "###;  
const char* MQTT_BROKER = "###";

WiFiClient espClient;
PubSubClient client(espClient);

int status = WL_IDLE_STATUS;

unsigned long int avgValue;  //Store the average value of the sensor feedback
float b;
int buf[10],temp;
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH,SCREEN_HEIGHT,&Wire,OLED_RESET);

void setup() {
  Serial.begin(115200);
  WiFi.disconnect();
  Serial.println("Connecting...");
  WiFi.begin(ssid,pass);
  
  while((!(WiFi.status() == WL_CONNECTED))){
    delay(300);
    Serial.print(".");
  }
  
  Serial.println(WiFi.status());
  Serial.println("Connected!");
  Serial.println("");
   if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c))
  {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);//Dont proceed
  }
display.display();
delay(2);
display.clearDisplay();
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0,5);
display.print("PH Sensor");
display.display();
delay(3000);
client.setServer(MQTT_BROKER, 1884);
}

void loop() {
  //String myData = String(analogRead(A0));
    for(int i=0;i<10;i++)       //Get 10 sample value from the sensor for smooth the value
  {
    buf[i]=analogRead(A0);
    delay(10);
  }
  for(int i=0;i<9;i++)        //sort the analog from small to large
  {
    for(int j=i+1;j<10;j++)
    {
      if(buf[i]>buf[j])
      {
        temp=buf[i];
        buf[i]=buf[j];
        buf[j]=temp;
      }
    }
  }
  avgValue=0;
  for(int i=2;i<8;i++)                      //take the average value of 6 center sample
    avgValue+=buf[i];
  float phValue=(float)avgValue*5.0/1024/6; //convert the analog into millivolt
  phValue=3.5*phValue;  //convert the millivolt into pH value
  phValue=phValue-7.51;
  //String myData = String(analogRead(A0))
  Serial.print("    pH:");  
  Serial.print(phValue,2);
  Serial.println(" ");
  //=============================oled display======================================
  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(20,0);
  display.print("PH Wert");

  display.setTextSize(3);
  display.setCursor(30,30);
  display.print(phValue);
  display.display();

  //=========================Mqtt  ==================================================
     if (!client.connected()) {
        while (!client.connected()) {
            client.connect("ESP8266Client");
            delay(100);
        }
    }
    client.loop();
    client.publish("/home/data", "phValue");

  
  while (client.available()) {
    char c = client.read();
    Serial.write(c);
  }
  if (!client.connected()) {
    client.stop();
  }
  delay(5000);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.05.2021, 06:34
Beitrag #2
RE: Wemos d1 Ph Sonde - Hilfe bei Daten per MQTT senden
Ich hab mal in meinen MQTT Sketch geschaut. Dinge die bei mir anders laufen:
Code:
PubSubClient mqttclient(mqtt_server,port,0,espClient);                    // MQTT initialisieren
Ich übergebe den MQTT Server, Port, etc schon vor dem Setup.

Wenn ich mich recht entsinne gehört:
Code:
client.loop();
an das Ende vom Loop und nicht in eine if-Abfrage. Kommt in meinem Sketch nicht zum tragen, da nur einmal etwas publisht wird. Danach geht der ESP wieder schlafen.

Und hier sendest du nicht den Wert von phValue sondern das Wort "phValue"
Code:
client.publish("/home/data", "phValue");

Ich hänge dir mal meinen Sketch an, der einwandfrei funktioniert. Vielleicht findest du dadurch Unstimmigkeiten bei dir. Und wenn Fragen dazu auftreten, einfach Fragen.

Code:
//Bibliotheken
#include <ESP.h>
#include <Wire.h>                                                         // für I2C (BME280, OLED, etc.)
#include <Adafruit_Sensor.h>                                              // für BME280
#include <Adafruit_BME280.h>                                              // für BME280
#include <ESP8266WiFi.h>                                                  // ESP8266 WLAN Bibliothek
#include <PubSubClient.h>                                                 // MQTT Bibliothek
#include <Adafruit_GFX.h>                                                 // OLED GFX Bibliothek
#include <Adafruit_SSD1306.h>                                             // OLED SSD1306 Bibliothek

//OLED SSD1306
#define OLED_RESET         -1                                             // Reset Pin # (oder -1 zum nutzen des internen Reset Pins)
#define SCREEN_WIDTH      128                                             // OLED Display Weite, in Pixels
#define SCREEN_HEIGHT      64                                             // OLED Display Höhe, in Pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // OLED initialisieren

//MQTT Topics
#define Temperatur_Topic      "ESP12F/nici/sensor/temperature"            // MQTT Topic für Temperatur
#define Pressure_Topic        "ESP12F/nici/sensor/pressure"               // MQTT Topic für Luftdruck
#define Humidity_Topic        "ESP12F/nici/sensor/humidity"               // MQTT Topic für Luftfeuchte
#define Battery_Voltage_Topic "ESP12F/nici/sensor/voltage"                // MQTT Topic für Batterie Spannung
#define Battery_Level         "ESP12F/nici/sensor/battery"                // MQTT Topic für Batterie Prozent
#define ESP_Voltage_Topic     "ESP12F/nici/sensor/ESPvoltage"             // MQTT Topic für ESP Spannung

//Batterie
#define Battery_Full      4.0                                             // Wert der vollen Batterie zur Prozent Berechnung (linear)
#define Battery_Empty     3.0                                             // Wert der leeren Batterie zur Prozent Berechnung (linear)

/*struct rst_info{
   uint32 reason;
   uint32 exccause;
   uint32 epc1;
   uint32 epc2;
   uint32 epc3;
   uint32 excvaddr;
   uint32 depc;
};*/

String        rinfo;
const char*   ssid = "***";                                         // WLAN Name (SSID)
const char*   password = "***";                          // WLAN Passwort
const char*   mqtt_server = "111, 111, 111, 111";                             // IP des MQTT Brokers (z.b. IP des Raspberry PI)
uint16_t      port = 1883;                                                // Port des MQTT Brokers
char*         clientName = "Sensor Nici";
unsigned long sleepTime = 6e8;                                            // Schlafzeit in Nanosekunden // Bsp: 15e6 = "15 und 6mal 0" = 15.000.000 Nanosekunden = 15.000 Millisekunden = 15 Sekunden // 18e8 = 30Min
float         BattV;
String        sendBattV;
String        sendBattProz;
String        sendTemp;
String        sendHum;
String        sendPress;

Adafruit_BME280 bme;                                                      // BME280 also I2C bei Adafruit_BME280.h initialisieren
WiFiClient espClient;                                                     // WLAN initialisieren
PubSubClient mqttclient(mqtt_server,port,0,espClient);                    // MQTT initialisieren


void setup() {
//  Serial.begin(74880);
  delay(200);
  rinfo = ESP.getResetReason();                                           // Resetgrund einlesen
//  Serial.println(rinfo);
  bme.begin(0x76);                                                        // SDA, SCL, I2C Adress
  
  measureValues();                                                        // Werte einlesen
  
  if (rinfo == "External System"){                                        // Wenn Resetgrund = Resettaster, Display starten
    oled();
  }
  
  // WLAN einstellungen
  IPAddress ip(111, 111, 111, 111);                                        // IP Adresse des ESPs
  IPAddress gateway(111, 111, 111, 111);                                    // Gateway für den ESP
  IPAddress subnet(111, 111, 111, 111);                                     // Subnet für den ESP
  IPAddress dns(111, 111, 111, 111);                                        // DNS für den ESP
  WiFi.config(ip, dns, gateway, subnet);                                  // WLAN am ESP einsellen
  WiFi.persistent(false);                                                 // auskommentieren wenn Netzwerkname oder Passwort in den Flash geschrieben werden sollen
  WiFi.mode(WIFI_STA);
  WiFiStart();

  // MQTT starten
  mqttclient.connect(clientName);

  // Werte an MQTT senden
  printValues();

  delay(300);                                                   // benötigt um die MQTT Daten vor dem DeepSleep sicher zu senden (Der braucht wohl ein bissl dafür ^^)
  ESP.deepSleep(sleepTime);                                     // Schlafzeit in Nanosekunden, für DeepSleep muss D0 mit Reset verbunden sein, zum aufwecken
  delay(100);                                                   // soll benötigt werden um korekt schlafen zu gehen
}

void loop() {}                                                  // wird bei DeepSleep nicht benötigt

void oled() {
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);                            // I2C address = 0x3C (links) oder 0x3D (rechts) (Aufdruck Rückseite verkehrt) // Kann durch umlöten des Widerstandes verändert werden.
  delay(100);                                                           // Pause zum Disply initialisieren
  display.clearDisplay();                                               // Display löschen
  display.setTextSize(2);                                               // Textgröße
  display.setTextColor(WHITE);                                          // Farbe (WHITE/BLACK)
  display.setCursor(0, 0);
  display.println("Nici");
  display.print("Tem: ");
  display.print(sendTemp);
  display.println("C");
  display.print("Feu: ");
  display.print(sendHum);
  display.println("%");
  display.print("Bat: ");
  display.print(sendBattProz);
  display.println("%");
  display.display();
  delay(10000);
  display.clearDisplay();
  display.display();
  display.ssd1306_command(SSD1306_DISPLAYOFF);    
}

void measureValues() {
  
  bme.takeForcedMeasurement();
  
    BattV = float(map(analogRead(A0),0,1023,0,430))/100;
  
  sendBattV = String(BattV);
    
    BattV = (BattV-Battery_Empty)*100/(Battery_Full-Battery_Empty);
    if (BattV < 1) BattV = 1;
    else if (BattV > 100) BattV = 100;
  
  sendBattProz = String(BattV,1);
  sendTemp = String(bme.readTemperature(),1);
  sendHum = String(bme.readHumidity(),1);
  sendPress = String((bme.readPressure() /100.0F),0);                   // hPa
}

void printValues() {
  
  mqttclient.publish(Battery_Voltage_Topic, sendBattV.c_str());
  mqttclient.publish(Battery_Level, sendBattProz.c_str());
  mqttclient.publish(Temperatur_Topic, sendTemp.c_str());
  mqttclient.publish(Pressure_Topic, sendPress.c_str());
  mqttclient.publish(Humidity_Topic, sendHum.c_str());
}


void WiFiStart(){                                               // wird zum verbinden bzw. wiederverbinden zum WLAN ausgeführt
  
  WiFi.begin(ssid, password);

  int i = 20;                                                   // Max Verbindungszeit i*0,5s
  while (WiFi.status() != WL_CONNECTED && i > 0) {
    delay(500);
    i--;
  }
  if (WiFi.status() != WL_CONNECTED){
    ESP.deepSleep(sleepTime/10);                                // Falls die WLAN Verbindung fehlschlägt, schläft er wieder. (z.B. /10 ein Zehntel der voreingestellten Zeit)
    delay(100);
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.05.2021, 07:58
Beitrag #3
RE: Wemos d1 Ph Sonde - Hilfe bei Daten per MQTT senden
ich dank dir! Werd ich mir heut Abend ansehen und mich melden. Komm grad leider nicht dazu... der Pool will fertig gebaut werden ;P
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.05.2021, 20:45 (Dieser Beitrag wurde zuletzt bearbeitet: 08.05.2021 20:56 von SoerenKaiser99.)
Beitrag #4
RE: Wemos d1 Ph Sonde - Hilfe bei Daten per MQTT senden
ich bekomm es nicht hin :/
angepasst hab ich es. aber mir fehlt der publish Teil noch:
Code:
#include <SPI.h>
#include <ESP8266WiFi.h>
#include<Adafruit_GFX.h>
#include<Adafruit_SSD1306.h>
#include <PubSubClient.h>                                                 // MQTT Bibliothek
#define OLED_RESET 4  

//MQTT Topics
#define pH_Topic      "Pool/Sensoren/ph"            // MQTT Topic für pH

/*struct rst_info{
   uint32 reason;
   uint32 exccause;
   uint32 epc1;
   uint32 epc2;
   uint32 epc3;
   uint32 excvaddr;
   uint32 depc;
};*/

char ssid[] = "";      
char pass[] = "###;  
const String myDevice = "PHSens";
const char*   mqtt_server = "192, 168, 2, ##";                             // IP des MQTT Brokers (z.b. IP des Raspberry PI)
uint16_t      port = 1884;                                                // Port des MQTT Brokers
const char*       clientName = "pHSonde";
int status = WL_IDLE_STATUS;
WiFiClient espClient;                                                     // WLAN initialisieren
PubSubClient mqttclient(mqtt_server,port,0,espClient);                    // MQTT initialisieren

unsigned long int avgValue;  //Store the average value of the sensor feedback
float b;
int buf[10],temp;
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH,SCREEN_HEIGHT,&Wire,OLED_RESET);

void setup() {
  Serial.begin(115200);
  WiFi.disconnect();
  Serial.println("Connecting...");
  WiFi.begin(ssid,pass);
  
  while((!(WiFi.status() == WL_CONNECTED))){
    delay(300);
    Serial.print(".");
  }
  // MQTT starten
  mqttclient.connect(clientName);
  
  Serial.println(WiFi.status());
  Serial.println("Connected!");
  Serial.println("");
   if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c))
  {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);//Dont proceed
  }
display.display();
delay(2);
display.clearDisplay();
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0,5);
display.print("PH Sensor");
display.display();
delay(3000);
}

void loop() {
  //String myData = String(analogRead(A0));
    for(int i=0;i<10;i++)       //Get 10 sample value from the sensor for smooth the value
  {
    buf[i]=analogRead(A0);
    delay(10);
  }
  for(int i=0;i<9;i++)        //sort the analog from small to large
  {
    for(int j=i+1;j<10;j++)
    {
      if(buf[i]>buf[j])
      {
        temp=buf[i];
        buf[i]=buf[j];
        buf[j]=temp;
      }
    }
  }
  avgValue=0;
  for(int i=2;i<8;i++)                      //take the average value of 6 center sample
    avgValue+=buf[i];
  float phValue=(float)avgValue*5.0/1024/6; //convert the analog into millivolt
  phValue=3.5*phValue;  //convert the millivolt into pH value
  phValue=phValue-7.51;
  //String myData = String(analogRead(A0))
  Serial.print("    pH:");  
  Serial.print(phValue,2);
  Serial.println(" ");

  //=============================oled display======================================
  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(20,0);
  display.print("PH Wert");

  display.setTextSize(3);
  display.setCursor(30,30);
  display.print(phValue);
  display.display();
  
  //=========================mqtt=================================================

  mqttclient.publish(pH_Topic, (phValue,2);
  }
  while (client.available()) {
    char c = client.read();
    Serial.write(c);
  }
  if (!client.connected()) {
    client.stop();
  }
  delay(5000);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.05.2021, 20:54
Beitrag #5
RE: Wemos d1 Ph Sonde - Hilfe bei Daten per MQTT senden
Moin,
wenn ich es richtig sehe, hast Du vergessen, die PubSubClient.h einzubinden.
Grüße Jan
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.05.2021, 20:56
Beitrag #6
RE: Wemos d1 Ph Sonde - Hilfe bei Daten per MQTT senden
(08.05.2021 20:54)nbk83 schrieb:  Moin,
wenn ich es richtig sehe, hast Du vergessen, die PubSubClient.h einzubinden.
Grüße Jan

Danke ;p das ist mir ne minute später auch aufgefallen! Könntest du mir bei dem Publish Teil helfen?

mqttclient.publish(pH_Topic, (phValue,2); reicht unter mqtt wohl nicht?!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.05.2021, 21:09 (Dieser Beitrag wurde zuletzt bearbeitet: 08.05.2021 21:09 von nbk83.)
Beitrag #7
RE: Wemos d1 Ph Sonde - Hilfe bei Daten per MQTT senden
zum einen fehlt eine schließende Klammer, zum anderen könnte es sein, dass Du phValue vorher in einen String umwandeln musst. So mache ich es zumindest immer.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.05.2021, 21:19
Beitrag #8
RE: Wemos d1 Ph Sonde - Hilfe bei Daten per MQTT senden
(08.05.2021 21:09)nbk83 schrieb:  zum einen fehlt eine schließende Klammer, zum anderen könnte es sein, dass Du phValue vorher in einen String umwandeln musst. So mache ich es zumindest immer.

könntest du mir evtl. den entsprechenden Teil mit dem umwandeln und dem Klammer einfügen hier posten?
Ich hab es nur kopiert und versucht mit logik heran zu gehen aber mir fehlt der Hintergrund. Dank dir schon mal!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Wemos D1 Mini DeepSleep Verbrauch - wo kaufen? andi82 4 369 07.06.2021 08:53
Letzter Beitrag: hotsystems
  Wemos D1 mini: Startet nur nach Upload 1 mal RudolfAtITD 5 554 24.05.2021 18:38
Letzter Beitrag: Tommy56
  SHT30 an Wemos D1 Mini ESP32 Mirkan 6 675 10.05.2021 09:59
Letzter Beitrag: Mirkan
  Wemos D1 R1 PS2 Tastatur Wolli501 6 2.093 02.05.2021 15:22
Letzter Beitrag: Tommy56
  Einen HTML Befehl an meine CCU senden Microsuck 1 486 20.04.2021 15:19
Letzter Beitrag: Tommy56
  Relay über NFC und Wifi schalten, bitte um Hilfe bei der Programmierung Tirol-Daniel 28 2.251 17.04.2021 13:31
Letzter Beitrag: Tommy56
  Wemos D1 mini pro Fehler hitman44NL 7 1.035 16.04.2021 07:55
Letzter Beitrag: hotsystems
  Einer RGB-LED am ESP Werte aus MQTT zuweisen. Manny 2 572 15.04.2021 16:50
Letzter Beitrag: Manny
  ESP32 Daten aus HTML Roger100499 11 1.252 15.04.2021 15:00
Letzter Beitrag: Tommy56
  ESP8266 SPIFF Daten schreiben und zeilenweise lesen? foto2004 10 1.142 15.04.2021 14:26
Letzter Beitrag: hotsystems

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste