LoRa Packet Forwarder JSON Daten
25.12.2024
Elektronik | Funk | Software
Der Technik-Blog
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.
Hauptartikel: Arduino weltweit steuern
Code Dokumentation: Python UDP Relay
Artikel 2: Arduino über PHP steuern
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)
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); } |
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.
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.
Mit einem Mikrocontroller wie dem Arduino, einer kleinen Schaltung und entsprechender Software kann die Windgeschwindigkeit über ein Anemometer gemessen werden
WeiterlesenPT1000 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?
WeiterlesenAEQ-WEB © 2015-2025 All Right Reserved