Forum: Haus & Smart Home Automatisierte ausgabe sensordaten


von Jonathan (croudzz)


Lesenswert?

Hallo zusammen,
ich habe zurzeit in meinem Aubildungsbetrieb ein Projekt, das Rolltor zu 
unserem Lager mittels Raspberry pi und Reed-schalter zu überwachen. Ich 
bin mittlerweile soweit, dass ich auf anfrage am Raspberry den 
jeweiligen zustand ausgeworfen bekomme (GPIO-pin gibt mir 0 oder 1 aus). 
Nun möchte ich aber dass mir automatisch augegeben wird sobald der 
zustand sich ändert. Wie/in welcher Art und weise ist das möglich? Ach 
ja der code ist in Python geschrieben.

Vielen Dank im voraus für die Antworten.

von Ein T. (ein_typ)


Lesenswert?

Jonathan schrieb:
> ich habe zurzeit in meinem Aubildungsbetrieb ein Projekt, das Rolltor zu
> unserem Lager mittels Raspberry pi und Reed-schalter zu überwachen. Ich
> bin mittlerweile soweit, dass ich auf anfrage am Raspberry den
> jeweiligen zustand ausgeworfen bekomme (GPIO-pin gibt mir 0 oder 1 aus).
> Nun möchte ich aber dass mir automatisch augegeben wird sobald der
> zustand sich ändert. Wie/in welcher Art und weise ist das möglich? Ach
> ja der code ist in Python geschrieben.

Es wäre zweifellos sinnvoll gewesen, Deinen Schaltplan und Deinen Code 
an Deinen Beitrag anzuhängen. :-)

Grundsätzlich können viele der GPIOs eines RasPi nicht nur abgefragt 
(gepollt) werden, sondern auch Interrupts auslösen. Du kannst dabei 
wählen, ob Dein Programm blockierend auf einen Interrupt wartet, oder ob 
beim Auftreten eines Interrupt eine Callback-Funktion aufgerufen werden 
soll. Wie das geht, findest Du ausführlich hier [1] oder auf deutsch und 
knapper hier [2]. Viel Erfolg!

[1] https://roboticsbackend.com/raspberry-pi-gpio-interrupts-tutorial/
[2] 
https://www.kampis-elektroecke.de/raspberry-pi/raspberry-pi-gpio/interrupts/

von Rainer W. (rawi)


Lesenswert?

Ein T. schrieb:
> Grundsätzlich können viele der GPIOs eines RasPi nicht nur abgefragt
> (gepollt) werden, sondern auch Interrupts auslösen.

Prellende Kontakte an einem Interrupt geben ein lustiges Geklimper.

Wenn es darum geht, nur bei Änderungen eine Aktion auszuführen, muss man 
diese Änderung erstmal über einen Vergleich mit dem vorigen Zustand 
erkennen. Bei mechanischen Kontakten muss man zusätzlich noch 
entprellen.

von Ein T. (ein_typ)


Lesenswert?

Rainer W. schrieb:
> Ein T. schrieb:
>> Grundsätzlich können viele der GPIOs eines RasPi nicht nur abgefragt
>> (gepollt) werden, sondern auch Interrupts auslösen.
>
> Prellende Kontakte an einem Interrupt geben ein lustiges Geklimper.

Das ist natürlich korrekt, aber: ich weiß nicht, wie die Schaltung des 
jungen Mannes aussieht. Vielleicht hat er ja bereits ein R/C-Glied 
verbaut, weißt Du möglicherweise mehr als ich?

> Wenn es darum geht, nur bei Änderungen eine Aktion auszuführen, muss man
> diese Änderung erstmal über einen Vergleich mit dem vorigen Zustand
> erkennen.

IIRC kann der RasPi steigende und fallende Flanken unterscheiden.

von Sebastian R. (sebastian_r569)


Lesenswert?

Einfach forumuliert:
Merk dir den Zustand vom Pin und vergleiche ihn mit dem aktuellen 
Zustand. Wenn unterschiedlich, gab's eine Änderung.

Entprellen muss man natürlich auch noch.

von Sebastian S. (amateur)


Lesenswert?

Ein Raspberry pi hat wohl die meiste Zeit über nichts zutun, während er 
ein Tor überwacht.
Daher sollte es doch kein Problem sein, den aktuellen Zustand 
zwischenzuspeichern und später dann zu überprüfen ob es immer noch der 
Gleiche ist.
Es kann natürlich sinnvoll sein, den aktuellen Zustand erst nach der 
Prellerei zu sichern. Wie das aber geht ist wohl in einem halben Tausend 
Posts hier abgehandelt worden.

von Rainer W. (rawi)


Lesenswert?

Ein T. schrieb:
> Vielleicht hat er ja bereits ein R/C-Glied verbaut, weißt Du
> möglicherweise mehr als ich?

Warum sollte man zusätzliche externe Filter verbauen, wenn der Raspberry 
Pi sich sowieso langweilt. Bei einem Schalter, der einen mechanischen 
Zustand zurück meldet, kann der Pi alle paar  Centisekunden mal vorbei 
schauen und den Zustand bewerten. Die Sache mit dem Entprellen kann der 
gefälligst selber machen bzw. erledigt sich durch das Abtastintervall 
von selbst.

von Ein T. (ein_typ)


Lesenswert?

Rainer W. schrieb:
> Warum sollte man zusätzliche externe Filter verbauen,

Warum nicht?

> wenn der Raspberry Pi sich sowieso langweilt.

Das ist nur eine Unterstellung Deinerseits, und bisher jedenfalls von 
nichts in den Aussagen des TO gedeckt.

Nebenbei bemerkt, hat er ausschließlich gefragt, wie er mit seiner 
Software auf Ereignisse reagieren kann, und ich habe ihm die Möglichkeit 
aufgezeigt, Interrupts zu verwenden. Warum Du jetzt verhindern möchtest, 
daß ein junger Mensch seine eigenen Erfahrungen macht, und mir eine 
gleichermaßen halt- wie gegenstandslose Diskussion über Entprellung an 
die Backe klebst, wird wohl Dein kleines Geheimnis bleiben. Trotzdem 
vielen Dank für das Gespräch, hab' noch einen schönen Tag.

von Kay-Uwe R. (dfias)


Lesenswert?

Ein T. schrieb:
> Vielleicht hat er ja bereits ein R/C-Glied verbaut
Mit einem RC-Glied entprellen? Auch wenn dass hier auf µC.net als 
Notlösung aufgeführt ist, hätte uns der Prof dafür geohrfeigt!

von Dietrich L. (dietrichl)


Lesenswert?

Kay-Uwe R. schrieb:
> Mit einem RC-Glied entprellen? Auch wenn dass hier auf µC.net als
> Notlösung aufgeführt ist, hätte uns der Prof dafür geohrfeigt!

Die Ohrfeige wäre aber nur dann berechtigt, wenn der Eingang keine 
Schmitttrigger-Eigenschaft hat. Mit Schmitttrigger und richtiger 
Dimensionierung der RC-Glieds ist das durchaus seriös.

von N. M. (mani)


Lesenswert?

Interrupt ist schön wenn man eine niedrige Latenz bräuchte. Für ein 
Garagentor reicht polling völlig.

Nebenbei, auch in Python wurde das triviale Problem des debouncing 
bereits gelöst.
Kurze Suche und man stößt auf gpiozero 
https://gpiozero.readthedocs.io/en/latest/api_input.html

Keine Ahnung ob das was taugt, sieht aber nicht so verkehrt aus. Gibt 
aber bestimmt auch Alternativen.

Wenn ich das richtig deute müsste sowas in der Art reichen für eine 
Change-Detection:
1
from gpiozero import Button
2
from signal import pause
3
4
myButtonPin = 13 #BMC Pin numbering!
5
myDebounceTime =0.05 #50ms
6
7
def button_change():
8
    print("Button change detected!")
9
10
button = Button(pin=myButtonPin,bounce_time=myDebounceTime)
11
button.when_pressed = button_change
12
button.when_released = button_change
13
pause()

von Daniel F. (df311)


Lesenswert?

Jonathan schrieb:
> Nun möchte ich aber dass mir automatisch augegeben wird sobald der
> zustand sich ändert.

wie soll denn das überhaupt ausgegeben werden bzw. was soll passieren?

anzeige mit einer led?
email verschicken?
mitteilung an den chef mittels pager?
logdatei schreiben?
alarmplan für atomwaffenlager abarbeiten?
bakterien-/virenkulturen vernichten?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.