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.

Download Arduino Sketch (ZIP)

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

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.

Arduino Bidirectional Communication Startup Serial Monitor

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.

Arduino Bidirectional Communication Receive Command Serial Monitor

Oft gelesen

Anzeige:

Social Media

Newsletter