Sketch von einen ESP8266 auf ein ESP32 portieren (hagelt Fehlermeldung)
Hallo,
habe mal eine Frage wegen eines Sketches für einen ESP8266 auf einen ESP32 Portieren. Leider bekomme ich es nicht hin, habe schon einige Stunden damit verbracht und versucht den Sketch anzupassen, scheint aber bei mir nicht zu klappen. Diesen Sketch habe ich im Internet gefunden, ist für ein ESP8266 Devboard mit OLED gemacht. Ich wollte diesen aber gern auf einen ESP32 TTGO Oled Devboard portieren, was ich aber nicht schaffe. Deshalb nun eine Frage/Bitte ob mir hier jemand weiterhelfen kann. Ich hänge mal den Originalen Sketch und meinen bereits (versuchten) mit Änderungen an. Ebenso die Fehlermeldung in der Arduino IDE. Sinn des ganzen ist, ich hätte mehrere freie GPIO´s, die ich für andere Sachen im Smarthome verwenden kann. Beim ESP8266 sind leider alle GPIO´s belegt. Vielen Dank schon mal
PS: hier ist noch ein Link wo man eine Beschreibung zum Devboard hat.
Dieser Testcode läuft sehr gut auf meinen ESP32 TTGO OLED Board. Habe genau das gleiche wie dort in Verwendung.
// Netzwerkinformationen für Accesspoint
// Im AP-Modus ist der ESP8266 unter der IP 192.168.0.1 erreichbar
const char* ssidAP = "ESP8266 for RCoid Access Point";
const char* passwordAP = "passpass"; //Muss mindestens 8 Zeichen haben
unsigned long timer;
#define DISPLAY_TIMEOUT 20000
#define RESET_TIMEOUT 300000 //Wenn sich im AP-Modus kein Client verbindet, wird nach dieser Zeit ein Reset ausgelöst. Sinnvoll, wenn nach Stromausfall der Router noch nicht neu gestartet hat.
int fileCounter;
/*
sendet ein RCoid-RF-Signal
z.B.:
*/
void handleRf()
{
serial_print_HttpInfo();
int repeats = getArgValue("repeats");
if (repeats == -1)
repeats = 1;
int gap = getArgValue("gap");
if (gap == -1)
gap = 10000;
bool burst = true; //wir beginnen mit RF-Signal
unsigned int burstTime = strtol(p_RCoidRfCode, &p, 10);
while (burstTime != 0)
{
digitalWrite(RF_PORT, burst ? HIGH : LOW);
delayMicroseconds(burstTime); //Warten
burst = !burst;
p++; //Komma im String wird übersprungen
burstTime = strtol(p, &p, 10);
}
digitalWrite(RF_PORT, LOW); //Am Ende IR immer AUS
}
/*
Gibt die CPU Takte zurück, die seit dem Neustart vergangen sind.
läuft ca. alle 53 Sekunden über
*/
#define RSR_CCOUNT(r) __asm__ __volatile__("rsr %0,ccount":"=a" (r))
static inline uint32_t get_ccount()
{
uint32_t ccount;
RSR_CCOUNT(ccount);
return ccount;
}
/*
Diese Webseite wird angezeigt, wenn der ESP im WLAN mit seiner lokalen IP abgerufen wird.
*/
void handleRoot()
{
htmlcontent = "<html><head></head><body style='font-family: sans-serif; font-size: 12px'>ESP8266 für RCoid";
htmlcontent += "<p>";
htmlcontent += "<a href='/receiveir'>Receive Infrared Signal</a>";
htmlcontent += "</p>";
htmlcontent += "<p>";
htmlcontent += "<a href='/deletepass'>WLAN Zugangsdaten löschen</a>";
htmlcontent += "</p>";
htmlcontent += "<p>";
htmlcontent += "<a href='/files'>Alle Daten anzeigen</a>";
htmlcontent += "</p>";
htmlcontent += "<p>";
htmlcontent += "<a href='/formatspiffs'>Dateisystem formatieren</a>";
htmlcontent += "</p>";
/*
Diese Webseite wird angezeigt, wenn der ESP im AP-Modus mit seiner IP 192.168.0.1 abgerufen wird.
Hier kann man dann die SSID und das Password des WLAN eingeben und den ESP neu starten.
*/
void handleAPRoot()
{
IPAddress ip = WiFi.softAPIP();
htmlcontent = "<html><head></head><body style='font-family: sans-serif; font-size: 12px'>ESP8266 für RCoid mit aktivem Access Point (IP: " + String(ip[0]) + '.' + String(ip[1]) + '.' + String(ip[2]) + '.' + String(ip[3]) + ")";
htmlcontent += "<p>";
int n = WiFi.scanNetworks();
if (n > 0)
{
htmlcontent += "<ol>";
for (int i = 0; i < n; ++i)
{
// Print SSID and RSSI for each network found
htmlcontent += "<li>";
if (WiFi.SSID(i) == WiFi.SSID())
htmlcontent += "<b>";
htmlcontent += WiFi.SSID(i);
htmlcontent += " (";
htmlcontent += WiFi.RSSI(i);
htmlcontent += ")";
htmlcontent += (WiFi.encryptionType(i) == ENC_TYPE_NONE) ? " " : "*";
if (WiFi.SSID(i) == WiFi.SSID())
{
IPAddress ip = WiFi.localIP();
htmlcontent += "</b> verbunden mit lokaler IP " + String(ip[0]) + '.' + String(ip[1]) + '.' + String(ip[2]) + '.' + String(ip[3]);
}
htmlcontent += "</li>";
}
htmlcontent += "</ol>";
}
else
{
htmlcontent += "Es konnten keine Netzwerke gefunden werden.";
}
htmlcontent += "</p><form method='get' action='setting'><label>SSID: </label><input name='ssid'><input name='pass'><input type='submit'></form><br><br>";
htmlcontent += "<a href='/reset'>ESP8266 neu starten";
if (WiFi.status() == WL_CONNECTED)
{
htmlcontent += " und AP deaktivieren";
}
htmlcontent += ".</a>";
htmlcontent += "<p>";
htmlcontent += "<a href='/receiveir'>Receive Infrared Signal</a>";
htmlcontent += "</p>";
htmlcontent += "<p>";
htmlcontent += "<a href='/files'>Alle Daten anzeigen</a>";
htmlcontent += "</p>";
htmlcontent += "<p>";
htmlcontent += "<a href='/formatspiffs'>Dateisystem formatieren</a>";
htmlcontent += "</p>";
/*
diese Funktion löscht die Zugangsdaten aus dem EEPROM
*/
void handleDeletePass()
{
htmlcontent = "<!DOCTYPE HTML>\r\n<html>";
htmlcontent += "<p>Clearing the EEPROM</p></html>";
server.send(200, "text/html", htmlcontent);
Serial.println("clearing eeprom");
EEPROM.write(0, 0);
EEPROM.write(1, 0);
EEPROM.commit();
ESP.restart();
}
/*
Diese Webseite wird angezeigt, wenn eine unbekannte URL abgerufen wird.
*/
void handleNotFound() {
htmlcontent = "File Not Found\n\n";
htmlcontent += "URI: ";
htmlcontent += server.uri();
htmlcontent += "\nMethod: ";
htmlcontent += (server.method() == HTTP_GET) ? "GET" : "POST";
htmlcontent += "\nArguments: ";
htmlcontent += server.args();
htmlcontent += "\n";
for (uint8_t i = 0; i < server.args(); i++) {
htmlcontent += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", htmlcontent);
}
/*
Gibt den Interger-Wert einers Argumentes zurück.
oder -1. falls das Argument nicht existiert
*/
int getArgValue(String name)
{
for (uint8_t i = 0; i < server.args(); i++)
if (server.argName(i) == name)
return server.arg(i).toInt();
return -1;
}
int port = getArgValue("port");
Serial.print("Port ");
Serial.println(port);
if (port < 0 || port > 15)
{
Serial.println("Port out of range. Abort!");
htmlcontent = "Port out of range.";
server.send(400, "text/plain", htmlcontent);
return;
}
Serial.print("Value ");
if (server.arg("value") == "t")
{
Serial.println("t (Toggle)");
if (port != -1)
{
pinMode(port, OUTPUT);
digitalWrite(port, !digitalRead(port));
}
}
else
{
int value = getArgValue("value");
Serial.println(value);
if (port != -1 && value != -1)
{
pinMode(port, OUTPUT);
digitalWrite(port, value == 0 ? LOW : HIGH);
}
}
/*
setzt den ESP zurück, damit er sich neu verbindet (nur im AP- und AP_STA-Modus)
Wenn sich der ESP dann im WLAN einwählen konnte, startet er im STA-Modus
Achtung: funktioniert das erste mal nach dem Flashen nicht! Der ESP muss dann mit dem Reset-Taster neu gestartet werden.
*/
void handleReset()
{
Serial.println("ESP wird neu gestartet!");
ESP.restart();
}
/*
gibt die IP als Klartext zurück (nur im AP- und AP_STA-Modus)
wird von RCoid abgefragt um festzustellen, ob der ESP mit dem WLAN verbunden ist
wird von RCoid automatisch in der App eingetragen
*/
void handleGetIp()
{
IPAddress ip = WiFi.localIP();
htmlcontent = ip.toString();;
server.send(200, "text/plain", htmlcontent);
Serial.println("Get IP = " + htmlcontent);
if (!ip.toString().equals("0.0.0.0"))
{
display.clear();
display.setFont(ArialMT_Plain_16);
display.drawString(0, 10, "Local IP");
display.drawString(0, 30, ip.toString());
display.setFont(ArialMT_Plain_10);
display.display();
timer = millis();
}
}
/*
wartet eine Zeit ab, bis am Receiver ein IR Signal decodiert wurde
blockiert den ESP
*/
void handleReceiveIr()
{
if (pushJson)
{
push_JSON();
return;
}
digitalWrite(STATUS_LED, LOW);
irReceiver.enableIRIn(); // Start the receiver
unsigned long start = millis();
display.clear();
display.setFont(ArialMT_Plain_16);
display.drawString(10, 10, "Wait for");
display.drawString(40, 30, "IR-Signal");
display.setFont(ArialMT_Plain_10);
display.display();
while (millis() < start + 30000)
{
if (irReceiver.decode(&ir_Decoded))
{
digitalWrite(STATUS_LED, LOW);
irDecodedIndexShow = fileCounter;
displayIRdecoded(ir_Decoded);
saveJSON();
playTone();
irReceiver.resume(); // Receive the next value
digitalWrite(STATUS_LED, HIGH);
return;
}
delay(100);
}
digitalWrite(STATUS_LED, HIGH);
server.send(408, "text/plain", "No IR Signal received!");
display.clear();
display.setFont(ArialMT_Plain_16);
display.drawString(0, 15, "No IR Signal");
display.drawString(40, 35, "received!");
display.setFont(ArialMT_Plain_10);
display.display();
for (int i = 2; i < 2 + ssidSize; i++)
{
essid += char(EEPROM.read(i));
}
Serial.print("SSID: ");
Serial.println(essid);
String epass = "";
for (int i = 2 + ssidSize; i < 2 + ssidSize + passSize; i++)
{
epass += char(EEPROM.read(i));
}
//Serial.print("PASS: ");
//Serial.println(epass);
if (essid.length() > 1)
{
WiFi.mode(WIFI_STA);
WiFi.begin(essid.c_str(), epass.c_str()); //Starte WIFI mit den Zugangsdaten aus dem EEPROM
display.drawString(0, 0, "Connect to");
display.drawString(0, 10, essid.c_str());
display.display();
setupAP(); //wenn keine Verbindung zum WLAN hergestellt werden konnte, wird der Accespoint aufgespannt.
}
/*
Zeigt eine Webseite mit allen Dateien im SPIFFS an
z.B.: http://ip.of.your.device/files
oder zeigt eine bestimmte Datei an
z.B.: http://ip.of.your.device/files?file=/IR-Decoded10.json
*/
void handleFiles()
{
if (server.arg("file").length() != 0)
{
File file = SPIFFS.open(server.arg("file"), "r");
if (!file)
{
Serial.println("file open failed");
server.send(400, "text/html", "File not found.");
}
else
{
htmlcontent = file.readString();
if (String(file.name()).endsWith(".json"))
server.send(200, "application/json", htmlcontent);
else
server.send(200, "text/html", htmlcontent);
}
}
else //listet alle Files auf
{
Dir dir = SPIFFS.openDir("/");
server.setContentLength(CONTENT_LENGTH_UNKNOWN);
/*
Wartet die gegebene Zeit t(in s)ab, bis die Verbindung zum WLAN besteht.
gibt "true" zurück, wenn die Verbindung besteht.
Anderenfalls wird "false" zurück gegeben.
*/
bool WaitForConnection(int t)
{
int counter = 0;
while (WiFi.status() != WL_CONNECTED)
{
counter++;
if (counter > t * 2)
return false;
delay(500);
Serial.print(".");
display.drawString(50 + counter * 3, 0, ".");
display.display();
}
return true;
}
/*
//////////////////////////////////// SETUP Access Point ///////////////////////////////////////////
Startet einen AP.
Settings:
SSID = "ESP8266 for RCoid Access Point"
Pass = "passpass"
IP = "192.168.0.1"
Wird ausgeführt, wenn der ESP keine Verbindung zum WLAN aufbauen konnte.
/*
speicher die SSID und das Password in den EEPROM
und versucht sich anschließend im WLAN einzuloggen.
Wenn das gelingt wird RCoid die IP abrufen und den ESP neu startet
*/
void handleSetting()
{
serial_print_HttpInfo();
String qsid = server.arg("ssid");
String qpass = server.arg("pass");
if (qsid.length() > 0 && qpass.length() > 0)
{
EEPROM.write(0, qsid.length());
EEPROM.write(1, qpass.length());
for (unsigned int i = 0; i < qsid.length(); i++)
{
EEPROM.write(2 + i, qsid[i]);
}
for (unsigned int i = 0; i < qpass.length(); i++)
{
EEPROM.write(2 + qsid.length() + i, qpass[i]);
}
EEPROM.commit();
RE: Sketch von einen ESP8266 auf ein ESP32 portieren (hagelt Fehlermeldung)
Warum willst du unbedingt auf den ESP32 umsteigen ?
Der ist leider noch etwas unstabiler, als der ESP8266.
Ich setze bisher aus diesem Grund nur die ESP8266 für den dauerhaften Betrieb ein und das bisher ohne Ausfälle.
Bei derartigen Projekten würde ich immer Stück für Stück umsteigen.
Also jede Funktion einzeln protieren, um sicher zu sein, dass diese auch soweit funktioniert.
Danach die nächste Funktion, aber auch einzeln vorgehen.
Erst wenn jede für sich funktioniert, dann zusammen fügen.
So kannst du sicher sein das auch die Libraries jeweils dazu passen.
Gruß Dieter
I2C = weniger ist mehr: weniger Kabel, mehr Probleme.
RE: Sketch von einen ESP8266 auf ein ESP32 portieren (hagelt Fehlermeldung)
@TO: Die Stunden sind nur eine geringe Zeit für solche Portierungen. Plane lieber Wochen ein.
Wie hotsystems schon schrieb, ist der ESP8266 stabiler. Wenn Du mehr Pins brauchst, kannst Du diese problemlos mit I2C-Porterweiterungen (z.B. PCF8574 8 Bit oder MCP23017 16 Bit) erweitern.
Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
RE: Sketch von einen ESP8266 auf ein ESP32 portieren (hagelt Fehlermeldung)
Hallo,
@TO: dem Hinweis, daß der ESP32 immernoch problematischer als der ESP8266 ist, stimme ich komplett zu.
Ein fertiges Projekt in diesem Umfang umzuziehen, dürfte diverse Bastelein mit passenden Libs, abweichenden Funktionsaufrufen usw. nachsich ziehen.
Am "damit rumspielen" hindert mich aber, daß ich es nicht mag, daß in den Sketchen die dämlichen D1...Dx Bezeichnungen für die Pins und nicht die GPIO-Nummern der ESPs benutzt werden. Ich habe z.B. alle Komponenten zur Hand, aber eben nicht das fertige passende Modul, ich sehe nichtmal eindeutig, welches Board ich in der IDE einstellen muß, damit das Pinmapping passt.
Von der ESP8266Webserver-Lib gibt es einen Fork mit einem Wrapper, der beim ESP32 auf die Webserver-Funktionen des ESP32 umleitet.
OLED dürfte kein Problem sein, IR könnte also auch klappen, was z.B. am RF_PORT passiert habe ich nicht geschaut und wenn ich das sehe:
#define RSR_CCOUNT® __asm__ __volatile__("rsr %0,ccount":"=a" ®)
weiß ich, daß da viel Arbeit auf Dich zukommt...
Danke aber für den wohl ungewollten Hinweis auf die IRremoteESP8266 Lib, da gab es hier vor kurzen einen anderen Thread um IRRemote-Probleme.
Schlimm für mich ist: die IRremoteESP8266 habe ich vor 2 Jahren selbst genutzt und hier immernoch im Einsatz und hatte das vergessen...
Ich werde alt.
Gruß aus Berlin
Michael
12.11.2019, 14:07 (Dieser Beitrag wurde zuletzt bearbeitet: 12.11.2019 14:20 von magnum1795.)
RE: Sketch von einen ESP8266 auf ein ESP32 portieren (hagelt Fehlermeldung)
@ amithlon
"ich sehe nichtmal eindeutig, welches Board ich in der IDE einstellen muß, damit das Pinmapping passt."
wer lesen kann ist klar im Vorteil. Steht im Sketch mit drin. "Board: "NodeMCU 1.0" hi,hi,hi
Ich habe mir diese ESP8266 Devboard´s vor längerer Zeit bei Alibaba gekauft und funktionieren sehr gut. Habe mir dazu noch ein passende Gehäuse gedruckt.
@ Thommy
werde mir das mal überlegen mit den PCF8574 (habe hier noch einige rumliegen) und dann mal sehn ob es was wird. Bin mir nicht sicher ob man das PCF8574 so ohne weiteres noch anschließen kann. Ein neues Gehäuse zu drucken ist dann nicht das Problem.
Na ja, dann werde ich wohl den/die ESP32 Boards zum "Spielen" verwenden, mal schauen was da so noch Interessantes damit geht.
PS: hier sind mal paar Bilder von den 8266 Devboard inkl. den IR LED´s und den Funkmodul. Das ganze kann ich mit Blynk steuern oder auch mit der hervorragenden Android App RCoid (zu finden hier > https://play.google.com/store/apps/detai...coid&hl=de
ist blos erstmal zum Testen die Free Version, würde aber jeden der Interesse daran hat die Vollversion empfehlen.
und hier die Originale Seite von den Entwickler > http://www.rcoid.de/RCoidIrToyFunk.html
und noch ein paar Foto´s vom ESP32 TTGO OLED Modul inkl. selbst entworfenen und gedruckten Gehäuse
RE: Sketch von einen ESP8266 auf ein ESP32 portieren (hagelt Fehlermeldung)
(12.11.2019 14:07)magnum1795 schrieb: Ich habe mir diese ESP8266 Devboard´s vor längerer Zeit bei Alibaba gekauft und funktionieren sehr gut. Habe mir dazu noch ein passende Gehäuse gedruckt.
Du schreibs aber nicht, warum du auf das ESP32 umsteigen willst.
Hätte mich schon interessiert.
Gruß Dieter
I2C = weniger ist mehr: weniger Kabel, mehr Probleme.
RE: Sketch von einen ESP8266 auf ein ESP32 portieren (hagelt Fehlermeldung)
@ hotsystems
doch, habe ich oben im ersten Beitrag doch geschrieben. Damit hätte ich dann mehrere GPIO´s frei und könnte somit noch weiteres damit in meinen Smarthome steuern. Wie.z.B. Garagentoröffner, Bewässerung etc.
doch, habe ich oben im ersten Beitrag doch geschrieben. Damit hätte ich dann mehrere GPIO´s frei und könnte somit noch weiteres damit in meinen Smarthome steuern. Wie.z.B. Garagentoröffner, Bewässerung etc.
OK....sorry, das habe ich tatsächlich übersehen.
Stimme aber in diesem Fall Tommy zu, diese "Problem" mit entsprechenden Portexpandern zu erschlagen. Damit bleibst du erst mal bei einem stabileren System.
Gruß Dieter
I2C = weniger ist mehr: weniger Kabel, mehr Probleme.