Tag 6: UDP Button

In dem gestrigen Programm wurden erste Kommandos vom Controller ausgewertet. Das heutige Programm behält diese Funktion, kann aber nun zusätzlich selbstständig ein Kommando in das Netzwerk senden.

Hinter dem heutigen Türchen verbirgt sich ein Tastschalter. Er dient hier als einfacher Sensor. Verbinden Sie ihn mit dem Controller wie auf dem Aufbaubild gezeigt.

Der Schalter platzsparend an D8 angeschlossen

Der Schalter platzsparend an D8 angeschlossen

Das Programm: Day6_UDPSwitch

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

Das Programm wertet weiterhin die ankommenden Signale aus. Zusätzlich wird jedoch ständig der Button abgefragt. Wird dieser durch den Nutzer betätigt, sendet der Controller den Text

Button=1

an das Netzwerk. Alle mit dem Modul verbundenen Geräte mit einem UDP-Server am Port 90, können den Befehl empfangen. Bei einem Hausautomatisierungsprojekt würde nun ein Server die Statusmeldung beispielsweise von einem Bewegungsmelder empfangen und dann den Befehl led=1 zurücksenden, um das Licht zu aktivieren.

Die Kommandos im Packet Sender

Die Kommandos im Packet Sender

70 Kommentare

  1. Florian

    Guten Abend,

    Ich habe folgendes Problem:

    Bereits seit Tag 2: Google Ping scheint mein ESP-Board nicht richtig zu funktionieren. Ich kkonnte mich an Tag 2 nicht mit meinem Wlan verbinden. Durch Erstellen eines Hotspots über mein Smartphone hat dies dann jedoch funktioniert, Google sowie mehrere andere Seiten konnnte ich trotzdem nicht anpingen. Der quadratische Chip gegenüber des USB-Anschlusses wird bei mir nach Anschließen des Bords über USB innerhalb vonn 90 Sekunden so warm, dass man sich daran verletzen kann.

  2. Stefanie

    Liebe alle, hab gestern am Abend (um 1 in der früh), den Beitrag/Artikel/Thread zu Tag 6 gelesen und gemacht und da war eigentlich das Fritzing Programm zum Downloaden? Bilde ich mir das ein? Die Dateien hab ich noch am PC, aber ich find den Beitrag nicht mehr? Danke im Vorhinein

    1. jz

      http://fritzing.org

      Diese Information ist z.B. im Buch zum Franzis Arduino Lernpacket zu finden.

    2. fk (Beitrag Autor)

      Hi,
      den Beitrag findest du, wenn du z.B. oben im Hauptmenü auf WiFi-Board klickst. Dort findest du alle Beitrage speziell zum Board und u.A. auch den gesuchten Artikel.

  3. MC

    Kennt jemand eine iPhone App, die mit dem Packet Sender vergleichbar ist?

    1. Christoph

      Dito für iPhone 4 gesucht.

    2. Skayo

      Ich benutze „cmd“ von Baranasic Damian

  4. MC

    Hatte zunächst versucht, die LED über das iPhone zu steuern. Hatte auch eine App gefunden (Wi-Fi-Chat), mit der das Schalten der LED (Tag 5) funktionierte. Allerdings hatte es immer ewig gebraucht, bis das Telefon sich mit NanoESP verbunden hatte. Und eine Rückmeldung vom Board, wurde in dieser App auch nicht angezeigt.
    Dann habe ich umgestellt auf ein Odys Wintab 10. Hier klappt die Verbindung zum NanoESP schnell und auch Packet Sender funktioniert problemlos.
    Das Schalten der LED klappte immer. Allerdings bekam ich nach dem Schaltvorgang keine Rückmeldung im Packet Sender. Und auch die Rückmeldung vom Button kam nur sehr selten. Daraufhin habe ich auch die IP Adresse im Code umgestellt. Nun bekomme ich auch alle Rückmeldungen im Packet Sender. Die Rückmeldung vom Button kommt aber etwas verzögert.

  5. Skayo

    Ich habe den UKW-Radio vom letzten Jahr und würde den jetzt mit dem NanoESP verbinden. Dh ein und ausschalten über UDP.

    Hat jemand eine Idee wie man das machen könnte?
    mfg

    1. TO

      Hallo Skayo,
      was den Softwareteil betrifft geht das genau so wie bei der LED.
      Zum Hardwareteil muss ich ein bisschen raten. Ich nehme mal an, dass das UKW Radio mit ein paar Milli-Ampere auskommt. Dann kannst du einen kleinen NPN-Transistor (z.B. 2N2222) als Schalter verwenden. Basis über einen 1K Widerstand auf eine Portausgang des NanoESP, Kollektor auf GND und Emitter an den Minus Anschluß des Radio. Der Plus Anschluß kommt auf die benutzte Stromversorgung. GND vom NanoESP und Minus der Stromversorgung vom Radio müssen natürlich auch verbunden werden.
      Habe versucht das mal „hinzumalen“, siehe Bild.

  6. TO

    Hat jemand von euch eine Beschreibung der AT Kommandos gefunden die die Befehle nicht nur auflistet, sondern auch die Parameter beschreibt?
    https://nurdspace.nl/ESP8266#AT_Commands ist ja mal ein Anfang, aber schon arg knapp. Ausführlicher habe ich nur was chinesisches gefunden (und ich meine wirklich chinesisch, nicht fachchinesisch).

    1. Roebi

      Die Version 0.22 ist im ESP8266_NONOS_SDK_V1.0.0_15_03_20
      http://bbs.espressif.com/viewtopic.php?f=46&t=286
      Zuunterst der Anhang 4A-ESP8266 AT Instruction Set_v0.22.pdf
      Gruss Röbi

      1. TO

        Hallo Röbi,
        das ist genau das was ich gesucht habe.
        Vielen Dank

  7. Hr Anderas

    HAHAHAHAHA man brach 10 stunden um dieses schlechte kabel zu desisolieren !!!

    1. Noob

      Also… Ich habe mit einer schlechten Haushaltsschere ungefähr zehn Sekunden gebraucht.
      Ist aber nur eine grobe Schätzung.

  8. TO

    Hallo Leute,
    solange der Taster gedrückt wird steht das Programm und kann keine Kommandos für das Aus-/Einschalten der LED empfangen. Hier ein Vorschlag für eine Änderung der Routine loop() (man beachte das static!):

    static boolean pressed = false;
    if (!digitalRead(SWITCH))
    {
    if (!pressed)
    {
    debug(„Button=1“);
    sendUDP(„Button=1“);
    pressed = true;
    }
    }
    else
    {
    if (pressed)
    {
    debug(„Released“);
    sendUDP(„Released“);
    pressed = false;
    }
    }

    Schönen Restsonntag noch.

  9. Jürgen

    Wenn du mit dem Button die LED ein- und ausschalten willst, brauchst du nur eine globale Variable, die den LED-Wert zwischenspeichert.
    Bei jedem Drücken des Buttons invertierst du den Wert dann (d.h. aus 0 wird 1 und umgekehrt), speicherst ihn wieder in der gobalen Variable und schickst ihn an den LED-Port:


    int ledValue = 0; // speichert den LED-wert

    void setup() {

    In der loop-Funktion:

    if (!digitalRead(SWITCH))
    {
    debug(„Button=1“);
    sendUDP(„Button=1“);
    ledValue = !ledValue; // invertiere den aktuellen led-wert
    digitalWrite(LED, ledValue); // schicke den led-wert an den port
    while (!digitalRead(SWITCH)) {}
    }
    }
    //—————————————–Config ESP8266————————————

    1. Tommy

      Hallo Jürgen,

      das funktioniert an sich perfekt (danke dafür!),

      nur hat die Kommentarfunktion wieder diese typografischen
      Anführungszeichen bei

      debug(„Button=1“);
      sendUDP(„Button=1“);

      drausgemacht.

      Die müssen im Prog durch die Anführungszeichen mit ersetzt werden, sonst gibts nen Kompilierungsfehler…

      1. Tommy

        wollte schreiben:

        Die müssen im Prog durch die Anführungszeichen mit Shift+2 ersetzt werden, sonst gibts nen Kompilierungsfehler…

        Die Kommentarfunktion frisst auch spitze Klammern grrr…

    2. Rainer

      Wenn man es noch „schöner“ machen will, kann man vorher noch den Wert von setLed übernehmen. Ansonsten, wenn über Netzwerk der Befehl led1 kommt und dann der Taster betätigt wird, ändert sich der Zustand nicht, erst beim 2. Mal.

      Konkret:
      in der loop() Funktion hinter:
      int setLed = esp8266.parseInt();

      die Zeile:
      ledValue = setLed;

      einfügen, dann wird der aktuelle Zustand der LED übernommen.

      Ansonsten: Alles perfekt!

      Viel Spaß an alle Bastler.

      Gruß Rainer

      1. Jürgen

        Du hast recht, darauf hatte ich gar nicht geachtet… :-)

        Einwandfrei!

        Un das ist auch das Schöne an diesem Kalender, dass eigentlich jeder ein bisserl was dazu beitragen kann.
        Der Eine mit Fragen und Anregungen und der Andere mit Umsetzungen und Erweiterungen.

        1. Aironout

          Whow, Leute, das habt ihr echt super elegant gelöst.
          Ich hatte schon etwa 20 Zeilen Code gelegt, um die LED auch mit dem Button an- und ausschalten zu können, und dann entnervt aufgegeben. Und ihr macht das mit ein paar Zeilen und dann auch noch mit gedrückt halten und via UDP ausschalten…
          Hut ab, funktioniert klasse!

  10. Leuchten

    Hallo!

    Ich habe ne Frage. Wenn man auf den Button drückt soll dan die LED angehen oder so etwas?
    Bei mit passiert da nichts. Der Paket Sender registriert einfach das ich den Button gedrückt habe, aber sonst passiert nichts.

    1. Reinhard

      Es soll keine LED angehen wenn du den Taster drückst.
      Am heutigen Tag wird einfach gezeigt daß das Board auch per WLan eine Meldung an den PacketSender schicken kann.

      Da du die Meldung empfängst funktioniert bei dir alles bestens.

      1. Reinhard

        Du löst also mit dem Taster eine Aktion aus. Diese wird vom Board erkannt und schickt sie per wLan an deinen PacketSender (und auch Empfänger). Wäre der Taster z.B. ein Alarmkontakt in einer Tür, so würdest du quasi drahtlos über den Alarm informiert werden (Internet der Dinge).

    2. Hr Plober

      Es soll nur signalisieren das der button gedrückt wurde mehr nicht

  11. Willi

    Hey Leute,
    erstmal einen schönen zweiten Advent!
    Ich habe euch den Source-Code nochmal umgeschrieben damit ihr den NanoESP auch im Heimnetzwerk benutzen könnt also ihr bindet den NanoESP ins Heimnetzwerk ein, genauer genommen in euer WLAN, ich müsst nurnoch bevor ihr den Code hochladet eure SSID, PASSWORT und den REMOTEHOST(Euren Empfänger) im Code anpassen.
    Hier zum Download: https://www.dropbox.com/s/k4rz368236bhwdx/Day6_UDPSwitchButtonLEDWithoutAP.zip?dl=0

    1. Toni Taste

      Da warst Du 5 Minuten schneller als ich ;)

      1. Willi

        @Toni Taste
        :D Mal sehen wer morgen schneller dran ist!

      2. Toni Taste

        Wenn es Probleme beim Einbinden in das WLAN gibt, dann einfach in der Methode configAP() zwischen den beiden Zeilen success &= … die Zeile esp8266.setTimeout(20000); ergänzen.

      3. MartinW

        Dank an euch beide für den Service ;-))

  12. anonym

    wozu ist das da?

    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);
    }
    }

    1. TO

      Der obere Teil sind Reste von Tag 1 bei dem jedes Zeichen das über den Seriellen Monitor eingeben wurde auf das WLAN Modul weiter geleitet wurde. Das wird jetzt nicht mehr benutzt.
      Die unter Hälfte wird für die Ausgabe von Text im Seriellen Monitor benutzt.

  13. Reinhard

    Mit Debian Jessie funktioniert alles auf Anhieb!
    Zu Android UDP-Sender / Receifer habe ich eine Bemerkung.

    Die ersten Versuche des Adventskalenders führte ich unter Windows 10 durch. Dies funktionierte problemlos bis es zum UDP-Protokoll kam. Ab da blockte die interne Firewall.

    Die Anfrage der Firewall ob ich „PacketSender“ uneingeschränkten Zugriff auf das Internet gewähren möchte beantwortete ich mit „ja“. Nun funktionierte die Kommunikation vom Packet-Sender zum Board.
    Vom Board zum PacketSender gab es weiterhin Probleme.
    Diese hätte ich durch weitere Einstellungen an der Firewall bestimmt lösen können.
    Ich entschloss mich jedoch dazu das Programm PacketSender auf meinem Netbook zu installieren.
    Es läuft unter dem Betriebssystem „Debian Jessie“.
    Jessie hat nach einer Standardinstallation keine Firewall aktiviert.
    Mir fiel auf das die PacketSender Version für Debian den gleichen Bug hat wie die für Macs.
    Also Ports wie für Macs beschrieben ändern.
    Sonst waren bisher keine Änderungen am Code für den Arduino nötig.
    Es funktioniert also auch Multicast.
    Das betätigen des Tasters wird jedes Mal zuverlässig erkannt und auf dem seriellen Monitor sowie als Rückmeldung im PacketSender angegeben.

    Nun zu UDP Sender/Receifer unter Android.
    Ich nutze ein älteres Samsung-Smartphone unter Android 4.1.
    Dort habe ich die oben genannte App installiert. Bis zum heutigen Tag waren alle Versuche damit durchführbar.

    Folgendes funktioniert auch heute:
    LED einschalten mit Rückmeldung
    LED ausschalten mit Rückmeldung

    Folgendes funktioniert nicht:
    Bei Betätigung des Buttons erfolgt nur eine Rückmeldung
    im seriellen Monitor.
    Jedoch nicht im „UDP Sender/Receifer“ auf dem Handy.

    (Um überhaupt Rückmeldungen zu empfangen muss im „UDP Sender / Receifer“ übrigens „Read Timeout“ auf z. B. 2 Sekunden gestellt werden. Standardmäßig wartet das Programm nicht auf Rückmeldungen)

    Dies kann nicht am Code für das Arduino-Board liegen. Denn unter Debian empfange ich ja alles.

    Meine Diagnose ist das „UDP Sender/Receifer“ in der jetzigen Version für Android 4.1 nur auf eine Antwort lauscht wenn der Befehl zum Board auch über dieses Programm gesendet wird.

    1. Reinhard

      Hier noch ein Bild unter Android:

  14. Christian

    Für alle Linuxer die bisher noch nicht dazu kamen: Man kann es auch bequem haben ohne zig qt-Pakete zu installieren um den Packet Sender ans laufen zu bringen.

    Wie man Eingabe oder Ausgabe in ein Terminalfenster umlenkt stand ja schon beschrieben – ich fand das jedoch recht mühsam, weil ich ja dann zwei Terminalfenster brauche und zwei mal das Passwort für sudo eingeben muss.

    Um sowohl Ein- als auch Ausgabe ins selbe Terminalfenster umzulenken, kann man folgenden Befehl verwenden:

    sudo socat UDP-RECV:90,crnl\!\!UDP-SENDTO:192.168.4.1:91 STDIO

    Einen schönen zweiten Advent wünsche ich allen Mitstreitern!
    Christian

    1. Ulrich

      Danke das war ein guter Tip leider habe ich den Kalender fast durchgebaut aber fuers naechste Jahr

  15. Helmut

    Bisher hat bei mir immer alles bestens funktioniert. Aber heute ist der Wurm drin. Es geht gar nichts. Wie muss der Taster eingesetzt werden? Mit den Metallfähnchen rechts/links oder oben/unten? Ich habe auch noch nichts gefunden (Windows 10) wo ich auf Heimnetzwerk umstellen kann. Hat mir jemand einen Tipp ?

    1. Toni Taste

      Metallfähnchen nach links/rechts.

    2. jz

      Bei Windows 7 gings über Network & Sharing Center. Bei Windows 10 suche ich noch.
      Was geht, ist über Settings Knopf im Windows Hauptmenu, dann Network & Internet, dann Manage WiFi Settings, dann das Netzwerk wählen und Forget betätigen (englisches W10). Anschliessend beim Neuverbinden Privates Netzwerk wählen.
      Alternativ neuen Namen wählen in dem Beispiel.

  16. Hartmut

    Wenn der Button unter Windows nicht im Packet Sender angezeigt wird, prüft bitte mal, ob das NanoESP Netzwerk, mit dem ihr euch ja verbunden habt, als „Heimnetzwerk“ eingestellt ist. Bei „öffentlichem Netzwerk“ geht es bei mir auch nicht, wohl aber die LED.

  17. MiPhi

    LED geht, Button nur auf dem Monitor, nicht aber auf dem Packetsender zu sehen.
    Dann in Zeile 83 statt 192.168.4.255 die 192.168.4.2 eingetragen und alles klappt tadellos.

    1. Frank

      Button=1 kommt im seriellen Monitor an, nicht aber im Packet Sender, auch nach Abänderung Code keine Änderung

  18. anonym

    Wenn ich den Taster drück passiert nichts aber die LED kann ich ein oder aus schalten! Was habe ich falsch gemacht?

    1. Marco

      Schalter ist falsch drinnen. Muss um 90° gedreht werden

      1. Marco

        Sry, vergiss die Antwort. Bin total falsch.

    2. Tanja

      Eventuell den Taster auf dem Lochraster um 90° drehen?

      1. Rolf

        I have the same problem as anonym – led works but nothing happens when pressing the switch. Don’t think I can rotate the switch as it will not fit the 1st and 4th hole in that line of 5.

        Somebody care to explain how this should work anyway? Is the switch pulling D8 to GND and should that have the effect?

        Thanks

        1. Rolf

          I must have had some sort of hardware issue – i removed the switch, checked it using a multi-meter and put it back.

          Now all works – both with broadcast and direct.

          Not sure what was wrong before. I find I have to press the switch quite firmly – even though it clicks it does no always register apparently.

          1. anonym

            Jetzt funktioniert es bei mir auch! :D

    3. Leuchten

      Hallo,

      wir haben dasselbe Prblem wie du.
      Wir können die LED ein und ausschalten (mit Befehlen im Packet Sender) aber ohne den Button. Im Packet Sender sehen wir aber die Befehle für die LED und die Nachrichten des Buttons.
      Wie hast du es gelöst? Muss denn die LED auf Knopfdruck leuchten?

  19. JoergOgait

    geht bei mir nicht. Am seriellen Monitor erscheint button=1, am Packetsender kommt nichts an. Schade

    1. Sören Hetzer

      Bei mir das selbe, aber es kommt bei mir wenigstens machmal an

    2. Flix

      Hab das selbe Problem, bei mir kommt auch was im serial monitor und im packet sender, bei der led tut sich aber nichts

  20. Sören Hetzer

    Ist es nochmal dass die Meldung bei Knopfdruck nur manchmal am mac ankommt so gefühlt nur jedes 8te mal aber in der Seriellen Monitor kommt jeder Knopfdruck an

    1. jz

      Eigentlich nicht. Gibt es einen Unterschied, wenn statt Multicast (192.168.2.255) die spezifische Zieladresse (192.168.4.2) verwendet wird?

      1. Sören Hetzer

        Ne, nicht wirklich, wenigstens funktionierts so halb aber danke

      2. Reto

        Ja den gibt es Die multicast Adresse von 192.168.4.2/24 ist 192.168.4.255, nicht 192.168.2.255.

        Hab die Multicast Adresse auf mein Netz angepasst, jetzt geht alles.

        1. Reto

          sorry, Broadcastadrese natürlich, nicht Multicast.

        2. Thoen

          Ich habe die geleiche Fehler.
          Was ist „auf mein Netz angepasst?“

          Warum gibt es dieses fremde comment in die dritten Zeile der „ControllESP“-Teil:
          succes &= sendCom(„AT+CIPSEND=“ + String(Msg.length() + 2), „>“); //+“,\“192.168.4.2\“,90″, „>“);

          Vielleicht hat das etwas zu tun mit das beschriebene Problem…

          1. jz

            Beispiel: (hoffentlich kommt das Pleirechtssymbol >)
            // succes &= sendCom(„AT+CIPSEND=“ + String(Msg.length() + 2), „>“); // geht nicht mit multicast für Androids
            succes &= sendCom(„AT+CIPSEND=“ + String(Msg.length() + 2) + „,\“192.168.4.2\“,5505″, „>“); // geht, kein multicast

          2. jz korr.

            Korrektur:
            // succes &= sendCom(„AT+CIPSEND=“ + String(Msg.length() + 2) + „,\“192.168.4.2\“,5505,5506″, „>“); // geht, kein multicast
            // succes &= sendCom(„AT+CIPSEND=“ + String(Msg.length() + 2) + „,\“192.168.4.2\“,90,91″, „>“); // originale Ports

          3. jz korr.korr.

            schon wieder falsch. Korrektur:
            // succes &= sendCom(„AT+CIPSEND=“ + String(Msg.length() + 2) + „,\“192.168.4.2\“,5505″, „>“); // geht, kein multicast
            // succes &= sendCom(„AT+CIPSEND=“ + String(Msg.length() + 2) + „,\“192.168.4.2\“,90″, „>“); // originales Port

            Bei CIPSEND natürlich nur den Zielport.

        3. jz

          Multicast Adresse 192.168.4.255 war gemeint.
          Meine Finger schreiben automatisch 192.168.2.
          Broadcast ist der Oberbegriff.
          Multicast ist meines Wissens Broadcast im Subnetz.
          Broadcast im engeren Sinne übers Subnetz hinaus, also z.B. 192.168.255.255 oder sogar 255.255.255.255.

          1. Thoen

            Danke, jz!
            Dein Beispiel gefolgt, und alles funktioniert (mit Mac).

      3. rk

        Bei mir hat es die letzten Tage nur funktioniert wenn ich die spezifische Zieladresse verwendet habe. An was liegt das?
        Heute geht gar nichts…

    2. Hoeni

      Ja, ist bei mir auch so (am Mac). Am Packet Sender kommt nur manchmal auch ein Paket an. Im seriellen Log wird aber immer „Button=1“ angezeigt.

      1. Hoeni

        Mit der direkten Adresse 192.168.4.2 geht es bei mir zuverlässig

      2. Martin

        Ist bei mir auch so. Weiß jemand warum und wie man das abstellen kann? Wenn ich 192.168.4.2 statt 192.168.4.255 nehme geht gar nichts.

        1. Nikdro

          Um das zu verstehen sind ein paar Grundlagen zu Netzwerken aus der Informatik notwendig…

          Ganz vereinfacht dargestellt:
          Die IP-Adresse 192.168.4.255 ist keinem PC zugeteilt. Wird eine Nachricht an sie gesendet, wird sie an alle PCs verteilt. So bekommt wirklich jeder die Botschaft.

          Also muss die IP entweder genau die des Computers sein, oder halt die 255 am Ende um an alle zu senden. :)

          Ich hoffe das war einigermaßen verständlich. Sonst gerne fragen :)

Schreiben Sie einen Kommentar

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