[Gelöst] Hilfe bei einem Sketch mit MQTT

Hallo, ich benötige Hilfe bei einem Sketch. Ich möchte gerne den Druck (pressure_bar) über MQTT an IOBROKER übertragen. Leider macht er das nicht, sondern er überträgt sensorVal.

#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
#include <string.h>

// Update these with values suitable for your network.
byte mac[]    = {  0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
IPAddress ip(192, 168, 178, 149);
const char* server = "192.168.178.124";
char in_message[100];
EthernetClient ethClient;
PubSubClient mqttClient(ethClient);

  void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("]\n ");
  for (int i=0;i<length;i++) {
    //Serial.print((char)payload[i]);
    in_message[i]=char(payload[i]);
  }
  //Serial.print(payload);
}

void setup()
{
    // Open serial communications and wait for port to open:

  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Ethernet.begin(mac, ip);
  // Allow the hardware to sort itself out
  delay(1500);
  //mqttClient.setServer(server, 1883);
  mqttClient.setServer("192.168.178.124", 1883);
  mqttClient.setCallback(callback);


  if (mqttClient.connect("arduino-1")) {
    // connection succeeded
    Serial.println("Connected ");
    boolean r= mqttClient.subscribe("test");
    Serial.println("subscribe ");
    Serial.println(r);
  } 
  else {
    // connection failed
    // mqttClient.state() will provide more information
    // on why it failed.
    Serial.println("Connection failed ");
  }

}

  void loop()
  {
    //
int sensorVal=analogRead(A1);
float voltage = (sensorVal*5.0)/1024.0;
    // serial.print("Volts: ");
    // serialplay.print(voltage);
    
  float pressure_pascal = (3.0*((float)voltage-0.47))*1000000.0;
  float pressure_bar = pressure_pascal/10e5;

char sensorVal_string[4];
sprintf(sensorVal_string, "%d", pressure_bar); 
Serial.println("publishing string");
Serial.println(pressure_bar);




char out_msg[100] ="Druck = ";
 strcat(out_msg, sensorVal_string);
boolean rc = mqttClient.publish("test", out_msg );
 byte outmsg[]={0xff,0xfe};
  Serial.println("publishing bytes");
   rc = mqttClient.publish("testbyte", outmsg,2);
  Serial.print("in_message= ");
  Serial.print(in_message);

delay(10000);
    mqttClient.loop();
  }
    


Vielen Dank Vorab
VG

ganzen Sketch als Codescetion gepostet ist schon mal gut.

Aber eine präzisere Beschreibung was da im IOBroker ankommt wäre schon gut.

Am besten mit Beispielzahlen
und dann würde ich mir zur Analyse eben mal auch auf dem Seriellen Monitor genau die variable ausgeben lassen die du per MQTT verschickst.

du machst ein

boolean rc = mqttClient.publish("test", out_msg );

dann mach doch ein

Serial.print("out_msg #") ;
Serial.print(out_msg ) ;
Serial.println("#") ;

Serial.print("outmsg #") ;
Serial.print(outmsg) ;
Serial.println("#") ;

Die Doppelkreuze sollen den wirklichen Anfang und Ende des Inhalts markieren
vgs

@StefanL38 danke für deine Hilfe.
Habe es nun anders gelöst.

#include <Ethernet.h>
#include <PubSubClient.h>
#include <string.h>

// Update these with values suitable for your network.
byte mac[]    = {  0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
IPAddress ip(192, 168, 178, 149);
byte server [] = {192, 168, 178, 152};

EthernetClient ethClient;
PubSubClient mqttClient(server, 1883, ethClient);



void setup() {

  Serial.begin(9600);
  Ethernet.begin(mac);
}

void loop() {

  if (mqttClient.connect("arduino-1")) {
  mqttClient.connect("arduinoClient");
  }

int sensorVal=analogRead(A1);
  float voltage = (sensorVal*5.0)/1024.0;
    // serial.print("Volts: ");
    // serialplay.print(voltage);
    
  float pressure_pascal = (3.0*((float)voltage-0.47))*1000000.0;
  float pressure_bar = pressure_pascal/10e5;
 //

 double pressure = analogRead(A1);
 char stringBuffer[6];
 dtostrf(pressure_bar, 2, 2, stringBuffer);
 //

  Serial.println("publishing string");
  Serial.println(pressure_bar);
 
 delay(10000);
 
  mqttClient.loop();
  mqttClient.publish("test", stringBuffer);
  }
 

Aber die Verbindung bricht halt immer ab mit dem Uno . . . .
Das ganze dient dazu einen Drucksensor der am Sandfilter hängt auszulesen. Daher
auch die Berechnung, damit ich auf bar komme. Vorher hat er mir nur die Volt übermittelt.

VG

Dass die Verbindung abbricht wundert mich nicht bei einem Delay von 10 Sekunden...
Fasse dein Auslesen, Berechnen und die MQTT Übertragung doch mit einer Klammer zusammen und rufe diese alle 10 Sekunden auf.

Und dann nicht mit delay() den 10 Sekundentakt erzeugen sondern mit non-blocking timing
das auf millis() basiert.

vgs

Ja das meinte ich damit, hab mich wohl nicht klar genug ausgedrückt...

Vielen Dank, es funktioniert.
VG

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.