ich möchte über eine einfache Website die auf meinem Raspberry läuft ein Relais einschalten welches an mein Arduino Uno Board angeschlossen ist. Hierzu soll auf der Website ein einfacher Button dargestellt werden, welcher einen UDP Befehl an das Arduino Uno sendet, um das Relais einzuschalten. Danach soll das Uno Board einen UDP Befehl zurücksenden an die Website, um dort den Status von 0 auf 1 umzuschalten.
Ich habe hierzu schon sämtliche Foren durhcsucht, finde aber immer nur den Code zum senden und empfangen der UDP Befehle auf dem Arduino, nicht aber eine HTML Datei mit PHP Datei, welche mir die Website erzeugt.
ich denke da wirfst Du ein paar Dinge durcheinander.
Die Webseite liegt auf dem RasPi. Auch nur der kann PHP ausführen (wenn dort ein Apache-Server installiert ist).
Ein Arduino hätte viel zu wenig Speicher und Power. Der könnte maximal ein paar einfache HTML-Seiten ausgeben. Allerdings verfügt der Uno über keine Netzwerkschnittstelle, also kann der nicht einmal das.
Genauso wenig UDP Nachrichten zu versenden oder empfangen.
Interessant wäre erstmal zu wissen, wie ist der Uno mit dem RasPi verbunden?
Und benötigst Du den überhaupt? Wenn das Relais mit dem Uno läuft, kannst Du das doch auch über die Pins vom RasPi steuern und ganz auf den Uno verzichten.
Wie man die Pins des Raspi ansteuern kann (auch per PHP) findest Du massenweise im Internet*.
Dann ist es Aufgabe des PHP-Scriptes den Status des Pins (bzw. des Relais dahinter) abzufragen und im HTML entsprechend mit AN oder AUS darzustellen.
Drückt der Anwender nun auf den Knopf, kannst Du per JavaScript oder PHP das Relais(de-)aktivieren.
Die Meinung meines Vorredners teile ich, dass man in dem Fall einfach die GPIOs des RaspberryPi nutzen kann.
Ich bin kürzlich über Node Red gestolpert, welches nun auf meinem RasPi läuft. Die Aufgabenstellung lässt sich hiermit sehr leicht grafisch zusammenklicken, übers Dashboard wird dann auch gleich eine funktionale Website generiert. Zudem ist das System dann beliebig erweiterbar.
Was damit alles möglich ist, kann man bspw. in dieser Youtube-Reihe von haus-automatisierung sehen.
vielen Dank für die Antworten.
Das Uno verfügt über ein Ethernetshield mit MicroSD Kartenslot. Somit könnte man einen Webserver auf dem Uno laufen lassen und einfache HTML Dateien in den FLashspeicher des Unos laden oder aber auf die Micro SD Speicherkarte auslagern.
Das Uno ist somit mit dem Raspberry per LAN verbunden.
Das Uno nimmt einfach nur Sensorwerte auf und soll diese ins Netzwerk senden und ein Relais schalten wenn das Raspberry ihm das sagt per UDP.
Okay, dann verstehe ich das Setup, dass der Uno und Raspi entfernt von einander stehen.
Dennis201911:
Somit könnte man einen Webserver auf dem Uno laufen lassen und einfache HTML Dateien in den FLashspeicher des Unos laden oder aber auf die Micro SD Speicherkarte auslagern.
Das ist aber die schlechtest Mögliche aller Lösungen! Und ich verstehe auch nicht warum.
Du möchtest Großmutter im Allgäu besuchen und Dir stehen ein LKW der Müllabfuhr und ein Ferrari zur Verfügung. Du entscheidest Dich mit dem Müllwagen quer durch die Republik zu fahren, weil er schließlich auch 4 Räder hat.
Der RasPi hat Rechenpower und unbegrenzt Speicher. Es wäre sinnvoll ihm die Aufgabe mit der HTML Seite zu geben.
UDP ist für den Fall eigentlich auch nicht das richtige. Ich würde simple http requests an den Uno senden:
127.0.0.0/relais?on
127.0.0.0/relais?off
Feste IP vergeben, sofern der Router das nicht ohnehin schon macht und fertig ist das Konstrukt.
Dann kannst Du die Seite auch mit Javascript und PHP vollstopfen, bei anständiger performance. Oder wenn Du zu einem späteren Zeitpunkt den Uno direkt ansprechen möchtest, (Handy App, o.ä.) kannst Du das ebenfalls direkt per webrequests machen.
Warum hältst Du so an UDP fest? Gibt es dafür einen Grund?
Es befinden sich mehrere Uno Boards im Feld, welche nicht nur Relais schalten sondern auch Sensorwerte senden. Das Raspberry soll als Schaltzentrale wirken und die Unos nur das ausführen, was das Raspberry vorgibt. Netzwerkkabel liegt überall zu den Unos, so dass diese einfach per Netzwerkkabel kommunizieren.
An UDP habe ich hier gedacht, da es einfach vom Aufbau ist und die gängigen SmartHome System (Loxone, FHEM) auch darüber kommunizieren.
Dann würde ich lieber auf MQQT setzen.
Dort können Clients mit einem Server kommunizieren und sich auch untereinander verbinden.
Wenn z.B. ein Aktor direkt auf Sensordaten reagieren soll, selbst wenn der Server mal nicht erreichbar sein sollte (Lichtschalter, Zeit-/Sonneneinfall-gesteuerte Rolläden, uvm.).
Es gibt massenweise Beispiele für den RasPi, Arduino oder ESP.
Es können mehrere Sicherheitsmechanismen implementiert werden.
Viele Heimaustomatisierungssysteme "verstehen" MQQT.
Ich würde simple http requests an den Uno senden:
127.0.0.0/relais?on
127.0.0.0/relais?off
Genau das würde ich dir auch empfehlen.
Der Webserver am raspberry gibt dir einen Button
Den Button verarbeitest du im webserver am raspberry.
Der Webserver des raspberry schickt einen HTTP-GET zum Arduino
Der Arduino verarbeitet den GET und Antwortet mit einem neuem Status (z.B. mit einem JSON)
Der Webserver am Raspberry verarbeitet die Antwort vom Arduino und kann nun auch mittels Refresh, Ajax oder Fetch deine Darstellung im Browser aktualisieren.
Rein testweise würde ich auch eine Seite am Arduino zur Verfügung stellen, damit du deinen GET auch direkt am Arduino testen kannst.
vielen Dank für die Antworten.
Ja das mit dem Request habe ich verstanden. Dies ist eine sehr einfache Lösung, die ich grundsätzlich immer favorisiere und sie bietet natürlich die den Vorteil eine Testseite direkt auf dem Arduino mit darzustellen. Zum Schalten von Aktoren ist diese Lösung auch sehr gut und findet ja so auch schon länger bei mir eine Anwendung. Problematisch wurde es halt mit dem Einbinden von Sensorwerten. Hierfür wird halt ein Kommunikationsprotokoll notwendig. Daher habe ich direkt anfangs an UDP gedacht.
Aufgrund der Posts habe ich mich jetzt aber auch mit MQTT beschäftigt und verstehe nun die Vorteile.
Allerdings finde ich hat der letzte Post von noiasca schon einen gewissen Scharm, wenn ich mit JSON den Status übermittel. Jedoch bleibt dann immer noch das Problem die Sensorwerte zu übertragen, so dass MQTT am Ende wohl doch die beste Lösung ist?!