Day 18: Universal remote control
Yesterday, you built a receiver for infra-red remote controls. Today, you are building the remote control itself. More precisely, you will build a universal remote control that you can operate by computer or Smartphone and with which you can operate your TV or other devices whenever you misplace the original remote control.
For this project, you need the component behind today’s door: the IR diode. It looks like a simple LED, but it sends light in the invisible infra-red range. The IR-signals are visible to a digital camera, however. The structure of today’s experiment is shown in the figure. Don’t be surprised that the IR-LED is not given a dropping resistor. The effective dropping resistor is the On-resistor of the port, at approx. 30 Ohm. Because of this, the current through the diode is quite high, but the impulses sent are so short that the diode will not take damage.
The program: Day18_IrRemote
Before the program can work, you need to make some adjustments again. If you read out and used the codes for Power, Volume up, Volume down, Channel up, Channel down and Mute yesterday, you can simply enter these codes into the irCommand array in sequence. Otherwise, install yesterday’s programme again and read out the matching codes. Of course, you may use entirely different codes as well. The labels on the website will not match then. In addition to the codes, you also need to enter the protocol used in the variable irProtokoll if your remote control is supported. Last, you need to enter the length of the signal to be sent. Determine it by multiplying the digits of the hex code by four. Example: My code for Power was 0x20DF10EF. 0x is simply the sign for a hex code, which leaves 20DF10EF and thus an eight-digit hex code. 8•4 = 32, i.e. in the example program, the variable irLen means 32. A similar calculation is needed for a code with another length.
Once you have entered all codes and parameters, and of course also your WLAN data, you can upload the program. The website of the board now contains six buttons that are labelled accordingly. When you push one of the buttons, a message should appear on the Serial Monitor and your TV or other device should react to the signal correctly. If not, you may need to get closer or check if the IR diode sends anything at all. An LED connected with the wrong polarity would be one possible reason why a project is not working as desired.
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
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
Kann man auch den 9V block anschließen ohne das die Bauteile schaden nehmen?
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
Steht „Type“ (decode_typ) aus dem gestrigen Versuch für den „irProtocol“ vom heutigen Versuch?
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.
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
Was sendet der Serieller Monitor wenn´s funktioniert?
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
Incomming mit Doppel-m *lol*
Wahrscheinlich wegen “In-communicate-ing” ;-)
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?
es geht nich ich bekomme immer eine fehlermeldung
Hast du die Libary installiert? Versuch einfach das von gestern nochmal. Wenn da auch nicht funktioniert steht fest, dass die Lib nicht installiert ist :)
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
*~\Documents\Arduino\libraries
jetz geht es. die library war nicht richtig installiert,
aber jetz geht es.
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!
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 ;-)
DANKE, DANKE, DANKE!!!!!
bis aufs duplizieren hab ich alles gemacht und jetzt funktioniert alles auf meinem Samsung TV :) auch der serielle Monitor “wieder” :D
Wo sind denn die Sourcen für den Nodeesp herunterzuladen?
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
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?
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?
Hi Axoloti, siehe meinen Kommentar von eben, bei mir war die irLen falsch, schau doch mal nach, ob es bei dir auch daran liegt.
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!
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.
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).
Hallo wo finde ich dieses Protokoll die in die Variable irProtokoll geschrieben wird.
Mit Freundlichen Grüßen Markus
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?
Bei mentalen Störungen der Arduino IDE empfiehlt sich ein Neustart derselbigen.
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
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.
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?
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”?
Serieller Monitor
Jetzt hat es zumindest mit dem Sony Fernseher geklappt. Allerdings habe ich entgegen dem angezeigten “Type:4” “irProtocol=2” gesetzt.
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.
Auch Nullen sind nicht wertlos! nur werden sie nicht immer dargestellt. Also doch 12 Bits.
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
#define DEBUG nach #include IRremote einfügen.
(wegen upgedatetem IRremote).
Ok, danke.
Hatte nicht die komplette neue iRemote.h durchgesehen (und auch nicht erwartet, dass es dort deaktiviert wird)
Jetzt passt es.
“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.
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.
Ist die IR-Abstrahlung eigentlich gerichtet ? Dh. muss die Diode zum Empfänger ausgerichtet sein?
Ja
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
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.
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…
Hi, ich habe gerade die Kommentar gelesen und deine Frage scheint schon von jz im ersten Kommentar beantwortet zu sein. HTH
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?
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.
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.
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.
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.
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)!
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. :-)
“… woran erkennt man …?”
jedenfalls nicht mehr daran, dass der Transistor von oben schwarz aussieht, denn das ist bei der IR-Diode genauso ;-)
Nur finde ich ist der schwarze Punkt bei der IR-Diode kleiner aus.
ah, da warst du etwas schneller ;-)
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.
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?
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.
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.
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.
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.
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.
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.