html-Code für virtuelles website-Button-Pad
Zitat:
Zitat von
Moppi
Das ist nicht ganz so einfach. Das nodeMCU ist etwas langsam. Ich hatte schon mal gelesen, dass die keine sher hohe Datenübertragungsrate per WiFi haben, aber mich stellt das so nicht ganz zufrieden. Einen Anfang habe ich gemacht, bis ich jetzt gesehen habe, wie lang das mit der Übertragung der Seite dauert.
Hier mal der vorläufige Code:
Code:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
const char* ssid = "....";
const char* password = "....";
ESP8266WebServer server(80); //instantiate server at port 80 (http port)
String page = "";
//the HTML of the web page
String s1="<div style='display:block;overflow:visible;'><div role='presentation' style='display:table'>";
String s2="<div style='display:table-row;'>";
String s3="<div style='display:table-cell;position:relative;vertical-align:top;width:1.5em;padding:0.1em;'><form style='height:0.65em;'><input type='text' name='but' value='";
String s31="' maxlength='1' style='visibility:hidden;width:0;height:0;'><input id='but#0' type='submit' value='*' style='margin:0;height:1.5em;width:1.6em;font-family:monospace;font-style:normal;font-size:133%;color:#000000;font-weight:700;text-align:center;line-height:170%;border-radius:0.375em;border-width:1px;'></form></div>";
String s4="</div>";
int tableWidth=7;
int tableHeight=7;
void setup(void){
Serial.begin(115200);
delay(10);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password); //begin WiFi connection
WiFi.config(IPAddress(xxx,xxx,x,xx), IPAddress(xxx,xxx,x,xx), IPAddress(255,255,255,0), IPAddress(xxx,xxx,x,xxx));
Serial.println("");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
server.on("/", [](){
page = s1;
int but = 0;
for(int x=0; x < tableHeight; x++){
page += s2;
for(int j=0; j < tableWidth; j++){
page += s3 + String(but) + s31;
but++;
}
page += s4;
}
page += s4;
server.send(200, "text/html", page);
});
server.begin();
Serial.println("Web server started!");
}
void loop(void){
server.handleClient();
yield();
}
Es wäre in der Größe, per CSS, noch optimierbar, aber besser wär's mit JavaScript auf der Seite zu arbeiten und einem unsichtbaren Frame, zwecks Datenübertragung.
MfG
die Eingabe per Buttons ist nicht zeitkritisch, das dauert eh bis man ein Muster mit etwa 10-20 Buttons gedrückt hat.
Dann muss es per Sende-Button ("Fertig") übertragen weden,
und dann beginnt der Trainings- und Lernalgorithmus, der dann eh nicht mehr auf das Netzt per html zugreift und (je nach Netzstruktur und Musterzahl) durchaus mehrere Stunden dauern kann.
Im "Erinnerungsmodus" kann man dann dem Netz verschiedene Muster präsentieren (dauert so lange wie oben)
und dann legt es die gelernten Perzeptronwerte an (Netz-Matrix),
das dauert dann erfahrungsgemäß nur wenige Sekunden bis zur Auswertung.
Update:
dein html-Buttonpad sieht schon sehr schön aus, jetzt müssten die Buttons noch Zahlen tragen (0-63, zeilenweise hochgezählt),
Farbwechsel sobald gedrückt (grau->gelb o.ä.)
und dann müsste das Gesamt-Muster mit allen Nullen und Einsen für alle 64 Buttons als Block per Extra-Button an den esp gesendet werden, zur Weiterverarbeitung als net-inputs.
Anm.: WiFi.config() hat subnet 255,255,255,0 am Schluss!
WiFi.config(IPAddress(192,168,2,99), IPAddress(192,168,2,1), IPAddress(192,168,2,1), IPAddress(255,255,255,0));
Liste der Anhänge anzeigen (Anzahl: 1)
Vergiss es wieder, ist schon überholt. Nicht mit dem alten Krempel den Server belasten.
Hier mal ein Bild, ob das so dann ok ist. In den Feldern stehen nachher 0, 1 oder Leer und X (oder was anderes). Zum Aussuchen. Beim reinklicken würde sich der Inhalt ändern. Wenn alles fertig gesetzt ist, würde es ein Mal übertragen. Das ist dann aber vom Code her schon wesentlich kürzer so.
Anhang 34433
MfG
Liste der Anhänge anzeigen (Anzahl: 1)
Quelltext für KeyPad
Zitat:
alle meine bisherigen MCUs konnten Multithreading (Lego NXT und Arduino Due), und beiden machte es nichts aus, wenn eine Funktion für eine Berechnung sehr lange gebraucht hat (Minuten bis Stunden).
Macht es dem nodeMCU auch nicht, wenn man im Programmcode mitteilt, dass man beschäftigt aber aktiv ist. Der Befehl dafür ist: yield();
Ich habe das mal, so weit es bis jetzt mit den Infos möglich war, erstellt und etwas beschrieben. Datei hier zum Herunterladen.
Anhang 34434
MfG
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Ein bool Datentyp benötigt ja übrigens auch denselben Speicherplatz bei C/C++ ( stdbool.h ) wie ein char oder byte.
Habe ich nicht mit gerechnet. Dann sag noch mal, was Du für einen Datentyp brauchst, dann sparen wir die Umwandlung.
Zitat:
Ich muss es nur zunächst übertragen auf lineare Arrays, aber nur dann, wenn Daten auch neu verfügbar sind (OK/senden-Button auf der website frisch gedrückt).
Ich habe eine Variable (bool isChange) eingebaut, zum Abfragen nach server.handleClient();
Anhang 34435
MfG
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat von
HaWe
Die 100 website-keys müssen zeilenweise als Array durchgezählt sein von 0...99, nicht Reihe/Spalte.
Sind sie.
Zitat:
Zitat von
HaWe
ich komme aber mit dem Reinkopieren des neuen Schnipsels nicht klar.
Kannst du bitte den vollständigen, kompletten Code posten?
:!: Anhang 34436
Auf neue Daten prüfen
if (isChange) ...
Kopieren sobald neue Daten verfügbar
for (int i=0; i<100; i++} { bufferArray[i]=(float)matrix[i]; }
MfG
PS:
Benutze lieber ZIPs, weil der Thread so leserlicher bleibt.
Ich habe im Thread nochmal etwas gelesen, ob noch irgendwas in den Code eingebaut werden soll, was ich übersehen habe.
Für das nodeMCU hatte ich ein kleines Projekt geplant. Aus diesem Grund kam ich überhaupt auf das Tastenfeld per HTML.
Du musst schauen, ob es so praktikabel ist, wenn nicht, dann nicht. Alle meine Projekte beginnen so, dass ich mit unbekannten
Dingen beginne oder mit denen, die am schwierigsten sein könnten; um frühzeitig ein Scheitern zu erkennen und dann abzubrechen.
Wenn Du das lieber anders lösen möchtest, als mit einer HTML-Seite, habe ich damit also keinerlei Problem. Alles i.O.
Liste der Anhänge anzeigen (Anzahl: 1)
Das nodeMCU mit seinen Bibliotheken hat mir einige Schwierigkeiten bereitet.
Die Radio-Buttons wollten nicht funktionieren; obwohl das HTML im Browser schon funktionierte,
nur nicht, nachdem das mit dem nodeMCU verschickt wurde. Hat mich den ganzen Vormittag gekostet :(
Also bin ich doch auf Buttons umgestiegen, Quelltext hier:
:!: Anhang 34437
Neu hinzugekommen sind:
bool isLearn
bool isDetect
bool isReset
bool isSave
In der Browserzeile kann man noch sehen, welche Parameter an das nodeMCU verschickt wurden.
Habe das so gelassen, weil man dann bei der Entwicklung etwas zum Kontrollieren hat.
Kann später geändert werden.
MfG