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
ESP32 & WLAN & BME280 & MySql
14.02.2020, 13:53 (Dieser Beitrag wurde zuletzt bearbeitet: 14.02.2020 15:32 von db91595.)
Beitrag #1
ESP32 & WLAN & BME280 & MySql
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);
}


.txt  Esp1_TempS1.ino.txt (Größe: 5,03 KB / Downloads: 69)

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 !!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.02.2020, 14:07
Beitrag #2
RE: ESP32 & WLAN & BME32 & MySql
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.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.02.2020, 14:13
Beitrag #3
RE: ESP32 & WLAN & BME32 & MySql
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.02.2020, 14:14 (Dieser Beitrag wurde zuletzt bearbeitet: 14.02.2020 14:19 von db91595.)
Beitrag #4
RE: ESP32 & WLAN & BME32 & MySql
(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!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.02.2020, 19:40
Beitrag #5
RE: ESP32 & WLAN & BME280 & MySql
(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

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.02.2020, 19:49
Beitrag #6
RE: ESP32 & WLAN & BME280 & MySql
(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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.02.2020, 20:00
Beitrag #7
RE: ESP32 & WLAN & BME280 & MySql
(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

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.02.2020, 20:15 (Dieser Beitrag wurde zuletzt bearbeitet: 14.02.2020 20:19 von Fips.)
Beitrag #8
RE: ESP32 & WLAN & BME280 & MySql
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

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  ESP32 Schieberegler Woolli 13 327 20.10.2020 13:37
Letzter Beitrag: Tommy56
  Max. Eingangsspannung ESP32 Devkit V1 Gerdchen03 4 170 20.10.2020 00:45
Letzter Beitrag: Bitklopfer
  ESP32 BLE - Wie kann ich die UUID aus INI-WiFiManger übernehmen ? Stargazer 0 125 18.10.2020 16:26
Letzter Beitrag: Stargazer
  AZ-Touch ESP32 Grafiktest ckuehnel 0 175 13.10.2020 17:34
Letzter Beitrag: ckuehnel
  ESP32: Filesystem uploader tool findet mklittlefs.exe nicht ultralex 6 105 12.10.2020 22:07
Letzter Beitrag: hotsystems
  ESP32+SIM808 Gpsdaten auf Display und SMS reinhard-adam 0 187 06.10.2020 16:49
Letzter Beitrag: reinhard-adam
  ESP32+SIM808 GPS Daten auslesen und auf LCD reinhard-adam 2 364 21.09.2020 18:25
Letzter Beitrag: georg01
  Fehler bei Board AI Thinker ESP32-CAM Manny 4 749 30.08.2020 16:37
Letzter Beitrag: Manny
  ESP32 Ethernet shrimps 33 24.412 27.08.2020 15:05
Letzter Beitrag: biologist
  ESP32 Dev Kit 4711engel 12 1.612 26.08.2020 08:41
Letzter Beitrag: 4711engel

Gehe zu:


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