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
Wetterstation die xte
26.07.2018, 11:00 (Dieser Beitrag wurde zuletzt bearbeitet: 26.07.2018 11:32 von muhmuh.)
Beitrag #1
Wetterstation die xte
Mahlzeit,

ich habe vor ein paar Monaten mit einem Nodemcu ESP32, einem BME280, einem BH1750, einem Veml6070 sowie einem TX 23 Windsensor eine kleine Wetterstation gebaut, welche die Daten auf Weather Underground hochlädt. Dies hat eigentlich die meiste Zeit auch gut funktioniert, bis ich in der Monatsansicht gesehen habe, das es teilweise 0 Werte bzw. -146 Grad Werte vom BME280 gibt. Ich habe die Wetterstation wieder demontiert und nun steht diese in meinem Büro und wartet auf eure Hilfe, da mir keine Lösung einfällt. Ich habe jedoch bereits durch testen herausgefunden, dass es wahrscheinlich ein Problem mit dem i2c ist, da in dem Moment des Ausfalls alle Sensoren Fehlerwerte anzeigen, lediglich das Anemometer weiter richtige Daten liefert. Ich hoffe, ich habe alle Infos reingeschrieben, welche ihr für einen gerne kritischen Blick auf den Code braucht.

Also nochmal kurz zusammengefasst:
Nodemcu ESP32
BME280, BH1750 und VEML6070 per i2c, Kabellänge circa 50cm
Anemometer auf Pin 4

Code:
Code:
//Library Setting
//================================================================================​============
#include <WiFi.h>
#include <ESPmDNS.h>
#include <WiFiUdp.h>
#include <WiFiClientSecure.h>
#include <math.h>
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include "Adafruit_VEML6070.h"
#include <BH1750.h>
#include <time.h>
#include <LaCrosse_TX23.h>


// bme280
//================================================================================​============
Adafruit_BME280 bme; // I2C
float tempc;
float tempf;
float humidity;
float baromin;
float dewptf;
float dewptc;
float dewptf2;

// VEML6070
//================================================================================​============
Adafruit_VEML6070 uv = Adafruit_VEML6070();
int UV = 0;
String UVIndex = "O";

// BH1750
//================================================================================​============
BH1750 lightMeter(0x23);
uint16_t lux        = 250;
float Wattsm2;

// Wifi & Wunderground
//================================================================================​​============
const char* ssid     = "XXX";
const char* password = "XXX";
String WU_pwsID       = "XXX";
String WU_pwsPASSWORD = "XXX";

const char* host      = "rtupdate.wunderground.com"; //"weatherstation.wunderground.com";
const int httpsPort   = 443;

String UploadData, timenow;

// TX23 Wind and -direction
//================================================================================​​============
LaCrosse_TX23 anemometer = LaCrosse_TX23(4); //DATA wire connected to arduino port 4
String dirTable[] = {"N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW"};
String dirTable2[] = {"348.75", "11.25", "33.75", "56.25", "78.75", "101.25", "146.25", "168.75", "191.25", "213.75", "236.25", "258.75", "281.25", "303.75", "326.25"};
float speed;
float speedmph;
int direction;

unsigned long delayTime;

void setup() {
  Serial.begin(115200);
  Serial.println(F("BME280 & VEML6070 & BH1750 % Wind & -direction Upload-Test 2"));
  StartWiFi();
  //bme.begin(0x76);
    bool status;
    
    // default settings
    // (you can also pass in a Wire library object like &Wire2)
    status = bme.begin(0x76);  
    if (!status) {
        Serial.println("Could not find a valid BME280 sensor, check wiring!");
        while (1);
    }
  
  uv.begin(VEML6070_1_T);
  lightMeter.begin();
  //delayTime = 300000; //5 min
  delayTime = 5000; //10 sec
  StartAndGetTime();

}

void loop() {
  UpdateTime();
  timenow = "now"; // or comment this line to upload the local time from the ESP time update
  StartAnemometer();
  readBME();
  readUV();
  readLUX();
  showDEBUG();
  //UploadDataToWU();
  delay(delayTime);
}

void readBME() {
  tempc = bme.readTemperature();
  tempf = (tempc * 1.8) + 32.0; // convert native C to F
  baromin = bme.readPressure() / 100.0F * 0.02953;
  humidity = bme.readHumidity();

  dewptf = (dewPoint(tempf, bme.readHumidity())); //Dew point calc(wunderground) //replaced dht.readtemp with converted temp
  dewptf2 = ((tempc - (100 - humidity) / 5.0) * 9 / 5 + 32);
  dewptc = (dewPoint(tempc, bme.readHumidity())); //Dew point calc(wunderground) //replaced dht.readtemp with converted temp
  delay(1000);
}

void showDEBUG() {

  //BME280 BEGIN
  Serial.print("Temperatur = ");
  Serial.print("\t");
  Serial.print(tempc);
  Serial.println(" *C");

  Serial.print("Temperatur = ");
  Serial.print("\t");
  Serial.print(tempf);
  Serial.println(" *F");

  Serial.print("Taupunkt = ");
  Serial.print("\t");
  Serial.print(dewptc);
  Serial.println(" *C");

  Serial.print("Taupunkt = ");
  Serial.print("\t");
  Serial.print(dewptf);
  Serial.println(" *F");

  Serial.print("Taupunkt = ");
  Serial.print("\t");
  Serial.print(dewptf2);
  Serial.println(" *F");

  Serial.print("Luftdruck = ");
  Serial.print("\t");
  Serial.print(bme.readPressure() / 100);
  Serial.println(" hPa");

  Serial.print("Feuchtigkeit = ");
  Serial.print("\t");
  Serial.print(humidity);
  Serial.println(" %");
  //BME280 END

  //VEML6070 BEGIN
  Serial.print("UV-INDEX = ");
  Serial.print("\t");
  Serial.println(UVIndex);
  //VEML6070 END

  //BH1750 BEGIN
  Serial.print("Helligkeit: ");
  Serial.print("\t");
  Serial.print(lux);
  Serial.println(" Lux");

  Serial.print("Watt m²: ");
  Serial.print("\t");
  Serial.println(Wattsm2);
  //BH1750 END

  //TX 23 BEGIN
  Serial.println("Windrichtung = " + dirTable[direction]);
  Serial.println("Dir = " + dirTable2[direction]);
  Serial.println("Windgeschwindigkeit = " + String(speed, 1) + " m/s");
  Serial.println("Speed = " + String(speedmph) + " mph");
  //TX 23 END

  Serial.println();
}

double dewPoint(double tempf, double humidity)
{
  double A0 = 373.15 / (273.15 + tempf);
  double SUM = -7.90298 * (A0 - 1);
  SUM += 5.02808 * log10(A0);
  SUM += -1.3816e-7 * (pow(10, (11.344 * (1 - 1 / A0))) - 1) ;
  SUM += 8.1328e-3 * (pow(10, (-3.49149 * (A0 - 1))) - 1) ;
  SUM += log10(1013.246);
  double VP = pow(10, SUM - 3) * humidity;
  double T = log(VP / 0.61078);
  return (241.88 * T) / (17.558 - T);
}

boolean UploadDataToWU() {
  WiFiClientSecure client;
  // Use WiFiClientSecure class to create SSL connection
  Serial.println("Connecting to   : " + String(host));
  if (!client.connect(host, httpsPort)) {
    Serial.println("Connection failed");
    return false;
  }
  String url = "/weatherstation/updateweatherstation.php?ID=" + WU_pwsID + "&PASSWORD=" + WU_pwsPASSWORD + "&dateutc=" + timenow +
               "&tempf=" + tempf +
               "&humidity=" + humidity +
               "&dewptf=" + dewptf +          // ***** You must report Dew Point for a valid display to be shown on WU
               "&baromin=" +baromin +
               "&UV=" + UVIndex +
               "&winddir=" + dirTable2[direction] +
               "&windspeedmph=" + speedmph +
               /*
                 "&windgustmph="+WU_windgustmph +
                 "&rainin="+WU_rainin +
                 "&dailyrainin="+WU_dailyrainin +
                 */
                 "&solarradiation="+Wattsm2 +
              
               "&action=updateraw&realtime=1&rtfreq=5";
  Serial.println("Requesting      : " + url);
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "User-Agent: G6EJDFailureDetectionFunction\r\n" +
               "Connection: close\r\n\r\n");
  Serial.print("Request sent    : ");
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line == "\r") {
      Serial.println("Headers received");
      break;
    }
  }
  String line = client.readStringUntil('\n');
  //Serial.println(line);
  boolean Status = true;
  if (line == "success") line = "Server confirmed all data received";
  if (line == "INVALIDPASSWORDID|Password or key and/or id are incorrect") {
    line = "Invalid PWS/User data entered in the ID and PASSWORD or GET parameters";
    Status = false;
  }
  if (line == "RapidFire Server") {
    line = "The minimum GET parameters of ID, PASSWORD, action and dateutc were not set correctly";
    Status = false;
  }
  Serial.println("Server Response : " + line);
  Serial.println("Status          : Closing connection");
  Serial.println();
  return Status;
}

void StartAndGetTime() {
  configTime(0, 0, "0.uk.pool.ntp.org", "time.nist.gov");
  setenv("TZ", "GMT-1BST,M3.5.0/01,M10.5.0/02", 1);
  delay(400);
  time_t rawtime;
  struct tm *info;
  char buffer[80];
  time( &rawtime );
  info = localtime( &rawtime );
  // Upload format for time = dateutc [CCYY-MM-DD HH:MM:SS (mysql format)]
  // 2018-04-30 10:32:35 becomes 2018-04-30+10%3A32%3A35 in url escaped format
  // See: http://www.cplusplus.com/reference/ctime/strftime/
  Serial.println("Upload date-time: CCYY-MM-DD HH:MM:SS   expected");
  strftime(buffer, 80, "%Y-%m-%d+%H:%M:%S", info);
  printf("Upload date-time: %s\n", buffer );
  timenow = buffer; // timenow is correctly formated for WU
  timenow.replace(":", "%3A");
}

void UpdateTime() {
  time_t rawtime;
  struct tm *info;
  char buffer[80];
  time( &rawtime );
  info = localtime( &rawtime );
  strftime(buffer, 80, "%Y-%m-%d+%H:%M:%S", info);
  printf("Upload date-time: %s\n", buffer );
  timenow = buffer;
  timenow.replace(":", "%3A"); // timenow is correctly formated for WU
}
void StartWiFi() {
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("Connection Failed! Rebooting...");
    delay(5000);
    ESP.restart();
  }
  Serial.println("Connected to the WiFi network");
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void StartAnemometer() {
  anemometer.read(speed, direction);
  speedmph = ((speed) * 2.23694);
}

void readUV() {
  UV = uv.readUV();
  if (UV < 50)
  {
    UVIndex = ("0");
  }
  else if (UV > 50 && UV <= 227)
  {
    UVIndex = ("1");
  }
  else if (UV > 227 && UV <= 318)
  {
    UVIndex = ("2");
  }
  else if (UV > 318 && UV <= 408)
  {
    UVIndex = ("3");
  }
  else if (UV > 408 && UV <= 503)
  {
    UVIndex = ("4");
  }
  else if (UV > 503 && UV <= 606)
  {
    UVIndex = ("5");
  }
  else if (UV > 606 && UV <= 696)
  {
    UVIndex = ("6");
  }
  else if (UV > 696 && UV <= 7945)
  {
    UVIndex = ("7");
  }
  else if (UV > 795 && UV <= 881)
  {
    UVIndex = ("8");
  }
  else if (UV > 881 && UV <= 976)
  {
    UVIndex = ("9");
  }
  else if (UV > 976 && UV <= 1079)
  {
    UVIndex = ("10");
  }
  else if (UV > 1079)
  {
    UVIndex = ("11");
  }
}

void readLUX() {
  lux = lightMeter.readLightLevel();
  Wattsm2 = lux / 683.0;
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.07.2018, 11:30
Beitrag #2
RE: Wetterstation die xte
Ich würde Dir empfehlen die SSID und Passworte im Sketch nicht zu veröffentlichen und die veröffentlichten real zu ändern.

Ansonsten ich sehe auf Anhieb keinen Fehler. Höchstens könnten die 50 cm etwas lang sein. Pullup-Widerstände haben die Module ja drauf.

Wie verhält sich denn die Wetterstation jetzt im Arbeitszimmer?
Wenn immer noch nichts über I2C geht, dann die Module mal einzeln anklemmen und schauen, ob eins gestorben ist.

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
26.07.2018, 11:35
Beitrag #3
RE: Wetterstation die xte
(26.07.2018 11:30)Tommy56 schrieb:  Ich würde Dir empfehlen die SSID und Passworte im Sketch nicht zu veröffentlichen und die veröffentlichten real zu ändern.

Ansonsten ich sehe auf Anhieb keinen Fehler. Höchstens könnten die 50 cm etwas lang sein. Pullup-Widerstände haben die Module ja drauf.

Wie verhält sich denn die Wetterstation jetzt im Arbeitszimmer?
Wenn immer noch nichts über I2C geht, dann die Module mal einzeln anklemmen und schauen, ob eins gestorben ist.

Gruß Tommy

Danke, habe ich rausgenommen.
Ich kann jeden Sensor einzeln auslesen, also mit dem jeweiligen Beispiel-Sketch der Libary, als auch gemeinsam. Jedoch kommt irgendwann der 0-Wert bzw. -146 Grad Wert und dann fällt das ganze i2c aus. Dann funktioniert auch kein i2c-Scanner mehr. Nimmt man dem ESP den Saft so für circa 10 min, liest er hiernach wieder alle Daten normal aus. Ja das mit der Kabellänge kann ich mal testen, kann die kurzen Jumperkabel mal nehmen. Ich habe auch schon jeden Sensor und den ESP getauscht, da ich eh alles doppelt bestellt hatte, auch keine Besserung.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.07.2018, 12:17
Beitrag #4
RE: Wetterstation die xte
(26.07.2018 11:35)muhmuh schrieb:  .....
Jedoch kommt irgendwann der 0-Wert bzw. -146 Grad Wert und dann fällt das ganze i2c aus. Dann funktioniert auch kein i2c-Scanner mehr. Nimmt man dem ESP den Saft so für circa 10 min, liest er hiernach wieder alle Daten normal aus. Ja das mit der Kabellänge kann ich mal testen, kann die kurzen Jumperkabel mal nehmen. Ich habe auch schon jeden Sensor und den ESP getauscht, da ich eh alles doppelt bestellt hatte, auch keine Besserung.
Das hört sich fast nach einem Hardwareproblem an.
Wie hast du denn die ganzen Module Verkabelt ?
Mit was für einer Spannung betreibst du da Projekt und wie hast du die Spannung angeschlossen ?
Evtl. wird der Spannungsregler auf dem ESP32 auch überlastet.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.07.2018, 12:18
Beitrag #5
RE: Wetterstation die xte
Du arbeitst sehr intensiv mit Variablen vom Typ String. Das kann nach einiger Zeit dazu führen, dass der gesamte RAM fragmentiert und dann geht auch nichts mehr.

Wenn Du das Senden an den Server und die Bildung des UV-Index auskommentierst (da sind die meisten Strings drin), dauert es dann länger, bis der Ausfall kommt?

Wenn ja, dann entweder auf charArrays umstellen oder wenigstens die Methode reserve des Stringobjects mit der maximal zu erwartenden Länge benutzen.

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
26.07.2018, 12:30
Beitrag #6
RE: Wetterstation die xte
(26.07.2018 12:17)hotsystems schrieb:  Das hört sich fast nach einem Hardwareproblem an.
Wie hast du denn die ganzen Module Verkabelt ?
Mit was für einer Spannung betreibst du da Projekt und wie hast du die Spannung angeschlossen ?
Evtl. wird der Spannungsregler auf dem ESP32 auch überlastet.

Verkabel sind die Sensoren mit einem Telefonkabel 7x0,5, dann auf eine Lochrasterplatine, welche als verlöteter Sockel für den ESP32 dient.
Angeschlossen ist das ESP32 mit dem mitgelieferten USB-Netzteil bzw. Micro-USB an den PC-USB Port. Alle Sensoren sind aktuell am 5V-Pin des ESPs.

(26.07.2018 12:18)Tommy56 schrieb:  Du arbeitst sehr intensiv mit Variablen vom Typ String. Das kann nach einiger Zeit dazu führen, dass der gesamte RAM fragmentiert und dann geht auch nichts mehr.

Wenn Du das Senden an den Server und die Bildung des UV-Index auskommentierst (da sind die meisten Strings drin), dauert es dann länger, bis der Ausfall kommt?

Wenn ja, dann entweder auf charArrays umstellen oder wenigstens die Methode reserve des Stringobjects mit der maximal zu erwartenden Länge benutzen.

Gruß Tommy

Muss ich testen.
Ich baue heute Abend mal beide Systeme parallel auf und schaue mal, ob es Unterschiede gibt.
Das zweite System wird dann wohl wieder back to the basics auf ein Breadboard kommen.

Auf jeden Fall schon einmal Danke für die Anregungen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.07.2018, 12:46
Beitrag #7
RE: Wetterstation die xte
(26.07.2018 12:30)muhmuh schrieb:  ...
Alle Sensoren sind aktuell am 5V-Pin des ESPs.
...

Vorsicht Exclamation Das kann schief gehen.
Ein ESP32 kann an seinen E/A Pins nur bis 3,3V.
Die einzelnen Sensoren gibt es aber meist für 3,3V und 5V. Es gibt sie mit und ohne Pullup-Widerstände und es gibt sie mit und ohne Levelshifter.
In den oft knappen Beschreibungen zu den Sensoren steht das im Detail oft nicht drin, aber es ist wichtig es zu wissen wenn man die Teile an einen ESP anschließt.
Wenn jetzt eines deiner Sensormodule keinen 3,3V Regler verbaut hat aber mit Pullup-Widerständen versehen ist, zieht das den I2C Pegel auf 5V und das mag der ESP32 nicht.
Hast du durchgehen darauf geachtet dass die I2C Anschlüsse der Sensoren nur 3,3V liefern?

Gruß Arne
Mit zunehmender Anzahl qualifizierter Informationen bei einer Fragestellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.07.2018, 13:04
Beitrag #8
RE: Wetterstation die xte
(26.07.2018 12:30)muhmuh schrieb:  ......
Alle Sensoren sind aktuell am 5V-Pin des ESPs.
Und genau hier vermute ich dein Problem.
ardu_arne hat dir das schon geschrieben.
Schau dir alle Sensoren genau an, da gibt es sehr unterschiedliche.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Wetterstation mit Wemos d1 mini Beavis1703 2 1.590 13.09.2018 10:43
Letzter Beitrag: Bitklopfer
  ESP32 Wetterstation MeisterQ 16 4.951 31.08.2018 17:34
Letzter Beitrag: MeisterQ
  Wetterstation mit bme280 bauen OCB 50 8.911 14.08.2018 07:30
Letzter Beitrag: Fips

Gehe zu:


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