ArduinoForum.de - Das deutschsprachige Forum rund um den Arduino
ESP32 & WLAN & BME280 & MySql - Druckversion

+- ArduinoForum.de - Das deutschsprachige Forum rund um den Arduino (https://www.arduinoforum.de)
+-- Forum: Arduino-Allgemein (/arduino-Forum-Arduino-Allgemein)
+--- Forum: ESP8266 und ESP32 (/arduino-Forum-ESP8266-und-ESP32)
+--- Thema: ESP32 & WLAN & BME280 & MySql (/arduino-Thread-ESP32-WLAN-BME280-MySql)

Seiten: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16


ESP32 & WLAN & BME280 & MySql - db91595 - 14.02.2020 13:53

Hi Forum!

Ich betreibe ein Netzwerk von Raspi's (Messwerte erfassen) und einem MySql-Server an einer FritzBox.
Da der PiZeroW relativ schlecht zu bekommen ist (und auch relativ teuer) habe ich nun einen ESP32 (c't Make: ESP32 SPECIAL) gekauft und damit einen Temperatur-Sensor mit WLAN und direkt-zugriff auf meinen MySql-Server realisiert.
Ich biete das hier an weil ich einige Tage "suchen & anpassen" musste bis es funktioniert hat.
Jetzt misst der BME280 am ESP32 munter vor sich hin und schickt die Daten an den MySql-Server.
Ich biete das hier als "Beispiel" an für Alle die es gebrauchen können.

Hintergrund:
Ich bin ein Anfänger mit Erfahrung in Linux, RasPi und Python.
Das C++ nicht meine Sprache ist werden die Könner bestimmt auf den ersten Blick sehen. (Wenn's funktioniert ...) [im seriellen Monitor tickert es munter vor sich hin]
Energie sparen ist ein beiläufiges Thema, der ESP32 hängt am 5V-Handy-Netzteil.
An Kommentaren wünsche ich mir "wenn du es so machst - hast du diesen Vorteil / - ist es mehr C++ konform o.Ä.

Code:
// File: Esp1_TempS1.ino

/*
* ESP32 & WLAN & BME280 & MySql
* Version: 2020-02-14
* made with Google & ESP32-Community & "blood, sweat and tears"
* "honor to whom honor is due"(Google translate) (German: "Ehre wem Ehre gebührt")
* compilation: Bt
* Globale Variablen verwenden 40592 Bytes (12%) des dynamischen Speichers,
* 287088 Bytes für lokale Variablen verbleiben.
* Das Maximum sind 327680 Bytes.
*/

// network
#include <NTPClient.h>
#include <WiFi.h>
#include <WiFiUdp.h>
// sensor
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
// sql
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>

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

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 3600, 60000);
WiFiClient client;

MySQL_Connection conn((Client *)&client);
char sqlUser[] = "my sql user";              // MySql connect
char sqlPassword[] = "my sql user password"; // MySql connect
IPAddress sql_server_ip(192,168,1,2);        // my sql server ip

Adafruit_BME280 bme;  // I2C
float tempS1 = 0.0;
int S;
int M;
int H;
String stamp = "";
String formattedDate;
String dayStamp;
String timeStamp;


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

  Serial.println("Initialising connection");
  Serial.println("");
  Serial.print("Connecting to ");
  Serial.println(ssid);

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

  Serial.println("");
  Serial.println("WiFi Connected");
  Serial.print("Assigned IP: ");
  Serial.print(WiFi.localIP());
  Serial.println("");

  Serial.println("Connecting to database");
  
  if (conn.connect(sql_server_ip, 3306, sqlUser, sqlPassword)) {
    Serial.print("conn to: ");
    Serial.println(sql_server_ip);
    delay(1000);
  }
  else {
    Serial.println("SQL-Connection failed.");
  }
  
  conn.close();  
  bool status = bme.begin(0x76); // BME280 connected?
  
  if (!status) {
    Serial.println("Could not find a valid BME280 sensor, check wiring or change I2C address!");
    while (1);
  }

  timeClient.begin();
  while(!timeClient.update()) {
    timeClient.forceUpdate();
  }
}

void loop() {
  S = timeClient.getSeconds();
  M = timeClient.getMinutes();
  H = timeClient.getHours();
  Serial.println("H:" + String(H) + "  M:" + String(M) + "  S:" + String(S));
  
  //Check WiFi connection status
  if(WiFi.status()== WL_CONNECTED){
    timeClient.update();
    // create stamp(yyyy-mm-dd HH:MM:SS)
    formattedDate = timeClient.getFormattedDate();
    //Serial.println(formattedDate);
    // Extract date
    int splitT = formattedDate.indexOf("T");
    dayStamp = formattedDate.substring(0, splitT);
    //Serial.print("DATE: ");
    //Serial.println(dayStamp);
    // Extract time
    timeStamp = formattedDate.substring(splitT+1, formattedDate.length()-1);
    //Serial.print("HOUR: ");
    //Serial.println(timeStamp);
    // stamp for sqlQuery('yyyy-mm-dd HH:MM:SS')
    stamp = "'" + dayStamp + " " + timeStamp + "'"; // stamp for query = 'yyyy-mm-dd HH:MM:SS' (with ' !)
    //Serial.print("stamp: ");
    //Serial.println(stamp);

    if (S==41) {
      // 1x/Minute: Messwert holen
      tempS1 = bme.readTemperature();
      Serial.print("tempS1: ");
      Serial.println(String(tempS1));
    }
    
    if (S==46) {
      // 1x/Minute: MySql-Update Messwert
      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 myDB.myTable SET tempS1=" + String(tempS1) + ", stampEsp1=" + stamp + " WHERE ID=1;";
        Serial.println(sqlQueryStr);
        sqlQueryStr.toCharArray (sqlQueryChar, sqlQueryStr.length());
        cur_mem->execute(sqlQueryChar);
        Serial.println("Query executed? Please check!");
        Serial.print("SQL-Server: ");
        Serial.println(sql_server_ip);
      }
    }

    if (S==58) {
      timeClient.update();
      Serial.println("timeClient.update 1x/Minute");
    }
    
    if ((S==59) and (M==59)) {
      // 1x/Hour timeCliente.forceUpdate & save stamp in MySql
      while(!timeClient.update()) {
        timeClient.forceUpdate();
        Serial.println("timeClient.forceUpdate() [all Hour]:59:59");
      }
      if (conn.connect(sql_server_ip, 3306, sqlUser, sqlPassword)) {
        Serial.println("Running NTP-UPDATE:");
        MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
        char sqlQueryChar[256];
        String sqlQueryStr = "UPDATE myDB.myTable SET ntpUpdate=" + stamp + " WHERE ID=1;";
        Serial.println(sqlQueryStr);
        sqlQueryStr.toCharArray (sqlQueryChar, sqlQueryStr.length());
        cur_mem->execute(sqlQueryChar);
        Serial.print("SQL-Server: ");
        Serial.println(sql_server_ip);
      }
    }
  }
  else {
    Serial.println("WiFi Disconnected, now reconnect");
    WiFi.begin(ssid, password);
  }
  // delay(1000) = cycle 1 Second
  //Serial.println("");
  delay(1000);
}

[attachment=4189]

Edit: Ich war mal so frei und habe den Dateianhang direkt eingefügt. Wink
[Bild: attachment.php?aid=2177]
Anleitung dazu ,bitte lesen und künftig selbst anwenden.Wink

Gruß Arne

Danke Arne !!


RE: ESP32 & WLAN & BME32 & MySql - hotsystems - 14.02.2020 14:07

Ok und danke für deinen Beitrag.

Aber was ist ein BME32 ?

Und für dich zur Info, sieh dir mal die Seite von fips an, da gibt es noch zahlreiche Tipps.


RE: ESP32 & WLAN & BME32 & MySql - amithlon - 14.02.2020 14:13

Hallo,

die beim ESP32 Paket vorhandene time.h (Port der Posix-Timelib) erledigt den ganzen NTP/Zeitkram nahezu ohne Aufwand im Hintergrund.
Wenn Du den BME280 durchlaufen läßt ist die Temepratur eigentlich immer um 1-2 Gard zu hoch. Man sollte den forced-Mode nutzen, der weckt den BME280 aus dem StandBy,macht eine Messung und schickt ihn wieder schlafen.
Beispiele zu beiden sollten zu finden sein, sonst nochmal fragen.

Gruß aus Berlin
Michael


RE: ESP32 & WLAN & BME32 & MySql - db91595 - 14.02.2020 14:14

(14.02.2020 14:07)hotsystems schrieb:  Aber was ist ein BME32 ?

Sorry, mein Fehler!

Bitte an die Moderatoren: im Titel abändern "BME32" in "BME280".
Ich würde es selbst machen, weiß aber nicht wie!


RE: ESP32 & WLAN & BME280 & MySql - Fips - 14.02.2020 19:40

(14.02.2020 13:53)db91595 schrieb:  Ich bin ein Anfänger mit Erfahrung in Linux, RasPi und Python.

An Kommentaren wünsche ich mir "wenn du es so machst - hast du diesen Vorteil / - ist es mehr C++ konform o.Ä.

Ich bin ein Anfänger in Linux Raspberry und Mqtt mit Erfahrung bei den Esp....

Ich bekomme keine Verbindung zu Mosquitto vom Esp32, wie kann ich das debuggen?

Broker ist Installiert
mosquitto version 1.5.7
mosquitto is an MQTT v3.1.1 broker.
User und Passwort habe ich eingerichtet.


Gruß Fips


RE: ESP32 & WLAN & BME280 & MySql - db91595 - 14.02.2020 19:49

(14.02.2020 19:40)Fips schrieb:  Ich bekomme keine Verbindung zu Mosquitto vom Esp32, wie kann ich das debuggen?

Broker ist Installiert
mosquitto version 1.5.7
mosquitto is an MQTT v3.1.1 broker.
User und Passwort habe ich eingerichtet.

Gruß Fips

el Maestro - ich grüße euch.
Zu meinem Bedauern ist weder "mosquitto" noch "MQTT" in meinem geistigen Fundus.

LG
Dietmar


RE: ESP32 & WLAN & BME280 & MySql - Fips - 14.02.2020 20:00

(14.02.2020 19:49)db91595 schrieb:  Zu meinem Bedauern ist weder "mosquitto" noch "MQTT" in meinem geistigen Fundus.

Oh, da habe ich doch was verwechselt!

Zitat:#include <MySQL_Connection.h>

Betriebsblind!

Gruß Fips


RE: ESP32 & WLAN & BME280 & MySql - Fips - 14.02.2020 20:15

Wie Michael schon schrieb, schmeiß das ganze NTP/UDP Time Gedöns raus.
Der Esp32 bringt das schon alles im EspCore mit!

Code:
#include "time.h"
#include <WiFi.h>

struct tm tm;
WiFiClient client;

const char* const PROGMEM ntpServer[] = {"fritz.box", "de.pool.ntp.org", "at.pool.ntp.org", "ch.pool.ntp.org", "ptbtime1.ptb.de", "europe.pool.ntp.org"};

bool getTime() {                                                   // Zeitzone einstellen https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
  configTzTime("CET-1CEST,M3.5.0/02,M10.5.0/03", ntpServer[0]);    // deinen NTP Server einstellen (von 0 - 5 aus obiger Liste)
  if (!getLocalTime(&tm)) return false;
  return true;
}

char* localTime() {
  static char buf[22];                                  // je nach Format von "strftime" eventuell die Größe anpassen
  static time_t lastsec {0};
  getLocalTime(&tm);
  if (tm.tm_sec != lastsec) {
    lastsec = tm.tm_sec;
    strftime (buf, sizeof(buf), "\'%F %T\'", &tm);      // 'yyyy-mm-dd HH:MM:SS' // http://www.cplusplus.com/reference/ctime/strftime/
    time_t now;
    if (!(time(&now) % 86400)) getTime();               // einmal am Tag die Zeit vom NTP Server holen o. jede Stunde "% 3600" aller zwei "% 7200"
  }
  return buf;
}



void setup() {
......
  getTime();  //nach dem Verbindungsaufbau aufrufen
  // besser mit Ausgabe
  if (!getTime()) Serial.print("Zeit konnte nicht geholt werden\n");
....
}

void loop() {
.....
    stamp = localTime();   //Zeitstempel an deine String Variable übergeben
    Serial.print("stamp: ");
    Serial.println(stamp);

    if (tm.tm_sec == 41) {    // http://www.cplusplus.com/reference/ctime/tm/
......


Gruß Fips