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:
  • 1 Bewertungen - 4 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino Wetterstation mqtt iobroker
15.05.2018, 22:56
Beitrag #1
Arduino Wetterstation mqtt iobroker
Hallo Zusammen,
ich habe eine Wetterstation (Wind, Windrichtung, Temperatur, Solar, Regen, etc.) mit einem Arduino Mega realisiert.
Jetzt möchte ich die Daten der Wetterstation über mqtt zum iobroker (Raspberry pi) senden. Wenn eben möglich über wifi. Module wie esp8266 oder nodemcu 8266 stehen zu Verfügung. Oder auch per Funk über NRF24L01 wäre möglich.
Ich habe im WEB leider nicht wirklich viel gefunden.
Aber vielleicht gibt es hier ja eine relativ einfache Lösung?

Über eine Rückmeldung würde ich mich sehr freuen.

Gruß
Manfred
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.05.2018, 08:35 (Dieser Beitrag wurde zuletzt bearbeitet: 16.05.2018 08:36 von amithlon.)
Beitrag #2
RE: Arduino Wetterstation mqtt iobroker
Hallo,

(15.05.2018 22:56)heli-freak66 schrieb:  Jetzt möchte ich die Daten der Wetterstation über mqtt zum iobroker (Raspberry pi) senden. Wenn eben möglich über wifi. Module wie esp8266 oder nodemcu 8266 stehen zu Verfügung. Oder auch per Funk über NRF24L01 wäre möglich.
Ich habe im WEB leider nicht wirklich viel gefunden.
Aber vielleicht gibt es hier ja eine relativ einfache Lösung?

gibt es. Nur die Diskussion darüber, welche es ist, kann endlos werden. Smile

Ohne am bestehenden Projekt viel zu ändern, würde ich es so machen:
eigene Software auf der NodeMCU, die die Daten entgegen nimmt und den MQTT-Kram erledigt. Bei mir wäre die verbindung zwischen beiden per serielle Schnittstelle bevorzugt, andere bemühen da gern I2C. Deine Datenmengen dürften problemlos mit 9600 Baud gehen, am Mege hast Du ja vielleicht auch noch eine Hardware-Seriell zur Verfügung.
Daten einfach rüberschicken, als Protokoll würde ich nur wenig Aufwand treiben. Byte für Übertragungsbeginn, Byte für Typ der Daten und Länge des Datensatzes sollte reichen.
Auf der NodeMCU entweder den PubSubClient oder AsyncMQTT laufen lassen und den Datensatz mit passendem topic rausschicken.

Läßt sich auch gut debuggen, weil man sich die Daten von und zum Mega ja erstmal am PC mit einem Serial-Adapter anschuen kann. Umgekehrt kann man die NodeMCU-Geschichte auch so testen.
Ich nehme meist erstmal die Hardware-Seriell dazu, dann kann man aus der IDE die Teile testen und ersetze dann nur die jeweiligen Aufrufe der Serial.xxx durch die SoftSerial.xxx.
Wie gesagt, wäre meine Version und wird so auch hier genutzt.
Die NodeMCU läßt sich dann auch problemlos durch einen ESP8266-01 mit seiner Hardware-Seriellen ersetzen, wenn alles passt und man das will.
Bei den inzwischen herrschenden Preisen bleibt es bei mir aber meist beim Wemos D1 Mini...

Gruß aus Berlin
Michael
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.05.2018, 12:00
Beitrag #3
RE: Arduino Wetterstation mqtt iobroker
Hallo Michael,

vielen Dank für deine ausführliche Stellungsnahme.
Die Lösung mit der seriellen Schnittstelle finde ich gut.
Möchte nur noch einmal kurz zusammenfassen ob ich das auch richtig verstanden habe.
Der Mega sendet die Daten über die serielle Schnittstelle an den nodemcu.
Das dürfte kein Problem sein. Diese würden dann auf dem seriellen Monitor erscheinen.
Das würde ich auch noch hinbekommen Smile.
Aber jetzt kommt mein Problem.
Wie bekomme ich dann die Daten vom nodemcu weitergeleitet an den Raspberry pi der ja bei mir der MQTT ist.
Ich habe mal nachstehenden Code auf dem nodemcu hochgeladen. Hier ist der dht direkt am nodemcu direkt angeschlossen.
Funktioniert perfekt.
Wie schon oben angedeutet benötige ich nur die Info, wie ich die seriellen Daten vom Mega an den nodemcu weiterleiten kann.

Gruß
Manfred


#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include<dht.h>
dht DHT;

// Define NodeMCU D3 pin to as temperature data pin of DHT11
#define DHT11_PIN D3

// Update these with values suitable for your network.
const char* ssid = "WLAN-SSID;
const char* password = "WLAN-PWD";
const char* mqtt_server = "192.168.2.90";

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;

void setup_wifi() {
delay(100);
// We start by connecting to a WiFi network
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}

void reconnect()
{
// Loop until we're reconnected
while (!client.connected())
{
Serial.print("Attempting MQTT connection...");
// Create a random client ID
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
// Attempt to connect
//if you MQTT broker has clientID,username and password
//please change following line to if (client.connect(clientId,userName,passWord))
if (client.connect(clientId.c_str()))
{
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);
}
}
}

void setup()
{
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
}

void loop()
{
if (!client.connected()) {
reconnect();
}
client.loop();
long now = millis();
// read DHT11 sensor every 6 seconds
if (now - lastMsg > 10000) {
lastMsg = now;
int chk = DHT.read11(DHT11_PIN);
String msg="";
char MsgTemp[25];
char MsgFeutigkeit[25];

msg= DHT.temperature;
msg.toCharArray(MsgTemp,25);

msg=DHT.humidity;
msg=msg+"%";
msg.toCharArray(MsgFeutigkeit,25);

client.publish("Temp", MsgTemp);
client.publish("Feuchtigkeit", MsgFeutigkeit);
}
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.05.2018, 13:00
Beitrag #4
RE: Arduino Wetterstation mqtt iobroker
Setzue Deinen Sketch bitte in Codetags. Wie das geht, steht hier.

Die Frage nach der Weiterleitung hatte Amithlon bereits beantwortet:
Zitat:Auf der NodeMCU entweder den PubSubClient oder AsyncMQTT laufen lassen und den Datensatz mit passendem topic rausschicken.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.05.2018, 13:56
Beitrag #5
RE: Arduino Wetterstation mqtt iobroker
Hallo Tommy,

vielen Dank für deine Meldung.
Leider kann ich mit den Angaben von Amithlon "Auf der NodeMCU entweder den PubSubClient oder AsyncMQTT laufen lassen und den Datensatz mit passendem topic rausschicken" nicht sehr viel anfangen, da meine Programmierkenntnisse sehr begrenzt sind um es mal vorsichtig auszudrücken.
Ich komme mehr aus dem Hause Visualisierung.
Gibt es evtl. einen Link worauf auf dieses Thema näher eingegangen bzw. erklärt wird.

Gruß
Manfred



Code:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include<dht.h>
dht DHT;

// Define NodeMCU D3 pin to as temperature data pin of  DHT11
#define DHT11_PIN D3

// Update these with values suitable for your network.
const char* ssid = "WLAN-SSID;
const char* password = "WLAN-PWD";
const char* mqtt_server = "192.168.2.90";

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;

void setup_wifi() {
   delay(100);
  // We start by connecting to a WiFi network
    Serial.print("Connecting to ");
    Serial.println(ssid);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED)
    {
      delay(500);
      Serial.print(".");
    }
  randomSeed(micros());
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void reconnect()
{
  // Loop until we're reconnected
  while (!client.connected())
  {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP8266Client-";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    //if you MQTT broker has clientID,username and password
    //please change following line to    if (client.connect(clientId,userName,passWord))
    if (client.connect(clientId.c_str()))
    {
      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);
    }
  }
}

void setup()
{
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
}

void loop()
{
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
  long now = millis();
  // read DHT11 sensor every 6 seconds
  if (now - lastMsg > 10000) {
     lastMsg = now;
     int chk = DHT.read11(DHT11_PIN);
     String msg="";
     char MsgTemp[25];
     char MsgFeutigkeit[25];    

     msg= DHT.temperature;
     msg.toCharArray(MsgTemp,25);
        
     msg=DHT.humidity;
     msg=msg+"%";
     msg.toCharArray(MsgFeutigkeit,25);    
          
     client.publish("Temp", MsgTemp);
     client.publish("Feuchtigkeit", MsgFeutigkeit);
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.05.2018, 15:48
Beitrag #6
RE: Arduino Wetterstation mqtt iobroker
Ich habe von MQTT keine Ahnung, da musst Du auf Meldungen von anderen warten.
Ich sammle meine Daten direkt auf dem ESP8266 und schicke sie an eine Datenbank bei meinem Provider. Von dort visualisiere ich sie mit PHP (z.B. mit jpgraph).

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.05.2018, 16:44
Beitrag #7
RE: Arduino Wetterstation mqtt iobroker
Hallo,

ich habe gerade wenig Zeit, als Ansatz:

Code:
...
String inputString = "";               // a string to hold incoming data
boolean stringComplete = false;  // whether the string is complete
...

void setup()
{
  ...
}

void loop()
{
  if (!client.connected())
{
    reconnect();
  }
  client.loop();

  serialEvent();      

  // sendet MQTT-Message wenn ein String von der Seriellen da ist
  if (stringComplete)
  {
      // clear the string:
          
     client.publish("Test/Message", inputString};

     inputString = "";
     stringComplete = false;
  }
}

void serialEvent()
  {
    while (Serial.available())
      {
        // get the new byte:
        char inChar = (char)Serial.read();
        // add it to the inputString:
        inputString += inChar;
        // if the incoming character is a newline, set a flag
        // so the main loop can do something about it:
        if (inChar == '\n')
          {
            stringComplete = true;
          }
      }
  }

Wenn ein String über die Serielle komplett angekommen ist (\n als Endezeichen) wird dieser so wie er ist unter dem Topic Test/Message per MQTT weitergeschickt.

Gruß aus Berlin
Michael
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.05.2018, 22:52
Beitrag #8
RE: Arduino Wetterstation mqtt iobroker
Hallo Michael,

vielen Dank für deinen Ansatz. Ich habe mal versucht deinen Sketch in meinem Sketch einzubauen, nur leider ohne Erfolg.
Es kommen immer Fehlermeldungen.
U.a meckert der nodemcu beim Kompilieren bei dieser Zeile: mclient.publish("Test/Message", inputString};
Auch wenn ich die Summenklammer durch eine normale Klammer austausche Wink
Könntest du mir da da noch einmal helfen?
Im Netz finde ich leider nicht viel zu diesem Thema.

Wie genau muss denn der topic, der vom Mega gesendet wird, aussehen.
Momentan habe ich zum Testen einen Poti der Zahlen von 0 - 1023 an den nodemcu sendet.

Nachstehend der Sketch den auf dem Mega installiert habe.

Code:
#include <SoftwareSerial.h>
//Code by ArduinoAll
SoftwareSerial ArduinoSerial(11, 10); //RX , TX


int sensorPin1 = A0;    // select the input pin for the potentiometer


void setup() {
   Serial.begin(115200);
   ArduinoSerial.begin(115200);
  
   pinMode(13, OUTPUT);

}
void loop() {

    
  while (ArduinoSerial.available() > 0) {
    float val = ArduinoSerial.parseFloat();
    if (ArduinoSerial.read() == '\n') {
      if (val == 0xA0) {
        int A0 = analogRead(A0);
        ArduinoSerial.print(A0);
        ArduinoSerial.print("\n");
      }
     }
  }
}

Gruß
Manfred
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  mqtt subscribe abfragen guenni71 4 634 03.07.2018 21:01
Letzter Beitrag: guenni71
  MQTT ausgabe auf ili9341 wird flasch dargestellt merz 13 1.210 03.04.2018 11:30
Letzter Beitrag: merz
  Firmata (Daten senden an den Arduino und empfangen vom Arduino) comfan 6 2.397 29.04.2017 14:29
Letzter Beitrag: hotsystems
  Wetterstation mit Vorhersage auf Webserver reimundko 8 2.986 05.06.2016 16:06
Letzter Beitrag: reimundko
Brick Arduino Wetterstation Daten zu CSV speichern linuxman 4 4.401 23.08.2015 03:17
Letzter Beitrag: Scherheinz
  Arduino Ethernet mit USB 2 Serial Converter/Welche Einstellungen im Arduino-Sketch lociluke 1 2.381 05.05.2015 13:40
Letzter Beitrag: Bitklopfer
  Arduino Mega-Projekt mit EEPROM auf Arduino Due portieren Foto-Ralf 17 7.149 16.03.2015 12:06
Letzter Beitrag: Foto-Ralf
  Schneehöhe messen für Wetterstation Thrillhouse 4 3.867 22.08.2014 20:10
Letzter Beitrag: Thrillhouse
  Wetterstation mit Arduino, PHP Variable in einem Div Container ausgeben? Froschz 0 1.563 17.02.2014 20:24
Letzter Beitrag: Froschz

Gehe zu:


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