Hallo,
ich werde noch verrückt.
ich schaffe es einfach nicht meine Werte an den MQTT zu senden.
Wenn ich einen Text übertrage der kommt an aber die Werte nicht. Beim Kompilieren zeigt er keinen Fehler.
Anbei mal die entsprechende Code Passage:
void mqttsenden() {
if (!client.connected()) {
reconnect();
}
client.loop();
Serial.print("Sende Daten an MQTT: ");
Serial.println(msg);
client.publish("/Wetterstation/TemperaturCase/", (temperatureDHT));
client.publish("/Wetterstation/Test/", "Hello World");
Serial.println("Daten gesendet !!! ");
delay(5000);
}
Das "Hello World" kommt an. Also sollte die Verbindung Funktionieren.
Sobald ich die Daten vom temperatureDHT Senden möchte kommt als fehler:
no matching function for call to 'PubSubClient::publish(const char [31], float&)'
Wenn temperatureDHT seriell ausgebe zeigt er mir die Temperatur richtig an.
Danke
Warum machst Du einen neuen Thread auf?
Wenn Du die Leser nur mit Codefragmentan abspeist, wirst Du weniger Hilfe bekommen.
Du benutzt eine Methode mit einer Signatur (Parameter) die es so nicht gibt. Du musst die Werte vorher in die Meldung stopfen. Schau Dir mal sprintf/snprintf an.
Gruß Tommy
Hallo,
der ganze Code ist leider zu lang. Ich versuch mal Unwesentliche Subs zu entfernen.
NEuer Thread da es jetzt um diese Fehlermeldung geht. Der Rest passt jetzt ja.
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <WiFiServer.h>
#include <ESP8266WebServer.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include "DHTesp.h"
#include <Wire.h>
#include <Adafruit_INA219.h>
#include "Adafruit_TSL2591.h"
#include <PubSubClient.h>
Adafruit_INA219 ina219;
Adafruit_BME280 bme;
DHTesp dht;
Adafruit_TSL2591 tsl = Adafruit_TSL2591(2591);
WiFiClient wclient;
PubSubClient client(wclient);
long lastMsg = 0;
char msg[50];
int value = 0;
// Das B steht für Sensor BME und TSL
float temperatureB;
float humidityB;
float pressureB;
float Percipitation;
float numClicksRain;
float windSpeed;
float numRevsAnemometer;
char* windDirection;
float luminosity;
volatile unsigned long previousTimeRain=0, previousTimeSpeed=0, delayTime=20;
float temperatureDHT = 0.0;
float humidityDHT = 0.0;
// Deep Sleep Time 60 Sekunden X 1
const int sleepSeconds = 60 * 1;
/************************* WiFi Access Point *********************************/
#define WLAN_SSID "FRITZ!Box 7530 MP"
#define WLAN_PASS "XXX"
/************************* Wettermonster Page *********************************/
const char* id = "XXX";
const char* key = "XXX";
/************************* MQTT Daten *********************************/
#define AIO_SERVER "192.168.178.70"
#define AIO_SERVERPORT 1881 // use 8883 for SSL
#define AIO_USERNAME "XXX"
#define AIO_KEY "XXX"
#define AIO_CLIENTID "Wetterstation"
//***********************Serial Setup Parameter ************************/
void setup(void)
{
Serial.begin(115200);
setup_wifi();
client.setServer(AIO_SERVER, AIO_SERVERPORT);
while (!Serial) {
// will pause Zero, Leonardo, etc until serial console opens
delay(1);
}
//************************INA PARAMETER *****************************/
uint32_t currentFrequency;
// Initialize the INA219.
// By default the initialization will use the largest range (32V, 2A). However
// you can call a setCalibration function to change this range (see comments).
ina219.begin();
// To use a slightly lower 32V, 1A range (higher precision on amps):
//ina219.setCalibration_32V_1A();
// Or to use a lower 16V, 400mA range (higher precision on volts and amps):
//ina219.setCalibration_16V_400mA();
// SCL SDA AN D1 D2 vom Wemos
//*************************Board abfrage und DHT Parameter****************************/
String thisBoard = ARDUINO_BOARD;
Serial.println(thisBoard);
Serial.println("");
Serial.println("Board Erkannt");
Serial.println("");
// Autodetect is not working reliable, don't use the following line
// dht.setup(17);
// use this instead:
dht.setup(12, DHTesp::DHT11); // Connect DHT sensor to GPIO 12 Stift D6
}
/************************* WIFI START *********************************/
/************************* Sub Read DTH *********************************/
void readDHT() {
delay(dht.getMinimumSamplingPeriod());
char humidityDHT = dht.getHumidity();
char temperatureDHT = dht.getTemperature();
Serial.println(" Einlesen DHT Gehaeuse Werte !!!");
Serial.println("Status\tFeuchtigkeit (%)\tTemperatur (C)");
Serial.print(dht.getStatusString());
Serial.print("\t");
Serial.print(humidityDHT, 1); Serial.print(" %");
Serial.print("\t\t\t");
Serial.print(temperatureDHT, 1); Serial.println (" C");
}
/************************* Sub Read TSL *********************************/
/************************* Sub Read INA *********************************/
void readINA() {
float shuntvoltage = 0;
float busvoltage = 0;
float current_mA = 0;
float loadvoltage = 0;
float power_mW = 0;
shuntvoltage = ina219.getShuntVoltage_mV();
busvoltage = ina219.getBusVoltage_V();
current_mA = ina219.getCurrent_mA();
power_mW = ina219.getPower_mW();
loadvoltage = busvoltage + (shuntvoltage / 1000);
Serial.println("Einlesen INA219 ...");
Serial.print("Bus Voltage: "); Serial.print(busvoltage); Serial.println(" V");
Serial.print("Shunt Voltage: "); Serial.print(shuntvoltage); Serial.println(" mV");
Serial.print("Load Voltage: "); Serial.print(loadvoltage); Serial.println(" V");
Serial.print("Current: "); Serial.print(current_mA); Serial.println(" mA");
Serial.print("Power: "); Serial.print(power_mW); Serial.println(" mW");
Serial.println("");
Serial.println("");
}
/************************* Sub Read BME *********************************/
void readBME() {
temperatureB = bme.readTemperature();
humidityB = bme.readHumidity();
pressureB = bme.readPressure() / 100.0F;
}
/************************* Connect MQTT *********************************/
void reconnect()
{
// Loop until we're reconnected
while (!client.connected())
{
Serial.print("Attempting MQTT connection...");
if (client.connect(AIO_CLIENTID,AIO_USERNAME,AIO_KEY))
{
Serial.println("connected");
//once connected to MQTT broker, subscribe command if any
client.subscribe("OsoyooCommand");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 6 seconds before retrying
delay(6000);
}
}
}
/************************* Sub Connect Send Wettermonster ****************************/
/************************* Sub Seriel ausgabe Wettermonster ****************************/
/************************* Sub MQTT Daten Senden****************************/
void mqttsenden() {
if (!client.connected()) {
reconnect();
}
client.loop();
Serial.print("Sende Daten an MQTT: ");
//client.publish("/Wetterstation/TemperaturCase/", (temperatureDHT));
//client.publish("/Wetterstation/TemperaturCase/", (temperatureDHT));
client.publish("/Wetterstation/Test/", "Hello World");
Serial.println("Daten gesendet !!! ");
Serial.println("");
delay(5000);
}
/************************* Hauptprogramm *********************************/
void loop()
{
Serial.println(" STARTE Sensoren");
Serial.println("");
Serial.println("");
readBME();
readTSL();
// Auslesen DHT
readDHT();
// Auslesen INA219
readINA();
// Auslesen Ausgabe Daten für Wettermonster
printDaten();
// Sende daten an MQTT
mqttsenden();
Serial.printf("Deep Sleep fuer %i seconds...", sleepSeconds);
ESP.deepSleep(sleepSeconds * 1000000);
delay(100);
}
Worauf Tommy hinauswill: die Funktion client.publish() erfordert einen string, bzw. eine Zeichenkette. Du übergibst ihm aber eine Variable vom Datentyp float. Also einfach die Variable in eine Zeichenkette umwandeln und diese dann übergeben.
Danke. Werde ich mir mal ansehen wie das geht.
DerLehmi:
Worauf Tommy hinauswill: die Funktion client.publish() erfordert einen string, bzw. eine Zeichenkette. Du übergibst ihm aber eine Variable vom Datentyp float. Also einfach die Variable in eine Zeichenkette umwandeln und diese dann übergeben.
Vielen dank habe es hinbekommen.
Zwar umständlich aber so läuft es.
Zeigst Du uns auch noch, wie Du es hinbekommen hast? Evtl. kan man da noch optimieren.
Außerdem ist es in Foren üblich, die Lösung zu veröffentlichen.
Gruß Tommy
Hallo,
Tommy56:
Zeigst Du uns auch noch, wie Du es hinbekommen hast? Evtl. kan man da noch optimieren.
Außerdem ist es in Foren üblich, die Lösung zu veröffentlichen.
Gruß Tommy
Natürlich.
Und neue Fragen:
Mit umständlich meine ich:
/************************* Sub MQTT Daten Senden****************************/
void mqttsenden() {
float tempC = 0.0;
float humC = 0.0;
if (!client.connected()) {
reconnect();
}
client.loop();
Serial.println("Sende Daten an MQTT: ");
long now = millis();
delay(5000);
float newHum = dht.getHumidity();
float newTemp = dht.getTemperature();
tempC = newTemp;
Serial.print("Temperatur Gehaeuse: ");
Serial.println(String(tempC).c_str());
client.publish("Wetterstation/TemperaturCase", String(tempC).c_str(), true);
humC = newHum;
Serial.print("Feuchtigkeit Gehaeuse: ");
Serial.println(String(humC).c_str());
client.publish("Wetterstation/FeuchtigkeitCase", String(humC).c_str(), true);
client.publish("Wetterstation/Test", "Hello World");
Serial.println("Daten gesendet !!! ");
Serial.println("");
delay(5000);
}
- Kann ich das irgendwie vereinfachen oder muss ich immer 2X convertieren?
- Mein Hello Word kommt jetzt nicht mehr an.
- Kann ich gleich Format mitsenden also °C und % in diesem Fall?
Es kommt ja noch mehr dazu. Wie man dem Gesamten Sketch weiter oben entnehmen kann.