Tag 18: Universal Fernbedienung

Gestern haben Sie einen Empfänger für Infrarotfernbedienungen gebaut. Heute bauen Sie sozusagen die Fernbedienung selbst. Genauer gesagt basteln Sie sich eine per Computer oder Smartphone bedienbare Universalfernbedienung, mit der Sie Ihren Fernseher oder andere Geräte steuern können, auch wenn die originale Fernbedienung mal wieder nicht auffindbar ist.

Damit Sie das Projekt angehen können, benötigen Sie das Bauteil, das sich hinter dem heutigen Türchen befindet, die IR-Diode. Sie sieht aus wie eine einfache LED, allerdings sendet sie Licht im nicht sichtbaren Infrarotbereich aus. Die IR-Signale sind aber für eine digitale Kamera sichtbar. Der Aufbau des heutigen Tages können Sie dem unteren Bild entnehmen. Wundern Sie sich nicht, dass die IR-LED keinen Vorwiderstand bekommt. Der wirksame Vorwiderstand ist allein der On-Widerstand des Ports von ca. 30 Ohm.  Damit ist der Strom durch die Diode recht groß, die gesendeten Impulse sind aber so kurz, dass die Diode keinen Schaden nimmt.

Anschluss der IR-Diode an Pin D3

Anschluss der IR-Diode an Pin D3

Das Programm: Day18_IrRemote

Bevor das Projekt funktionieren kann, müssen Sie wieder einige Anpassungen vornehmen. Wenn Sie gestern die Codes Power, Lauter, Leiser, Kanal hoch, Kanal runter, und Mute ausgelesen und verwendet haben, können Sie die Codes einfach der Reihe nach in das Array irCommand eintragen. Falls nicht sollten Sie das gestrige Programm erneut einspielen und die passenden Codes auslesen, Sie können natürlich auch ganz andere Codes nehmen, nur passt die Beschriftung auf der Webseite dann nicht dazu. Neben den Codes müssen Sie auch das verwendete Protokoll in die Variable irProtokoll eintragen, sofern Ihre Fernbedienung unterstützt wird. Zuletzt müssen Sie noch die Länge des zu sendenden Signals eintragen. Diese ermitteln Sie, indem Sie die Stellen des Hex Codes mit vier multiplizieren. Als Beispiel: Mein Code für Power war 0x20DF10EF. 0x ist einfach nur das Zeichen für einen Hex Code, bleiben also 20DF10EF und damit ein achtstelliger Hex-Code. 8*4 = 32, also steht im Beispielprogramm hinter der Variable irLen eine 32. Eine ähnliche Rechnung müssen Sie dann für einen Code vornehmen, der eine andere Länge hat.

Wenn Sie alle Codes und Parameter und natürlich auch Ihre WLAN-Daten eingetragen haben, können Sie das Programm uploaden. Die Webseite des Boards enthält nun sechs Buttons mit passender Beschriftung. Wenn Sie nun einen der Buttons betätigen, sollte eine Meldung über den Serial Monitor erscheinen und Ihr Fernseher oder anderes Gerät passend auf das Signal reagieren. Falls nicht müssen Sie eventuell näher ran gehen, oder Sie überprüfen, ob die IR-Diode überhaupt etwas sendet. Eine falsch gepolte LED wäre z.B. eine Möglichkeit, warum das Projekt nicht wie gewünscht funktioniert.

Die TV-Remote Webseite

Die TV-Remote Webseite

66 Kommentare

  1. Peter

    Hallo,

    mich wundert es das es hier keine Posts von Panasonic-Besitzern gibt.
    War ich der einzige der nicht auf anhieb gesehen hat was mit dem Code nicht stimmt? Oder habt Ihr alle andere Geräte?

    Bei mir hat es erst geklappt, nachdem ich die irSend()-Methode geändert hab.
    Case 7 sieht jetzt so aus:

    case 7:
    irsend.sendPanasonic(0x4004, irCommand[irCom]);
    delay(40);
    break;

    Wobei 0x4004 die Geräteadresse meines TV ist.

    Links die mir geholfen haben:
    http://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html

    https://forum.arduino.cc/index.php?topic=338723.0

  2. matzotti

    HI, ich versuche gerade ein bißchen Tag 17 mit Tag 18 zu kombinieren -> Wenn der Fernseher bedient wird (egal welche Taste, also wenn ein beliebiges SIgnal gesendet wird) wird ein definiertes Signal zurückgesendet.
    Dafür habe ich die Programmcodes von den beiden Tagen gemixt. Leider erkennt der Arduino nicht mehr das Signal.

    void loop() {

    irAnalyse(); //Check incomming IR

    if (esp8266.available()) // check if the esp is sending a message
    {
    if (esp8266.find(„+IPD,“))
    {
    debug(„Incoming Request“);
    int connectionId = esp8266.parseInt();

    if (sendWebsite(connectionId, createWebsite())) debug(„Website send OK“);

    }
    }

    }
    void irAnalyse()
    {

    if (irrecv.decode(&results)) {
    Serial.print(„Sende Signal“);
    irSend(0xE0E040BF);
    irSend(0xE0E040BF);
    irrecv.resume(); // Receive the next value
    }
    }

    DerArduino springt leider nicht in der void() Schleife in die Funktion irAnalyse, obwohl der Code und die Schaltung aus TAG 17 übernommen wurde. Lediglich die LED wurde durch die IR-Diode aus TAG 18 ersetzt.

    Warum funzt das nicht ?

    Gruß,
    Matzotti

  3. Jakob

    Kann man auch den 9V block anschließen ohne das die Bauteile schaden nehmen?

    1. Klaus

      Wenn Du ihn wie an dem Tag wo der Clip im Kalender war anschließt (GND und VIN), dann klappt das. Auf dem Board ist ein Spannungsregler, der die 9V zu 5V und 3,3V macht

  4. Axolotl

    Steht „Type“ (decode_typ) aus dem gestrigen Versuch für den „irProtocol“ vom heutigen Versuch?

  5. Kacki

    Ok, mit dem heutigen Projekt habe ich folgende Erkenntnisse:

    1. Man kann getrost die IR-Led *ohne* Vorwiderstand anschließen, also so wie hier gezeigt. Sie braucht eh eine höhere Spannung als die anderen Leds und selbst ohne Widerstand leuchtet sie bei Weitem nicht so „hell“ wie die Sende-Led meiner Original-FB (Das hat mein Handy-Cam-Test nach rein subjektivem Empfinden gezeigt)

    2. Die Konstante irLen bleibt bei mir auf 32, obwohl meine Original-FB nur 6- statt 8-stellige Codes sendet. Funktioniert prima.

    3. Nachdem nun alles eigentlich gut funktioniert, stimmt die Zuordnung der Tasten von gestern im Programm heute bei mir nicht. Liegt das an mir, oder kann das jemand bestätigen? So ist z.B. zwar On/Off richtig, aber „Mute“ macht an meinem Gerät den Ton „lauter“, „CH-“ macht bei mir „leiser“, bei den anderen weiß ich’s gerade nicht mehr genau… irgendwie ist’s permutiert. Ich habe das Array aber entsprechend der Reihenfolge vom gestrigen Programm gefüllt.

    1. Matzotti

      Wenn man die Reihenfolge der Codes aus Tag17 nimmt und den HTML Code aus Tag 18 vergleicht sind die Lautstärke und Kanalauswahl verdreht.
      Dementsprechend kann
      1.) die Codes im Arduino-Code korrigiert eintrage
      oder
      2.) im HTML-Code die Zahl 1 und 2 mit 3 und 4 vertauschen

  6. Huetter

    Was sendet der Serieller Monitor wenn´s funktioniert?

    1. Kacki

      Der loggt für jeden Webseiten-Tastendruck:

      Incomming Request
      0
      Incomming Request
      1
      Incomming Request
      2

      […]

      Incomming Request
      5

      Die Ziffer entspricht vermutlich der Taste

      1. Kacki

        Incomming mit Doppel-m *lol*
        Wahrscheinlich wegen „In-communicate-ing“ ;-)

  7. Santiago

    Bei mir kommt diese Fehlermeldung:

    C:\Users\Santiago\Documents\Arduino\libraries\IRremote\irISR.cpp: In function ‚void __vector_7()‘:

    C:\Users\Santiago\Documents\Arduino\libraries\IRremote\irISR.cpp:27:54: error: ‚STATE_OVERFLOW‘ was not declared in this scope

    if (irparams.rawlen >= RAWBUF) irparams.rcvstate = STATE_OVERFLOW ; // Buffer overflow

    ^

    C:\Users\Santiago\Documents\Arduino\libraries\IRremote\irISR.cpp:38:15: error: ‚volatile struct irparams_t‘ has no member named ‚overflow‘

    irparams.overflow = false;

    ^

    C:\Users\Santiago\Documents\Arduino\libraries\IRremote\irISR.cpp:74:8: error: ‚STATE_OVERFLOW‘ was not declared in this scope

    case STATE_OVERFLOW: // Flag up a read overflow; Stop the State Machine

    ^

    C:\Users\Santiago\Documents\Arduino\libraries\IRremote\irISR.cpp:75:13: error: ‚volatile struct irparams_t‘ has no member named ‚overflow‘

    irparams.overflow = true;

    ^

    Multiple libraries were found for „IRremote.h“
    Used: C:\Users\Santiago\Documents\Arduino\libraries\IRremote
    Not used: C:\Program Files (x86)\Arduino\libraries\RobotIRremote
    exit status 1
    Error compiling.

    Kann mir bitte wer helfen?

  8. chris

    es geht nich ich bekomme immer eine fehlermeldung

    1. Nikdro

      Hast du die Libary installiert? Versuch einfach das von gestern nochmal. Wenn da auch nicht funktioniert steht fest, dass die Lib nicht installiert ist :)

    2. Skayo

      Sicher dass du die IRremote-library RICHTIG eingefügt hast?
      —> ~\Documents\Arduino

      Kontrolliere das mal.
      Denn wenn ich die IRremote-library nicht zu dem „libraries“-Ordner hinzufüge, kommt bei mir der gleiche Fehler.

      mfg

      1. Skayo

        *~\Documents\Arduino\libraries

        1. chris

          jetz geht es. die library war nicht richtig installiert,
          aber jetz geht es.

  9. Roman_2

    Hallo Leute, habe derzeit nur 1 TV-Gerät + zugehöriger Fernbedienung zur Verfügung. Bei mir ist im gestrigen Versuch irProtocol „Type:-1“ im seriellen Monitor gestanden. Funktion war aber gegeben. Habe ich dann heute überhaupt eine Chance etwas zu senden?
    irLen habe ich bereits kontrolliert
    und habe auch die verschiedensten irProtocol’s durch.

    Danke schonmal im Voraus!

    1. Tommy

      Hast du schon mal versuch die iRemote.h upzudaten? Geht im Arduino-Programm über Menü: Sketch / Bibliothek einbinden / Bibliotheken verwalten.
      Dort dann die iRemote suchen und auf More info klicken.
      Dort dann das Update installieren. In der neuen Version werden etliche FB-Typen mehr unterstützt.

      Dann musst du natürlich noch das heutige Programm anpassen. In meinem Fall gings um Samsung-TV.
      Alte iRemote brachte Type=-1, neue Type=7.

      Jedoch steht im heutigen Programm den Type 7 der Aufruf:

      case 7:
      irsend.sendPanasonic(irCommand[irCom], irLen);

      Das musste ich ändern in:

      case 7:
      irsend.sendSAMSUNG(irCommand[irCom], irLen);

      Eventuell kanns auch nötig sein, den irsend-Aufruf zu duplizieren, damit es funzt. (war bei meinem Samsung so).

      ACHTUNG: Groß-/Kleinschreibung für den Markennamen beachten. Wie es von der neuen iRemote.h erwartet wird, steht in dieser.

      Dann wars noch wichtig, die Zeile:

      #define DEBUG true

      HINTER die Zeile:

      #include

      zu setzen, sonst siehste im Seriellen Monitor nix.

      Bei mir hats am Ende gepasst. Siehe mein Reply unten
      auf MCs Beitrag.

      Good luck ;-)

      1. Roman_2

        DANKE, DANKE, DANKE!!!!!
        bis aufs duplizieren hab ich alles gemacht und jetzt funktioniert alles auf meinem Samsung TV :) auch der serielle Monitor „wieder“ :D

  10. Rolando

    ENDLICH habe ich herausgefunden, warum es heute bisher nicht geklappt hat, und das wird auch viele andere betreffen: Die Anleitung, die Stellen des gestern ermittelten HEX Codes einfach mit 4 zu multiplizieren, um die irLen zu berechnen, stimmt so nicht. Und mit falscher irLen geht es nicht. Mein Code war CBC0, daher wäre die irLen 16 gewesen. Sie ist aber 20.

    Die richtige irLen findet ihr wie folgt heraus: fügt im Sketch von gestern die folgende Zeile bei der Ausgabe der Werte hinzu (sieh Screenshot anbei):

    Serial.println(„irLen:“ + String(results.bits));

    Dann wird unter dem Type die richtige irLen angezeigt (hatte ich in der Libary entdeckt).

    Mit der richtigen irLen und dem richtigen Type sollte dann alles gehen. Dabei ist es offensichtlich auch unerheblich, ob der ausgelesene und heute angegebene HEX-Code Nullen führt oder nicht. Bei mit funktionieren folgende Schreibweisen, solange nur die irLen stimmt: 0xCBC0, 0xCBC0, 0x00CBC0, 0x0000CBC0

    Ich hoffe, das hilft ein paar Leuten. Ich hätte heute fast aufgegeben. #tollerKalender #ohneVorkenntnisse #keineChance

    1. Axolotl

      Danke fürs posten!

      Leider hat das bei mir auch nichts gebracht!

      Noch ne Frage:
      Steht „Type“ (decode_typ) aus dem gestrigen Versuch für den „irProtocol“ vom heutigen Versuch?

  11. Axolotl

    Hallo Zusammen!

    Da ich kein TV habe, versuche ich meinen SONY Receiver anzusprechen. Das ding reagiert nicht!

    Ich habe:
    – die Codes von mit dem gestrigen Sketch ausgelesen
    – IR Diode getestet: geht! Ein Signal wird gesendet
    – Sony protocol eingestellt (2)
    – alle anderen Prtokolle ausprobiert! nichts!
    – IR-LED direkt an den Empfänger vom Receiver gehalten! nix!

    Jetzt bin ich mir nicht sicher ob der Code meiner FB richtig interpretiert wurde!

    Das ganze auch mit einer IR steuerbaren RGB-LED-Streifen ausprobiert! nichts!

    Hat jemand eine Idee was ich noch machen könnte?

    1. Rolando

      Hi Axoloti, siehe meinen Kommentar von eben, bei mir war die irLen falsch, schau doch mal nach, ob es bei dir auch daran liegt.

  12. Olaf

    Ich frage mich seit geraumer Zeit, wie rum man eigentlich vorgeht:
    1) Arduino mit neuer Software bestücken OHNE die Schaltung aufgebaut zu haben
    2) Die Schaltung aufbauen

    ODER

    1) Schaltung aufbauen
    2) Arduino mit Software ausstatten

    DENN:
    wenn ich zB hier lese, dass der hohe Strom durch die IR-LED nicht schlimm ist, da nur kurze Impulse gesendet werden – was würde denn passieren, wenn aufgrund der „alten“ Software vom Vortag auf genau diesem Pin ein Dauer HIGH liegt? Würde dann die LED nicht doch Schaden nehmen??

    Ich würde mir wünschen zu wissen, wie man ganz generell mit Aufbauen vs. Software aufspielen umgehen müsste!

    1. jz

      Aus didaktischen Gründen sollte man keinen LEDs ohne Vorwiderstand zu verwenden empfehlen. Wurde auch schon gesagt. Die Pins vertragen zwar viel, aber macht es Sinn, im Prozessorchip den Spannungsabfall zu verheizen?
      Der Chip ist zwar billig, das NanoESP aber nicht.

      Als absolute Vorsichtmassnahme kann man ein „leeres“ Programm laden, dann sind alle Pins auf Input.

      1. Kacki

        Das trifft ja genau wieder meinen Nerv.
        Ich werde die heutige Schaltung auch nur wieder mit Vorwiderstand aufbauen. Bei der einen Diode entsteht da auch kein echtes Platzproblem. Und genau dafür hatten wir ja eigentlich auch die 3 Widerstände à 1KOhm bekommen (die wir anfangs auch noch konsequent verbaut hatten).

  13. Markus

    Hallo wo finde ich dieses Protokoll die in die Variable irProtokoll geschrieben wird.

    Mit Freundlichen Grüßen Markus

  14. Klaus

    Bei mir kommen seit heute plötzlich beim Kompilieren öfters Java-Fehlermeldungen
    [code] at java.util.regex.Pattern$Loop.match(Pattern.java:4785)
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4717)
    at java.util.regex.Pattern$BranchConn.match(Pattern.java:4568)
    at java.util.regex.Pattern$CharProperty.match(Pattern.java:3777)
    at java.util.regex.Pattern$Branch.match(Pattern.java:4604)
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)[/code]
    Nach mehrmaligem Klicken auf den Kompilieren-Button geht es dann irgendwann doch. Hat dafür jemand eine Erklärung?

    1. The Mentalist

      Bei mentalen Störungen der Arduino IDE empfiehlt sich ein Neustart derselbigen.

    2. Karsten

      probiere mal die definition der html seite in eine eigen datei auszulagern, z.b. page.h, und die mit incllude am Anfang einzubinden. Der Java Preprozessor hat an der Stelle manchmal Probleme.

      siehe: https://github.com/esp8266/Arduino/issues/222

      1. Klaus

        Also irgendwie klappt bei mir heute gar nix. Auch das Programm läuft nicht richtig. Das gestrige funktioniert.
        Er bringt ständig „Error CIPSEND“. Aber wenn ich mir die Rückmeldung ansehe, dann kommt das „>“. Scheinbar gibt es irgendeinen Konflikt zwischen der IR-Bibliothek und dem ESP8266. Auch wenn ich mal einen Text ins Terminalfenster kopiere, kommt die „ge-echote“ Meldung zum großen Teil als Müll zurück.

        1. Klaus

          Nachdem ich nun die ganzen Funktionen auskommentiert hatte, die nicht gebraucht werden, funktioniert es scheinbar. Da wird das WLAN-Modul total durcheinander gebracht. Keine Ahnung, was da passiert. Jedenfalls half kein Reset, sondern nur Strom weg.

          Nun hätte ich aber mal ne andere Frage: Ich habe mir eine Klassenbibliothek gebaut, wo die Funktionen zum Ansteuern des WLAN-Moduls drin stehen. Das wäre ja theoretisch genau das gleiche. Funktionen, die nicht benötigt werden, werden trotzdem eingebunden. Gibt es eine Möglichkeit, dem Compiler zu sagen, dass er Funktionen die nicht referenziert werden, nicht mit kompiliert?

  15. MC

    Hallo,
    also leider funktioniert die Sache bei mir auch nicht, dabei hatte ich mich schon so drauf gefreut!
    Zunächst einmal habe ich das Programm nach dem Hinweis von jz, analog dem Beispiel von Tag 16 so abgeändert, dass es sich nicht aufhängt, sondern die Webseite immer wieder aktualisiert wird (siehe Abb). Das scheint soweit auch zu funktionieren, denn ich kann mit der Digitalkamera die Signale der IR-LED sehen.
    (@klaus: Zitat aus dem Text oben:“Die IR-Signale sind aber für eine digitale Kamera sichtbar.“)
    Ich vermute aber ein anderes Problem, dem ich aber nochmal nachgehen will.
    Und zwar wenn ich die Signale der Fernbedienung auslese, scheint diese ihren IR-Code immer drei mal zu senden (Siehe Abb. vom seriellen Monitor, hier habe ich „On“, „Ch+“ und dann „Ch-“ gedrückt). Kann es sein, dass unser Programm den Code aber immer nur ein mal sendet? Oder kümmert sich die Library „IRremote.h“ schon darum, dass das passt? Mal sehen, ob ich das irgendwie noch herausbekommen kann.
    Und noch eine Sache: wenn ich auf meiner Sony Fernbedienung Ch+ drücke, habe ich nur einen zwei-stelligen Code (siehe Abb. serieller Monitor, „Value 90“) , die anderen Tasten liefern einen drei-stelligen Code. Was ist nun der richtige Wert für „irLen“?

    1. MC

      Serieller Monitor

      1. MC

        Jetzt hat es zumindest mit dem Sony Fernseher geklappt. Allerdings habe ich entgegen dem angezeigten „Type:4“ „irProtocol=2“ gesetzt.

    2. Klaus

      Das Programm sendet nur 1x. Normalerweise reicht das auch aus. Du kannst ja einfach mal probieren, in der Funktion irSend (etwa Zeile 66) die Zeile irsend.sendRC6 (in Deinem Fall, da Type4) 3x zu duplizieren, also 4x hin zu schreiben. Dann wird 4x gesendet.

    3. jz

      Auch Nullen sind nicht wertlos! nur werden sie nicht immer dargestellt. Also doch 12 Bits.

    4. Tommy

      So, nach dem Rauswerfen von else in der loop passt das auch mit der Website (Danke MC!)

      Musste nun noch für mein Samsung-TV im Fall des Protokolls 7 die Klasse sendPanasonic durch sendSAMSUNG ersetzen und wie von Klaus vorgeschlagen
      irsend duplizieren, nun läuft das Teil als FB!

      Allerdings wird nix im Seriellen Monitor ausgegeben, auch nicht das WLAN Connect, obwohl das WLAN verbunden ist

      1. jz

        #define DEBUG nach #include IRremote einfügen.
        (wegen upgedatetem IRremote).

        1. Tommy

          Ok, danke.

          Hatte nicht die komplette neue iRemote.h durchgesehen (und auch nicht erwartet, dass es dort deaktiviert wird)

          Jetzt passt es.

  16. Klaus

    „Falls nicht müssen Sie eventuell näher ran gehen, oder Sie überprüfen, ob die IR-Diode überhaupt etwas sendet.“

    Sehr guter Hinweis für Laien. Welcher Laie weiß denn, dass er in der Regel mit jeder Digitalkamera die Infrarotsignale sehen kann? Hätte man vielleicht mal erwähnen sollen.

    Desweiteren finde ich es als Elektroniker einfach unmöglich, dass hier in einem quasi „Lernpaket“ zum wiederholten Male LEDs ohne Vorwiderstand betreibt. Man lehrt den Schülern nur falsche Dinge. Und jeder, der in der Lehre tätig ist, oder Kinder hat, weiß genau, dass es äußerst schwierig ist, etwas erstmal falsch gelerntes wieder aus dem Kopf zu bekommen. Drin ist es ganz schnell.
    Also passt doch bitte mal auf, dass die Versuche auch formal fachlich korrekt aufgebaut sind. Hier stellen sich einem wirklich bald die Nackenhaare auf. Bitte bedenkt, dass der Kalender unter der Premisse „Keine Vorkenntnisse nötig“ verkauft wurde.

    1. Karsten

      Zum Thema LED Vorwiderstand steht folgendes bei Tag 16:

      „Achtung! LEDs dürfen nicht ohne Vorwiderstände angeschlossen werden. Dass es in diesem Fall zulässig ist, liegt an den On-Widerständen der internen Port-FETs von ca. 30 Ohm. Weil die LEDs zwischen zwei Ports liegen, arbeiten sie tatsächlich mit einem Vorwiderstand von 60 Ohm. Je nach LED-Typ und Farbe stellt sich dabei ein LED-Strom zwischen 15 mA und maximal 30 mA ein, was noch zulässig ist.“

      Klarer kann man es kaum formulieren. Der Imax pro I/o pin ist 40mA, damit ist das auch ok. Imax bei den LEDs ist normalerweise 20mA, sie werden also im Überlastbereich betrieben und sollten nicht auf Dauer an sein, das hätte man noch erwähnen können.

  17. KUD

    Ist die IR-Abstrahlung eigentlich gerichtet ? Dh. muss die Diode zum Empfänger ausgerichtet sein?

    1. Klaus

      Ja

    2. Skayo

      Nicht ganz: Ich kann das Steckboard einfach auf meinem Fernseher-Tisch stellen (waagrecht) und trotzdem empfängt der Receiver das Signal. Dh. ich muss das Steckboard nicht schräg stellen damit es funktioniert.

      mfg

      1. Klaus

        Das schon, aber nach vorne kommt am meisten raus. Nimm mal die LED mit sichtbarem Licht. Dort siehst Du, wie das mit dem IR aussieht. Ist exakt das gleiche. Zur Seite kommt nicht viel raus. Die IR-LED hat nen Abstrahlwinkel von 20°, d.h. 10° nach links, 10° nach rechts. Der Rest bekommt kaum was ab, was nicht heißt, dass da gar nix kommt.

  18. Tommy

    Website TV Remote hängt sich auf, nix geht…

    Also hochladen kann ich das Prog, WLAN ist auch da.
    Website aufrufen passt auch noch, aber sobald ich auf
    einen Butten klicke, versucht sich die Seite zu
    aktualisieren, scheint aber keine Rückmeldung mehr
    zu bekommen. Unten steht ständig: Warten auf (meine IP-Adresse)… Irgenwann gibts dann einen Timeout.
    Chrome Browser meldet Keine Daten empfangen
    ERR_EMPTY_RESPONSE

    Mit Firefox ists ähnlich, und vom Android auch.

    Gesendet wird auch nix und im seriellen Monitor erscheint auch nix.

    Zur Kontrolle der Hardware hab ich noch mal das Projekt vom Vortag aufgebaut, das läuft perfekt.

    Echt merkwürdig…

    1. generalovernight

      Hi, ich habe gerade die Kommentar gelesen und deine Frage scheint schon von jz im ersten Kommentar beantwortet zu sein. HTH

    2. jz

      Da scheint es sich mal um einen echten Fehler im Programm zu handeln.
      Die Webseite wird nur im else Pfad gesendet.

      War das ein Test?

      1. Klaus

        Das ist zwar der eine Fehler, trotzdem hängt sich das Programm öfters mal auf. Einige Male kann ich den Befehl senden, klappt auch wunderbar, dann irgendwann geht gar nix mehr. Es gibt auch keine LED-Aktivität mehr, wenn ich ne Anfrage vom Browser sende. Anscheinend hängt sich die irsend auf. Dort wird ja die Kommunikation zum WLAN-Modul abgeschaltet und später wieder an.

      2. fk (Beitrag Autor)

        Hi,

        es ist durchaus beabsichtigt, dass die Webseite nur einmal gesendet wird. Nur wenn die Adresse des NanoESP das erste mal (also ohne Parameter) aufgerufen wird, wird auch eine Seite übermittelt. Wenn man dann einen Button drückt empfangt das Board die Werte und setzt sie um, sendet aber nicht die Seite neu. Das erhöht die Geschwindigkeit und soll gegen abstürze des Boards wegen fehlerhafter Übertragung helfen. Es kann aber sein, dass der Browser ein Landessymbol zeigt. Das war bei mir nicht so, da die Verbindung wieder geschlossen wird.

    3. KlausiMausi

      Das gleiche Fehlerbild habe ich auch. Mit der Handy-Kamera kann ich sorgar sehen das IR-Diode was sendet beim ersten Mal Drücken. Dann lädt aber die Seite und beim weiten Drücken der Buttons wird nichts an den Nano gesendet und es kommt dann zum Seiten-Ladefehler (bei Firefox).
      Vielleicht hat ja bis heute Abend jemand eine Lösung. Ich geh erst Mal den letzten Arbeitstag feiern für dieses Jar.

    4. NM

      Habe das selbe Problem seit Tag 13 bis 16. Bislang hat noch kein Kommentar im Formum eine Lösung ergeben.
      Ein Befehl vom Browser geht durch, dann bricht der Kontakt ab.

  19. Kacki

    Oh man, schon wieder so eine transparente LED im Türchen ;-) LED? Oder war es der Fototransistor? Moment… Mist… ich habe alles in ein Tütchen getan. Was war noch mal… waoran erkennt man… ?! Ich brauche dringend einen/zwei/drei Edding(s)!

    1. Ralf Härter

      Dem kann ich mich anschliessen. :-/

      Alles ausgepackt und nett einsortiert und jetzt finde ich das ‚plöde‘ Teil nicht wieder. :-(

      Aber egal, ich kann die LEDs ja der Reihe nach z. B. an Pin 13 testen. :-)

    2. generalovernight

      „… woran erkennt man …?“

      jedenfalls nicht mehr daran, dass der Transistor von oben schwarz aussieht, denn das ist bei der IR-Diode genauso ;-)

      1. Dirk

        Nur finde ich ist der schwarze Punkt bei der IR-Diode kleiner aus.

        1. generalovernight

          ah, da warst du etwas schneller ;-)

    3. generalovernight

      Ich hab mir die Dinger nochmal genauer angeschaut, die Lösung:

      Wenn man mit einer Lupe von oben hieneinguckt, sieht man den Chip als dunkles Quadrat und das ist beim Transistor größer und bei der IR-Diode kleiner.

      Ist auch verständlich, denn der Transistor besteht ja praktisch aus zwei Dioden.

      1. Kacki

        Aha… Danke für den/die Tipps… muss ich gleich heute abend mal nachgucken.

        Aber: ist das wirklich so? Ist in dem sogenannten „FotoTRANSISTOR“ wirklich ein Transistor verbaut, oder nennt man das Dingen nur so, weil es zur Umgangssprache gehört. Meinerzeit gab es ja noch Fotodioden und mir scheint diese entsprechend auch eine zu sein… von wegen zwei statt drei Anschlüsse. War mir schon als Kind ein Rätsel, wozu man für „Foto“ einen Transistor braucht, wenn doch eine Diode ausreicht… Siliziumverschwendung… oder?

        1. jz

          Ich denke, ein Fototransistor ist einfach lichtempfindlicher.
          Bei ihm ist intern eine Fotodiode von Kollektor zur Basis des Transistors geschaltet. Darum hat er nur zwei Anschlüsse.

  20. jz

    Das Beispielprogramm von Tag 18 reizt den vorhandenen dynamischen Speicher fast vollständig aus, da die Kopie des Texts der Webseite über 800 Bytes benötigt.
    Vorsicht bei Erweiterung des Programms: bei Speicherüberschreitung hängt das Programm.
    Abhilfe: nicht benötigte Funktionen entfernen oder auskommentieren.
    Ursache: „literals“, also Text in Anführungszeichen, benötigen dynamischen Speicher; sie werden vom generierten Code automatisch kopiert (analog zum PROGMEM webtext). Dies ist bedingt durch die Prozessorarchitektur.

    Hohe Frustrationstoleranz ist gefordert: wenn das Gerät nicht reagiert, hat man keine Chance der Ursache auf den Grund zu gehen, ausser man hat z.B. ein zweites NanoESP mit Tag 17 am laufen.

    1. Klaus

      Ich hab mir schon vor einigen Tagen, als das mit PROGMEM anfing, gedacht, warum das überhaupt erst in eine Variable kopiert wird? PROGMEM soll ja weniger Arbeitsspeicher benötigen. Nur, wird dieser Vorteil nicht so zunichte gemacht? Ich denke, es wäre wesentlich sinnvoller, die Daten direkt aus dem PROGMEM auf die Schnittstelle auszugeben, anstatt sie erst aufwändig in Variablen zu kopieren.

      1. jz

        Beispiel für:
        const char site[] PROGMEM = {…}

        boolean sendWebsite(int connectionId)
        {
        boolean succes = true;

        if (sendCom(„AT+CIPSEND=“ + String(connectionId) + „,“ + String(strnlen_P(site,sizeof(site))), „>“))
        {
        esp8266.print((const __FlashStringHelper*)site);
        esp8266.find(„SEND OK“);
        succes &= sendCom(„AT+CIPCLOSE=“ + String(connectionId), „OK“);
        }
        else
        {
        debug(„Error CIPSEND“);
        succes = false;
        }
        return succes;
        }

        für const byte site[] PROGMEM = {…}
        brauchts noch typecast oder reinterpret_cast.

        1. Klaus

          Entweder das (__FlashStringHelper kannte ich noch nicht, muss ich mal googeln), oder man ersetzt
          ‚xBuffer += myChar;‘
          durch
          ‚esp8266.print(mcChar);‘
          und natürlich dann das ‚esp8266.print(webpage);‘ auskommentieren. Hab es jetzt noch nicht probiert, könnte vielleicht auch ein write anstatt print nötig sein.

          1. jz

            Danke!
            Warum einfach, wenns kompliziert auch geht (oder umgekehrt).
            __FlashStringHelper habe ich in Print.h gefunden. Ist ein Hinweis an den Compiler, die passende print() Methode zu verwenden.

Schreiben Sie einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.