Verschiedene Daten an html-Seite schicken

Guten Nachmittag,
Möchte gerne einige Daten an den ESP8266 Webserver schicken.
das klappt (Quelle: Esp8266 Dht22 Tab):

// ****************************************************************
// Sketch Esp8266 DHT22 Modular(Tab)
// created: Jens Fleischer, 2018-08-08
// last mod: Jens Fleischer, 2018-08-08
// For more information visit: https://fipsok.de
// ****************************************************************
// Hardware: Esp8266, DHT22, 1 x 4k7 Ohm Widerstand
// D7 = GPIO13  Anschluss DHT22
// 4k7 Ohm Widerstand von VCC auf GPIO13
// Getestet auf: Nodemcu, Wemos D1 Mini Pro
/******************************************************************
  Copyright (c) 2018 Jens Fleischer. All rights reserved.

  This file is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.
  This file is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.
*******************************************************************/
// Diese Version von DHT22 sollte als Tab eingebunden werden.
// #include <ESP8266WebServer.h> muss im Haupttab aufgerufen werden
// Die Funktionalität des ESP8266 Webservers ist erforderlich.
// Die Funktion "dht22();" muss im Setup aufgerufen werden.
/**************************************************************************************/

#include "DHTesp.h"       // Version 1.0.9 https://github.com/beegee-tokyo/DHTesp

const byte DHT_PIN = 13;     // Pin für DHT22 einstellen

DHTesp dht;

void dht22() {       // Funktionsaufruf "dht22();" muss im Setup eingebunden werden
  dht.setup(DHT_PIN, DHTesp::DHT22);
  server.on("/dht22", []() {
    server.send(200, "application/json", handleDht());
  });
}

String handleDht() {
  float hum = dht.getHumidity();
  float temp = dht.getTemperature();
  char buf[37];
  snprintf(buf, sizeof(buf), "[\"%s\",\"%.1f\",\"%.1f\",\"%.1f\",\"%.1f\"]", dht.getStatusString(), temp, hum, dht.computeDewPoint(temp, hum), dht.computeHeatIndex(temp, hum));
  return buf;
}

Nun möchte ich gerne meine Anzeige mit dem aktuellen Datum und Uhrzeit erweitern.
Habe gesehen, dass in diesem Beispiel folgender Befehl verwendet wird:

strftime (buf, sizeof(buf), R"(["%T","%d.%m.%Y"])", &tm); // http://www.cplusplus.com/reference/ctime/strftime/

Wie kann ich z.B. auf dieser html-Webseite (dht22.html) die Messerte und das aktuelle Datum und Uhrzeit anzeigen?
Kann ich zwei verschiedene Buffer auf die gleiche html-Seite übertragen oder muss ich alles in einem Buffer zusammenfügen?
Welche Lösung würdet ihr mir empfehlen?
Vielen Dank für eure Hilfe und Tipps.

Grüße

Genau so, wie Du die Daten über die Javascript-Funktion renew() holst, kannst Du dort auch die aktuelle Zeit mit übertragen.

Gruß Tommy

Hallo,
Du kannst das eigentlich nur in einem buffer verarbeiten.
die Zeile

server.send(200, "application/json", handleDht());

versendet ja die Daten als JSON das vorher zusammendesetzt wurde.

Du musst dann natürlich auch die Webseite erweitern und die Daten aus dem JASON auslesen.
Heinz

Nachtrag @Tommy56 hat da sicher eine andere Idee und sieht zwei getrennte Fetch vor. Geht natürlich auch.
dann könntet Du die DHT werte z.B alle 5s holen und die Zeit jede Sekunde. Typischer Fall für den Weg nach Rom.

Nö, ich hätte das mit ins snprintf rein genommen. Ist ein Aufwasch.
Ich gehe bei solchen Sachen so vor, dass der ESP öfter und unabhängig von Anfragen misst. Wenn die Anfrage kommt, wird einfach der letzte Wert übertragen. So schnell ändern sich Umgebungsparameter nicht. Die Werte für Datum/Uhrzeit kann man ja auf die Schnelle ermitteln.

Mein Favorit ist auch nicht JSON, sondern mit ; getrennte Name=Wert Paare, wobei Name = id des Zielfeldes im HTML ist. Damit ist es einfach und schnell übertragen und wieder zerlegt.

Gruß Tommy

Danke für deinen Beitag.

Also arbeitest du wie zB nachfolgendes Beispiel?

char buf[37];
  snprintf(buf, sizeof(buf), "[\"%s\",\"%.1f\",\"%.1f\",\"%.1f\",\"%.1f\"]", dht.getStatusString(), temp, hum, dht.computeDewPoint(temp, hum), dht.computeHeatIndex(temp, hum));

Formatierst du vorher die Zeit mit strftime(), wenn du die Daten und die Zeit an den Webserver überträgst?

Was meinst du damit?

Der ESP8266 zählt ja die Zeit weiter.
Wenn Du den NTP-Tab von Fips drin hast, kannst Du einfach die Zeitbestandteile ermitteln:

  struct tm tm;
  time_t now = time(&now);
  localtime_r(&now, &tm);

Dann hast Du in tm alles stehgen, was Du brauchst.

Gruß Tommy

Danke.
So hätte ich es jetzt auf die Schnelle auch gemacht.
Dachte es gibt vielleicht einen anderen Weg.
Nochmals Danke.

Gruß

Wenn ich zB in einem Tab Messdaten sammle, in einem anderen Tab wird die NTP Zeit ermittelt und in einem anderen Tab werden andere Daten übermittelt.
Wie kann ich aber am Ende aller gesammelten Daten diese gebündelt an eine html-Seite schicken? Muss ich mir diese Daten alle einzeln über einem globalen Array sammeln (oder Zeiger?), verknnüpfen und an die html-Seite senden?

Wenn Du auf der Webseite alles in verschiedenen Tabs hast, dann sollte in jedem Tab auch nur das aktualisiert werden, was dort dargestellt wird.
Du kannst natürlich auch alles aktualisieren, ist halt Ansichtssache.

Gruß Tommy

In der Arduino IDE habe ich das Gesamtprogramm in verschiedene Tab (Teilprogramme) aufgeteilt (zB 1 Tab für die NTP Zeit, 1 Tab für das Auslesen des Sensors).
Nun möchte ich auf einer html-Seite alle Daten anzeigen.
Ich überlege gerade, dass jedes Teilprogramm mittels einer Funktion die Daten an einen Gesamtbuffer übermittelt und am Ende wird in einem anderen Tab (Teilprgramm) alle Daten aus dem Gesamtbuffer an die Webseite übermittelt.

Du verwechselst die Tabs in der IDE mit den Tabs im Browser. Ich war von Browsertabs ausgegangen.
Die Tabs in der IDE bilden ein gemeinsames Programm.

Gruß Tommy

Ich dachte mir, dass es falsch rübergekommen ist. Sorry.
Daher spreche ich jetzt lieber von Teilprgrammen (Tab) in der Arduino IDE.
Hast du aber verstanden, was ich meine?

Setze den Puffer zusammen, wenn Du ihn brauchst und mache keine krummen Wege. Deine Beschreibung "mehrere Werte" ist so schwammig, da kann man nichts konkret dazu sagen.

Gruß Tommy

In der Arduino IDE habe ich in einem Programm (Sketch) zB
-ein Teilprogramm (Tab) für Messdaten von einem Sensor
-ein Teilprgramm (Tab) für die Daten der Uhrzeit (NTP Time)
-ein Teilprogramm (Tab) für die Daten vom Sonnenaufgang und Sonnenuntergang

Nun möchte ich alle diese Werte gebündelt an eine html-Seite schicken.
Alle Daten wie zb Messdaten des Sensors oder die Daten vom Sonnenaufgang und Sonnenuntergang sind ja auf Grund der Variablendeklaration.
Meine Frage ist nun wie ich diese Daten in den unterschiedlichen Teilprgrammen (tab) in einem Buffer elegant bündel damit ich mittels einer Funktion diese dann an die Webseite übergeben kann.
Ich hoffe ich konnte es jetzt verständlich erklären.

Grüße

Du übergibst sie an eine Funktion und die baut den Puffer draus.
An der Stelle musst Du einfach mal ein paar Basics lernen, wenn Dir das nicht klar ist, was das bedeutet.
Pseudocode:

void sendDaten(time_t timestamp, float temp, float feuchte) {
char puffer[512];
snprintf(puffer, sizeof(puffer, ".2f ...", ... // wie Du das halt willst
server.send(...);
}

Gruß Tommy

Also war meine Überlegung richtig.
Vielen Dank für deinen Tipp.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.