Tag 5: LED Schalten
In dem heutigen Programm geht es nun endlich darum, Hardware über das UDP-Protokoll zu steuern. In diesem Fall wird eine LED mit einfachen Befehlen ein- und ausgeschaltet.
Hinter dem fünften Türchen befindet sich eine LED. Der passende Vorwiderstand befand sich schon im gestrigen Fach. Bauen Sie die Schaltung auf, wie es das Bild zeigt.
Das Programm: Day5_UDPLED
! Achtung: Einige MAC-Nutzer berichten von einem Bug in dem PackerSender-Programm, welcher nicht erlaubt, die Ports umzustellen. Es gibt allerings auch die Möglichkeit die Ports in dem Arduino Programm zu verändern. Falls das Problem auftritt, müssen Sie für den heutigen Versuch die Zeile 83 von
succes &= sendCom(„AT+CIPSTART=\“UDP\“,\“192.168.4.255\“,90,91″, „OK“);
in
succes &= sendCom(„AT+CIPSTART=\“UDP\“,\“192.168.4.255\“,55005,55006″, „OK“);
umändern.
Während die vorangegangen Beispielprogramme viele Eingaben des Nutzers benötigten, soll das heutige Programm autonom arbeiten. Trotzdem werden über den seriellen Monitor weiterhin Informationen zu Debug-Zwecken ausgegeben.
Der Controller wartet nun auf vom Modul empfangene Daten, die über die +IPD-Meldung angekündigt werden. Legitime Befehle, die Sie über den Packet Sender schicken können, lauten led1 und led0. Der Controller interpretiert sie und schaltet dementsprechend die LED an oder aus. Eine Rückmeldung an den Sender wird ebenfalls übermittelt. Falls ein anderer Befehl gesendet wird, erscheint im Serial Monitor die Meldung „Wrong UDP Command“. Die gleiche Nachricht wird auch über das Netzwerk an den Sender übermittelt.
Hi,nach den laden des Programms für Tag 5 auf den NanoESP, kann ich über den Seriellen Monitor nicht mehr mit den Bord kommunizieren. Das Bord zeigt an das es Reset, ADD, UDP ok ist aber mehr passiert dann nicht. Wer kann helfen.
Hallo Dirk,
nur, falls noch keiner geantwortet hat bzw. Du noch nicht selbst draufgekommen bist: mit den Programmen ab Tag 5 kannst Du nicht über den Monitor der Arduino-Software mit dem Board kommunizieren, Du gibst die Befehle im Packet-Sender ein und über sendest sie via UDP.
Ich verbinde das Board immer per WLAN mit meinem Router und gehe dann von meinem Rechner ebenfalls per WLAN über den Router auf’s Board, aber das Standard-Programm, welches es hier zum Download gibt, verlangt, dass Du Dich direkt per Peer-to-Peer Netzwerk mit Deinem Board verbindest.
Wenn das geklappt hat, einfach bei Deinem Packet-Sender in der Sendebox („ASCII“) den Befehl „led1“ für LED-an oder „led0“ für LED-aus eingeben und via UDP senden (Kleinschreibung beachten!).
Lass‘ mal hören, ob’s geklappt hat.
Viele Grüße,
Aironout
Hi Aironout, vielen Dank für den Tip. Mit dem Paket Sender funktioniert es. Das NanoESP ist per WLAN direkt mit dem PC verbunden. Nur noch die LED gedreht und erleuchtet. Danke fein.
Hallo zusammen,
leider bekomme ich die LED nicht zum leuchten. Alles reagiert wie es soll. led0 und led1 werden akzeptiert. Andere Befehle werden wie beschrieben abgelehnt. Nur die LED leuchtet nicht.
Any Ideas ?
Ich habe mal ein Bild angehangen, da ich vermute das es an einer fehlerhaften Verkabelung liegt.
Viele Grüße
Bernd
Hallo Bernd,
ist vielleicht eine dumme Frage: aber hast Du die LED einfach mal anders herum eingesteckt?
Grundsätzlich muss das kurze Beinchen außen in der Masse-Schiene sitzen.
Ansonsten müsste man mal mit einem Multimeter prüfen, ob an Pin D9 denn eine Spannung anliegt, wenn „led1“ im seriellen Monitor ausgegeben wird.
Denn wenn das der Fall ist, dann liegt der Fehle evtl. an der LED selbe, am Widerstand, oder an den Steckbrücken. Dann solltest Du mal andere Bauteile testen.
Ohne den Arduino-Teil des Boards zu kennen, würde ich auch vermuten, dass Du einfach mal einen anderen Pin zur Ausgabe des Signals definieren kannst. Ganz oben im Code anstatt „#define LED 9“ vielleicht mal „define LED 8“ probieren. Das sollte zumindest bei Tag 5 noch funktionieren
Hallo MC,
so blöd war die Frage dann wohl nicht …
Mmmmh – Vielen Dank ! Geht jetzt !
Viele Grüße
Bernd
Da es wohl in der Nachrichtenflut unter gegangen ist, stelle ich hier nochmal die Frage in der Wurzel:
Kann mir bitte jemand die Definition
#define S(s) (char *)s
erklären? Hier wird mit define eine Art Funktion definiert. Habe ich noch nie gesehen. Aber was macht die jetzt genau?
Das ist eine abgekürzte Schreibweise (#define). Überall wo S(…) steht, wird statt dessen beim kompilieren (char *)… angenommen. Beiapiel:
S(„OK“) wird dann zu (char *)“OK“
Das verhindert dann warnings „type conversions deprecated“ (oder so ähnlich).
Ahja, danke. Allerdings hatte ich die Warnung noch nie, auch ohne die Ersetzung. Ich arbeite mit der Version 1.6.5. Das muss dann wohl in der Version 1.6.6 neu sein.
Die Compiler Warnungen kann man an- und abschalten (Datei-Voreinstellungen)
Falls Du „Ausführliche Ausgabe“ meinst, os ist die bei mir eingeschaltet. Bis auf „Externer Editor“ sind bei mir alle Häkchen gesetzt.
Ach nein, hab gerade das Auswahlfeld gesehen. Dann kommen bei mir auch die Warnungen.
Liebe Freunde erd besinnlichen Adventszeit:
– Mutter hat den Sohn (17) den Adventskalender gekauft
– Sohn ist verzweifelt, Vater muss ran
– Win 10 46bit
– verschiedene USB-Kabel gestestet
– Beispiel Blink okay, andere Beispiele auch
– 1.,2.,5.Tag mit Fehlermeldung exit status 1 Fehler beim Kompilieren.
HELP!!!
Hi,
welche Arduino-Version benutzt du? Manchmal kann es auch zu Fehlern beim Kompilieren kommen, wenn das falsche Board ausgewählt ist. Und manchmal verursacht der Virenscanner Fehler bei der Arduino Installation. Neu Installieren ware dann die Lösung.
Guten Morgen,
ich nutze die Version 1.6.7 Hourly Build 2015/12/ 02:17.
Eigestellt ist Arduino Nano, ATmega328 on COM1.
Das mit den AVRA ist mir in der Nacht auch noch durch den Kopf gegangen – ich mach das jetzt mal neu.
Danke.
Hi,
Das Programm lief bei zunächst ohne weitere Probleme. Doch aufeinmal erhalte ich beim Ausführen folgenden Fehler: „ESP SEND ERROR: AT+CIPSTART=“lUDP“,“192.168.4.255″,90,91″
Kann mir da jemand eventuell weiterhelfen?
Viele Grüße
Kann es sein, dass dir ein I bei „UDP“ reingerutscht ist?
In der Tat, das war der Grund. Vielen Dank!
Hallo fk
Danke für Deine Hinweise , es läuft :-)
void loop() {
if (esp8266.available())
{
if (esp8266.find(„+IPD,“))
{
if (esp8266.find(„led“)) {
int numLed = esp8266.parseInt();
if (numLed == 10) {
digitalWrite(LED, LOW);
/*
Steuerkommando led10 = LED1 aus
*/
}
else if (numLed == 11) {
digitalWrite(LED, HIGH);
/*
Steuerkommando led11 = LED1 an
*/
}
if (numLed == 20) {
digitalWrite(LED1, LOW);
}
else if (numLed == 21) {
digitalWrite(LED1, HIGH);
}
if (numLed == 1020) {
digitalWrite(LED, LOW);
digitalWrite(LED1, LOW);
/*
Steuerkommando led1020 = LED1 und LED2 aus
*/
}
else if (numLed == 1121) {
digitalWrite(LED, HIGH);
digitalWrite(LED1, HIGH);
/*
Steuerkommando led1121 = LED1 und LED2 an
*/
}
debug(„led“+String(numLed));
}
}
packetsender Alternativen auf Android? Meine Erkenntnisse:
Auf Android 4.2.2 habe ich mit mehreren Apps folgendes Verhalten festgestellt:
– die Rückmeldungen LED=1 und LED=0 kommen durch
– die Rückmeldung „Wrong UDP Command“ kommt nicht durch
– die Meldung „Button=1“ kommt nicht durch (Tag 6)
Wenn ich in loop() eine Zeile ändere:
if (esp8266.findUntil(„led“,“OK“))
dann kommt „Wrong UDP Command“ durch.
d.h. eine unmittelbare Rückmeldung kommt durch!
(sonst kommt „Wrong UDP Command“ erst nach find() timeout 1s und wird nicht empfangen).
„Button=1“ kommt nur sehr ausnahmsweise durch.
Falls jemand auf Android anderes Verhalten feststellt, bin ich sehr interessiert, z.B. andere Android Version.
Die für das Beispiel mit Multicast (192.168.4.255).
Klapptsuper :)
Ich würde nun nur noch gerne das Modul mit dem heimischen Wlan verbinden.
Versuche dies auch scheitere edoch dauernd kann mit bitte jemand sagen, was man ändern muss.
Gruß Janick :)
Wird im Beispiel Tag 7 behandelt. Geduld, oder schon versucht?
Schau mal weiter unten…
Toni Taste hat dafür ein Prog zum Download eingestellt.
Beim packetsender kommt seit Tag 3 nichts an. Habe alles ausprobiert. Echt frustrierend.
Auf dem PC wo der packetsender läuft das NanoESP WLAN verbunden und als privates Netzwerk gewählt?
Im packetsender die UDP und den richtigen Empfangsport gewählt (im Beispiel 90) und UDP Server aktiv (unten rechts)?
Der packetsender verwirft oft die Portnummer, z.B. wenn der Port besetzt ist. Manchmal hilft, den Port mal zu ändern und dann zurück zu ändern. Neustart packetsender und im Extremfall Reboot PC kann auch helfen.
Port 91 und die richtige IP Adresse auf 1 endend eingegeben und UDP eingestellt?
Bevor wir mit UDP ganz aufhören, habe ich mal versucht, einen UDP Server im Internet abzufragen. Dazu habe ich die Uhrzeit von einem der Rechner der PTB (ptbtime2.ptb.de) geholt. Das Programm verbindet sich also als Station mit meinem WLAN (wie schon beim Ping am 2. Tag), sendet ein Paket (48 Byte) per UDP an die oben angegebene URL und bekommt dann ein gleich langes Paket mit der Uhrzeit zurück. Details des Antwort-Paket bitte in RFC 2030 nachschlagen.
Hier der Kern des Programms:
/*
* Setup UDP connection
*/
esp8266.setTimeout(5000);
esp8266.println(„AT+CIPSTART=\“UDP\“,\“ptbtime2.ptb.de\“,123″);
if (esp8266.find(S(„OK“))) {
Serial.println(„Connect OK“);
} else {
Serial.println(„Connect Error“);
}
/*
* Send SNTP request
*/
memset(ntpPacket, 0, sizeof(ntpPacket));
ntpPacket[0] = 0b00011011;
esp8266.println(„AT+CIPSEND=48“);
if (esp8266.findUntil(S(„>“), S(„ERROR“))) {
esp8266.write(ntpPacket, 48);
if (esp8266.find(S(„+IPD,48:“))) {
esp8266.readBytes(ntpPacket, 48);
// byte 40-43: Sekunden seit 1.1.1900
unsigned long secs_lo = word(ntpPacket[40], ntpPacket[41]);
unsigned long secs_hi = word(ntpPacket[42], ntpPacket[43]);
unsigned long secs = secs_lo << 16 | secs_hi;
// Tage (86400 Sekunden) interessieren nicht, nur die Uhrzeit
secs = secs % 86400L;
Serial.print("Current time: ");
print2digits(secs / 3600L); // Stunden
Serial.print(":");
print2digits((secs % 3600L) / 60L); // Minuten
Serial.print(":");
print2digits(secs % 60L); // Sekunden
Serial.println(" UTC");
}
}
Den gesamten Sketch habe ich mal auf Dropbox gestellt:
https://www.dropbox.com/s/wslwftotw6iwf8s/SNTPClient.ino?dl=0
Interessant… mir kommt da gerade eine Idee für meine nächste Bastel-Uhr. Hab hier noch ein paar schöne Nixies rumliegen… Danke, ist ja bald Weihnachtsurlaub :)
Interessantes Projekt. Ich bin nicht so wirklich ein Crack in C. Kann mir bitte jemand die Definition
#define S(s) (char *)s
erklären? Hier wird mit define eine Art Funktion definiert. Habe ich noch nie gesehen. Aber was macht die jetzt genau?
Danke, schöne Idee!
ich habe schon einige Conrad Adventskalender gehabt, aber dieser ich klasse. macht echt Spaß. Freue mich auf jedes neue Türchen
Ist es möglcih den NanoESP bei den Pins GND und 5V mit einer Externen Spannungsquelle zu versorgen, also mit einer 9V Batterie? Kann man dann auch gleichzeitig das MicroUSB Kabel anschließen oder muss man dann die Externe Spannungsversorgung kappen?
Wenn du die 9V Batterie und das USB-Kabel gleichzeitig anschließen würdest, dann verbindest du zwei unterschiedliche Potentiale. Du schickst damit 9V auf den USB-Ausgang deines Rechners. Vermutlich ist der USB-Ausgang mit einer Diode geschützt oder auch nicht. Außerdem können an den USB-Ports noch andere Geräte hängen, die du dann mit deiner 9V Batterie verbindest.
Kurz gesagt: Ich würde die 9V Batterie und das USB-Kabel _nicht_ gleichzeitig nutzen.
Hi,
ja das ist Möglich, aber nicht über den 5V-Pins sondern über Vin. Du greifst damit etwas den folgenden Themen voraus, aber auf dem unteren Bild siehst du die passende Schaltung.
Es ist möglich USB und externe Stromversorgung gleichzeitig zu nutzen. Allerdings mit Vorsicht!
Das Board verträgt über den Vin-Pin zwischen 7 – 12 V.
Und wievel verträgt der Spannungsregler?
Bei 12V und 200mA, die das Board incl. ESP benötigt, fallen am Regler ja 7V*0.2A = 1,4W ab. Da bekomme ich Angst.
Wir haben die beim Entwickeln des Boards zwei Spannungsregler verwendet. Der erste regelt, bei einer externen Spannungsversorgung, auf 5V runter und versorgt damit den Arduino Teil. Diese 5 V werden dann auf 3,3 V runter geregelt um das WiFi-Modul zu versorgen.
Beide Spannungsregler sind vom Typ AMS1117 und auch für z.B. 12V und 500mA dimensioniert.
Wäre es vielleicht möglich, den Schaltplan zu bekommen? Ich kann das Board zwar auch untersuchen, wäre aber einfacher.
Bei meinem Arduino Uno ist der 5V-Spannunsregler (AMS1117) im Parallelbetrieb abgeraucht. Steckernetzteil 7,5V an VIN, USB an Rechner => Polyfuse schaltet ab (wird heiss). Mit neuem Spannungsregler geht Arduino wieder. Der PC hat zum Glück nichts abbekommen.
Koenntet Ihr bitte den kompletten Schaltplan diese Pretzel Boards verlinken. Waere echt hilfreich, und ist ja sicher kein Geheimniss.
Besten Dank, Roland
Das ist eine gute Frage.
Zunächst einmal: Um Gottes willen nicht 9V an den 5V Pin legen!
Der Original Nano hat einen Pin Vin, der für externe Spannungsversorgung z.B. mit 9V vorgesehen ist und auf einen 5V Spannungsregler geht. Laut Beschreibung (des Originals) siegt die höhere Spannungsquelle.
Ob das bei diesem Nachbau auch der Fall ist und für welche Belastung der 5V Regler dann ausgelegt ist (der ESP Chip zieht mehr als 200mA) weiß ich aber nicht. Daher habe ich diesen Versuch unterlassen.
Hey Community,
ich habe ein paar Probleme mit der heutigen Aufgabe.
Die Problembeschreibung entspricht im Wesentlichen der Problemstellung von dem User „Noob“.
Alle vorherigen Versuche haben ohne Probleme funktioniert.
(Arbeite unter Linux Mint mit Arduino Stduio 1.6.6 und zur UDP-Kommunikation nutze ich: sudo socat UDP-LISTEN:90 STDIO )
Wenn ich den Controller flashe, dann ist folgendes im Serial Monitor zu sehen:
Reset OK, AP ready, UDP ready.
Loop:
Anschließend rutscht der Controller einmalig in den If-Zweig von esp8266.available().
Dann schlägt esp8266.find(„+IPD,“) fehl.
Nach dem ersten Schleifen durchlauf, schlägt esp8266.available() immer fehl!
Unabhängig davon ob ich vom UDP-Server etwas sende oder nicht.
Daher kann ich niemals die LED an oder aus schalten.
Ich habe inzwischen auch das Anschlusskabel ausgetauscht, da ich dachte das evt. die Versorgunsspannung nicht stabil genug ist. (Esp8266 kann unter Last ganz schön an Leistung ziehen!)
Irgendwelche Ideen?
LG Michi
Nach weiteren testen und probieren ist es mir endlich aufgefallen.
In diesem Beispiel muss direkt an die entsprechende Adresse mit entsprechendem Port kommuniziert werden, damit die Befehle überhaupt ankommen.
Zuvor habe ich einfach mit einem Listener gearbetet, der sobald einmalig etwas empfangen wurde auch als Sender agieren konnte.
Hier war es nun nötig das ich an 192.168.4.1:91 sende, damit es korrekt funktioniert…
In diesem Fall:
sudo socat UDP-SENDTO:192.168.4.1:91 STDIO
Hallo, klappt alles sehr gut.
Kann die LED mit meinem Iphone steuern.
Und zwar mit der APP „UDP Commander“. Dort ist es möglich einen Button für LED EIN und einen Button für LED AUS zu erstellen. Desweiteren habe ich die abgeänderte Version von Toni Taste genommen, sodass ich mich nicht in das AP des ESP einwählen muss, sondern dieser sich mit dem heimischem WLAN verbindet.
Hallo Kai,
gute Idee, das Modul mit dem heimischen Wlan zu verbinden.
Versuche dies auch scheitere Jedoch dauernd kannst du (oder auch andere) bitte sagen, was man ändern muss.
Gruß Janick :)
Weder im Programm noch in Google finde ich was darüber, wie man die Buttons belegen kann. Wie geht das? Ich kann sie nur antippen. Aber da wird dann das Kommando gesendet.
Bei mir geht Multicast (.255) nicht, nur gezielt (.4.2).
Danke an Jörg für den Vorschlag „mode=2“. Hat bei mir nichts genützt, im Gegenteil, nichts mehr ging durch.
Muss wohl an der Firmware des esp8266 liegen. Meine Version sagt:
RESET OK
AP ready
UDP ready
AT+GMR
AT version:0.22.0.0(Mar 20 2015 10:04:26)
SDK version:1.0.0
compile time:Mar 20 2015 11:00:32
OK
Ich wäre interessiert, bei welchen Versionen Multicast geht und bei welchen nicht.
Hat schon jemand den Update Befehl versucht? Ist der gefährlich? AT+CIUPDATE.
Hi,
die Firmware ist richtig und ist auch bei allen NanoESP’s die gleiche.
Im Grunde kann es ja dann nur der PC blocken oder in dem Fall das Packet-Sender Programm. Hast du es mal mit einem Smartphone oder Tablet probiert?
Mein erster Versuch war mit packetsender auf Windows 10 auf meinem alten Asus Netbook.
Aktuell verwende ich „TCP/UDP Terminal“ auf Asus Fonepad mit Android 4.4.2.
Werde wohl meine weiteren Resourcen durchprobieren, von Windows XP, Vista, Windows7, bis Windows 10 und diversen Smartphones; da es nicht wie vermutet an der Firmware liegen kann.
Elektrosmog habe ich auch schon ausgeschlossen: im Keller ist mein kräftiges WLAN nicht so dominant (aktuell auf Kanal 11, NanoEsp auf 5).
Dann werde ich meine ersten Gehversuche auf Ubuntu auf meinem neuen pcDruino machen; offensichtlich muss man dafür den packetsender erst „builden“.
Danke für den Hinweis!
Ich habe Spass am IoT-Kalender und geniesse die Herausforderung, bei Problemen tiefer zu graben; ich bin an der 2. Runde der Kalenderversuche.
Ok, mit packetsender funktioniert es, vorerst auf 2 Windows 10 Installationen versucht.
Der erste Versuch auf dem Netbook war gescheitert, weil ich das NanoESP WLAN (vorsichtshalber) als public statt private erklärt hatte. Die „TCP/UDP Terminal“ App auf Android werde ich wohl leider nicht mehr gebrauchen können. Weitere Versuche folgen.
Hi,
ich habe etwas an der Kommentar-Funktion gearbeitet. Die neuesten Kommentare stehen nun oben und es ist möglich, Bilder direkt in die Kommentare einzufügen. Ich hoffe damit wird dieser Bereich übersichtlicher.
Ein Forum, in dem alles rund ums Board besprochen werden kann, soll übrigens auch bald möglichst eröffnet werden. Ich glaube aber, dass für Probleme mit dem Kalendertagen die Kommentarsektion eine erste gut Anlaufstelle ist.
Erst einmal Super das Du dich von all unserer Kritik nicht demotivieren lässt, sondern voll annimmst und umsetzt.
Das so einen Kalender zu erstellen sicher schwerer ist, als man denkt, bin ich mir sicher. Homer Simpson hat schon gesagt: „Es ist so schwer etwas zu erschaffen, aber so leicht es zu zerstören.“ (oder so ähnlich).
Ob das mit dem Forum Sinn macht oder nicht, sei dahin gestellt. Wir User glauben Dinge eh erst wenn wir sie sehen ;)
Mal sehen ob Wir jetzt, unseren eigenen Ansprüchen, gerecht werden. :)
@fk Dankeschön!
fk schrieb: „Ich glaube aber, dass für Probleme mit dem Kalendertagen die Kommentarsektion eine erste gut Anlaufstelle ist.“
Im Prinzip ja, es scheint aber so, als ob einige Teilnehmer das Zählen bei Monty Python gelernt haben, und wenn man beim Lesen der Kommentare ständig aufpassen muss, dass man nicht über irbgenwelche Spoiler stolpert, dann macht das genze wenig Spass.
Der Kalender ist wirklich super und bis jetzt funktioniert bei mir auch alles, doch, wenn ich versuch den Arduino mit einer externen Spannungsquelle zu versorgen oder einfach den Serial Monitor nicht öffne, passiert gar nichts.
Könnte mir vielleicht jemand sagen, welche Stelle in Programmcode das auslöst?
@ Horst-Peter: Eine externe Spannungsversorgung für den NanoESP funktioniert. D. h. ohne USB-Kabel.
Hey Tanja,
die Externe Stromversorgung hast du doch bei den Pins „GND“ und „5V“ angeschlossen ist dann „GND“ Minus und „5V“ Plus? Oder ist das egal ob ich Minus bei „5V“ anstecke und Plus bei „GND“? Ich habe eine 9V Batterie und möchte den NanoESP damit versorgen, funktioniert das? Bei Technischen Daten steht Betriebsspannung 5V, ist das schlimm wenn es mehr sind?
@Willi:
GND = ground = Masse = 0 Volt = Minus deiner Batterie
In dem Datenblatt für mein NanoESP board sind zwei Angaben zu finden:
Betriebsspannung 5 Volt
Empfohlene Eingangsspannung 7 bis 12 Volt
Da der NanoESP mit 5 Volt über das USB-Kabel versorgt wird, habe ich das Netzteil auf meinem breadboard ebenfalls auf 5 Volt eingestellt.
Mal ne blöde Frage: Wo ist diese Seite her? Warum ist die bei meinem Adventskalender nicht dabei gewesen? Kann man da irgendwo was runter laden?
@Klaus:
Ich vermute, dass ist der Beipackzettel vom C-Controll IoT WiFi Board. Allerdings stehen dort auch nur Infos, die auch auf dieser Seite zu finden sind:
http://iot.fkainka.de/schnellstart-anleitung
http://iot.fkainka.de/technische-daten
@fk
Ah, das könnte auch sein. Ist natürlich schade, dass das im Handbuch des Kalenders nicht auch drin steht.
Lustig finde ich daran jetzt allerdings, dass ein Link zu Deiner Homepage drauf ist und Du anscheinend selbst nicht mal was davon weißt.
Ich habe mal Robins Arbeit der letzten Tage (dafür herzlichen Dank!) fortgesetzt. Die Anpassungen sind nun in der Methode configAP(). Dadurch muss das Hauptprogramm bis auf die Variablendeklaration nicht mehr geändert werden. Das sollte sich nun auch für die weiteren Tage übertragen lassen. Unter https://www.dropbox.com/s/u76fxpco2uldizc/Day5_UDPLEDBidirectionalWithoutAP.zip?dl=0 gibt es diese Version ohne AP. Wie an den vorherigen Tagen müssen die Variablen angepasst werden und im Packet Sender Programm muss die IP angegeben werden die der NanoESP vom Router zugewiesen bekommen hat.
Hallo Toni,
das funktionierte bei mir nicht sofort.
Nach RESET OK bekam ich immer einen SEND ERROR bezüglich des Befehls: succes &= (sendCom(„AT+CWJAP=\““ + String(SSID) + „\“,\““ + String(PASSWORD) + „\““, „OK“));
in der configAP-Funktion.
Hab dann vor dem Befehl noch
esp8266.setTimeout(20000);
eingefügt und schon gings!
Irgendwie reagiert das WLAN bei mir langsamer und ich brauch nen längeren Timeout.
Trotzdem danke für den Job ;-)
Hallo Tommy,
vielen Dank für den Tipp, ich habe es gleich mit eingearbeitet und in der Dropbox aktualisiert.
Zuerst mehrere erfolglose Versuche. Dann viel mir auf, das bei meinem Packet Sender der Button unten rechts auf „TCP:55006“ steht – und nicht auf „TCP Server Disabled“ wie in der Abbildung oben. Nach dem Umstellen auf „TCP Server Disabled“ funktionierte die Schaltung sofort. _Allerdings_ funktioniert die Schaltung jetzt auch, wenn ich wieder zurück auf „TCP:55006“ stelle.
Es könnte also sein, dass Packet Sender nicht ganz fehlerfrei ist.
Für die Andrioden, die später etwas automatisieren wollen:
Die App *UPD Sender* funktioniert hier bestens:
*UPD Sender* https://play.google.com/store/apps/details?id=com.hastarin.android.udpsender&hl=de
Diese App kann als Plugin für die App *Tasker – kostenpflichtig* verwendet werden:
*Tasker* https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm&hl=de
Gruss Röbi
Hallo Noob.
Nun wird es spannend, denn wir haben
– nun Hardware (LED) und
– Software (Day5_UDPLED)
die einen Fehler haben könnte oder falsch bedient werden.
Im Fall der Led: Hier ev. die Anschlüsse tauschen.
Im Fall der Software: Im Serial Terminal kommt der Text ‚LED=1‘ als Antwort = Software OK
Gruss Roebi
Funktioniert super.
Nur schade dass ich mit dem Netzwerk „NanoESP“ nicht ins Internet komme.
Soweit funktioniert alles. Ich kann die LED so einstöpseln, wie es in der Skizze abgebildet ist (nicht das dass ein Problem wäre), kann auch prima das Programm auf das NanoESP hochladen und bekomme im seriellen Monitor auch die Ansicht
RESET OK
AP ready
UDP ready
Wenn ich jetzt aber über den Packet Sender (selbstverständlich schön auf Ports 90 und 91 eingestellt) versuche, die Befehle led1 und led0 zu verschicken, passiert… nichts. Ich bekomme nicht mal eine Fehlermeldung. Es ist, als würde das Signal einfach irgendwo verschluckt.
Wahrscheinlich habe ich einfach irgendwo vergessen, einen Port oder so richtig einzustellen… Hat jemand eine Idee?
Habe doch etwas gefunden… offenbar hatte er beim Hochladen doch so seine Probleme:
deprecated conversion from string constant to ‚char*‘ [-Wwrite-strings]
if (esp8266.find(„+IPD,“))
warning: deprecated conversion from string constant to ‚char*‘ [-Wwrite-strings]
if (esp8266.find(„led“)) {
warning: deprecated conversion from string constant to ‚char*‘ [-Wwrite-strings]
sendCom(„LED=“ + String(setLed), „OK“);
Und die gleiche Fehlermeldung noch ein paar Mal, habe jetzt nur Beispiele willkürlich rausgepickt.
Hi,
haben die vorherigen Programme funktioniert? und welche Arduino-Version?
Du kannst auch mal Probieren, die IP-Adresse im Packet-Sender auf 192.168.4.255 zu stellen. Und wichtig ist natürlich auch, dass du im WLAN des Moduls angemeldet bist.
Funktioniert bei mir.
Hallo ich finde den Kalender Super :-)
Ich habe gestern schon Tag 5 bearbeitet !
Das Prog läuft super , ich steuere es von meinem Android Handy mit dem Programm UDP TCP Server-Free an. Eine LED ein und ausschalten geht sehr gut. Nun hab ich das Programm geändert um zwei LEDs zu steuern. Die erste LED geht gut aber die zweite muß ich immer mehrmals drucken damit sie ein und aus geht . Ich kenne mich mit Arduino Programmierung noch nicht aus . Ich programmiere nur bisher in BASCOM . Könnt ihr mal rüberschauen was ich falsch gemacht habe.
/*
UDP Controll LED.
No change necessary.
*/
#define DEBUG true
#define LED 9
#define LED1 8
#include
SoftwareSerial esp8266(11, 12); // RX, TX
void setup() {
Serial.begin(19200);
esp8266.begin(19200);
esp8266.setTimeout(5000);
if (sendCom(„AT+RST“, „ready“)) {
debug(„RESET OK“);
}
if (configAP()) {
debug(„AP ready“);
}
if (configUDP()) {
debug(„UDP ready“);
}
//shorter Timeout for faster wrong UPD-Comands handling
esp8266.setTimeout(1000);
pinMode(LED, OUTPUT);
pinMode(LED1, OUTPUT);
}
void loop() {
if (esp8266.available())
{
if (esp8266.find(„+IPD,“))
{
if (esp8266.find(„led1“)) {
int setLed = esp8266.parseInt();
digitalWrite(LED, setLed);
}
if (esp8266.find(„led2“)) {
int setLed1 = esp8266.parseInt();
digitalWrite(LED1, setLed1);
}
}
}
/*
Neue Zeilen
*/
}
//—————————————–Config ESP8266————————————
boolean configAP()
{
boolean succes = true;
succes &= (sendCom(„AT+CWMODE=2“, „OK“));
succes &= (sendCom(„AT+CWSAP=\“NanoESP\“,\“\“,5,0″, „OK“));
return succes;
}
boolean configUDP()
{
boolean succes = true;
succes &= (sendCom(„AT+CIPMODE=0“, „OK“));
succes &= (sendCom(„AT+CIPMUX=0“, „OK“));
succes &= sendCom(„AT+CIPSTART=\“UDP\“,\“192.168.4.255\“,90,91″, „OK“); //UDP Bidirectional and Broadcast
return succes;
}
//———————————————–Controll ESP—————————————————–
boolean sendCom(String command, char respond[])
{
esp8266.println(command);
if (esp8266.findUntil(respond, „ERROR“))
{
return true;
}
else
{
debug(„ESP SEND ERROR: “ + command);
return false;
}
}
String sendCom(String command)
{
esp8266.println(command);
return esp8266.readString();
}
//————————————————-Debug Functions——————————————————
void serialDebug() {
while (true)
{
if (esp8266.available())
Serial.write(esp8266.read());
if (Serial.available())
esp8266.write(Serial.read());
}
}
void debug(String Msg)
{
if (DEBUG)
{
Serial.println(Msg);
}
}
Danke
JPM schrieb: „Könnt ihr mal rüberschauen was ich falsch gemacht habe.“
Ja, ganz einfach, Du hast das falsche Türchen aufgemacht, es gibt bisher hur eine LED und die hängt an Pin 9.
Es hängt auch noch eine an Pin 13…
@Steve2955: nicht wenn du deinen Adventskalender richtig bedient hast (und schon bis fünf zählen kannst), denn dann hast du ein nanoESP-Board, ein Breadbord, ein Stück Kabel, einen Widerstand und … EINE LED ;-)
Das geht so nicht. find() und parseInt() „konsumieren“ die empfangenen Zeichen. Das heisst, dass zweite find() ist nie erfolgreich. Analysiere das erste erhaltene „setLed“ mittels if oder case. Viel Spass.
Hi,
wie jz bereits erwähnt hat, wird mit dem Befehl find() und parseInt() die Zeichenkette aus dem Buffer auch entfernt.
In deinem Beispiel gibt es aber noch ein weiteres Problem: Die find Methode funktioniert so, dass der SoftwareSerial-Buffer nach der Zeichenkette durchsucht wird, und zwar solange, bis ein Timeout sagt, dass genug gesucht wurde. Das beuetet, dass das Programm nach deiner ersten find(„led1“) abfrage mindestens eine Sekunde hängt, wenn nicht gerade auch der Befehl led1 gesendet wurde. Ob dann noch in der zweiten if-Abfrage led2 gefunden wird ist eine Glückssache. Du könntest diese Stelle aber auch so schreiben:
if (esp8266.find(„+IPD,“))
{
if (esp8266.find(„led“)) {
int numLed = esp8266.parseInt();
int setLed = esp8266.parseInt();
if (numLed == 1) {
digitalWrite(LED, setLed);
}
else if (numLed == 2) {
digitalWrite(LED2, setLed);
}
debug(„LED“ +String (numLed)+“=“ + String(setLed));
Dann findet das Programm mit parseInt die erste Zahl nach led (also 1 oder 2 in deinem Fall) und mit dem zweiten parseInt den Zustand (0 oder 1).
Hallo fk
Danke für Deinen Tip
aber so Richtig geht es nicht , ich bekomme in numLed den richtigen Wert also 1 oder 2 , aber im setLed immer eine Null. Die Werte im Terminalprogramm sind auch alle 3 stellig, also 100 oder 110
Benutzt du als Steuerkommando led1=1 oder led2=0?
Als Steuerkommando benutze ich led11 für ein und led10 für aus bzw. led21 für ein und led20 für aus
Achso…das Problem ist, dass mit parseInt dann die Zahl als ganzes erkannt wird. Also 11 oder 21. du könntest natürlich auch dann diese Zahl abfragen also if Zahl = 21 then led2=an