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:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Sensordaten werden nicht richtig berechnet
03.03.2020, 21:48
Beitrag #1
Sensordaten werden nicht richtig berechnet
Hallo liebes Forum,
ich bitte um Hilfe bei einem ESP32/ESP8266 Problem:
ich habe vor zwei Jahren eine Markiesensteuerung mit Arduino gebaut. Die Wetterdaten (Licht, Wind, Regen sowie Temperatur, Luftdruck und Luftfeuchte)kamen über
433 Mhz-Funk zum Arduino-Steuerung und zu zwei weiteren LCD-Anzeigen.Das Programm lief problemlos, der Funk unzuverlässig.
Jetzt habe ich auf ESP32 (Empfänger) und WEMOS D1 mini (Sender) umgebaut. Die Markiesensteuerung funktioniert jetzt zuverlässig über WLAN und MQTT.
Aber die Wetteranzeigen (jetzt Nextion):
alle Sensordaten werden richtig berechnet und angezeigt, nur die Max/Min Werte werden nicht bzw. falsch berechnet. Der selbe einfache Code funktionierte mit Arduino ohne Probleme, jetzt kommt an diesen Stellen irres Zeug oder nichts !

Code:
#include <PubSubClient.h>
#include <ESP8266WiFi.h>

const char* ssid = "XXXXXXX";                    / << kann bis zu 32 Zeichen haben
const char* password = "XXXXXXX";               // << mindestens 8 Zeichen jedoch nicht länger als 64 Zeichen

WiFiClient espclient;
PubSubClient client(espclient);                                      // Setup MQTT client
char StringReceived[100];
const char *topic = "Wetter";                                         // Topic to subcribe to
const char* broker = "192.168.178.53";

float t, p, h, w, r;
unsigned int l;                                                       //Helligkeit Lux
int X, R, RJ, W, P;                                                    

int pmin = 1100;                                                            
int pmax = 900;                  

float tmax = -200;
float tmin = 200;

float hmax = -100;
float hmin = 100;

float wmax = 0;
float rmax = 0;


void setup()
{
  Serial.begin(115200);
  setup_wifi();                                                 // Connect to network
  client.setServer(broker, 1883);
  client.setCallback(callback);
  delay(2500);
}

void setup_wifi()                                              
{
Serial.print("\nConnecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);                                    // Connect to network
while (WiFi.status() != WL_CONNECTED)                          // Wait for connection
{
  delay(500);
  Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}

void reconnect()                                                  // Reconnect to client
{  
while (!client.connected())                                      // Loop until we're reconnected
{
  String clientId = "ESP8266-";                                         // ID für weitere Clients
  clientId += String(random(0xffff), HEX);                              // Zufallszahl für ID
  Serial.printf("MQTT connecting as client %s...\n", clientId.c_str());
  if (client.connect(clientId.c_str()))                                 // verbinden
  Serial.println("Connecting to MQTT...");
  if (client.connect("ESP38266Client" ))
  {
   Serial.println("connected to MQTT broker");
  }
  else
  {
   Serial.print("failed with state ");
   Serial.print(client.state());
   delay(500);
  }
}
Serial.println("ESP32 AS SUBSCRIBER");
Serial.println("Subscribing topic test");
client.subscribe("Wetter");
}

void loop()
{
  if (!client.connected())                                                      // Reconnect if connection is lost
  {
  reconnect();
  }  
  client.loop();
  delay(2000);
  anzeigen();
}

void callback(char* topic, byte* payload, unsigned int length)                   // Broker-Nachrichten empfangen
{
for (int i = 0; i < length; i++)
{
  StringReceived[i] = (char)payload[i];
  sscanf(StringReceived,"%f,%f,%f,%u,%f,%f,%d",&t,&p,&h,&l,&w,&r,&X);            // String "auseiander nehmen"
                                                                                 //Temp, Druck und Feuchte t, p, h ist float
  W = (int) (w +.5);                                                             //Wind von float in int
  R = (int)(r + .5);                                                             //Regen float in int
  RJ = (RJ + r);        
      
  if (t > tmax)tmax = t;        // Berechnung der Max/Min-Werte: max geht                                                
  if (t < tmin)tmin = t;        // min geht nicht, es wird 0 angezeigt
  if (h > hmax)hmax = h;        // geht
  if (h < hmin)hmin = h;        // geht nicht , es wird o angezeigt
  if (P > pmax)pmax = P;        // geht
  if (P < pmin)pmin = P;        // geht nicht
  if (r > rmax)rmax = r;        // geht
  if (w > wmax)wmax = w;        // wenn Wind grösser als 10 km/h steht hier irres Zeug, Wert wird immer grösser bis über 1000!
}
}

void anzeigen()
{
  Serial.print("StringReceived: "); Serial.println(StringReceived);
  Serial.print("Aussentemperatur: "); Serial.print(t); Serial.println(" Grad");
  Serial.print("Luftdruck: "); Serial.print(p); Serial.println(" hPa");
  Serial.print("Luftfeuchte: "); Serial.print(h); Serial.println(" %");
  Serial.print("Regen: "); Serial.println(r);
  Serial.print("Wind: "); Serial.print(W); Serial.println(" km/h");
  Serial.print("MaxWind: "); Serial.print(wmax); Serial.println(" km/h");
  Serial.print("WindSchnitt: "); Serial.print(ws); Serial.println(" km/h");
  Serial.print("MaxTemp: "); Serial.print(tmax); Serial.println(" Grad");
  Serial.print("MinTemp: "); Serial.print(tmin); Serial.println(" Grad");           // es wird 0 angezeigt
  Serial.print("MaxLuftDruck: "); Serial.print(pmax); Serial.println(" hPa");
  Serial.print("MinLuftDruck: "); Serial.print(pmin); Serial.println(" hPa");       // es wird 0 angezeigt  
  Serial.print("MaxLuftfeuchte: "); Serial.print(hmax); Serial.println(" %");
  Serial.print("MinLuftfeuchte: "); Serial.print(hmin); Serial.println(" %");        // es wird 0 angezeigt
  Serial.println("-------------------------------------");
  
}


Ich bin am Ende mit meinem beschränkten Latein.
Der Fehler ist mit ESP32 wie auch mit ESP8266 der gleiche
Arduino-Version 1.8.12
ESP Core 1.04
ESP8266 Core 2.63

Hat irgend jemand ein Idee bzw. einen Hinweis für mich? Ich wäre für jeden Rat dankbar[/code]
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.03.2020, 22:14
Beitrag #2
RE: Sensordaten werden nicht richtig berechnet
int ist bei den ESP 32 bit breit (AVR 16 Bit) , das könnte bei Deiner Umwandlung evtl ein Problem sein.

Baue Dir genügend Serielle Ausgaben ein, um Das Problem einzugrenzen. Das kannst nur Du, da nur Du das Umfeld hast.

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
04.03.2020, 10:12
Beitrag #3
RE: Sensordaten werden nicht richtig berechnet
Soweit ich das Programm auf die Schnelle verstanden habe, denke ich, dass die
for Schleife in der callback Methode so aussehen sollte :

for (int i = 0; i < length; i++)
{
StringReceived[i] = (char)payload[i];
}
und erst danach sscanf(StringReceived,"%f,%f,%f,%u,%f,%f,%d",&t,&p,&h,&l,&w,&r,&X);
und der Rest kommen sollte.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.03.2020, 23:03
Beitrag #4
RE: Sensordaten werden nicht richtig berechnet
(04.03.2020 10:12)arduino2108 schrieb:  Soweit ich das Programm auf die Schnelle verstanden habe, denke ich, dass die
for Schleife in der callback Methode so aussehen sollte :

for (int i = 0; i < length; i++)
{
StringReceived[i] = (char)payload[i];
}
und erst danach sscanf(StringReceived,"%f,%f,%f,%u,%f,%f,%d",&t,&p,&h,&l,&w,&r,&X);
und der Rest kommen sollte.
Hallo arduino2108
Vielen Dank für den Tip: genau das war mein Problem.
Da das Programm am Arduino Nano lief, konnte es nur ein Versehen beim Umkopieren gewesen sein.
Es ist schon erstaunlich, was das für einen Effekt hatte, und vor Allem warum.
Also Danke nochmals in die Runde.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Reset nicht gleich Reset? Mirkan 33 749 Gestern 15:05
Letzter Beitrag: Mirkan
  D1 Mini - WLAN bei Frost nicht möglich? KlaRa 45 2.407 10.02.2021 11:24
Letzter Beitrag: hotsystems
  ESP8266 Webserver nach Zeit nicht mehr verfügbar. ESPWolf 21 2.055 02.02.2021 17:54
Letzter Beitrag: Tommy56
  Bester Weg um Sensordaten zu speichern und auszuwerten basementmedia 42 2.415 06.01.2021 23:45
Letzter Beitrag: Tommy56
  Sketch upload funktioniert plötzlich nicht mehr basementmedia 2 469 02.01.2021 17:31
Letzter Beitrag: Jan Hirt
  ESP32 Devkit c4 Oled und RFID RC522 betreiben klappt nicht steffus 1 431 23.12.2020 12:45
Letzter Beitrag: hotsystems
  ESP8266-01 verbindet sich nicht mit dem WLAN Kopernikus 1 494 02.12.2020 20:02
Letzter Beitrag: Tommy56
  Wifi Reconnect - nicht blockierend Arduino4Fun 6 714 29.11.2020 10:32
Letzter Beitrag: Arduino4Fun
  LittleFS Open, seekSet und Write / Read tut nicht, was es soll Nichtraucher 11 1.036 23.11.2020 21:53
Letzter Beitrag: Nichtraucher
  D1 Mini digitalWrite(D7, LOW) wird nicht LOW KlaRa 3 564 19.11.2020 13:04
Letzter Beitrag: hotsystems

Gehe zu:


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