- 12V Akku mit 280 Ah bauen         
Seite 1 von 9 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 90

Thema: html-Code für virtuelles website-Button-Pad

  1. #1
    HaWe
    Gast

    html-Code für virtuelles website-Button-Pad

    Anzeige

    Praxistest und DIY Projekte
    Zitat Zitat von Moppi Beitrag anzeigen
    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));

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    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.


    Klicke auf die Grafik für eine größere Ansicht

Name:	feld.jpg
Hits:	14
Größe:	8,7 KB
ID:	34433



    MfG

  3. #3
    HaWe
    Gast
    zusätzlich zu
    [Senden/OK]

    bräuchte man zum Umschalten der Betriebsmodi noch einen Button
    [Training]

    und einen Button
    [Erkennen],

    aber das ginge zur Not auch über 2 echte Buttons an je einem GPIO Pin

    - - - Aktualisiert - - -

    edit, hat sich überschnitten:

    ja, sieht top aus!
    da ginge sogar auch ' ' für 0 und 'X' für 1, wenn kein Farbwechsel stattfindet und keine Zahlen in den Feldern stehen
    (Zahlen in den Feldern würden das Debuggen vereinfachen, muss aber nicht sein)

    - - - Aktualisiert - - -

    man würde dann

    1. entscheiden per Buttonclick, ob trainiert oder erkannt werden soll (evtl. auch Radio-Buttons)
    und
    2. "Senden/OK" würde dann das Muster für den gewählten Modus übertragen ans Netz.

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Man kann rein schreiben, was man möchte. Es wäre auch die Hintergrundfarbe zu ändern, was ich dann persönlich für besser fände, wenn das Feld ein Muster abbilden soll.

    Das mit den "Betriebsmodi" verstehe ich noch nicht.
    Das mit dem Muster trainieren kann ich mir vorstellen, aber dann fehlt die Zielvorgabe, was am Ende erkannt werden soll.

    Jetzt ist es so nur ein Eingabefeld. Man könnte durch anklicken der Felder ein Muster erstellen / eingeben und abschicken.

    Mal sehen ...



    MfG

  5. #5
    HaWe
    Gast
    man trainiert mehrere Eingabemuster gemeinam mit enem jew. Ausgabemuster (Ziel), z.B
    000
    0
    (training)

    010
    0
    (training)

    100
    0
    (training)

    110
    1
    (training)


    dadurch lernt das Netz, die verschiedenen Eingabemuster zuzuordnen.
    Dabei werden nicht die Einzelmuster gespeichert, sondern die Neuronen verändern ihre innere Struktur für alle Muster gemeinsam:
    sie bilden eine interne Variablen-Matrix aus internen Gewichten und Thresholds, die auf alles gemeinam passt.

    gibt man nun ein
    011
    drückt man auf
    (erkennen)
    dann wurde dieses Muster bisher nicht trainiert, trotzdem wendet das Netz seine Matrix auf dieses Muster an und erzeugt ein Ergebnis, das irgendwie zu den bisherigen Mustern passt, möglicherweise wird es auch eine 1 sein, aber das muss man ausprobieren: es lässt sich nicht vorhersagen.

    Als Inputschicht könnte man die obersten 9 Zeilen des html-Buttonpads verwenden, als Ausgabeschicht die unterste, 10.

    Ich bin aber gestern abend/nacht auf eine Sache gestoßen, als ich ein einfaches meiner alten Netze auf den ESP8266 portieren wollte:

    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).

    Der ESP8266 kann aber überhaupt kein Multithreading, und er stürzt ab und rebootet, wenn eine Funktion den Prozessor länger als wenige (1-2) Sekunden komplett mit einer Berechnung belegt. Training aber kann mehrere Stunden dauern, und auch Auswertungen (Erkennen) zumindest mehrere Sekunden

    Das zweite Problem lässt sich vielleicht (!) durch etliche delay(1) in der Trainingsfunktion kaschieren (weiß ich noch nicht),
    aber Mutithreading ist unverzichtbar, wenn man im Betrieb das Gehirn (ich nenne es HAL) simultan Muster bearbeiten als auch Inputs, Steuerbuttons und das Display bedienen soll.
    Würde man das alles Spagetticodemäßig hintereinander schreiben, wird es nicht nur unübersichtlich, sondern auch extrem langsam, weil dadurch die sehr schnellen Gehirnroutinen im Mikrosekunden-Bereich ausgebremst werden durch TFT-Anzeige- oder GPIO- und html-Abfrageroutinen, die man nur 1x pro Sekunde aktualisieren muss.
    Ein dritter Grund, was gegen den ESP8266 spricht: er hat zu wenie GPIOs, um auch zusätzlich neben lokalen Pin-Buttons eine SD-Karte per SPI anzusprechen.

    Der ESP8266 macht daher keinen Sinn als Basis für ein NN, zumindest bei meinen NN-Pogrammen, die ich bereits geschrieben habe.
    Es müsste ein Arduino Due sein wie früher, der kann aber keinen Webserver aufbauen,
    oder ein esp32 ,
    denn nur diese beiden können derzeit Multithreading (Due Scheduler bzw. std::thread).

    Da der Due wegen mangelndem html aber komplett rausfällt und wir auch kein Hardware-Buttonpad haben, bleibt nur mein ESP32 als einzige Basis (meiner hat ein Adafruit Feather HX8367 Display) , für die ich die NNs neu programmieren könnte.
    Allerdings verwendet der ESP32 auch etwas andere wifi- und webserver libs als der esp8266.

    Mir ist daher jetzt noch nicht klar, wie es weitergehen kann, und ob es Sinn macht, zunächst mit den esp8266-html-Buttons zweigleisig zu fahren, mit absolut ungewissem Ausgang...

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650

    Quelltext für KeyPad

    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.

    KeyPadSource.zip

    MfG
    Geändert von Moppi (31.10.2019 um 08:06 Uhr) Grund: Anhang hinzufügen

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    und einem unsichtbaren Frame, zwecks Datenübertragung.
    https://www.html5rocks.com/en/tutori...ockets/basics/

    geht auch etwas eleganter als ständig http requests zu schicken

    Und weil ichs persönlich liebe hole ich nochmal die Python Keule raus und sag mal

    https://github.com/pallets/flask

    Da fällt das parsen etwas leichter und man kann die Webseiten als richtige HTMl Files schreiben und muss dann wie bei PHP in den Patzhaltern nur den PyCode packen der dann aus Daten die Lücken des HTML Dokuments an der entsprechenden Stelle ergänzt.

    Finde ich persönlich eleganter als den HTML code als String mit ein zu compilen (und man kann auch die files on-the-fly updaten wenn was nicht stimmt und muss nicht immer erst alles compilen und hochladen
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Zitat Zitat von Ceos Beitrag anzeigen
    https://www.html5rocks.com/en/tutori...ockets/basics/

    geht auch etwas eleganter als ständig http requests zu schicken
    Wenn Du es kannst: super! Mach bitte ein Beispiel für nodeMCU.

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    Wenn Du es kannst: super! Mach bitte ein Beispiel für nodeMCU.
    Netter Beißreflex ... war als Denkanstoß zu verstehen und um etwas Last aus der Verbindung zu nehmen, aber wenn man sich zu fein ist mal damit zu beschäftigen ... bitte ... daher nur eine vereinfachte Antwort und viel Glück

    https://www.tutorialspoint.com/html5..._websocket.htm

    für die NodeMCU Seite braucht man allerdings ein klein wenig mehr Einrichtungsarbeit

    https://github.com/micropython/micropython (Als Grundlage)
    https://github.com/pfalcon/picoweb (Die Flask Version für den kleinen Speicher)
    https://github.com/hiway/micropython...ockets-modules (Die Websocket Anbindung)

    Allerdings habe ich damals den richtigen Flask genommen und etwas angepasst damit er auf µPy läuft. Hab sogar mal Owncloud drauf laufen lassen, aber die Datenrate war eher bescheiden :P
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  10. #10
    HaWe
    Gast
    Zitat Zitat von Moppi Beitrag anzeigen
    Wenn Du es kannst: super! Mach bitte ein Beispiel für nodeMCU.
    schließe ich mich an, in Arduinisch!
    Python ist hier völlig OT, denn dann müsste ja auch das NN in Python geschrieben werden, und das ist völlig illusorisch für meine Zwecke.

    yield() ist aber nichts anderes als delay(1) in Arduinsch, das hatte ich ja schon angesprochen und damit müsste ich es ausprobieren.

    Dennoch nützt es nichts, wenn die cpu kein MT kann.

Seite 1 von 9 123 ... LetzteLetzte

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 20.03.2019, 14:40
  2. html code für User Login + password (esp8266 + Arduino IDE)
    Von HaWe im Forum NodeMCU-Board und ESP8266, ESP32-Serie
    Antworten: 35
    Letzter Beitrag: 19.08.2018, 20:10
  3. html-Code für nodeMCU mit Arduino IDE + Wifi libs
    Von HaWe im Forum Arduino -Plattform
    Antworten: 7
    Letzter Beitrag: 14.08.2018, 19:30
  4. HTML-Code (scripts)
    Von Technik =) im Forum Umfragen
    Antworten: 6
    Letzter Beitrag: 10.10.2008, 10:21
  5. virtuelles Autocockpit
    Von redg im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 6
    Letzter Beitrag: 02.10.2005, 14:53

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen