ESP zu mySQL

Hallo,

ich würde gerne die Temperatur eines Sensors, den ich mittels ESP32 auslese, an eine mySQL Datenbank schicken. Messen per ESP klappt bereits mittels folgendem Tutorial:

Der Code:

/*********
  Rui Santos
  Complete project details at https://randomnerdtutorials.com  
  Based on the Dallas Temperature Library example
*********/

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is conntec to the Arduino digital pin 4
#define ONE_WIRE_BUS 4

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature sensor 
DallasTemperature sensors(&oneWire);

void setup(void)
{
  // Start serial communication for debugging purposes
  Serial.begin(9600);
  // Start up the library
  sensors.begin();
}

void loop(void){ 
  // Call sensors.requestTemperatures() to issue a global temperature and Requests to all devices on the bus
  sensors.requestTemperatures(); 
  
  Serial.print("Celsius temperature: ");
  // Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire
  Serial.print(sensors.getTempCByIndex(0)); 
  Serial.print(" - Fahrenheit temperature: ");
  Serial.println(sensors.getTempFByIndex(0));
  delay(1000);
}

Der Code für mehrere Sensoren ist im Link, damit es übersichtlich bleibt verzichte ich erstmal darauf und bleib bei einem-

Für die mySQL und die php Datei verwendet ich folgendes Tut: DIY Cloud Weather Station with ESP32 or ESP8266 | Random Nerd Tutorials

Hier habe ich alles umgesetzt, nur muss ich nun die ESP Datei anpassen, ich muss den Sensor tauschen, den Rest habe ich schon hinbekommen:

/*
  Rui Santos
  Complete project details at Complete project details at https://RandomNerdTutorials.com/cloud-weather-station-esp32-esp8266/

  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.

  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.

*/

#ifdef ESP32
  #include <WiFi.h>
  #include <HTTPClient.h>
#else
  #include <ESP8266WiFi.h>
  #include <ESP8266HTTPClient.h>
  #include <WiFiClient.h>
#endif

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

//Your Domain name with URL path or IP address with path
const char* serverName = "http://example.com/esp-post-data.php";

// Keep this API Key value to be compatible with the PHP code provided in the project page.
// If you change the apiKeyValue value, the PHP file /esp-post-data.php also needs to have the same key
String apiKeyValue = "tPmAT5Ab3j7F9";
String sensorName = "BME280";
String sensorLocation = "Office";

/*#include <SPI.h>
#define BME_SCK 18
#define BME_MISO 19
#define BME_MOSI 23
#define BME_CS 5*/

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme;  // I2C
//Adafruit_BME280 bme(BME_CS);  // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK);  // software SPI

// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
unsigned long lastTime = 0;
// Timer set to 10 minutes (600000)
//unsigned long timerDelay = 600000;
// Set timer to 30 seconds (30000)
unsigned long timerDelay = 30000;

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

  WiFi.begin(ssid, password);
  Serial.println("Connecting");
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to WiFi network with IP Address: ");
  Serial.println(WiFi.localIP());

  // (you can also pass in a Wire library object like &Wire2)
  bool status = bme.begin(0x76);
  if (!status) {
    Serial.println("Could not find a valid BME280 sensor, check wiring or change I2C address!");
    while (1);
  }
  
  Serial.println("Timer set to 30 seconds (timerDelay variable), it will take 30 seconds before publishing the first reading.");
}

void loop() {
  //Send an HTTP POST request every 10 minutes
  if ((millis() - lastTime) > timerDelay) {
    //Check WiFi connection status
    if(WiFi.status()== WL_CONNECTED){
      HTTPClient http;

      // Your Domain name with URL path or IP address with path
      http.begin(serverName);

      // Specify content-type header
      http.addHeader("Content-Type", "application/x-www-form-urlencoded");

      // Prepare your HTTP POST request data
      String httpRequestData = "api_key=" + apiKeyValue + "&sensor=" + sensorName
                            + "&location=" + sensorLocation + "&value1=" + String(bme.readTemperature())
                            + "&value2=" + String(bme.readHumidity()) + "&value3=" + String(bme.readPressure()/100.0F) + "";
      Serial.print("httpRequestData: ");
      Serial.println(httpRequestData);

      // You can comment the httpRequestData variable above
      // then, use the httpRequestData variable below (for testing purposes without the BME280 sensor)
      //String httpRequestData = "api_key=tPmAT5Ab3j7F9&sensor=BME280&location=Office&value1=24.75&value2=49.54&value3=1005.14";

      // Send HTTP POST request
      int httpResponseCode = http.POST(httpRequestData);

      // If you need an HTTP request with a content type: text/plain
      //http.addHeader("Content-Type", "text/plain");
      //int httpResponseCode = http.POST("Hello, World!");

      // If you need an HTTP request with a content type: application/json, use the following:
      //http.addHeader("Content-Type", "application/json");
      //int httpResponseCode = http.POST("{\"value1\":\"19\",\"value2\":\"67\",\"value3\":\"78\"}");

      if (httpResponseCode>0) {
        Serial.print("HTTP Response code: ");
        Serial.println(httpResponseCode);
      }
      else {
        Serial.print("Error code: ");
        Serial.println(httpResponseCode);
      }
      // Free resources
      http.end();
    }
    else {
      Serial.println("WiFi Disconnected");
    }
    lastTime = millis();
  }
}

Vielleicht kann mir da wer helfen? Die alte Lib laden ist klar, dann muss ich noch den Sensor tauschen?

Danke

espler:
dann muss ich noch den Sensor tauschen?

Wenn Du damit meinst, im ersten Sketch anstelle des DS18B20 den BME280 einzubauen, dann ja.
Sonst musst Du genauer beschreiben, was Du meinst.

Gruß Tommy

Tommy56:
Wenn Du damit meinst, im ersten Sketch anstelle des DS18B20 den BME280 einzubauen, dann ja.
Sonst musst Du genauer beschreiben, was Du meinst.

Gruß Tommy

Hallo Tommy,

danke für deine Antwort. Also der Code verwendet (es sind ja mehrer siehe link: DIY Cloud Weather Station with ESP32 or ESP8266 | Random Nerd Tutorials )

$value1 = test_input($_POST["value1"]);

Ich weiß aber nicht, wo der Wert "value 1/2/3" im ESP Prog. definiert ist. Konnte ich nicht ausfindig machen, meine Idee wäre, wenn ich da die Werte Value 1 / 2 und 3 auf andere Sensoren lege, zB 3 Temperatursensoren, dann müsste ich ja das Skript nutzen können...?

LG

Der ESP verschickt die Daten an den Server wo die Internetseite gehostet ist. Dort brauchst Du ein Programm das die Daten die Du über POST (oder auch GET) verschickst und diese in die Datenbank schreibst. Bei mySQL ist typischerweise PHP die Programmsprache der Wahl. Du schreibst eine PHP Seite die du aufrust. Diese nimmt die Daten entgegen und schreibt sie in die Datenbank.

Grüße Uwe

espler:
$value1 = test_input($_POST["value1"]);

Dieser Code ist PHP und liegt auf dem Webserver, nicht auf dem ESP.
Wenn Deine MySQL-DB Direktzugriffe erlaubt, kannst Du auch mit dieser Lib direkt auf sie zugreifen.

Gruß Tommy

Moin,

willst du nur Daten von 3 Sensoren in eine Datenbank schreiben?
Oder willst du mehr?
Z.B. ein Webfrontend, eine Smartphone App, weitere Sensoren z.B. Stromzähler, Wasseruhr, Temperatur, Luftfeuchtigkeit, Luftdruck usw.
Wenn man sowas alles selber programmieren will, dann wird das sehr aufwendig.

Also was genau ist dein Ziel?

Lieben Gruß,
Chris

Hallo,

herzlichen Dank für den Input! Ich sehe mir die Libary mal an, ich hoffe das macht das, was ich brauche und verwirrt nicht zu sehr. :smiley:

Ich möchte das Schritt für Schritt machen, zuerst möchte ich die Temperatur des Heizkörpers, Wand und außen messen, dazu habe ich einen Sensor der auf einem Pin mehrere Temperatursensoren auswerten kann. Diese Daten möchte ich einfach in eine Datenbank bekommen, damit ich das per Grafa darstellen kann.

Ich habe noch mehr Idee, aber Schritt für Schritt macht da mehr Sinn. Parallel dachte ich sonst an Note Red und Rasperri, aber irgendwie hat der Versuch (Rasspi am PC simuliert) - nicht geklappt.

Also konkret gings mir um das darstellen der Messwerte in der Datenbank.

Wenn der ESP einfach so die Daten an das PHP File schickt und das PHP File das an die Datenbank, dann muss das PHP File die Sensorwerte den Parametern "Wert 1, 2, 3" zuordnen, oder nimmt er einfach den ersten gemessenen Wert?

So ganz bin ich da immer noch nicht dahinter gekommen, hab ich zB 3 Temperaturen am Pin 4, und am Pin 6 habe ich einen Schalter, dann habe ich nun 3 Temperaturen und 1 mal ein 1 oder 0 (wenn ich den HIGH oder LOW schalte mit einem Schalter). Nun habe ich also 4 Messwerte, er muss aber doch die Messwerte den Tabellen zuordnen. Also muss das irgendwo definiert sein oder? zB Pin 6 = value 4, Pin 3 = value 1-3. So dachte ich mir das zumindest.

MFG Manuel

Sowas hatte ich vermutet.
Ich hatte mal das gleiche vor.
Inzwischen nutze ich www.volkszaehler.org mit rund 100 Kanälen.
Das läuft auf einem RPi und man kann es sehr gut erweitern wie man will.

Das kann ich dir nur wärmstens empfehlen.

Lieben Gruß,
Chris

themanfrommoon:
Inzwischen nutze ich www.volkszaehler.org mit rund 100 Kanälen.
Das läuft auf einem RPi und man kann es sehr gut erweitern wie man will.

Hallo Chris,

danke, das schaue ich mir auch einmal an, bin mir aber unsicher ob das für mich funktioniert. Ein Beispiel, ich will auch eine kleine Waage bauen, die Medikamente immer misst und dann in der Tabelle darstellt. (Kontrolle bei Bedarfsmedikamenten), denke das wird bei fertigen Lösungen schwer.

MFG Manuel

Ein Beispiel, ich will auch eine kleine Waage bauen, die Medikamente immer misst und dann in der Tabelle darstellt. (Kontrolle bei Bedarfsmedikamenten), denke das wird bei fertigen Lösungen schwer.

Nee, das ist überhaupt kein Problem. Das kannst du ganz einfach selber bauen.

Da nimmst du dir einen µC und baust dir die Waage zusammen. Wenn das dann funktioniert brauchst du nur wiegen und kannst den Wert z.B. per Knopfdruck losschicken.

Ich habe mir z.B. mit einem nodeMCU und drei IR-Lichtschranken drei Drehzahlmesser gebaut, die eine Minute lang die Impulse messen und dann diese Werte über die middleware an die Datenbank schicken. Das ist total einfach.

Dann habe ich mir 8 BME280 Umweltsensoren an einen nodeMCU gebaut, die ebenfalls jede Minute die Werte auslesen und an die Datenbank schicken.

Geht auch andersrum: Hab ein nodeMCU gebaut, der die Daten aus der Datenbank liest und auf einem Display darstellt.

Das volkszaehler Projekt ist OpenSource, da kannst du machen was du willst (Und ich kann quasi kein Linux und programmiere auch nur Gelegenheitsmäßig auf sehr niedrigem Niveau).

Nach rund 2-3 Jahren sieht das bei mir ungefähr so aus:

Das "kann" aber noch einiges mehr. Man kann z.B. auch eine InfluxDB damit füllen, oder mit Grafana was visualisieren.
MQTT und Node-RED kann man damit auch nutzen.
Der große Vorteil ist, dass man nicht bei Null anfangen muss, sondern 98% von dem was man braucht schon da ist. Man muss das Rad ja nicht neu erfinden. Das dreht sich am Ende auch nur.

Lieben Gruß,
Chris

themanfrommoon:
Nee, das ist überhaupt kein Problem. Das kannst du ganz einfach selber bauen.

Hi Chris,

coole Sache, das schaue ich mir mal an und frag dann, wenn ich wo hänge und wenn das okay ist. :slight_smile:

Grüße Manuel

Ja, klaro, gerne :slight_smile:
Falls ich es nicht mitkriegen sollte kannst du auch gerne eine PN schicken.
Besser ist es aber im Forum, damit das auch andere lesen können.

Lieben Gruß,
Chris

Alles klar, gerne. Es ist OT aber keinen eigenen Thread wert, eig ne simple Frage, aber ich denke mal das kann hier jeder ad hoc beantworten. Ich hab ein Relai, JQC 3 FF S Z JQC 3FF S Z Relais 5 v low level trigger Eine 1 Kanal Relais Modul interface Board Schild Für PIC AVR DSP ARM MCU Arduino|Relays| - AliExpress

Da würde ich 12V drüber schalten, der Eingang wird am IN low level triggert... heißt das ich muss einen GND drauf fahren oder von HIGH auf LOW schalten? Also ich denke auf GND eben GND, VCC die 3V3 oder 5V und dann auf low level schalte ich einen Eingangspin auf LOW. Richtig?

LG

schaltest du den PIN auf HIGH schaltet das Relais ab, schaltest ihn LOW, schaltet das Relais ein.

[/quote]

noiasca:
schaltest du den PIN auf HIGH schaltet das Relais ab, schaltest ihn LOW, schaltet das Relais ein.

Danke :slight_smile:

Ich hätte hier mein erstes Programm, ev mag wer einen Blick darauf werfen. Da ich kompletter Neuling bin, würde es mich wundern, wenn es gleich klappt. :smiley:

Falls wer die Zeit hat, würde mich sehr freuen. :slight_smile:

Programm

Es soll eine Flüssigkeit durch den Chiller gekühlt werden. Hier pumpt die Pumpe den Tankinhalt durch eine Kühlspirale, solange, bis die untere Temperatur erreicht ist.

#include <OneWire.h>
#include <DallasTemperature.h>

// GPIO where the DS18B20 is connected to
const int oneWireBus = 4;     

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(oneWireBus);

// Pass our oneWire reference to Dallas Temperature sensor 
DallasTemperature sensors(&oneWire);


void setup() {
 // Start the Serial Monitor
 Serial.begin(115200);
 // Start the DS18B20 sensor
 sensors.begin();
}

void loop() {
 sensors.requestTemperatures(); 
 float temperatureC = sensors.getTempCByIndex(0);
 Serial.print(temperatureC);
 Serial.println("ºC");


// Wenn die Temperatur über 21 Grad geht schaltet sich die Kühlung für eine gewisse Zeit ein, danach eine Pause 

if(temperatureC >=21) {

// Wenn die Temperatur über 21 Grad erreicht schreibt er das gekühlt wird und schaltet Pin 4 auf LOW (=Relai ein)
// Danach scannt er die Temperatur erneut, und springt in der Schleife zum kühlen, bis die Temperatur unter 18.5 Grad geht
// Danach schreibt er, dass gekühlt wurde und schaltet den Pin 13 auf low 
 

do {
   printf("Temperatur über 21 > kühlen"); 
   digitalWrite(4, LOW);

   

   scanf("%temperatureC");
} while(temperatureC >  18.5);


printf("Temperatur auf 18.5 gekühlt");
 digitalWrite(13, HIGH);
}}

Bei Do/ while bin ich mir noch unsicher, ob ich das richtig verstanden hab, und bei scan.

LG

Du brauchst keine gesonderte do/while Schleife. Du hast doch loop.

Gruß Tommy

Tommy56:
Du brauchst keine gesonderte do/while Schleife. Du hast doch loop.

Gruß Tommy

Ja stimmt, aber ich will do while auch mal lernen. Stimmt den der Code so? Wollte es morgen mal testen, beim compilieren gab es erstmal keinen error. Hab den Arduino nun verkabelt, Uno, und wollte das morgen mal antesten.

Du wirst sehr schnell merken, dass die do-while-Schleife den Prozessor blockiert. Du kannst also während dieser Zeit nichts anderes machen.
Wenn, wie bei Dir die Bedingung im Schleifenkörper nicht aktualisiert wird (temperatureC), dann wird das eine klassische Endlosschleife.

Was das scanf da drin soll (außer dass es unvollständig ist), habe ich nicht verstanden.

Gruß Tommy

Tommy56:
Du wirst sehr schnell merken, dass die do-while-Schleife den Prozessor blockiert. Du kannst also während dieser Zeit nichts anderes machen.
Wenn, wie bei Dir die Bedingung im Schleifenkörper nicht aktualisiert wird (temperatureC), dann wird das eine klassische Endlosschleife.

Was das scanf da drin soll (außer dass es unvollständig ist), habe ich nicht verstanden.

Gruß Tommy

Hi, ja stimmt, aber sonst läuft immer das Programm durch, wenn ich da delays einbaue klappt es ja nicht mehr. Hab da einen Fehler, da sollte statt dem scanf ein:

sensors.requestTemperatures();

Oder? Es sollte der Sensor nach der aktuellen Temperatur abgefragt werden, das muss ja in der Schleife passieren, da er ja nicht zu beginn springen kann. Der zweite Fehler ist oben, es muss natürlich der PIN 13 auf Low geschalten werden, am 4er holt er ja den Temp. Wert.

LG