GPIOs separat ansteuern

Hallo,

ich möchte euch kurz mein Projekt vorstellen, dass ich bis dato versucht habe via Raspberry Pi umzusetzen, aber aufgrund der Stabilität und der nicht möglichen Realisierung nun gerne auf einem Arduino fortsetzen möchte.

Ich muss dazu sagen, dass ich noch keinen Arduino besitze, aber durch ein kleines Projekt an der Uni (Lichtsensor, Schrittmotor,...) schon ein klein wenig Kontakt damit hatte.

Was ich erreichen möchte:
Aktuell setze ich vier GPIO Pins des Raspberry ein, um damit zwei Ventile, der Einfachheithalber an GPIO 1 und 2, zu schalten. Diese müssen unabhängig von einander schaltbar sein und ihren Status (HIGH|LOW) auch so lange behalten, bis sie aktiv wieder abgeschalten werden. Beim Pi ginge es nur so, dass man das Python-Skript einmalig aufruft und in Dauerschleife laufen lässt. Dort müsste vorab aber schon klar sein, wann welches Ventil genau geschalten werden soll. Wird das Skript beendet müssen die GPIOs per "cleanup" zurückgesetzt werden.

Nun hätte ich es gerne so, dass die Ventile unabhängig (das sind sie nämlich) von einander schaltbar sind. D.h. ich würde mein Ventil-Skript aufrufen und ihm z.B. die Argumente "1" und "LOW" mitgeben. Dann würde GPIO 1 auf LOW gesetzt und damit geöffnet. Dann ist das Skript zuende und GPIO 1 ist auf LOW.
Rufe ich das Skript mit den Argumenten "2" und "LOW" erneut auf, dann wird das Ventil an GPIO 2 ebenfalls geöffnet. Das Ventil an GPIO 1 ist weiterhin geöffnet und bleibt es auch.
Dann rufe ich das Skript erneut auf und gebe "2" und "HIGH" als Argument mit -> das Ventil an GPIO 2 schließt sich, das an GPIO 1 bleibt offen, da noch nicht explizit beendet.
Zu guter letzt wird das Skript mit "1" und "HIGH" aufgerufen und auch dieses Ventil schließt sich.

Das würde es mir ermöglichen, jedes Ventil manuell z.B. vom Laptop über VPN zu öffnen und zu schließen. Außerdem könnte ich über meinen Server zeitgesteuert jedes einzelne Ventil öffnen und schließen. Der Arduino müsste lediglich das Skript ausführen. Die zeitliche Steuerung und weitere Logik (eventuell eine Anbindung an OpenWeatherMap) würde aber auf dem Server laufen.

Nun meine Frage: Ist das denn möglich, dass der Arduino jeden GPIO einzeln steuert, ohne nach jedem Skriptaufruf alle GPIOs zurücksetzen zu müssen?

BLU1:
Nun meine Frage: Ist das denn möglich, dass der Arduino jeden GPIO einzeln steuert, ohne nach jedem Skriptaufruf alle GPIOs zurücksetzen zu müssen?

Skript heißt beim Arduino “Sketch”.

Und der Sketch läuft beim Arduino immer in einer Schleife (Loop) durch.
Da musst du innerhalb der Loop immer die entsprechenden Werte an den GPIO (Pins) setzen.

Das ist aber auch mit dem Raspi problemlos machbar.

Ich würde mich da eher von der Herangehensweise mit je einem Skript pro Befehl (Pin 1 low, Pin 1 high, .... ) verabschieden.

Grüsse
Peter

https://www.arduino.cc/reference/en/language/functions/digital-io/digitalwrite/

Hallo,

vielen Dank für eure schnellen Antworten.

Vielleicht nochmal kurz zur Info, ich wollte nicht pro Befehl ein Sketch (Danke für den Hinweis), sondern ein Sketch das einen GPIO und einen Zustand als Argument erwartet, so dass ich das Sketch unendlich oft aufrufen und durch die Argumente die GPIOs unterschiedlich schalten kann.

Dann frage ich einfach mal dumm: Gibt es eine andere Möglichkeit in der Dauerschleife mein Vorhaben zu realisieren. Von mir aus kann das Skript ja auch gerne non-stop laufen, wenn es trotzdem irgendwie noch realisiert, wenn von außen Eingaben kommen.

Ich sage mal so: Beim Aufrufen des Sketch wird eine Ausgabe gemacht, ehe es in den Loop kommt:

Einen der folgenden Buchstaben drücken:
a) Ventil an GPIO 1 öffnen
b) Ventil an GPIO 1 schließen
c) Ventil an GPIO 2 öffnen
d) Ventil an GPIO 2 schließen
...

Dann läuft die Schleife los, der Sketch bekommt Tastatureingaben aber mit. Wenn ich nun "a" auf der Tastatur drücke, dann wird das Ventil an GPIO 1 geöffnet.
Würde ich aber z.B. "d" drücken, dann käme die Meldung "Ventil an GPIO 2 muss erst geöffnet werden, ehe es geschlossen werden kann", o.ä. Sprich, ich würde / müsste halt immer auch die Zustände abfragen.

Ginge denn sowas und ließe sich das dann später auch "Remote" über meinen Server steuern? Sprich, dass der Scheduler auf meinem Server läuft, während mein Sketch in der Dauerschleife läuft. Dann kommt vom Server die Anforderung "a" und das Ventil an GPIO 1 öffnet sich?

Vielen Dank und viele Grüße

Felix

BLU1:
Ginge denn sowas und ließe sich das dann später auch "Remote" über meinen Server steuern? Sprich, dass der Scheduler auf meinem Server läuft, während mein Sketch in der Dauerschleife läuft. Dann kommt vom Server die Anforderung "a" und das Ventil an GPIO 1 öffnet sich?

Naja, für die Verbindung Server-Arduino musst Du halt etwas Passendes finden. Ich habe mal einen Test mit einem Raspberry Pi, einem „Level-Changer“ und einem Arduino Nano gemacht: Man kann prima hin- und her-faseln.

Gruß

Gregor

BLU1:
.....
Ich sage mal so: Beim Aufrufen des Sketch wird eine Ausgabe gemacht, ehe es in den Loop kommt:

Dann läuft die Schleife los, der Sketch bekommt Tastatureingaben aber mit. Wenn ich nun "a" auf der Tastatur drücke, dann wird das Ventil an GPIO 1 geöffnet.
Würde ich aber z.B. "d" drücken, dann käme die Meldung "Ventil an GPIO 2 muss erst geöffnet werden, ehe es geschlossen werden kann", o.ä. Sprich, ich würde / müsste halt immer auch die Zustände abfragen.

Ginge denn sowas und ließe sich das dann später auch "Remote" über meinen Server steuern? Sprich, dass der Scheduler auf meinem Server läuft, während mein Sketch in der Dauerschleife läuft. Dann kommt vom Server die Anforderung "a" und das Ventil an GPIO 1 öffnet sich?

Das hatte ich dir doch in Post #1 schon geschrieben.

Ja, das funktioniert. Die Loop läuft (muss) ständig und fragt innerhalb deine Anweisungen ob über Taster oder Schnittstelle ab. Und führt dann entsprechend die gewollten Anweisungen (Led an oder aus) aus.

Da du von Tastatureingaben sprichst:
Lokal am Raspi oder per SSH Session?
Bei ersterem reicht es, wenn du mal in Python schaust, wie man die Tastatur abfragen kann, währen man in einer while-Schleife ist (Stichwort Nebenläufigkeit)
Bei einer SSH Session funktioniert es eigentlich gleich, ausser dass du darauf achten musst, in die gleiche Session zu kommen, in der schon dein Skript läuft (Stichwort screen).

Einem solchen Skript musst du auch keine Startparameter mitgeben, sondern lässt es einfach laufen und reagierst dann auf Eingaben per Tastatur.

Wenn das soweit läuft, kannst du z.B. per Socket vom Server einen Befehl an den Raspi senden für das geplante Scheduling vom Server aus.

Zur Entscheidung Raspi/Arduino:
Beide können diese Aufgabe erfüllen. Wenn du anschliessend per Server Befehle senden willst, ist die Frage, über welche Schnittstelle.
Wenn der Server gleich daneben steht und du z.B. eine USB-Verbindung nehmen kannst, wird es mit dem Arduino sicher einfacher.
Möchtest du über Netzwerk arbeiten braucht der Arduino aber einen Zugang dazu. Möglich wäre hier ein Ethernet-Shield oder z.B. ein ESP-8266
Das kann ein Raspi aber schon von Haus aus.

Du siehst also, viele Wege führen nach Rom...

Grüsse
Peter

Dann frage ich einfach mal dumm: Gibt es eine andere Möglichkeit in der Dauerschleife mein Vorhaben zu realisieren. Von mir aus kann das Skript ja auch gerne non-stop laufen, wenn es trotzdem irgendwie noch realisiert, wenn von außen Eingaben kommen.

Ich verwende in solchen Fällen gerne den CMDMessenger.
Der läuft auf PC und Arduino.

Hallo,

vielen Dank für eure zahlreichen Antworten.

gregorss:
Naja, für die Verbindung Server-Arduino musst Du halt etwas Passendes finden. Ich habe mal einen Test mit einem Raspberry Pi, einem „Level-Changer“ und einem Arduino Nano gemacht: Man kann prima hin- und her-faseln.

Das wäre auch erst der zweite Schritt. Wenn das grundsätzlich aber geht ist es schon mal sehr gut zu wissen, da ich mich dann erstmal drauf konzentrieren würde, dass manuelle Schalten zum Laufen zu bekommen (was kein größeres Problem sein sollte), aber für die Bewässerung, die über die Ventile geschalten wird, muss ich dann auch noch die passende Abstimmung finden (da geht es dann eher drum, wieviel Wasser verträgt der Rasen in welchem Bereich, welche Kreisläufe kann ich parallel laufen lassen,...).

HotSystems:
Das hatte ich dir doch in Post #1 schon geschrieben.
[...]

Bitte entschuldige, dann habe ich dich falsch mißverstanden. Ich dachte du meinst, ich solle im Skript hart kodieren: GPIO 1 um 5:30 Uhr starten, GPIO 2 um 5:30 Uhr starten, GPIO 1 um 6:15 beenden, GPIO 2 um 5:45 Uhr beenden und in der Schleife dann die jeweilige Uhrzeit abfragen und wenn die o.g. erreicht sind den entsprechenden GPIO-Status setzen.

Aber wenn das auch via Tastatureingabe während der Laufzeit geht, dann ist's ja umso besser. Dann ist auch der Einzelaufruf des Sketches unnötig bzw. ist es per Dauerschleife ja die bessere Variante, so kann ich im Fehlerfall immer wieder alle GPIOs auf HIGH setzen und damit die Ventile schließen. So bliebe mir der Schwimmteich im Fehlerfall erspart. :wink:

someone83:
Da du von Tastatureingaben sprichst:
Lokal am Raspi oder per SSH Session?

Es würde erstmal per SSH laufen, da ich das Sketch zu Testzwecken dann immer manuell starten würde. Da geht es dann erstmal drum zu prüfen:öffnen alle Ventile, sind sie auch richtig dicht, können alle Regner gemeinsam starten / laufen,... Also eigentlich mehr um die Bewässerung selbst, als um das Sketch.
Später würde ich schauen, dass ich eine Hausautomatisierung wie FHEM oder OpenHas laufen lasse, die das steuert und worauf ich dann vom Server per GUI aus Zugriff hätte. Aber das ist erstmal noch Zukunftsmusik.

someone83:
[...]
Wenn das soweit läuft, kannst du z.B. per Socket vom Server einen Befehl an den Raspi senden für das geplante Scheduling vom Server aus.

Danke. Ich habe auch schon von MQTT gelesen, aber nur ganz oberflächlich. Das sollte das auch ermöglichen?!

someone83:
[...]
Zur Entscheidung Raspi/Arduino:
Beide können diese Aufgabe erfüllen.

Dann würde ich erstmal beim Raspberry und Python bleiben, da ich damit schon ein wenig mehr gemacht habe (ihr seht ja, dafür bin ich aber auch kein Profi). Der läuft aber und für meine Testzwecke ist es erstmal egal, ob er etwas mehr Strom braucht, nicht so stabil ist,... Später kann ich dann immer noch umschwenken. Da der Server im Keller und die Steurung in der Garage sein wird, ist LAN-Kommunikation notwendig.
[/quote]

someone83:
[...]
z.B. ein ESP-8266

Den werde ich mir neben einem Arduino + Ethernet Shield auch mal anschauen. Danke!

combie:
Ich verwende in solchen Fällen gerne den CMDMessenger.
Der läuft auf PC und Arduino.

Danke für den Tipp! Den werde ich mir auf jeden Fall anschauen.