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
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 | }
|
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.
Wie schnell kommen denn die Daten? Ich hab noch ein PHP script, das die Werte auch speichert.
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
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.
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
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
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?
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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.