Analoge Thermostate am Arduino auswerten und per Esp8266 an mysql senden

uwefed:
Das mit dem Widerstand sehe ich eine Fehlerquelle.
Auf dem Arduino UNO bei der Hardware Seriellen Schnittstelle zwischen dem ATmega328 und ATmega16U2 sind zwei 1kOhm Widerstände.

Wenn Du einen 3,3V TX-Ausgang mit einem 1kOhm am RX des ATmega328 anschließt und dieser mit einem 1kOhm Widerstand an den Ausgang des ATmega16U2 angeschlossen ist, hast Du einen Spannungsteiler der die Spannung massiv reduziert sodaß die Pegel nicht erkannt werden.

Grüße Uwe

Uwe, das ist auch nicht für die Hardware-Serielle gedacht, sondern für SoftwareSerial.
Da funktioniert das sehr gut.

bourton88:
Funktioniert nicht gut heißt keine Datenübertragung oder Verbindungsabbrüche etc.?

Würdest du also einen Einsatz mit einem Esp8266 und einem Uno nicht empfehlen?

Eine Empfehlung ist für dich und dein Projekt sehr schwer auszusprechen.

Du solltest unbedingt die Grundlagen vorher lernen. So wird das nichts.

HotSystems:
Eine Empfehlung ist für dich und dein Projekt sehr schwer auszusprechen.

Du solltest unbedingt die Grundlagen vorher lernen. So wird das nichts.

Ja da würde ich dir recht geben. Es fehlt noch an der ein oder anderen Ecke :wink: Bin noch recht neu im Arduino Gewerbe...

bourton88:
Ja da würde ich dir recht geben. Es fehlt noch an der ein oder anderen Ecke :wink: Bin noch recht neu im Arduino Gewerbe...

Dann musst du unbedingt klein anfangen.
Auch dabei helfen wir dir.

Dein Vorhaben ist aktuell noch eine Nummer zu groß.

Mich würde noch interessieren ob nur das Arduino UNO die SoftwareSerial.h bekommt oder auch das Esp8266?

Quasi als Sender vom Arduino ud Empfänger am Esp.
Oder empfängt das Esp die Daten dann schon richtig?

bourton88:
Mich würde noch interessieren ob nur das Arduino UNO die SoftwareSerial.h bekommt oder auch das Esp8266?

Quasi als Sender vom Arduino ud Empfänger am Esp.
Oder empfängt das Esp die Daten dann schon richtig?

In deinem Fall reicht die SoftwareSerial für den Uno.
Auf dem ESP8266-01 kannst du die Hardware Serielle verwenden.
Auf den must du aber zuvor deinen entsprechenden Sketch flashen und danach kann dieser mit dem Uno kommunizieren.

Nur nochmal zum Verständnis.
Ich mache die ganze Arbeit dann auf dem UNO (Messwerte auslesen und aufbereitet) und diese sende ich nur per Software Seial an den ESP der mir dann die Daten mit dem entsprechenden Sketch weitergeleitet richtig?

bourton88:
Nur nochmal zum Verständnis.
Ich mache die ganze Arbeit dann auf dem UNO (Messwerte auslesen und aufbereitet) und diese sende ich nur per Software Seial an den ESP der mir dann die Daten mit dem entsprechenden Sketch weitergeleitet richtig?

Richtig.

Ich bedanke mich für eure Gedankenanstöße. Ich spreche den ESP8266 Chip “vorerst” über eine NodeMCU an. Die Programmierung ist einfacher und man kann “mal eben” was umprogrammieren, ohne ständig die Pins zu tauschen. So kann ich nun die Daten im Arduino einlesen, an den ESP8266 übermittel und per MQTT an FHEM weiterleiten.

Hier mal meine Lösung. Sicher nicht die sauberste aber es funktioniert :wink:

Meine Lösung
Arduino Uno:
Ich lese aktuell zwei Sensoren am Arduino Uno mit den Analogen Pins ein. Diese sende ich dann via ArduinoJson.h and die serielle Schnittstelle.

//Include ArduinoJSON libary
#include <ArduinoJson.h>

//Deklariere Dynamic Document
DynamicJsonDocument doc(1024);

void setup() {
  //Starte Seriellen Monitor
  Serial.begin(115200);
}

void loop() {
     //Schreibe Analoge Daten in variable
     int humidity_ground = analogRead(A0);
     int rain = analogRead(A1);

     //Schreibe Daten in DynamicDocument
     doc["type"] = "response";
     doc["Feuchtigkeit"] = humidity_ground;
     doc["Regen"] = rain;

     //Serialisiere Daten und Übertrage an Serial
     serializeJson(doc,Serial);
     
     //Zeitintervall beliebig anpassen
     delay(30000);
}

ESP8266:
Auf dem ESP8266 bzw. NodeMCU empfange ich die serialisierten JSON Daten per serielle Schnittstelle, deserialisiere sie wieder und schreibe sie in Variablen. Diese sende ich dann nach dem Musterbeispiel von Matthias Kleine (Link zum Code) an MQTT und FHEM.

//Include Wifi libaries
#include <ESP8266WiFi.h>
#include <WiFiClient.h>

//Include ArduinoJSON libary
#include <ArduinoJson.h>

//Include MQTT libary
#include <MQTTClient.h>

//Define MQTT host und WLAN-Daten
const char* host = "192.xxx.xxx.xxx";
const char* ssid = "DeineSSID";
const char* password = "DeinPasswort";

//Deklariere Variablen
String message = "";
double humidity_ground = 0, rain = 0;

//Deklariere Dynamic Document
DynamicJsonDocument doc(1024);

WiFiClient net;
MQTTClient mqtt;

void connect();

void setup() {

  //Starte Seriellen Monitor
  Serial.begin(115200);
  Serial.println();
  Serial.println("Booting...");

  WiFi.mode(WIFI_AP_STA);
  WiFi.begin(ssid, password);

  mqtt.begin(host, net);

  connect();
  Serial.println("Setup completed...");
  
}

void loop() {
  //Lese serielle Schnittstelle (Hier kommt eine Datenpaket im JSON-Format vom UNO)
  message = Serial.readString();

  //Deserialisiere dieses Datenpaket
  DeserializationError error = deserializeJson(doc,message);
  
  //Schreibe deserialisierte Daten in Variablen
  humidity_ground = doc["Feuchtigkeit"];
  rain = doc["Regen"];
  
  mqtt.loop();

  //Sende Daten an MQTT
  Serial.println("Sending... ");
  if (!isnan(humidity_ground)|| !isnan(rain)) {

    mqtt.publish("/Draussen/Garten/Bodensensor/humidityGround", String(humidity_ground));
    mqtt.publish("/Draussen/Garten/Bodensensor/rain", String(rain));

    //Schreibe gelesene Daten zur Kontrolle in Monitor
    Serial.print(" Humidity Ground: ");
    Serial.print(String(humidity_ground));
    Serial.print(" Rain: ");
    Serial.println(String(rain));
  }
  //Zeitintervall beliebig anpassen
  delay(30000);
}

//Erstellt WIFI Connection
void connect() {
  while(WiFi.waitForConnectResult() != WL_CONNECTED) {
    WiFi.begin(ssid, password);
    Serial.println("WiFi connection failed. Retry.");
  }

  Serial.print("Wifi connection successful - IP-Address: ");
  Serial.println(WiFi.localIP());

  while (!mqtt.connect(host)) {
    Serial.print(".");
  }

  Serial.println("MQTT connected!");
}

//Formatiert Daten für MQTT
void messageReceived(String topic, String payload, char * bytes, unsigned int length) {
  Serial.print("incoming: ");
  Serial.print(topic);
  Serial.print(" - ");
  Serial.print(payload);
  Serial.println();
}

Probleme:
Ich habe versucht über die SoftwareSerial.h zu gehen aber hier bekomme ->ICH<- (bestimmt geht das…) keine Strings übertragen. Nur die ASCII Daten, die es mir zu aufwändig sind wieder umzuwandeln…

Nun Verusche ich mich noch daran das ganze ohne NodeMCU auf den “reinen ESP8266” umzubauen.

EDIT:

Wie ich erwartet hatte, funktioniert der Code auch 1:1 auf dem “reinen” ESP-Modul. Das flashen ist ein bisschen kompliziert, da mir der ESP8266 nicht immer direkt im Flashmodus startet. Mit diesen Hilfen (hier) und der Stromversorgung (hier) habe ich den Chip auch stabil bekommen.

Wichtig:

  • Der Kondensator aus dem zweiten link ist ziemlich wichtig gewesen bei mir. Ich bekam sonst immer die Fehlermeldung “wdt reset…” aus dem ESP8266 da dieser nicht konstant mit Strom versorgt worden ist.
  • Vor dem Flashen des ESP8266 mit einem Arduino UNO, den UNO mit einem leeren Sketch betanken
  • Beim flashen des ESP8266 via Arduino UNO muss der TX PIN auf dem TX PIN stecken und der RX PIN auf dem RX PIN
  • ESP8266 mit dem Sketch von oben flashen
  • Nun den TX und RX PIN abziehen und den UNO mit dem Sketch von oben flashen
  • Zuletzt beide Geräte neustarten und die RX und TX PINS vertauschen( RX->TX und TX->RX)

Schönen Gruß
bourton88

Weshalb du die Übertragung mit SoftwareSerial nicht zum Laufen bekommst, kann ich nicht verstehen. Die Schnittstellen werden nahezu gleich angesprochen. Da solltest du mal genauere Infos liefern.