Hallo,
da ich mich mit MQTT noch nicht weiter beschäftigt habe und es auch kaum verstehe wie das funktioniert, bastel und suche ich nach Lösungen wie ich einen ESP dazu bekomme die Daten via WLAN an eine PHP Datei sende die diese dann wiederrum in die Datenbank schreibt zum Auswerten.
Hierzu fand ich ein super Script welches ich etwas angepast habe.
#include <DHT.h>
#include <ESP8266WiFi.h>
WiFiClient client;
#define DHTPIN 4 // SENSOR PIN
#define DHTTYPE DHT22 // SENSOR TYPE - THE ADAFRUIT LIBRARY OFFERS SUPPORT FOR MORE MODELS
DHT dht(DHTPIN, DHTTYPE);
const char* ssid = "Fort Knox";
const char* password = "%5jHghBF6634957$%_nur_ein_kleines_passwort";
const char server[] = "192.168.5.90";
void setup() {
Serial.begin(9600);
delay(100);
// Blinker
pinMode(LED_BUILTIN, OUTPUT);
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
blink (100, 20, 10); }
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP()); }
void loop() {
// DHT Messung
dht.begin();
Serial.println("sensor inizialized");
delay(5000); // GIVE THE SENSOR SOME TIME TO START
blink (100, 20, 10);
int sensorTemp = dht.readTemperature();
Serial.println("temperatur");
int sensorHum = dht.readHumidity();
Serial.println("luftfeuchtigkeit");
Serial.println(sensorTemp);
Serial.println(sensorHum);
Serial.println("\nStarting connection to server...");
if (client.connect(server, 80)) {
Serial.println("connected!!");
WiFi.printDiag(Serial);
String data = "/smarthome/esp/esp_temp.php?areaplace=Balkon&";
data += "temp=";
data += (String) sensorTemp;
data += "&humi=";
data += (String) sensorHum;
Serial.println(data);
client.print(String("GET ") + data + " HTTP/1.1\r\n" +
"Host: " + server + "\r\n" +
"Connection: close\r\n\r\n");
delay(50);
delay(300000);
client.stop(); } }
//Serial.println("Going into deep sleep for xx seconds");
//ESP.deepSleep(20e6); // e.g. 20e6 is 20 seconds
void blink(int t1, int t0, int n) {
// Schaltet LED ein und aus. Übergabeparameter: Millisekunden Ein,
// Millisekunden aus, Anzahl Blinks
// Optional - ggf. weglassen, um Strom zu sparen
int i = 0;
while (i <= n) {
digitalWrite(LED_BUILTIN, LOW);
delay(t1);
digitalWrite(LED_BUILTIN, HIGH);
delay(t0);
i++; } }
Alles anzeigen
mein esp_temp.php datei sieht dazu wie folgt aus.
<?php
$servername = "localhost";
$username = "admin";
$password = "mein passwort";
$dbname = "arduino_test";
$tblname = "";
$area = $_REQUEST['areaplace'];
$temp = $_REQUEST['temp'];
$humi = $_REQUEST['humi'];
$datum = date("d.m.Y");
$zeit = date("H:i:s");
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "INSERT INTO temp_test (temp, humi, area, datum, zeit) VALUES ('$temp', '$humi', '$area', '$datum', '$zeit')";
if ($conn->query($sql) === TRUE) {
echo "New record created successfully";
}
else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
?>
Alles anzeigen
Nun dachte ich mir, kann man dieses nicht als Art Chart darstellen und habe dazu auch etwas Online gefunden und angepasst.
Index.php
bild_temp.php
bild_humi.php
folgenden...
index.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="generator" content="PSPad editor, www.pspad.com">
<meta http-equiv="refresh" content="300">
<title></title>
</head>
<body>
<?php
$pdo = new PDO('mysql:host=localhost;dbname=arduino_test', 'admin', 'mein passwort');
$sql = "SELECT * FROM temp_test ORDER BY id DESC LIMIT 10";
foreach ($pdo->query($sql) as $row)
echo "<font face=verdana size=2>Temperatur: " . $row['temp']. "°C - Luftfeuchtigkeit: " . $row['humi']. "% am " . $row['datum']. " und um " . $row['zeit']. "</font><br>";
?>
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<table border="0" cellpadding="0" cellspacing="1">
<tr>
<td><font face=verdana size=2 color=blue>Temperaturdiagramm</font</td>
<td><font face=verdana size=2 color=red>Luftfeuchtigkeitsdiagramm</font></td>
</tr>
<tr>
<td><?php echo '<img src="bild_temp.php" alt="Fehler beim anzeigen" />'; ?></td>
<td><?php echo '<img src="bild_humi.php" alt="Fehler beim anzeigen" />'; ?></td>
</tr>
</table>
</td>
</tr>
</table>
<?php
$pdo = new PDO('mysql:host=localhost;dbname=arduino_test', 'admin', 'mein passwort');
$statement = $pdo->prepare("SELECT COUNT(*) AS anzahl FROM temp_test");
$statement->execute();
$row10 = $statement->fetch();
if ($row10['anzahl'] == 0) {
echo "Datenbank ist leer...!"; }
else {
print $row10['anzahl'];
print "<br>";
if ($nummer OR $_GET['nummer'] == false) {
$nummer=0;
$sql = "SELECT * FROM temp_test ORDER BY id";
foreach ($pdo->query($sql) as $row) {
$nummer++;
} }
else { } }
?>
</body>
</html>
Alles anzeigen
bild_temp.php
<?php
header("Content-type: image/png");
$imgWidth = '400';
$imgHeight = '200';
$theImage = imagecreate($imgWidth, $imgHeight);
$colorGrey = imagecolorallocate($theImage, 215, 215, 215);
$colorBlue = imagecolorallocate($theImage, 0, 50, 255);
$pdo = new PDO('mysql:host=localhost;dbname=arduino_test', 'admin', 'mein passwort');
$statement = $pdo->prepare("SELECT COUNT(*) AS anzahl FROM temp_test");
$statement->execute();
$row10 = $statement->fetch();
if ($row10['anzahl'] == 0) {
echo "Datenbank ist leer...!"; }
else {
if ($row10['anzahl'] <= $imgWidth) {
$sql = "SELECT * FROM temp_test ORDER BY id";
foreach ($pdo->query($sql) as $row) {
$wert[$row['id']] = $row['temp']; }
}
else {
$die400 = $row10['anzahl'] - $imgWidth;
$sql = "SELECT * FROM temp_test ORDER BY id LIMIT ".$die400.",400";
foreach ($pdo->query($sql) as $row) {
$wert[$wertnr++] = $row['temp']; }
}
$countBalken = count($wert);
for($i=0;$i<$countBalken;$i++) {
if($maxHeight < $wert[$i]) {
$maxHeight = $wert[$i]; } }
$dynWidth = round(($imgWidth-2) / ($countBalken-1), 0);
@$dynHeight = ($imgHeight-1) / $maxHeight;
for ($i=0; $i<$countBalken; $i++) {
$aktNewSize = @round($dynHeight * $wert[$i]);
$aktNewSize2 = @round($dynHeight * $wert[$i+1]);
if($i+1 < $countBalken) {
imageline($theImage, $i*$dynWidth, ($imgHeight-$aktNewSize),
($i+1)*$dynWidth, ($imgHeight-$aktNewSize2), $colorBlue); } }
imagepng($theImage);
imagedestroy($theImage);
}
?>
Alles anzeigen
bild_humi.php
<?php
header("Content-type: image/png");
$imgWidth = '400';
$imgHeight = '200';
$theImage = imagecreate($imgWidth, $imgHeight);
$colorGrey = imagecolorallocate($theImage, 215, 215, 215);
$colorBlue = imagecolorallocate($theImage, 255, 50, 0);
$pdo = new PDO('mysql:host=localhost;dbname=arduino_test', 'admin', 'mein passwort');
$statement = $pdo->prepare("SELECT COUNT(*) AS anzahl FROM temp_test");
$statement->execute();
$row10 = $statement->fetch();
if ($row10['anzahl'] == 0) {
echo "Datenbank ist leer...!"; }
else {
if ($row10['anzahl'] <= $imgWidth) {
$sql = "SELECT * FROM temp_test ORDER BY id";
foreach ($pdo->query($sql) as $row) {
$wert[$row['id']] = $row['humi']; }
}
else {
$die400 = $row10['anzahl'] - $imgWidth;
$sql = "SELECT * FROM temp_test ORDER BY id LIMIT ".$die400.",400";
foreach ($pdo->query($sql) as $row) {
$wert[$wertnr++] = $row['humi']; }
}
$countBalken = count($wert);
for($i=0;$i<$countBalken;$i++) {
if($maxHeight < $wert[$i]) {
$maxHeight = $wert[$i]; } }
$dynWidth = round(($imgWidth-2) / ($countBalken-1), 0);
@$dynHeight = ($imgHeight-1) / $maxHeight;
for ($i=0; $i<$countBalken; $i++) {
$aktNewSize = @round($dynHeight * $wert[$i]);
$aktNewSize2 = @round($dynHeight * $wert[$i+1]);
if($i+1 < $countBalken) {
imageline($theImage, $i*$dynWidth, ($imgHeight-$aktNewSize),
($i+1)*$dynWidth, ($imgHeight-$aktNewSize2), $colorBlue); } }
imagepng($theImage);
imagedestroy($theImage);
}
?>
Alles anzeigen
meine SQL dazu
-- phpMyAdmin SQL Dump
-- version 4.6.6deb5
-- https://www.phpmyadmin.net/
--
-- Host: localhost:3306
-- Erstellungszeit: 28. Apr 2020 um 10:25
-- Server-Version: 10.3.22-MariaDB-0+deb10u1
-- PHP-Version: 7.3.14-1~deb10u1
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- Datenbank: `arduino_test`
--
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `temp_test`
--
CREATE TABLE `temp_test` (
`id` int(11) NOT NULL,
`temp` varchar(255) NOT NULL,
`humi` varchar(255) NOT NULL,
`area` varchar(255) NOT NULL,
`datum` varchar(255) NOT NULL,
`zeit` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
--
-- Daten für Tabelle `temp_test`
--
--
-- Indizes der exportierten Tabellen
--
--
-- Indizes für die Tabelle `temp_test`
--
ALTER TABLE `temp_test`
ADD PRIMARY KEY (`id`);
--
-- AUTO_INCREMENT für exportierte Tabellen
--
--
-- AUTO_INCREMENT für Tabelle `temp_test`
--
ALTER TABLE `temp_test`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=993;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
Alles anzeigen
OK ist vielleicht nicht super schön aber läuft.
schöner wäre natürlich beide kurven in einen Bild darzustellen vielleicht hat dazu jemand eine Idee.
Es gibt auch jpGraph aber ne...
Gerne nehme ich wieder TIPS an um die Sache zu verfeinern.
danke Lars