Forum: Mikrocontroller und Digitale Elektronik Sensorwerte im Browser als Grafik anzeigen?


von Christian S. (chris02)


Lesenswert?

Hallo zusammen,

ich suche eine möglichst einfache Lösung Sensorwerte am PC zu plotten.

Es geht um einen Differentsstromsensor 
(https://www.pollin.de/productdownloads/D180071D.PDF), welcher eine 
galvanisch getrennte Ausgangsspannung (max. 5V) ausgibt. Diese Spannung 
würde ich gerne über einen Zeitraum von max 5 Minuten aufnehmen und am 
liebsten direkt am PC als Plot anzeigen.

Wäre sowas mit einem ESP32 direkt im Browser möglich? Gibt es dafür 
schon eine vorgefertigte Oberfläche, auf der ich aufsetzen kann, da 
meine Programmierkenntnisse recht eingeschränkt sind.

Viele Grüße
Chris

: Bearbeitet durch User
von M. D. (derdiek)


Lesenswert?

Volkszähler

von J. S. (jojos)


Lesenswert?

Da gibt es jede Menge Beispiele dazu:
https://randomnerdtutorials.com/

von Axel R. (axlr)


Lesenswert?

Ja - geht. Hab ich mal mit Temperaturwerten gemacht. Einfach das Projekt 
drauf geflasht und hat sofort funktioniert. Leider setzt der Browser bei 
mir die Zeitmarken. Das (in meinem Fall) Handy muss also, wenn man keine 
komische Lücken inder Darstellung haben will, immer an sein, wenn die 
Skalierung der Zeitachse einheitlich durchgängig sein soll. War son 
Platinfühler und ein Max6675 als Breakout-Board. Hatte ich Netz was 
passendes dazu gefunden.
Musste auch mal suchen. Seite finde ich gerade nicht, zu lange her.
https://www.bing.com/search?q=esp32+temperatur+monitor+max6675
Brauchst Du ja dann nur noch an deinen Sensor anpassen.
Im eingefügten Code (böse, weil nicht als Anhang!) gibt er nur die 
Temperatur aus. Als Einstieg quasi.
1
#include <Arduino.h>
2
#include <WiFi.h>
3
#include <ESPAsyncWebServer.h>
4
#include <max6675.h>
5
#include <SPIFFS.h>
6
const int led = 13;
7
const char* ssid = "FRITZ!Box 7412";           
8
const char* password = "16938482531710736684"; 
9
10
int thermoDO = 15;
11
int thermoCS = 2;
12
int thermoCLK = 4;
13
14
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
15
// Create AsyncWebServer object on port 80
16
AsyncWebServer server(80);
17
 
18
19
 String messe_temperatur(){
20
21
   return String(thermocouple.readCelsius());
22
 }
23
void setup() {
24
25
  // put your setup code here, to run once:
26
  delay(1000);
27
     Serial.begin(115200);
28
    pinMode(led, OUTPUT);      // set the LED pin mode
29
// Initialize SPIFFS
30
  if(!SPIFFS.begin()){
31
    Serial.println("An Error has occurred while mounting SPIFFS");
32
    return;
33
  }
34
    delay(1000);
35
36
    // We start by connecting to a WiFi network
37
38
    WiFi.mode(WIFI_STA);
39
    WiFi.begin(ssid, password);
40
    Serial.println("");
41
42
  // Wait for connection
43
      while (WiFi.status() != WL_CONNECTED) {
44
        delay(500);
45
        Serial.print(".");
46
      }
47
    Serial.println("");
48
    Serial.print("Connected to ");
49
    Serial.println(ssid);
50
    Serial.print("IP address: ");
51
    Serial.println(WiFi.localIP());
52
53
  
54
   // Route for root / web page
55
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
56
    request->send(SPIFFS, "/index.html");
57
  });
58
  server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest *request){
59
    request->send_P(200, "text/plain", messe_temperatur().c_str() );
60
  });
61
  Serial.println("HTTP server started");
62
  server.begin();
63
}
64
65
void loop() {
66
 
67
}

von J. S. (jojos)


Lesenswert?

Axel R. schrieb im Beitrag #7523022

> Im eingefügten Code (böse, weil nicht als Anhang!) gibt er nur die
> Temperatur aus. Als Einstieg

Prima, gleich mit PW für den Router.

von Kolja L. (kolja82)


Lesenswert?

Wie schnell kommen denn die Daten?

Ich hab noch ein PHP script, das die Werte auch speichert.

von Rainer W. (rawi)


Lesenswert?

J. S. schrieb:
> Prima, gleich mit PW für den Router.

Jetzt brauchst du nur noch die IP ;-)

(aber schnell - bevor die Box eine neue bekommt)

: Bearbeitet durch User
von Christian S. (chris02)


Lesenswert?

Kolja L. schrieb:
> Wie schnell kommen denn die Daten?
>
> Ich hab noch ein PHP script, das die Werte auch speichert.

Tiefergehende Gedanken habe ich mir noch keine Gemacht. Der Sensor ist 
erstmal bis 10kHz spezifiziert, sodass man mindestens mit 20kHz abtasten 
sollte, eher ein wenig mehr.

von N. M. (mani)


Lesenswert?

Christian S. schrieb:
> Diese Spannung würde ich gerne über einen Zeitraum von max 5 Minuten
> aufnehmen

Christian S. schrieb:
> Der Sensor ist erstmal bis 10kHz spezifiziert, sodass man mindestens mit
> 20kHz abtasten sollte, eher ein wenig mehr.

Das sind für deinen spezifizieren Zeitraum von 5 Minuten 6e6 
Datenpunkte. Eher ein wenig mehr 😜

Das bedeutet schonmal das der ESP die Daten nicht alle selbst halten 
kann.
Es muss also jemand da sein der die Daten päckchenweise entgegen nimmt.
Bei dir also ein PC, Server o.ä.
Jedes Datum einzeln übertragen kannst du vergessen bei der Datenrate und 
macht auch keinen Sinn wg. Overhead.
Also musst du hoffen dass du deine geschnürte Päckchen schnell genug 
über den Äther bekommst.
Anzeige von so vielen Punkten stelle ich auch Mal in Frage.

Ob das wirklich Sinn macht?
Man könnte die Bandbreite und damit auch die Abtastrate einfach auf das 
wirklich notwendige begrenzen.
Oder brauchst du wirklich die volle Bandbreite deines Sensors?

Ein Docker Container mit MQTT Broker und Graphana wäre PC seitig auch 
noch eine Möglichkeit.

: Bearbeitet durch User
von Axel R. (axlr)


Lesenswert?

J. S. schrieb:
> Axel R. schrieb im Beitrag #7523022
>
>> Im eingefügten Code (böse, weil nicht als Anhang!) gibt er nur die
>> Temperatur aus. Als Einstieg
>
> Prima, gleich mit PW für den Router.

:)
Du glaubts ja nicht im Enrst, dass das mein korrektes PW ist?
Alter: Ich mach das hier schon ne Weile und bin nicht komplett blöd!
(vielleicht zuweilen ein klein wenig unausstehlich. manchmal - kann 
sein)
Ich hab das nur stehen lassen, damit nicht wieder gefragt wird, ob und 
wie man da Gänsefüße setzt, oder was da hinkommt. Selbstverständlich ist 
das NICHT mein PW für den Router. Zugegeben: die Zeilenanzahl und die 
Numerik stimmt. Das ist aber auch schon alles. rolleyes

von Kolja L. (kolja82)


Lesenswert?

N. M. schrieb:
> Christian S. schrieb:
>> Der Sensor ist erstmal bis 10kHz spezifiziert, sodass man mindestens mit
>> 20kHz abtasten sollte, eher ein wenig mehr.
>
> Das sind für deinen spezifizieren Zeitraum von 5 Minuten 6e6
> Datenpunkte. Eher ein wenig mehr

Ich könnte mir vorstellen, dass die Datenrate allgemein etwas hoch ist, 
um sie vom ESP via WLAN zum Browser zu bringen.

Vielleicht doch besser die serielle Schnittstelle und den grafischen 
output der ArduinoIDE verwenden?

von N. M. (mani)


Lesenswert?

Kolja L. schrieb:
> Vielleicht doch besser die serielle Schnittstelle

Naja, wenn man sich mit dem internen ADC zufrieden gibt braucht man 
nicht mehr als 1 Byte übertragen. So schlecht wie der ist. Also 
200kBit/s bei 8N1.

Wenn es etwas genauer sein soll sind es mindestens 2 Byte pro Messwert. 
Dann braucht man aber wieder was für Start Erkennung und CRC. Sind 
nochmal 1-2 Byte mehr. Also 3-4*200kBit/s =600-800kBit/s.
Geht schon.
Bei WLAN mit UDP oder MQTT ist der Overhead natürlich etwas größer.

Kolja L. schrieb:
> den grafischen output der ArduinoIDE verwenden?

Ich kenne das Teil nicht.
Kommt das mit so einer Datenmenge zurecht oder stürzt das nach 100k 
Punkten schon ab?



Ich Stelle mir halt allgemein 2 Fragen:
Braucht er diese Bandbreite wirklich?
Und wenn ja, ist es dann wirklich egal dass der interne ADC so 
grottenschlecht ist?

von Bernhard S. (b_spitzer)


Lesenswert?

N. M. schrieb:
> Wenn es etwas genauer sein soll sind es mindestens 2 Byte pro Messwert.
> Dann braucht man aber wieder was für Start Erkennung und CRC. Sind
> nochmal 1-2 Byte mehr. Also 3-4*200kBit/s =600-800kBit/s.
bei 20kHz 2Byte Messwert macht erst mal 40kByte/s. Overhead kann man 
evtl reduzieren...

> Geht schon.
Beim ESP32 gehe ich auch davon aus, dass er die 600kBit/s locker 
schaffen kann. Mit einem ESP8266 habe ich beim reinen Datei-Download aus 
dem SPIFFS 85kByte/s (=> über 600kBit/s) erreichen können.

== anderes Thema ==
An die anderen mit der Passwort-Diskussion... Andreas Spies hat da mal 
einen guten Tip gegeben, den ich seither in allen Projekten nutze.
Man scheibt die Zugangsdaten einfach in eine .h Datei, die im 
Verzeichnis libraries\credentials liegt. Im Programm steht dann bei mir 
immer nur:
1
// Alternative 1: hier die Daten ihres AP oder Handy-Hotspots eintragen
2
//const char* ssid     = "MeineSSID";
3
//const char* password = "12345678";
4
// Alternative 2: Zugangsdaten über eine Datei einlesen, die Datei liegt im
5
// Libraries-Verzeichnis (Standard: Dokumente/Arduino/Libraries)
6
#include <credentials.h>
Der Inhalt der credentials.h ist nur ein Zweizeiler:
1
const char* ssid     = "TrautesHeimGlueckAllein";
2
const char* password = "StrengGeheim";
Über verschiedene Include-Dateien kann ich damit auch einfach für andere 
Anwendungen kompilieren und ich kann meinen Code weiter geben ohne 
vorher an die Zugangsdaten denken zu müssen.

: Bearbeitet durch User
von N. M. (mani)


Lesenswert?

Bernhard S. schrieb:
> bei 20kHz 2Byte Messwert macht erst mal 40kByte/s. Overhead kann man
> evtl reduzieren...

Stimmt schon. Und wie findet man den Anfang? Schreibst du das auch noch 
dazu?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.