Publish Arduino Sensordaten zu MQTT Server auf Rasberry

Hi ich habe einen Sketch vom Conrad Weihnachtskalender 2016 etwas abgewandelt. Nur IP-Adresse des Servers und WLAN SSID und Passwort…Das WLAN funktioniert aber ich bekomme keine Verbindung zum MQTT Server. Ist eigentlich auch logisch, denn der Raspberry auf dem der Server läuft ist Passwortgesichert. Der Server selbst ist nicht Passwortgesichert.
Ich suche seit ein paar Tagen ne Lösung im Netz aber bis auf Lösungen mit MQTT Passwort habe ich nichts gefunden. Ganz erschließt sich mir auch die mqtt id im scetch nicht. Ich brauch doch keine id für mqtt. Der Scetch läuft bis zur Ausgabe der mqtt id dann ist Ende.(error connecting) Ich kann vom Tablet auf den RaspberryMQTT Server publishen und das dann mit FHEM abbonieren. Umgekehrt läuft es auch.

/*
  MQTT Basic functions
  Change SSID and PASSWORD.
*/

#include <NanoESP.h>
#include <NanoESP_MQTT.h>
#include <SoftwareSerial.h>

#define SSID "XXXXXXXXXXX"
#define PASSWORD "#####################"

#define LED_WLAN 13

#define TEMP A0
#define LIGHT A1
#define HUMIDITY A4
#define GND A5


NanoESP nanoesp = NanoESP();
NanoESP_MQTT mqtt = NanoESP_MQTT(nanoesp);

mqtt_msg newTemp;
mqtt_msg newLight;
mqtt_msg newHum;

String ip, mqttId;

void setup() {
  Serial.begin(19200);

  nanoesp.init();

  nanoesp.configWifiStation(SSID, PASSWORD);

  if (nanoesp.wifiConnected()) {
    Serial.println(F("Wifi Connected"));
    digitalWrite(LED_WLAN, HIGH);
  }
  else {
    Serial.println(F("Wifi not Connected"));
  }


  //Print IP in Terminal
  nanoesp.getIpMac( ip,  mqttId);
  Serial.println("My IP: " + ip);

  //Print MQTTid in Terminal
  mqttId.replace(":", "");
  Serial.println("My MQTT ID: " + mqttId+"\n");
  
  newTemp = {"NanoESP/" + mqttId + "/arduino/temp", "0", 0, true};
  newLight = {"NanoESP/" + mqttId + "/arduino/licht", "0", 0, true};
  newHum = {"NanoESP/" + mqttId + "/arduino/feucht", "0", 0, true};

  //topic,                                value,    QOS, retain
  mqtt_msg lastWill = {"NanoESP/" + mqttId + "/arduino/status", "offline", 0, true};

  //ConnectionID, Brooker, Port, Clean Session, Keep alive Time (def. 120s), Pointer to lastWill MSG, Username, Password
  if (mqtt.connect(0, "192.178.168.23", 1883, mqttId, true, 10, &lastWill, "", "")) {

    Serial.println(F("Connected to Broker"));

    //Change msg
    lastWill.value = "online";
    mqtt.publish(0, &lastWill);

  }
  else {
    Serial.println(F("error connecting"));
  }
}


void loop() {
  int id, len;

  if (nanoesp.recvData(id, len)) {
    mqtt.recvMQTT(id, len); //auto hanlder mit Funktionen
  }

  mqtt.stayConnected(0);
  sendValues();
}

void sendValues() {
  newTemp.value = String(getTemp());
  newLight.value = String(getLight());
  newHum.value = String(getRF());

  mqtt.publish(0, &newTemp);
  mqtt.publish(0, &newLight);
  mqtt.publish(0, &newHum);

  //delay(250);
}

//--------------------------------Sensors----------------------------------------------------

int getRF() {
  long U, R;
  double F;

  pinMode(HUMIDITY, INPUT);       //  Ddrb.3 = 0      'Eingang
  digitalWrite(HUMIDITY, HIGH);   //  Portb.3 = 1     'Pullup ein
  U = analogRead(HUMIDITY);       //  U = Getadc(3)
  digitalWrite(HUMIDITY, LOW);    //  Portb.3 = 0     'Pullup Aus
  pinMode(HUMIDITY, OUTPUT);      //  Ddrb.3 = 1 'Nierohmig

  pinMode(GND, INPUT);            //  Ddrb.4 = 0      'Eingang
  digitalWrite(GND, HIGH);        //  Portb.4 = 1     'Pullup ein
  U += analogRead(GND);           //   U = U + Getadc(2)
  digitalWrite(GND, LOW);         //  Portb.4 = 0     'Pullup Aus
  pinMode(GND, OUTPUT);           //  Ddrb.4 = 1 'Nierohmig. entladen

  U = U / 2;
  R = 3500 * U;                 //'R=35k*(U/1023-U)
  U = 1023 - U;
  R = (U > 0) ? R / U : 999999;     //alternativ writing to: if(U>0) R = R/U; else R=999999;
  R = R - 450;                      //- interner Bahnwiderstand 0,45 k

  //Calculate Humidity
  F = R / 280;
  F = log(F);                                                //ln f !!!
  F = F * 8.9;
  F = 100 - F;
  F = round(F);

  // Serial.println(String(R) + "Ohm     " + String(F) + "%");
  //delay(500);
  return F;
}

double getTemp() {
  //Source: http://playground.arduino.cc/ComponentLib/Thermistor2
  double Temp;
  int RawADC = analogRead(TEMP);
  Temp = log(10000.0 * ((1024.0 / RawADC - 1)));
  //         =log(10000.0/(1024.0/RawADC-1)) // for pull-up configuration
  Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp )) * Temp );
  Temp = Temp - 273.15;            // Convert Kelvin to Celcius
  // Temp = (Temp * 9.0)/ 4.7 + 32.0; // Convert Celcius to Fahrenheit

  Temp = round(Temp * 10);
  Temp = Temp / 10;
  return Temp;
}

int getLight() {
  int vLight = analogRead(LIGHT);
  return vLight;
}

Also vorab:
Code bitte in Code-Tags :wink:

NanoESP.h und NanoESP_MQTT.h sind mir unbekannt, es empfehlen sich Wifi.h und der PubSubClient.

Ist eigentlich auch logisch, denn der Raspberry auf dem der Server läuft ist Passwortgesichert.

–>Ist eigentlich nicht logisch: es interessieren nur 2 Passwörter: einmal für das WLAN und dann für den MQTT-Broker (welcher bei Dir ja nicht passwortgesichert sein soll… nutzt Du mosquitto?)

Ganz erschließt sich mir auch die mqtt id im scetch nicht.

–>die MQTT-ID ist wahrscheinlich der Name des Clients für den Broker. Und wie es scheint, wird diese ID anhand der MAC des ESP generiert. Gibt er die MAC auch richtig aus?

Die serielle Konsole sagt Dir auch wirklich, dass mit dem WiFi-Netzwerk verbunden werden konnte?

“192.178.168.23”–>Und dies ist die WiFi-IP Adresse des Raspberry?

DerLehmi:
"192.178.168.23"-->Und dies ist die WiFi-IP Adresse des Raspberry?

Da das keine "private" IP ist, vermute ich einen Zahlendreher. "192.168.178.23" würde eher passen.

Gruß Tommy

Hallo,

mit der IP stimme ich zu, da hat er wohl einen Zahlendreher drin.

Der Conrad-Kram ist ein Arduino-Nano mit CH340

zusammen mit einem ESP8266-01 auf einem Board.
Wird auch als C-CONTROL DUINO OPEN WIFI-BOARD und zusammen mit Buch als Pretzel Board verkauft.
Die Bibliotheken scheinen also für den Mega328 zu sein und reden dann per AT-Kommando mit dem ESP.
Ein Umstieg der Nutzer auf andere ESP-Versionen und den üblichen Bibliotheken dürfte also sehr verwirrend werden...

Gruß aus Berlin
Michael

Hi,

Oje :stuck_out_tongue: ja es war der Zahlendreher die Verbindung zum Broker steht. Danke vom Dummkopf!

Ja, Es ist ein Pretzelboard mit eigenen Libarys, also ein Nano mit integriertem WLANchip inklusive Stromanpassung auf einer Platine. Welche andere Bibliothek wie dort funktioniert = Verwirrung :slight_smile:

Frage gibt der serielle Monitor alles aus was gesendet wird? Dann scheint nach dem Connect Mqtt nichts mehr zu kommen. Oder endet der Monitor so bald im Wlan gesendet wird und gibt nur die Statusmeldungen vom Arduino aus. Gut, das kann ich sicher nachlesen. Ich werd erst mal die Geschwindigkeit überprüfen, ich glaub der Broker arbeitet mit 52800....

Sorry aber Ich habe kein Icon für den Code gefunden..Doch jetzt ........ :o gleich das erste links. Kann man sicher am Anfang nachlesen...sorry..

Danke und Grüße

Hi

Du kannst auch JEDEN Deiner Posts editieren - allerdings unter den ersten 100 Post's nur im 5-Minuten-Takt.

MfG

Frage gibt der serielle Monitor alles aus was gesendet wird?

-->Nein...lässt sich aber simpel nachholen: einfach in die Messroutinen oder danach im loop() (oder direkt vor den Publish-Funktionen) entsprechend die Daten ausgeben

Ich werd erst mal die Geschwindigkeit überprüfen, ich glaub der Broker arbeitet mit 52800....

-->Auf jeden Fall ist es befremdlich, dass mit jedem loop()-Durchgang die Sensoren ausgelesen und die Daten gesendet werden...

Hi DerLehmi

ok jetzt hab ichs geschnallt, wie ich das nachträglich editieren kann, sorry nochmal.

Die Änderung der Geschwindigkeiten hat nichts gebracht.....aber ich hab meinen Fehler gefunden!
Dadurch das der ursprüngliche Scetch über einen Webserver ging, wurde eine mqtt Id erstellt, welche dann auch in die subscribe und publish Adressen eingebaut wurde. Da kann ich lange das Ende auf arduino/temp verändern und dann darauf lauschen lassen. Ich hab den ganzen mqtt id Quatsch rausgeschmissen und schon gehts. Das es so oft sendet ist mir egal, kommt ja eher drauf an sie oft fhem zuhört. Außerdem gehts in eine Datenbank die täglich gelöscht wird. Ok Belastung Strom und WLAN aber bei den paar Bits.....Na mal sehen man kann ja noch ein wait xxx einbauen.

LG und frohe Ostern und vielen Dank für die Hilfe und nichts für Ungut. Ich erwähnte schon, langsam is mein Kopf voller bunter Knete...

BT

Hi DerLehmi

ok jetzt hab ichs geschnallt, wie ich das nachträglich editieren kann, sorry nochmal.

Die Änderung der Geschwindigkeiten hat nichts gebracht.....aber ich hab meinen Fehler gefunden!
Dadurch das der ursprüngliche Scetch über einen Webserver ging, wurde eine mqtt Id erstellt, welche dann auch in die subscribe und publish Adressen eingebaut wurde. Da kann ich lange das Ende auf arduino/temp verändern und dann darauf lauschen lassen. Ich hab den ganzen mqtt id Quatsch rausgeschmissen und schon gehts.

Zum dritten mal geändert, denn ich lerne gerade dazu.....

Frage im Scetch steht unter anderem:

  // Serial.println(String(R) + "Ohm     " + String(F) + "%");
  //delay(500);

wenn ich hier die // weg nehme wirds langsamer und ich bekomme die Daten auf den seriellen Monitor....aber delay stoppt den Arduino? Habe ich gelesen - ist das so?

LG und frohe Ostern und vielen Dank für die Hilfe und nichts für Ungut. Ich erwähnte schon, langsam is mein Kopf voller bunter Knete

BT

wenn ich hier die // weg nehme wirds langsamer und ich bekomme die Daten auf den seriellen Monitor....aber delay stoppt den Arduino? Habe ich gelesen - ist das so?

-->Ja, natürlich. delay() hält den Prozessor für eine gewisse Zeit an. Ausweichen kann man mit millis() (siehe BlinkWithoutDelay)

... Anhalten passt nicht ganz - delay(x) ist eine Funktion, Die halt x Millisekunden 'im Kreis' läuft - für das Programm ist's wie 'Anhalten' - aber Interrupts werden (z.B.) noch bedient.

... trotzdem sollte man sich überlegen, ob man nicht auf delay() verzichten möchte - besonders, wenn man 'mehr' machen möchte.

Blink_without_delay und der Nachtwächter wurden schon genannt - Beide lesenswert!

MfG