Der ESP32-Faden
Moderatoren: Heaterman, Finger, Sven, TDI, Marsupilami72, duese
-
- Beiträge: 1506
- Registriert: Di 13. Aug 2013, 19:10
- Wohnort: Niedersachsen Süd-Ost
Re: Der ESP32-Faden
Ich habe mal den Fehler begangen, mir von Heise das ESP32-Sonderheft zu kaufen.
Ganz nett, aber zuerst einmal fehlt eine Beschreibung, wie man das Ding dazu bringt, aus der Arduino-IDE einen Softwareupload zu akzeptieren. Das im Heft beschriebene BASIC ist nicht erreichbar, weil die Steine bereits geflasht sind.
Es passierte genau das. was ich mir ersparen wollte: Eine Internetrecherche.
Letztendlich habe ich mich mit dem Vertrieb gestritten und eine gehörige Rückerstattung bekommen. alles gut.
Hätte ich mit einem ESP vom Ali günstiger haben können, da habe ich baugleiche Boards um 4 Euro nachgekauft
Falls jemand lesen mag, schadet zumindest nicht, ich habe es bei https://de.downmagaz.net/digital_magazi ... -2019.html gefunden.
Mal geholt und kopiert, da geht der Download etwas fixer und ohne CaptchaDreck:
https://1fichier.com/?cu5sai2xyhut4x2y1qpd
Ganz nett, aber zuerst einmal fehlt eine Beschreibung, wie man das Ding dazu bringt, aus der Arduino-IDE einen Softwareupload zu akzeptieren. Das im Heft beschriebene BASIC ist nicht erreichbar, weil die Steine bereits geflasht sind.
Es passierte genau das. was ich mir ersparen wollte: Eine Internetrecherche.
Letztendlich habe ich mich mit dem Vertrieb gestritten und eine gehörige Rückerstattung bekommen. alles gut.
Hätte ich mit einem ESP vom Ali günstiger haben können, da habe ich baugleiche Boards um 4 Euro nachgekauft
Falls jemand lesen mag, schadet zumindest nicht, ich habe es bei https://de.downmagaz.net/digital_magazi ... -2019.html gefunden.
Mal geholt und kopiert, da geht der Download etwas fixer und ohne CaptchaDreck:
https://1fichier.com/?cu5sai2xyhut4x2y1qpd
Re: Der ESP32-Faden
In dem Zusammenhang bin ich auf das hier gestoßen: https://github.com/me-no-dev/ESPAsyncWebServer
Unter den Beispielen ist eines, das sich asyncFSBrowser nennt, welches (scheinbar) irgendeine Webseite ausliefern soll. Dabei sind einige Dateien mit HTML, CSS und JS-Kruscht. Mir ist nur überhaupt nicht klar, wie das gehen soll. Ich habs für nen NodeMCU compiliert, aber der hat ja (nativ) kein Dateisystem. Ich finde aber auch nichts, was GENAU dieses Beispiel da macht. Kann mir da mal jemand auf die Sprünge helfen?
Unter den Beispielen ist eines, das sich asyncFSBrowser nennt, welches (scheinbar) irgendeine Webseite ausliefern soll. Dabei sind einige Dateien mit HTML, CSS und JS-Kruscht. Mir ist nur überhaupt nicht klar, wie das gehen soll. Ich habs für nen NodeMCU compiliert, aber der hat ja (nativ) kein Dateisystem. Ich finde aber auch nichts, was GENAU dieses Beispiel da macht. Kann mir da mal jemand auf die Sprünge helfen?
Re: Der ESP32-Faden
Guckst du hier:
https://randomnerdtutorials.com/install ... duino-ide/
Im Prinzip erstellst einen Ordner data in deinem Sketch und das Plugin generiert daraus das Filesystem und läd es anschließend hoch. Dein Programm braucht nur noch das Dateisystem öffnen und dann kann man auf alle Dateien zugreifen.
Grüße Jan
Edit meint:
Es gibt 2 Dateisysteme und 2 Plugins einmal SPIFFS und LittleFS. Beim Esp32 ist letzteres Standard.
Viele Beispiele funktionieren auch mit dem jeweiligen anderen... wenn man die Header und die Klassenobjekte tauscht.
https://randomnerdtutorials.com/install ... duino-ide/
Im Prinzip erstellst einen Ordner data in deinem Sketch und das Plugin generiert daraus das Filesystem und läd es anschließend hoch. Dein Programm braucht nur noch das Dateisystem öffnen und dann kann man auf alle Dateien zugreifen.
Grüße Jan
Edit meint:
Es gibt 2 Dateisysteme und 2 Plugins einmal SPIFFS und LittleFS. Beim Esp32 ist letzteres Standard.
Viele Beispiele funktionieren auch mit dem jeweiligen anderen... wenn man die Header und die Klassenobjekte tauscht.
Re: Der ESP32-Faden
OK, soweit klar. Ich solte dazu sagen, das ich gerade mit nem NodeMCU unterwegs bin. LittleFS zickt aber tierisch rum, oder eher das Upload-Tool für die Arduino-Ide. Das glänzt hartnäckig durch die Meldung "mklittefs not found". Soweit ich da durchsteige fehlt irgendein Executable, aber wo zum ***FCK*** kriege ich das her? Gibt wohl noch mehr Leute mit dem Problem, aber ganz ehrlich: kann mir da mal jemand auf die Sprünge helfen?
Zum Beispiel hier: https://www.arduinoforum.de/arduino-Thr ... -exe-nicht. Der Mann muss das ja irgendwo hergezaubert haben... Alles sehr intransparent...
Zum Beispiel hier: https://www.arduinoforum.de/arduino-Thr ... -exe-nicht. Der Mann muss das ja irgendwo hergezaubert haben... Alles sehr intransparent...
Re: Der ESP32-Faden
Also das Problem. Ja dass ist Arduino IDE Version 1.8.x spezifisch.
Bei der IDE wurden die Target-Ordner umgestellt, das wurde wohl immer noch nicht in dem Plugin mitgezogen seit 2017.
Die Exe fehlt nicht, die liegt für diese Version nur am falschen Ort.
Wo die genau hin muss kann ich dir nicht mehr sagen,
dass Wissen wurde vor 2 Monaten begraben,
als ich meinen letzten PC auf Linux umgestellt habe.
Du kannst dir via sysinternals mit den ProcessMonitor angucken auf welchen Pfad die IDE versucht aufzurufen und die Exe in das Verzeichnis kopieren.
So hatte ich das damals gelöst. Dann solle das ohne Probleme laufen.
Alternativ kann man auch die Sourcen von dem Plug-in ziehen und den Pfad dort modifizierten.
Edit: Noch was
Bevor du das FS hochladen kannst musst du den SerialMonitor schließen.
Grüße Jan
Bei der IDE wurden die Target-Ordner umgestellt, das wurde wohl immer noch nicht in dem Plugin mitgezogen seit 2017.
Die Exe fehlt nicht, die liegt für diese Version nur am falschen Ort.
Wo die genau hin muss kann ich dir nicht mehr sagen,
dass Wissen wurde vor 2 Monaten begraben,
als ich meinen letzten PC auf Linux umgestellt habe.
Du kannst dir via sysinternals mit den ProcessMonitor angucken auf welchen Pfad die IDE versucht aufzurufen und die Exe in das Verzeichnis kopieren.
So hatte ich das damals gelöst. Dann solle das ohne Probleme laufen.
Alternativ kann man auch die Sourcen von dem Plug-in ziehen und den Pfad dort modifizierten.
Edit: Noch was
Bevor du das FS hochladen kannst musst du den SerialMonitor schließen.
Grüße Jan
Re: Der ESP32-Faden
Das ist ja das bekloppte....es gibt hier keine Datei namens mklittlefs.exe oder sonstwas. Auf der lokalen Platte ist diese Datei nicht vorhanden. Woher soll die kommen?
LIegt der Kram in der Boardverwaltung? Gerade mal ein Update gemacht, auch die IDE ist auf letztem Stand *kratzamkopf*
Edit: Boardverwaltung, nach dem Update lag das Scheisserchen da drin...
LIegt der Kram in der Boardverwaltung? Gerade mal ein Update gemacht, auch die IDE ist auf letztem Stand *kratzamkopf*
Edit: Boardverwaltung, nach dem Update lag das Scheisserchen da drin...
Re: Der ESP32-Faden
Noch eine Verständnisfrage... Dateien hochladen und dann Sketch kompilieren und hinterherschieben? Beiben die Dateien erhalten?
Re: Der ESP32-Faden
Jo solange du keinen Mass-erase anstößt oder du das Partitions-Schema nicht änders, bleiben Programm und Filesystem erhalten.
Die können dann unabhängig von einander programmiert und ausgetauscht werden.
Grüße
Jan
Re: Der ESP32-Faden
Ich hab mal auf der Basis o.g. Zeitschrift und eigenem Gefummel mal auf nem NodeMCU was zusammengestoppelt. Liefert jetzt eine Webseite mit dem Zeug für canvas-Gauges aus (siehe o.g. Heft, da drin ist ein Beispiel, Kapitel WLAN), konkret also ein Zeigerinstrument, welches einen Wert anzeigt. Wie zum Geier krieg ich das denn jetzt hin, das das laufend aktualisiert wird, der Zeiger sich also bewegt ohne das ich die Seite neu laden muss?
Re: Der ESP32-Faden
Radial Gauge und Ajax bzw. jquery sind deine Freunde.
In Prinzip eine Gauge erstellen und via jquery die Werte nachladen. Der Webserver muss dazu eine REST-API bereitstellen. Und die Fähigkeit besitzen Dateien auszuliefern. Klingt alles komplizierter als es ist. Beides kann asyncWebserver gleichzeitig.
Sieht dann so aus:
https://fingers-welt.de/phpBB/viewtopic ... ot#p334388
Hier noch ein paar links.
https://canvas-gauges.com/docs/2.0.0/cl ... Gauge.html
https://jquery.com/
Grüße Jan
In Prinzip eine Gauge erstellen und via jquery die Werte nachladen. Der Webserver muss dazu eine REST-API bereitstellen. Und die Fähigkeit besitzen Dateien auszuliefern. Klingt alles komplizierter als es ist. Beides kann asyncWebserver gleichzeitig.
Sieht dann so aus:
https://fingers-welt.de/phpBB/viewtopic ... ot#p334388
Hier noch ein paar links.
https://canvas-gauges.com/docs/2.0.0/cl ... Gauge.html
https://jquery.com/
Grüße Jan
Re: Der ESP32-Faden
OK, ich hab ein wenig quer gelesen zum Thema Ajax und jquery, aber ich bin noch ein gutes Stück weg davon, selber funktionierenden Code in der Hinsicht zu schreiben. Ich machs mal konkret. Das hier ist die Index.html, ausgeliefert zusammen mit dem Javascript-Schnipsel vom ESP8266:
Die Zeile data-value='%TEMPERATURE%' macht mit die Schnittstelle zu meinem Sketch, im wesentlichen ein Beispiel aus dem ESPAsyncWebServer
Die letzten drei Zeilen übermitteln also einen Wert, der in die HTML-Datei eingebaut wird. Wenn ich das richtig verstanden habe, ist es mit Ajax möglch, nur diese Werte zur Laufzeit auszutauschen. Soweit so gut, aber mir fehlt da ein sinnvolles Beispiel, so das ich nicht bei Null anfangen muss, insbesondere bei JS, da kenn ich nix von....
Code: Alles auswählen
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Gewächshaus</title>
<script src="gauge.min.js"></script>
</head>
<body style="background: #222">
<hr>
<canvas data-type="radial-gauge"
data-width="500"
data-height="500"
data-units="°C"
data-title="Gewächshaus"
data-min-value="-50"
data-max-value="50"
data-major-ticks="[-50,-40,-30,-20,-10,0,10,20,30,40,50]"
data-minor-ticks="2"
data-stroke-ticks="true"
data-highlights='[ {"from": -50, "to": 0, "color": "rgba(0,0, 255, .3)"},
{"from": 0, "to": 50, "color": "rgba(255, 0, 0, .3)"} ]'
data-ticks-angle="225"
data-start-angle="67.5"
data-color-major-ticks="#ddd"
data-color-minor-ticks="#ddd"
data-color-title="#eee"
data-color-units="#ccc"
data-color-numbers="#eee"
data-color-plate="#222"
data-border-shadow-width="0"
data-borders="true"
data-needle-type="arrow"
data-needle-width="2"
data-needle-circle-size="7"
data-needle-circle-outer="true"
data-needle-circle-inner="false"
data-animation-duration="1500"
data-animation-rule="linear"
data-color-border-outer="#333"
data-color-border-outer-end="#111"
data-color-border-middle="#222"
data-color-border-middle-end="#111"
data-color-border-inner="#111"
data-color-border-inner-end="#333"
data-color-needle-shadow-down="#333"
data-color-needle-circle-outer="#333"
data-color-needle-circle-outer-end="#111"
data-color-needle-circle-inner="#111"
data-color-needle-circle-inner-end="#222"
data-value-box-border-radius="0"
data-color-value-box-rect="#222"
data-color-value-box-rect-end="#333"
data-value='%TEMPERATURE%'
></canvas>
</body>
</html>
Code: Alles auswählen
#include <ArduinoOTA.h>
#ifdef ESP32
#include <FS.h>
#include <SPIFFS.h>
#include <ESPmDNS.h>
#include <WiFi.h>
#include <AsyncTCP.h>
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#include <ESP8266mDNS.h>
#endif
#include <ESPAsyncWebServer.h>
#include <SPIFFSEditor.h>
float Temp = 0;
unsigned long Zeit = 0;
// SKETCH BEGIN
AsyncWebServer server(80);
AsyncWebSocket ws("/ws");
AsyncEventSource events("/events");
void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len){
if(type == WS_EVT_CONNECT){
Serial.printf("ws[%s][%u] connect\n", server->url(), client->id());
client->printf("Hello Client %u :)", client->id());
client->ping();
} else if(type == WS_EVT_DISCONNECT){
Serial.printf("ws[%s][%u] disconnect\n", server->url(), client->id());
} else if(type == WS_EVT_ERROR){
Serial.printf("ws[%s][%u] error(%u): %s\n", server->url(), client->id(), *((uint16_t*)arg), (char*)data);
} else if(type == WS_EVT_PONG){
Serial.printf("ws[%s][%u] pong[%u]: %s\n", server->url(), client->id(), len, (len)?(char*)data:"");
} else if(type == WS_EVT_DATA){
AwsFrameInfo * info = (AwsFrameInfo*)arg;
String msg = "";
if(info->final && info->index == 0 && info->len == len){
//the whole message is in a single frame and we got all of it's data
Serial.printf("ws[%s][%u] %s-message[%llu]: ", server->url(), client->id(), (info->opcode == WS_TEXT)?"text":"binary", info->len);
if(info->opcode == WS_TEXT){
for(size_t i=0; i < info->len; i++) {
msg += (char) data[i];
}
} else {
char buff[3];
for(size_t i=0; i < info->len; i++) {
sprintf(buff, "%02x ", (uint8_t) data[i]);
msg += buff ;
}
}
Serial.printf("%s\n",msg.c_str());
if(info->opcode == WS_TEXT)
client->text("I got your text message");
else
client->binary("I got your binary message");
} else {
//message is comprised of multiple frames or the frame is split into multiple packets
if(info->index == 0){
if(info->num == 0)
Serial.printf("ws[%s][%u] %s-message start\n", server->url(), client->id(), (info->message_opcode == WS_TEXT)?"text":"binary");
Serial.printf("ws[%s][%u] frame[%u] start[%llu]\n", server->url(), client->id(), info->num, info->len);
}
Serial.printf("ws[%s][%u] frame[%u] %s[%llu - %llu]: ", server->url(), client->id(), info->num, (info->message_opcode == WS_TEXT)?"text":"binary", info->index, info->index + len);
if(info->opcode == WS_TEXT){
for(size_t i=0; i < len; i++) {
msg += (char) data[i];
}
} else {
char buff[3];
for(size_t i=0; i < len; i++) {
sprintf(buff, "%02x ", (uint8_t) data[i]);
msg += buff ;
}
}
Serial.printf("%s\n",msg.c_str());
if((info->index + len) == info->len){
Serial.printf("ws[%s][%u] frame[%u] end[%llu]\n", server->url(), client->id(), info->num, info->len);
if(info->final){
Serial.printf("ws[%s][%u] %s-message end\n", server->url(), client->id(), (info->message_opcode == WS_TEXT)?"text":"binary");
if(info->message_opcode == WS_TEXT)
client->text("I got your text message");
else
client->binary("I got your binary message");
}
}
}
}
}
const char* ssid = "xyz";
const char* password = "Jaja";
const char * hostName = "esp-async";
const char* http_username = "admin";
const char* http_password = "admin";
void setup(){
Serial.begin(115200);
Serial.setDebugOutput(true);
WiFi.mode(WIFI_AP_STA);
WiFi.softAP(hostName);
WiFi.begin(ssid, password);
if (WiFi.waitForConnectResult() != WL_CONNECTED) {
Serial.printf("STA: Failed!\n");
WiFi.disconnect(false);
delay(1000);
WiFi.begin(ssid, password);
}
//Send OTA events to the browser
ArduinoOTA.onStart([]() { events.send("Update Start", "ota"); });
ArduinoOTA.onEnd([]() { events.send("Update End", "ota"); });
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
char p[32];
sprintf(p, "Progress: %u%%\n", (progress/(total/100)));
events.send(p, "ota");
});
ArduinoOTA.onError([](ota_error_t error) {
if(error == OTA_AUTH_ERROR) events.send("Auth Failed", "ota");
else if(error == OTA_BEGIN_ERROR) events.send("Begin Failed", "ota");
else if(error == OTA_CONNECT_ERROR) events.send("Connect Failed", "ota");
else if(error == OTA_RECEIVE_ERROR) events.send("Recieve Failed", "ota");
else if(error == OTA_END_ERROR) events.send("End Failed", "ota");
});
ArduinoOTA.setHostname(hostName);
ArduinoOTA.begin();
MDNS.addService("http","tcp",80);
SPIFFS.begin();
ws.onEvent(onWsEvent);
server.addHandler(&ws);
events.onConnect([](AsyncEventSourceClient *client){
client->send("hello!",NULL,millis(),1000);
});
server.addHandler(&events);
#ifdef ESP32
server.addHandler(new SPIFFSEditor(SPIFFS, http_username,http_password));
#elif defined(ESP8266)
server.addHandler(new SPIFFSEditor(http_username,http_password));
#endif
/*
server.on("/heap", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", String(ESP.getFreeHeap()));
});
*/
/*
server.serveStatic("/", SPIFFS, "/").setDefaultFile("index.html");
server.onNotFound([](AsyncWebServerRequest *request){
Serial.printf("NOT_FOUND: ");
if(request->method() == HTTP_GET)
Serial.printf("GET");
else if(request->method() == HTTP_POST)
Serial.printf("POST");
else if(request->method() == HTTP_DELETE)
Serial.printf("DELETE");
else if(request->method() == HTTP_PUT)
Serial.printf("PUT");
else if(request->method() == HTTP_PATCH)
Serial.printf("PATCH");
else if(request->method() == HTTP_HEAD)
Serial.printf("HEAD");
else if(request->method() == HTTP_OPTIONS)
Serial.printf("OPTIONS");
else
Serial.printf("UNKNOWN");
Serial.printf(" http://%s%s\n", request->host().c_str(), request->url().c_str());
if(request->contentLength()){
Serial.printf("_CONTENT_TYPE: %s\n", request->contentType().c_str());
Serial.printf("_CONTENT_LENGTH: %u\n", request->contentLength());
}
int headers = request->headers();
int i;
for(i=0;i<headers;i++){
AsyncWebHeader* h = request->getHeader(i);
Serial.printf("_HEADER[%s]: %s\n", h->name().c_str(), h->value().c_str());
}
int params = request->params();
for(i=0;i<params;i++){
AsyncWebParameter* p = request->getParam(i);
if(p->isFile()){
Serial.printf("_FILE[%s]: %s, size: %u\n", p->name().c_str(), p->value().c_str(), p->size());
} else if(p->isPost()){
Serial.printf("_POST[%s]: %s\n", p->name().c_str(), p->value().c_str());
} else {
Serial.printf("_GET[%s]: %s\n", p->name().c_str(), p->value().c_str());
}
}
request->send(404);
});
server.onFileUpload([](AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final){
if(!index)
Serial.printf("UploadStart: %s\n", filename.c_str());
Serial.printf("%s", (const char*)data);
if(final)
Serial.printf("UploadEnd: %s (%u)\n", filename.c_str(), index+len);
});
server.onRequestBody([](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total){
if(!index)
Serial.printf("BodyStart: %u\n", total);
Serial.printf("%s", (const char*)data);
if(index + len == total)
Serial.printf("BodyEnd: %u\n", total);
});
*/
server.on("/gauge.min.js", HTTP_GET, [](AsyncWebServerRequest* request) {
request->send(SPIFFS, "/gauge.min.js");
});
server.on("/", HTTP_GET, [](AsyncWebServerRequest* request) {
request->send(SPIFFS, "/index.html", String(), false, replaceVariable);
});
server.begin();
Zeit = millis ();
}
void loop(){
ArduinoOTA.handle();
ws.cleanupClients();
#define TIMEOUT 200
if ((Zeit + TIMEOUT) < millis ())
{
Zeit = millis ();
Temp += 1;
if (Temp > 50) Temp = -50;
}
}
String replaceVariable(const String& var) {
if (var == "TEMPERATURE") return String(Temp, 2);
return String(); }
Re: Der ESP32-Faden
Okay ich stelle hier mein Proof-of-Concept meiner Produktiv-Firmware zur Verfügung.
Die ist nicht super schön und für den ESP8266 funktioniert aber und enthält alles was man wissen muss.
Bitte noch die Libs auf asyncWebServer tauschen.
Da kannst du dir das Dashboard an gucken, dass musste genau das tun, was du als Beispiel erwartest.
Mit jQuery ist Ajax wirklich nur noch eine Fleißaufgabe es umzusetzen. In der ersten Version vor x Jahren hatte ich das noch in nativ JS geschrieben.
Grüße Jan
Die ist nicht super schön und für den ESP8266 funktioniert aber und enthält alles was man wissen muss.
Bitte noch die Libs auf asyncWebServer tauschen.
Da kannst du dir das Dashboard an gucken, dass musste genau das tun, was du als Beispiel erwartest.
Mit jQuery ist Ajax wirklich nur noch eine Fleißaufgabe es umzusetzen. In der ersten Version vor x Jahren hatte ich das noch in nativ JS geschrieben.
Grüße Jan
- Dateianhänge
-
- TestWebServer.zip
- (204.7 KiB) 38-mal heruntergeladen
Re: Der ESP32-Faden
Dank dir, ich werde mir das mal reindrehen!
Re: Der ESP32-Faden
Gestern ist mir die ESP8266Audio Bibliothek (https://github.com/earlephilhower/ESP8266Audio) über den Weg gelaufen. Dort gibt es das Beispiel "WebRadio" (https://github.com/earlephilhower/ESP82 ... s/WebRadio), was sehr einfach MP3 Streams abspielen kann ohne einen externen Decoder zu benutzen. Stream-URL ist bequem per Webinterface einstellbar.
Das wäre eine tolle Sachen mit einem winzigen Class-D Verstärker und einem kleinen Solarpanel. Wenn Sonne auf dem Balkon, dann kostenlose Musik!
Also gut, ESP8266 liegt noch rum, ebenso ein passender I2S DAC (PCM5102). Schnell zusammengelötet, Programm drauf und läuft mal grundsätzlich. Hängt sich aber ständig auf und spielt nicht unterbrechungsfrei. Ist der ESP8266 wohl etwas überfordert.
Das nackte Beispiel ohne Webservergedöns namens "StreamMP3FromHTTP" (https://github.com/earlephilhower/ESP82 ... P3FromHTTP) läuft schon flüssiger, aber immernoch nicht brauchbar.
Da die Bibliothek auch mit dem ESP32 funktionieren soll habe ich mir heute mal in der Verwandschaft so ein Teil besorgt. Hat ja deutlich mehr Dampf als der ESP8266, wäre ein Versuch wert ob der das besser auf die Reihe bekommt.
Nur gibt es hier das Problem, dass der Webserver nichts zu machen scheint. Firefox bringt nur die Meldung, dass der Server die Verbindung abgebrochen hat. Der ESP32 gibt ein paar Statusmeldungen über die serielle Schnittstelle aus, da sieht man dann, dass bei jedem Versuch die IP Adresse im Browser anzusurfen ein paar Daten übertragen werden, sich das mehrfach wiederholt und dann Ruhe ist. Sobald Ruhe ist zeigt der Browser eben an, dass die Verbdinung abgebrochen wurde.
Mich verwundert nun, dass zumindest mal die Webservergeschichte auf dem ESP8266 problemlos lief, auf dem ESP32 aber überhaupt nicht.
Sind da jemand Stolperfallen bekannt, die dazu führen, dass der selbe Code auf einem ESP8266 läuft aber auf dem ESP32 nicht? Vermutlich unterscheiden sich da schon so einige Details im Arduinoframework der beiden Controllertypen.
Jemand eine Idee, was das Problem sein könnte? Es gibt im Netz einige Berichte über Probleme mit der Webserverimplementierung auf dem ESP32, die aber angeblich in neuer Versionen des Frameworks behoben sein sollen. Bei mir geht weder Version 2.0 noch 1.0.5.
Das wäre eine tolle Sachen mit einem winzigen Class-D Verstärker und einem kleinen Solarpanel. Wenn Sonne auf dem Balkon, dann kostenlose Musik!
Also gut, ESP8266 liegt noch rum, ebenso ein passender I2S DAC (PCM5102). Schnell zusammengelötet, Programm drauf und läuft mal grundsätzlich. Hängt sich aber ständig auf und spielt nicht unterbrechungsfrei. Ist der ESP8266 wohl etwas überfordert.
Das nackte Beispiel ohne Webservergedöns namens "StreamMP3FromHTTP" (https://github.com/earlephilhower/ESP82 ... P3FromHTTP) läuft schon flüssiger, aber immernoch nicht brauchbar.
Da die Bibliothek auch mit dem ESP32 funktionieren soll habe ich mir heute mal in der Verwandschaft so ein Teil besorgt. Hat ja deutlich mehr Dampf als der ESP8266, wäre ein Versuch wert ob der das besser auf die Reihe bekommt.
Nur gibt es hier das Problem, dass der Webserver nichts zu machen scheint. Firefox bringt nur die Meldung, dass der Server die Verbindung abgebrochen hat. Der ESP32 gibt ein paar Statusmeldungen über die serielle Schnittstelle aus, da sieht man dann, dass bei jedem Versuch die IP Adresse im Browser anzusurfen ein paar Daten übertragen werden, sich das mehrfach wiederholt und dann Ruhe ist. Sobald Ruhe ist zeigt der Browser eben an, dass die Verbdinung abgebrochen wurde.
Mich verwundert nun, dass zumindest mal die Webservergeschichte auf dem ESP8266 problemlos lief, auf dem ESP32 aber überhaupt nicht.
Sind da jemand Stolperfallen bekannt, die dazu führen, dass der selbe Code auf einem ESP8266 läuft aber auf dem ESP32 nicht? Vermutlich unterscheiden sich da schon so einige Details im Arduinoframework der beiden Controllertypen.
Jemand eine Idee, was das Problem sein könnte? Es gibt im Netz einige Berichte über Probleme mit der Webserverimplementierung auf dem ESP32, die aber angeblich in neuer Versionen des Frameworks behoben sein sollen. Bei mir geht weder Version 2.0 noch 1.0.5.
Re: Der ESP32-Faden
AsyncWebserver ist die Lösung.
Problem Ursache siehe weiter oben.
Der Hauptunterschied ist das der ESP8266 ist Single-Core und der ESP32 ist Dualcore. Da funktioniert vieles anders.
VG Jan
Problem Ursache siehe weiter oben.
Der Hauptunterschied ist das der ESP8266 ist Single-Core und der ESP32 ist Dualcore. Da funktioniert vieles anders.
VG Jan
Re: Der ESP32-Faden
Hallo Jan!
Vielen Dank, das Problem ist nunhalbwegs klar.
Aber die Lösung noch nicht ganz, bzw. viel eher die Umsetzung der Lösung.
Kannst du mir auf die Sprünge helfen was ich genau anpassen muss, damit es funktionieren könnte?
Oder muss dafür der ganze Webseitenteil neu geschrieben werden? Das wäre dann vermutlich doch etwas über meinen Fähigkeiten.
Vielen Dank, das Problem ist nunhalbwegs klar.
Aber die Lösung noch nicht ganz, bzw. viel eher die Umsetzung der Lösung.
Kannst du mir auf die Sprünge helfen was ich genau anpassen muss, damit es funktionieren könnte?
Oder muss dafür der ganze Webseitenteil neu geschrieben werden? Das wäre dann vermutlich doch etwas über meinen Fähigkeiten.
Re: Der ESP32-Faden
Ich würde die Webserver Lib einfach mal stumpf austauschen und gucken welche Fehler der Compiler rauswirft. Viele waren das bei meinen Anwendungsfall nicht.
Grüße Jan
Grüße Jan
Re: Der ESP32-Faden
Da hört leider mein Verständnis schon auf. Ich sehe nicht, wo eine Webserver Lib eingebunden ist, die sich mit der asynchronen Variante austauschen lassen würde.
Sind das möglicherweise Funktionen, die in der ESP32 Bibliothek schon enthalten sind?
Vielleicht kannst du mal einen Blick in den von mir verlinkten Code werfen und noch einen Hinweis geben, in welchen Zeilen sind das genau abspielt?
Grundsätzlich ist das Programm ja nicht allzu riesig, aber wenn man gar nicht erst weiß wo man genauer hinschauen muss ist das doch ein recht aussichtsloses Unterfangen...
Edit:
Moment mal, da wurde sich doch extra ein eigener Webserver geschrieben und mit eingebunden, der gemäß Kommentar extra wenig RAM braucht.
Ich nehme an, dass es in dem Fall nicht so einfach ist das durch etwas Asynchrones auszutauschen?
Sind das möglicherweise Funktionen, die in der ESP32 Bibliothek schon enthalten sind?
Vielleicht kannst du mal einen Blick in den von mir verlinkten Code werfen und noch einen Hinweis geben, in welchen Zeilen sind das genau abspielt?
Grundsätzlich ist das Programm ja nicht allzu riesig, aber wenn man gar nicht erst weiß wo man genauer hinschauen muss ist das doch ein recht aussichtsloses Unterfangen...
Edit:
Moment mal, da wurde sich doch extra ein eigener Webserver geschrieben und mit eingebunden, der gemäß Kommentar extra wenig RAM braucht.
Ich nehme an, dass es in dem Fall nicht so einfach ist das durch etwas Asynchrones auszutauschen?
Re: Der ESP32-Faden
Ich habe mir mal deine SWLib angesehen.
Da wirkte wohl selbst Hand anlegen müssen oder alternativ hast du auch den Browser kastrieren... Parallel Conntections auf 1 stellen... geht zumindest bei FF.
Grüße Jan
Da wirkte wohl selbst Hand anlegen müssen oder alternativ hast du auch den Browser kastrieren... Parallel Conntections auf 1 stellen... geht zumindest bei FF.
Grüße Jan
Re: Der ESP32-Faden
ich habe eine ESP32-Cam Modul mit Tasmota drauf.
Wenn die Kamera aktiv ist, kackt das Ding nach ein paar Sekunden ab: dann vergisst Tasmota alle Einstellungen und meldet sich wieder jungfräulich mit Tasmota-Wlan. Wenn die Cam aus ist, läuft es stabil.
Ich habe bisher:
- C's 220uF mit 100nF parallel zwischen +5V-Gnd und +3,3V-Gnd gehängt
- alles nachgelötet
- Spannung auf 6V erhöht
keine Änderung. Habe auch keine Module zum quertauschen.
Kennt jemand das Problem?
Wenn die Kamera aktiv ist, kackt das Ding nach ein paar Sekunden ab: dann vergisst Tasmota alle Einstellungen und meldet sich wieder jungfräulich mit Tasmota-Wlan. Wenn die Cam aus ist, läuft es stabil.
Ich habe bisher:
- C's 220uF mit 100nF parallel zwischen +5V-Gnd und +3,3V-Gnd gehängt
- alles nachgelötet
- Spannung auf 6V erhöht
keine Änderung. Habe auch keine Module zum quertauschen.
Kennt jemand das Problem?
- Arndt
- Beiträge: 2589
- Registriert: Fr 28. Jun 2013, 13:42
- Wohnort: einen Schritt über den Abgrund hinaus
Re: Der ESP32-Faden
Ach guck an, noch ein Leidensgenosse!
Das scheint ein generelles Problem bei dem Ding zu sein, ich habe mich zufällig heute den gnzen Tag auch damit herumgeuält...
Bei mir läuft AI-on-the-edge auf dem Ding (Wasseruhr ablesen)
Quelle: https://github.com/jomjol/AI-on-the-edge-device/wiki
Anleitung https://www.youtube.com/watch?v=mDIJEyElkAU
Aber das Webinterface ist dermaßen unzuverlässig, das ist gruselig...
Zeitweise hatte ich das Mopet dann auch am Labornetzgerät, einen brownout schließe ich daher eigentlich aus.
Ich den Foren ließt man auch immer wieder, dass sich da viele schwer tun und in den käuflich zu erwerbenden Doppelpacks scheint kategorisch auch nur eine zu funktionieren.
@Kuddel, hattest Du nicht auch schon Deine Freude damit?
Das scheint ein generelles Problem bei dem Ding zu sein, ich habe mich zufällig heute den gnzen Tag auch damit herumgeuält...
Bei mir läuft AI-on-the-edge auf dem Ding (Wasseruhr ablesen)
Quelle: https://github.com/jomjol/AI-on-the-edge-device/wiki
Anleitung https://www.youtube.com/watch?v=mDIJEyElkAU
Aber das Webinterface ist dermaßen unzuverlässig, das ist gruselig...
Zeitweise hatte ich das Mopet dann auch am Labornetzgerät, einen brownout schließe ich daher eigentlich aus.
Ich den Foren ließt man auch immer wieder, dass sich da viele schwer tun und in den käuflich zu erwerbenden Doppelpacks scheint kategorisch auch nur eine zu funktionieren.
@Kuddel, hattest Du nicht auch schon Deine Freude damit?
Re: Der ESP32-Faden
Hängt da mal Strom an den Eingang, das Cameramodul zieht ordentlich.
-
- Beiträge: 131
- Registriert: So 9. Dez 2018, 11:30
Re: Der ESP32-Faden
Um das mit dem Brown Out auszuschließen bzw. um eine bessere Fehlermeldung zu erhalten könnte man die Ausgabe am UART0 des ESPs mithören (U0T). 8N1 115200 ist der Default Wert in dem SDK. Es kann aber sein das die Ausgabe deaktiviert oder eingeschränkt wurde, Widerstand an GPIO15 oder EFuse sind da möglich.
- Heaterman
- Beiträge: 3990
- Registriert: Fr 28. Jun 2013, 10:11
- Wohnort: Am Rand der Scheibe, 6 m unter NN
Re: Der ESP32-Faden
Das ist auch meine Erfahrung. Man sollte dem ein Netzteil spendieren, das mindestens 200 mA absolut stabil liefert. Und 5 V benutzen statt 3,3 V. Bei 3,3 V hat das Ding das Brown-Out-Problem. Ich hab ein paar dieser Dinger durch. Bei mir laufen die mit dem Standard-Webserver aus der Lib.
Ich hab so ein Ding auch in eine Modellbahn-Lok eingebaut. Ging nur über eine eigene Akkuschaltung, die wirklich stabil liefert und dann über die Fahrspannung gepuffert wird. Alle anderen Tricks mit Elko usw. haben nichts gebracht.
Einziges Problem bisher: Schaltet man den korrespondieren WLAN-AP oder das WLAN generell ab, braucht der ESP einen Neustart, wenn man das WLAN wieder zuschaltet.
Ich hab einen ESPCAM bei einem Bekannten installiert, der überwacht damit temporär sein Garagentor. WLAN des ESP reicht nicht von der Garage bis in die Wohnung, auch nicht mt externer Stabantenne. Er hat aber einen WLAN-AP 20 m daneben in der Laube (hauptsächlich für Computer und Handy im Garten), der nachts abgeschaltet wird. Beim EInschalten des AP zuckt sich der ESP erst mal nicht.
Da er sowieso einen Homematic-2-Kanal-Aktor zum Schalten des AP benutzt, haben wir den zweiten Kanal für das ESP-Netzteil genommen. Er schaltet das ESP-Netzteil ein paar Sekunden nach dem AP ein, dann handeln die Beiden aus und der ESP läuft. Alternative wäre das Schalten des ESP-Reset-Tasters per Fernsteuerung, geht auch, braucht aber einen externen, potentialfreien Relaiskontakt.
Die ESPCAMs im Doppelpack für 15 Euro sind Müll, manchmal auch die, wo der USB-Programmieradapter mitgeliefert wird. Beste Wahl bisher: das Modul von Ai-Thinker.
- Fritzler
- Beiträge: 12597
- Registriert: So 11. Aug 2013, 19:42
- Wohnort: D:/Berlin/Adlershof/Technologiepark
- Kontaktdaten:
Re: Der ESP32-Faden
5V statt 3,3V oder gar 6V?
Könnts sein, dass da ein LDO bzw DCDC drauf ist, der da abschmiert?
Son Kamerasensor zieht beim scannen gut Strom und WLAN auch ordentlich pulsweise beim Senden.
Kommen beide Pulse zusammen -> BÄM!
Ich hab sowas hier nicht liegen, daher müsstet ihr mal genauer erklären wie denn die Versorgung aufgebaut ist.
Dabei meine ich nicht nur euer Netzteil zu den Platinen hin, sondern wie auch die Spannungsversorgung auf den Platinen realisiert ist.
Wo bekommt das Cam Modul seinen Säft her?
Könnts sein, dass da ein LDO bzw DCDC drauf ist, der da abschmiert?
Son Kamerasensor zieht beim scannen gut Strom und WLAN auch ordentlich pulsweise beim Senden.
Kommen beide Pulse zusammen -> BÄM!
Ich hab sowas hier nicht liegen, daher müsstet ihr mal genauer erklären wie denn die Versorgung aufgebaut ist.
Dabei meine ich nicht nur euer Netzteil zu den Platinen hin, sondern wie auch die Spannungsversorgung auf den Platinen realisiert ist.
Wo bekommt das Cam Modul seinen Säft her?
- Heaterman
- Beiträge: 3990
- Registriert: Fr 28. Jun 2013, 10:11
- Wohnort: Am Rand der Scheibe, 6 m unter NN
Re: Der ESP32-Faden
Hier die Schaltung von Ai-Thinker:
https://docs.ai-thinker.com/_media/esp3 ... am_sch.pdf
Wenn man sie nicht braucht, ist es auch ganz nützlich, die Blitz-LED abzuhängen. Das Ding zieht gewaltig Strom und wird auch für Signalisierungen benutzt. Das kann auch Einbrüche verursachen.
https://docs.ai-thinker.com/_media/esp3 ... am_sch.pdf
Wenn man sie nicht braucht, ist es auch ganz nützlich, die Blitz-LED abzuhängen. Das Ding zieht gewaltig Strom und wird auch für Signalisierungen benutzt. Das kann auch Einbrüche verursachen.
- Fritzler
- Beiträge: 12597
- Registriert: So 11. Aug 2013, 19:42
- Wohnort: D:/Berlin/Adlershof/Technologiepark
- Kontaktdaten:
Re: Der ESP32-Faden
Werft den AMS1117 raus und ersetzt den gegen einen DCDC.
WLAN kann mal eben 300mA+ beim Senden ziehen.
(5V - 3,3V) * 0,3A -> 0,5W Ptot und im SOT223 hat der 90°C/W wenn man dem ne dicke Massefläche gibt.
Dazu dann noch die restliche Schaltung.
Der kann durchaus zu heiß werden und dann abschalten.
WLAN kann mal eben 300mA+ beim Senden ziehen.
(5V - 3,3V) * 0,3A -> 0,5W Ptot und im SOT223 hat der 90°C/W wenn man dem ne dicke Massefläche gibt.
Dazu dann noch die restliche Schaltung.
Der kann durchaus zu heiß werden und dann abschalten.
Re: Der ESP32-Faden
Das Problem scheint tatsächlich von der 3,3V Stabilisierung zu kommen.
Es läuft lange Zeit stabil wenn 3,3V extern eingespeist wird oder wenn "5V" mit 6V versorgt wird und gleichzeitig ein C=2000uF über 3,3V gehängt wird.
Allerdings nur in der Grundkonfiguration. Sobald ich einen Ausgang konfiguriere, wird Tasmota wieder jungfräulich. Hatte es mit mehreren Ausgängen probiert, jedoch ohne die Cam Belegung zu beachten. Evtl. werden diese Pins von Cam verwendet. Muss ich bei Gelegenheit mal genauer schauen...
Es läuft lange Zeit stabil wenn 3,3V extern eingespeist wird oder wenn "5V" mit 6V versorgt wird und gleichzeitig ein C=2000uF über 3,3V gehängt wird.
Allerdings nur in der Grundkonfiguration. Sobald ich einen Ausgang konfiguriere, wird Tasmota wieder jungfräulich. Hatte es mit mehreren Ausgängen probiert, jedoch ohne die Cam Belegung zu beachten. Evtl. werden diese Pins von Cam verwendet. Muss ich bei Gelegenheit mal genauer schauen...
Re: Der ESP32-Faden
Das Engelshaar in den meisten USB-Kabel ist zu dünn.
0.5 mm2 dürfte das dann schon mindestens sein.
Übertreiben große Cs sind auch eher kontraproduktiv.
Besser ist hier Low-ESR.
Grüße Jan
0.5 mm2 dürfte das dann schon mindestens sein.
Übertreiben große Cs sind auch eher kontraproduktiv.
Besser ist hier Low-ESR.
Grüße Jan
Re: Der ESP32-Faden
Aaaalso wie es der Zufall will: vorhin lag ein Umschlag mit 2x ESP32 CAM im Briefkasten. Optisch identisch zu Altem
Gleich mal an den Komposter gehängt und gleiche Tasmota Version draufgeschoben.
Beide funktionieren stabil an 5V über USB
Beide funktionieren stabil an 3,3V direkt
Ohne weitere C's
An beiden lassen sich Ausgänge konfigurieren ohne dass es abstürzt
An beiden kann ich LED anschalten (auch bei USB 5V) ohne dass es abstürzt
Beide zeigen etwa 20° weniger ESP Temperatur an als das Alte.
=> das alte Modul hat ein Problem
Gleich mal an den Komposter gehängt und gleiche Tasmota Version draufgeschoben.
Beide funktionieren stabil an 5V über USB
Beide funktionieren stabil an 3,3V direkt
Ohne weitere C's
An beiden lassen sich Ausgänge konfigurieren ohne dass es abstürzt
An beiden kann ich LED anschalten (auch bei USB 5V) ohne dass es abstürzt
Beide zeigen etwa 20° weniger ESP Temperatur an als das Alte.
=> das alte Modul hat ein Problem
Re: Der ESP32-Faden
Es gibt mehrere Versionen... je nach Hersteller.
Die alten haben meisten einen linearen Spannungsregler und die neueren einen DCDC.
Grüße Jan
Die alten haben meisten einen linearen Spannungsregler und die neueren einen DCDC.
Grüße Jan