Events

:

:

Elektronik | Funk | Software

Der Technik-Blog

  • Social Media

    Werbung:


    Neue Artikel


    Events

    • Keine zukünftigen Events vorhanden

    Der Technik-Blog

    Arduino Worldwide Bidirectional Communication

    Arduino UDP Controller Code

    Alex @ AEQ-WEB

    Dieser Artikel beschreibt den Arduino Quellcode für das Projekt "Arduino weltweit Steuern". Die für dieses Projekt benötigten Bibliotheken sind in der Regel bereits im Arduino IDE installiert.

    Was die Software kann

    Der Arduino ist in der Lage, Steuerinformationen, die vom Server kommen, zu verarbeiten. Dazu zählt das Schalten von digitalen Ausgängen sowie das Senden von Bestätigungen und Statusinformationen.

    Werbung:

    Download Arduino Sketch (ZIP)

    Arduino UDP Controller
    Download
    Der Arduino Code:

      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
     35
     36
     37
     38
     39
     40
     41
     42
     43
     44
     45
     46
     47
     48
     49
     50
     51
     52
     53
     54
     55
     56
     57
     58
     59
     60
     61
     62
     63
     64
     65
     66
     67
     68
     69
     70
     71
     72
     73
     74
     75
     76
     77
     78
     79
     80
     81
     82
     83
     84
     85
     86
     87
     88
     89
     90
     91
     92
     93
     94
     95
     96
     97
     98
     99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    #include <SPI.h>
    #include <Ethernet.h>
    #include <EthernetUdp.h>
    
    int ledpin = 7;
    
    unsigned int local_port = 33333;
    unsigned int remote_Port = 9999;
    const char * server = "your-domain.com";
    String device_name = "Arduino";
    byte mac[] = {0x90, 0xA2, 0xDA, 0x0D, 0x5C, 0x18};
    
    char packetBuffer[UDP_TX_PACKET_MAX_SIZE];
    long timer1;
    EthernetUDP Udp;
    
    void setup() {
      pinMode(ledpin, OUTPUT);
      Serial.begin(9600);
      Serial.println("Initialize Ethernet Shield with DHCP...");
      if (Ethernet.begin(mac) == 0) {
        Serial.println("Error: IP address was not assigned by DHCP");
        if (Ethernet.hardwareStatus() == EthernetNoHardware) {
          Serial.println("Error: Ethernet shield was not found");
        } else if (Ethernet.linkStatus() == LinkOFF) {
          Serial.println("Ethernet cable is not connected");
        } while (true) {
          delay(1);
        }
      }
      Serial.print("Local IP: ");
      Serial.print(Ethernet.localIP());
      Serial.print(" PORT: ");
      Serial.println(local_port);
      Udp.begin(local_port);
      delay(2000);
      sendudp("Keep-Alive");
    }
    
    void loop() {
    
      if ((timer1 + (30 * 1000)) <= millis()) { //Send a UDP packet every 30 seconds to keep port open
        sendudp("Keep-Alive");
        timer1 = millis();
      }
    
      int packetSize = Udp.parsePacket();
    
      if (packetSize) {
    
        Serial.print("Received packet! (Size: ");
        Serial.print(packetSize);
        Serial.println(")");
        Serial.print("From ");
        Serial.print(Udp.remoteIP());
        Serial.print(":");
        Serial.println(Udp.remotePort());
    
        Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
        String received_string(packetBuffer);
    
        Serial.print("<- Received String: ");
        Serial.println(received_string);
        Serial.println("");
        memset(&packetBuffer[0], 0, sizeof(packetBuffer)); //Clear buffer
    
        if (received_string.indexOf("LED=1") > 0) {
          Serial.println("TURN LED ON!");
          delay(10);
          digitalWrite(ledpin, HIGH);
          sendudp("DONE");
        }
    
        if (received_string.indexOf("LED=0") > 0) {
          Serial.println("TURN LED OFF!");
          delay(10);
          digitalWrite(ledpin, LOW);
          sendudp("DONE");
        }
    
        if (received_string.indexOf("INFO") > 0) {
          Serial.println("INFO COMMAND RECEIVED!");
          sendinfoudp();
        }
      }
    }
    
    void sendudp(String packet) {
      Udp.beginPacket(server, remote_Port);
      Udp.print(";");
      Udp.print(device_name);
      Udp.print(";");
      Udp.print(packet);
      Udp.print(";");
      Udp.endPacket();
    
      Serial.print("-> Send UDP packet to server: ");
      Serial.println(packet);
      Serial.print("-> RAW:  ");
      Serial.print(";");
      Serial.print(device_name);
      Serial.print(";");
      Serial.print(packet);
      Serial.println(";");
      Serial.println("");
      delay(2);
    }
    
    void sendinfoudp() {
      Udp.beginPacket(server, remote_Port);
      Udp.print(";");
      Udp.print(device_name);
      Udp.print(";");
      Udp.print("Arduino-IP: ");
      Udp.print(Ethernet.localIP());
      Udp.print(" Uptime: ");
      Udp.print(millis() / 1000);
      Udp.print(" sec");
      Udp.print(";");
      Udp.endPacket();
      delay(2);
    }
    

    Code Beschreibung

    In diesem Absatz sind die einzelnen Befehlszeilen beschrieben:

    1-3: Einbindung notwendiger Bibliotheken
    5: Definiere Pin für LED
    7: Definiere Empfangsport (An diesem Port regiert der Arduino auf UDP Pakete)
    8: Definiere Serverport (An diesem empfängt der Zielserver UDP Pakete)
    9: Domain oder IP-Adresse des UDP Socket Server (Python Relay)
    10: Systemkennung (muss auf Arduino und Server identisch sein)
    11: MAC Adresse (sollte am eigenen Arduino geändert werden)
    21-30: Startet das Ethernet Shield und testet das Netzwerk
    35: Startet UDP
    37: Sendet ein erstes UDP Paket an den Server um sich anzumelden
    42-45: Ein Timer, der alle 30 Sekunden ein Datenpaket an den Server sendet um Routing und NAT aufrecht zu halten
    49: Führt alle Befehle bis Zeile 85 aus, wenn ein Datenpaket empfangen wurde
    51-57: Ausgabe im Serial Monitor
    59: Lade empfangenes UDP Paket in einem Buffer
    60: Wandelt empfangenen Datensatz in String um
    65: Leert den Buffer für den nächsten Datensatz
    67-72: Diese Zeilen werden ausgeführt, wenn im empfangenen Datensatz der Zeichensatz "LED=1" enthalten ist
    70,77: Schaltet die LED entsprechend dem empfangenen Steuerbefehl
    71,78: Sendet eine Rückmeldung an den Server, dass der Befehl ausgeführt wurde (DONE)
    81: IF-Bedingung wird ausgeführt, wenn Steuerbefehl die Zeichenkette "INFO" enthält
    88-107: Diese Methode sendet ein Datenpaket mit übergebenen Datensatz an den Server
    109-122: Sendet ein Statuspaket (Controller IP, Laufzeit in Sekunden seit Start...) an den Server

    Werbung:

    Das folgende Bild zeigt eine erfolgreiche Initialisierung vom Ethernet Shield. Anschließend wird versucht, den Server zu erreichen. In den letzten Zeilen wird die Rückmeldung mit der Empfangsbestätigung vom Server angezeigt.

    Das folgende Bild zeigt den Serial Monitor vom Arduino IDE beim Empfang eines Steuerbefehls vom Server. Anschließend wird die LED an Pin 7 eingeschaltet und eine entsprechende Rückmeldung an den Server gesendet.

    Werbung:


    122X122

    Über den Autor

    Alex, der Gründer von AEQ-WEB. Seit über 10 Jahren beschäftigt er sich mit Computern und elektronischen Bauteilen aller Art. Neben den Hardware-Projekten entwickelt er auch Webseiten, Apps und Software für Computer.

    Top Artikel in dieser Kategorie:

    Arduino IRFZ44N PWM MOSFET Load Control

    Arduino MOSFET Steuerung

    • Video
    • DE/EN

    In diesen Artikel zeigen wir wie man große Lasten mittels eines MOSFET-Transistors über das Arduino Board steuert und die Drehzahl von einem Motor regelt

    Weiterlesen
    Arduino LM358 PT1000 Sensor Converter

    Temperatur messen mit PT1000 & Arduino

    • Video
    • DE/EN

    PT1000 Sensoren können nicht direkt analog mit einem Mikrocontroller gemessen werden. Wie baut man einen Messwandler mit dem LM358 für den PT1000 und Arduino?

    Weiterlesen

    Social Media

    Werbung:


    Neue Artikel


    Events

    • Keine zukünftigen Events vorhanden