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
ESP8266 & WLAN & 2x BME280 & MySql
11.03.2020, 13:10
Beitrag #1
ESP8266 & WLAN & 2x BME280 & MySql
2x BME280 (0x76 & 0x77)
BME280(0x76) für TempSp
BME280(0x77) für TempHo

Leider gibt es die BME280 nur mit 2 ID's.
Es geht einen 2ten i2c-Bus einzurichten. Damit gingen dann 2x2 BME280.
Noch nicht getestet. Mach ich vlt. noch mal.

Code:
/* File: 8266_TempSpHo.ino
* ESP8266 & WLAN & 2x BME280 & MySql & friendly Helpers on
* https://www.arduinoforum.de/
* Version: 2020-03-11
* "honor to whom honor is due"(Google translate) (German: "Ehre wem Ehre gebührt")
* compilation: Bt
*
* Boardinfo:
esptool.py v2.8
Serial port /dev/ttyUSB0
Connecting....
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: 84:f3:eb:e4:20:5e //ESP-SpHo
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 4MB
*/

// network
#include <ESP8266WiFi.h>
#include "time.h"
// sensor
#include <Wire.h>             // includet i2c on D1 & D2
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
// sql
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>

// Sensor Objekt "bme"
Adafruit_BME280 bme;          // i2c

#define DEBUGGING             // Auskommentieren wenn keine Serielle Ausgabe erforderlich ist

#ifdef DEBUGGING              // geklaut bei Fips. hilfreich!
#define DEBUG(...) Serial.println(__VA_ARGS__)
#define DEBUG_F(...) Serial.printf("Funktion: %s meldet in Zeile: %d -> ", __PRETTY_FUNCTION__, __LINE__); Serial.println(__VA_ARGS__)
#else
#define DEBUG(...)
#define DEBUG_F(...)
#endif

struct tm tm;
const uint32_t SYNC_INTERVAL = 24;             // NTP Sync Interval in Stunden
const char* const PROGMEM NTP_SERVER[] = {"fritz.box", "de.pool.ntp.org", "at.pool.ntp.org", "ch.pool.ntp.org", "ptbtime1.ptb.de", "europe.pool.ntp.org"};
extern "C" uint8_t sntp_getreachability(uint8_t);

bool getNtpServer(bool reply = false) {
  uint32_t timeout {millis()};
  configTime("CET-1CEST,M3.5.0/02,M10.5.0/03", NTP_SERVER[0], NTP_SERVER[1], NTP_SERVER[5]);   // Zeitzone einstellen https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
  do {
    delay(25);
    sntp_getreachability(0) ? reply = true : sntp_getreachability(1) ? reply = true : sntp_getreachability(2) ? reply = true : false;
  } while (millis() - timeout <= 1e4 && !reply);
  return reply;
}

WiFiClient client;

const char* ssid     = "xxx";              // WiFi connect
const char* password = "xxx"; // WiFi connect

#define LED_BUILTIN 2
void blink()
{ // Test ob LED_BUITIN funktioniert
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
}

MySQL_Connection conn((Client *)&client);
char sqlUser[]       = "pi";               // MySql connect
char sqlPassword[]   = "rapi1";            // MySql connect
IPAddress sql_server_ip(192,168,101,2);    // MySql Server

byte mac[6];

float tempSp = 0.0;
float tempHo = 0.0;

String LocalZeit = "";
String stamp = "";
unsigned long wifiCheckLastTimestamp = 0;
uint64_t chipid;

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

  while (!Serial) { }        // Wait for serial to initialize.

  Serial.printf("\n\nSketchname: %s\nBuild: %s\t\tIDE: %d.%d.%d\n%s\n\n", // geklaut bei Fips. hilfreich!
                (__FILE__), (__TIMESTAMP__), ARDUINO / 10000, ARDUINO % 10000 / 100, ARDUINO % 100 / 10 ? ARDUINO % 100 : ARDUINO % 10, ESP.getFullVersion().c_str());

  Serial.setDebugOutput(true);

  system_deep_sleep_set_option(2);

  Serial.println("WiFi Init Connection");
  Serial.println("");
  Serial.print("Connecting to ");  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  Serial.println("WiFi Connecting");
  
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(100);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi Connected");
  Serial.print("Assigned IP: ");  Serial.print(WiFi.localIP());
  Serial.println("");
  WiFi.macAddress(mac);
  
  Serial.println("MAC " + WiFi.macAddress()); // brauch ich hier nicht unbedingt - vlt. mal wo anders?

  Serial.println("Connecting to MySql");
  if (conn.connect(sql_server_ip, 3306, sqlUser, sqlPassword))
  {
    Serial.print("conn to SQL-Server: ");  Serial.println(sql_server_ip);
    delay(1000);
  }
  else
  {
    Serial.println("MySql connect failed.");
  }
  conn.close();  

  // BME280 initialisieren
  bool status76;
  status76 = bme.begin(0x76);  
  if (!status76) {
      Serial.println("Could not find a valid BME280(0x76) sensor, check wiring!");
      while (1);
  }
  bme.setSampling(Adafruit_BME280::MODE_FORCED,
                    Adafruit_BME280::SAMPLING_X1, // temperature
                    Adafruit_BME280::SAMPLING_X1, // pressure
                    Adafruit_BME280::SAMPLING_X1, // humidity
                    Adafruit_BME280::FILTER_OFF   );
  tempSp = bme.readTemperature();
  //Serial.print("tempSp : ");  Serial.println(String(tempSp));

  bool status77;
  status77 = bme.begin(0x77);  
  if (!status77) {
      Serial.println("Could not find a valid BME280(0x77) sensor, check wiring!");
      while (1);
  }
  bme.setSampling(Adafruit_BME280::MODE_FORCED,
                    Adafruit_BME280::SAMPLING_X1, // temperature
                    Adafruit_BME280::SAMPLING_X1, // pressure
                    Adafruit_BME280::SAMPLING_X1, // humidity
                    Adafruit_BME280::FILTER_OFF   );
  tempHo = bme.readTemperature();
  //Serial.print("tempHo : ");  Serial.println(String(tempHo));

  bool timeSync = getNtpServer();
  Serial.printf("NTP Synchronisation %s!\n", timeSync ? "erfolgreich" : "fehlgeschlagen");
  
  pinMode(LED_BUILTIN, OUTPUT);
  blink();  //ende setup, 2x blinzeln
}

void loop()
{
  char buff[20];                                            // je nach Format von "strftime" eventuell anpassen
  static time_t lastsec {0};
  time_t now = time(&now);
  localtime_r(&now, &tm);

  if (tm.tm_sec != lastsec)
  {
    lastsec = tm.tm_sec;
    strftime (buff, sizeof(buff), "%d.%m.%Y %T", &tm);      // http://www.cplusplus.com/reference/ctime/strftime/
    if (!(time(&now) % (SYNC_INTERVAL * 3600)))
    {
      getNtpServer(true);
    }
  }

  uint8_t tryCount=0;
  
  if (tm.tm_sec==49)                                        // 1x/Minute: MySql-Update Messwert
  {
    strftime (buff, sizeof(buff), "%F %T", &tm);            // http://www.cplusplus.com/reference/ctime/strftime/
    stamp = String(buff);
    //Serial.println(stamp);
    stamp = "'" + stamp + "'";
    //Serial.println(stamp);

    tempSp = 99.88;
    bme.begin(0x76);  
    tempSp = bme.readTemperature();
    Serial.print("tempSp : ");  Serial.println(String(tempSp));

    tempHo = 88.77;
    bme.begin(0x77);  
    tempHo = bme.readTemperature();
    Serial.print("tempHo : ");  Serial.println(String(tempHo));

    uint8_t tryCount=0;
    
    while (WiFi.status() != WL_CONNECTED && tryCount <= 4)
    {
      delay(500);
      Serial.print(F("."));
      tryCount++;
      wifiCheckLastTimestamp = millis();
      if (tryCount >= 4 && WiFi.status() == WL_CONNECT_FAILED)
      {
          WiFi.begin(ssid, password);                       // ESP32-workaround
      }
    }

    Serial.print("wifi_retry49: ");  Serial.println(String(tryCount));

    if(WiFi.status()== WL_CONNECTED)
    {
      if (conn.connect(sql_server_ip, 3306, sqlUser, sqlPassword))
      {
        Serial.println("Running SQL-UPDATE:");
        MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
        char sqlQueryChar[256];
        String sqlQueryStr = "UPDATE solar.Steuerung SET tempSp=" + String(tempSp) + ", tempHo=" + String(tempHo) + ", stampEspSpHo=" + stamp + " WHERE ID=1;";
        Serial.println(sqlQueryStr);
        sqlQueryStr.toCharArray (sqlQueryChar, sqlQueryStr.length()); // <-- convert sqlQueryStr to CharArray
        cur_mem->execute(sqlQueryChar);                               // execute CharArray
        Serial.println("Query executed? Please check!");
        Serial.print("SQL-Server: ");  Serial.print(sql_server_ip); Serial.print(" ");
        conn.close();
      }
    }
    WiFi.disconnect();
    Serial.println("ESP going sleep");
    Serial.flush();
    system_deep_sleep_instant(50 * 1000000); // sec * 1000000
    // Brücke von D0 nach RST :  RST--->|---D0 //(->|- = Diode)// bleibt drin, damit geht auch noch upload
  }
}

ESP32 Anfänger mit Migrations-Hintergrund (komme von RasPi & Python) Cool
Gruß aus Franken
Dietmar
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.03.2020, 13:27
Beitrag #2
RE: ESP8266 & WLAN & 2x BME280 & MySql
Wofür soll das Gehampel mit String und sqlQueryStr.toCharArray gut sein? Warum nicht gleich snprintf oder snprintf_P?

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
11.03.2020, 13:41
Beitrag #3
RE: ESP8266 & WLAN & 2x BME280 & MySql
Es gibt auch I2C Multiplexer wie z.B. den TCA9548A.
Damit kannst du dann 16 BME280 an einem I2C Bus betreiben. 8 auf Adr. 0x76 und 8 auf Adr. 0x76.

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
11.03.2020, 13:46
Beitrag #4
RE: ESP8266 & WLAN & 2x BME280 & MySql
Code:
Wofür soll das Gehampel..

Das "Gehampel" ist meiner Herkunft geschuldet.
Vorteil: es funktioniert.
Nachteil: den C++-Jüngern dreht's den Magen um.
Jeder darf mit dem Code machen was er will.
Von mir aus auch nach korrektem C++ konvertieren.

Ich hatte vor gut 15..20 Jahren Kontakt mit einem C++ Programmierer.
Der hatte eine Geräteprogrammierung für die Firma gemacht, wo ich dann mit Delphi das Visual-Frontend programmiert habe. (Mein "Baby", liegt heute tot auf dem Server weil die Firma keinen Delphi-Programmierer mehr hat.)
Der Kollege hatte mir damals schon C++ schmackhaft gemacht. Mangels weiterer Berührungspunkte ist da nichts daraus geworden.
Ich lerne hier "a weng" C++ so weit ich das brauche & verstehe.

Also BITTE verzeih mein Gehampel und übersehe es.

Jeder ist zu etwas zu gebrauchen - und wenn es nur als abschreckendes Beispiel ist. (Selbst-vera...schung) Angel

ESP32 Anfänger mit Migrations-Hintergrund (komme von RasPi & Python) Cool
Gruß aus Franken
Dietmar
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.03.2020, 13:52
Beitrag #5
RE: ESP8266 & WLAN & 2x BME280 & MySql
(11.03.2020 13:41)ardu_arne schrieb:  Es gibt auch I2C Multiplexer...

Danke Arne, ist mir bekannt.
Ich versuche mit dem auszukommen, was der ESP hat.
Mit 2x BME280 decke ich hier 2 Räume ab.
Das spart mir einen RasPi Zero.
Der eine ESP macht munter "Schlafzimmer-Temperatur".
Der hier macht dann Speicher- & Holzlager-Temperatur.

ESP32 Anfänger mit Migrations-Hintergrund (komme von RasPi & Python) Cool
Gruß aus Franken
Dietmar
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.03.2020, 14:17
Beitrag #6
RE: ESP8266 & WLAN & 2x BME280 & MySql
Du kannst auch zwei Bme280 mit gleicher Adresse an nur drei Pins des Esp8266 betreiben.

Beispiel


Gruß Fips

Gruß Fips

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.03.2020, 14:26 (Dieser Beitrag wurde zuletzt bearbeitet: 11.03.2020 14:29 von db91595.)
Beitrag #7
RE: ESP8266 & WLAN & 2x BME280 & MySql
Hi Fips,

das sieht zuerst mal "interessant" aus.

Das werde ich mal versuchen bei mir "einzubauen"
(mein Gehampel in dein C++ "übersetzen")

Herzlichen Dank für die Anregung!

Edit: @Tommy
Ich werde mich mal mit "snprintf oder snprintf_P" auseinander setzen.

ESP32 Anfänger mit Migrations-Hintergrund (komme von RasPi & Python) Cool
Gruß aus Franken
Dietmar
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.03.2020, 21:47
Beitrag #8
RE: ESP8266 & WLAN & 2x BME280 & MySql
(11.03.2020 14:26)db91595 schrieb:  Ich werde mich mal mit "snprintf oder snprintf_P" auseinander setzen.
Das finde ich gut. Wenn Du Code ins Forum setzt, fände ich es gut, wenn Du solche Sachen vermeidest. Es könnte sonst einer denken, es muss so sein und dem widerspreche ich halt vehement. Ich habe das snprintf_P in einem anderen Thread #7 angerissen.

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
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  ESP8266-12E & Pullup I2C rev.antun 33 1.341 Heute 01:46
Letzter Beitrag: rev.antun
  ESP8266 exception[9] beim datei schreiben in SPIFFS gk_1 15 315 05.03.2021 11:52
Letzter Beitrag: gk_1
  433 MHz Steckdose mit ESP8266/Alexa schalten Kurt 8 220 04.03.2021 20:20
Letzter Beitrag: hotsystems
  Abgespeckter Sketch für ESP8266 -WLAN Anbindung / Anfänger mizieg 7 394 26.02.2021 17:45
Letzter Beitrag: N1d45
  ESP8266 OTA und Verwendung von TXD0/RXD0 rev.antun 27 1.163 22.02.2021 19:43
Letzter Beitrag: hotsystems
  GPS-Synchronisierung mit NodeMCU-ESP8266 Floke4 3 282 22.02.2021 19:33
Letzter Beitrag: rev.antun
  esp8266 zu html gk_1 9 541 19.02.2021 19:41
Letzter Beitrag: Tommy56
  ESP8266 SD CSV Datei Zeilen rückwärtz RobertHQ 7 498 14.02.2021 19:29
Letzter Beitrag: Corvus
  D1 Mini - WLAN bei Frost nicht möglich? KlaRa 45 2.407 10.02.2021 11:24
Letzter Beitrag: hotsystems
  Erfahrungen mit ESP32 und WLAN/MQTT oder was ich beobachtet habe... Arduino4Fun 22 2.530 08.02.2021 15:34
Letzter Beitrag: ardu_arne

Gehe zu:


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