PHP: GPIO Zustand abfragen

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo zusammen,
    ich such mir hier schon eine Weile einen Wolf, aber ich komm nicht wirklich weiter...
    Wenn der raspberry hochfährt soll er einen Browser und eine Webpage (http://localhost/index_1.php) starten. So weit so gut.
    An dem Pi hängen 3 Taster, mit denen ich die Webpage "umschalten" will, also:
    Taster1 -> http://localhost/index_1.php
    Taster2 -> http://localhost/index_2.php
    Taster3 -> http://localhost/index_3.php

    Wie überwache die gpio Eingänge, um dann das "umschalten" zu triggern? Ich hatt das ganze in python angefangen, allerdings habe ich es nicht hinbekommen den browser im Kisokmode mit der entsprechenden Seite aufzurufen (Ich hab da schon so lange rumgefrickelt, dass ich garnicht mehr genau sagen könnte, was da genau das Problem war).
    Ich glaube, es ist einfacher das direkt in php einzubauen, allerdings fehlt mir hier ein ein Einstieg, wie ich den Zustand der Taster überwache, und dann die entsprechende Reaktion trigger. Ich hab keinerlei Erfahrungen in php - ich kann ein bisschen in python/r/matlab programmieren. Ich würde mich aber durchaus als interessiert bezeichnen :) also nicht zu viel voraussetzen.

    Kann mir jemand helfen?
    Besten dank und Gruß,
    dude76

  • Wieso willst du die Abfrage in PHP realisieren? Das würde bedeuten das du AJAX nutzen müsstest, und das wiederum erzeugt ziemlich viele Logeinträge im Webserver da dann jedesmal eine URL aufgerufen werden muss, die dann jeweils die GPIOs abfragt usw..

    Ich würde das lieber in Python oder Bash realisieren - wobei ich nicht weiß wie man allgemein für Kiosk einen Browser öffnet bzw einen bereits geöffneten anweißt die Seite zu ändern.. Welchen Browser verwendet du denn, und was hast du bisher versucht?

  • Naja "wollen" ist übertrieben. Wie gesagt, ich verstehe von php sehr wenig. Ich dachte, das ließe sich da halbwegs einfach realisieren.
    Bei Python hatte ich das Problem, dass ich mehr schlecht als recht den Browser mit der Startseite aufbekommen habe, aber das umschalten ging dann garnicht mehr. Ich wollte (etwas rabiat) den laufenden browser per kill-befehl beenden und einfach mit einer neuen website wieder starten. Aber das alles irgendwie nicht so wirklich erfolgreich.

  • Naja, das Problem ist in PHP halt das regelmäßige ausführen. Wie soll das PHP Script regelmäßig ausgeführt werden? -> Das geht nur über 3 Wege:
    * Der Client ruft/surft eine Seite an über welche AJAX genutzt wird, und dann im Hintergrund ständig das gpio-PHP Script ausgeführt wird. Die Seite muss dann aber die ganze Zeit offen bleiben sonst wird AJAX auch beendet.
    * Das PHP Script wird permanent, wie ein normales Script (bash/python/whatever) im Hintergrund ausgeführt..
    * Das PHP Script wird über ein anderes Script, zB bash, ständig aufgerufen und führt dann auch nur irgendeinen Konsolen Befehl aus

    Das macht so gesehen also eigentlich eher keinen Sinn - es sei denn man nutzt AJAX. Ansonsten kann man aber auch jede x-beliebe andere Sprache nutzen, wobei sich hier dann halt Python oder bash auch anbieten würde ;)

    Man könnte auch ein Haupt-PHP-Webseite erstellen, in der beim Laden eine bestimmte temporäre-Datei überprüft wird und daraufhin die entsprechende Seite läd. Würde aber bedeuten das im Hintergrund also der Konsole ein weiteres Script laufen müsste, welches die GPIO's abfragt und diese temporäre-Datei verändert...
    Beispiel:
    GPIO-Script registriert einen Tastendruck und ändert daraufhin die temporäre-Datei bzw dessen Inhalt auf die jeweilige neue URL. Das PHP Script reloaded regelmäßig die Seite, liest die temporäre-Datei aus und öffnet dann die darin befindliche URL in zB einem iframe o.ä..

    Das wäre aber relativ träge da nicht sofort darauf reagiert wird und auch nervig für den Surfer, da ständig die Page neu geladen wird, auch wenn keine Taste gedrückt wurde..

    Besser wäre also eigentlich erst dann eine Aktion durchzuführen wenn tatsächlich eine Taste gedrückt wurde.


    Leider erwähnst du immer noch nicht ob du Midori oder Chromium nutzt.. :huh:

    Kannst du deinen Versuchs-Code mal bitte posten?

  • Einfachere Idee:

    Zuerst den Browser die 3 Seiten öffnen lassen.

    Code
    midori index_1.php index_2.php index_3.php


    (Dabei wird nicht der Browser drei mal gestartet sondern die Seiten werden als Tabs geöffnet.)

    Und dann einfach mit einem kleinen Shellskript die 3 Taster überwachen und wenn eine davon gedrückt wurde mit der Tastenkombination Strg + (Tab Nr) zum jeweiligen Tab wechseln.

    Für das drücken/simulieren der Tastenkombination könnte man das xte Tool aus dem Paket xautomation verwenden. (Danke für den Tipp, @mmi :))


    Hier ein Beispiel für einen Taster. (Erstmal ohne genauere Erklärung)
    Beim drücken der Taste wird der wiringPi Pin 4 mit GND verbunden wodurch ein Interrupt ausgelöst wird. Dadurch wird ein drücken der Tastenkombination Strg + 1 per xte Tool simuliert und der Browser wechselt zum entsprechenden Tab.
    Das einlesen der Pins und die überwachung des Interrupts übernimmt dabei das gpio Tool(wiringPi). Es wird der interne Pullup Widerstand verwendet und um den Taster zu entprellen wird einfach eine halbe Sekunde gewartet.

    Bash
    #!/bin/bash
    gpio mode 4 up
    
    
    while :; do 
        gpio wfi 4 falling
        xte "keydown Control_L" "key 1" "keyup Control_L"
        sleep 0.5
    done

    Falls man die Seite auch noch aktualisieren möchte kann man zusätzlich noch die Tastenkombination Strg + r mit einbauen. So dass z.b. bei jedem wechsel des Tabs auch die Seite aktualisiert wird; Oder eine extra Taste dafür.

    DON'T PANIC!

    Einmal editiert, zuletzt von joh.raspi (7. Dezember 2014 um 20:09)

  • meigrafd: Ich verstehe Deinen Einwand mal als "Jung dat is quatsch" :) In meinen ersten Versuchen mit Python habe ich immer probiert aus Python heraus den Browser aufzurufen. Das ist wahrscheinlich Blödsinn. Du meinst, dass ich aus dem PHP Script Python aufrufe und so die Taster überwache, oder? So herum scheint mir das einfacher. Ich werde mal versuchen ein paar Zeilen zu schreiben und hier posten.
    joh.raspi: Besten Dank für den Tipp! Sieht spannend aus. Werde ich auf jeden Fall auch testen.

    Ich werde beides aber erst im Januar schaffen. Der Vorweihnachtstress legt gerade voll los :( Danach ist dann erstmal Urlaub. Also nicht wundern, wenn ich erstmal still bin. Im nächsten Jahr gehtŝ dann weiter!
    Gruss,
    Dude


  • Du meinst, dass ich aus dem PHP Script Python aufrufe und so die Taster überwache, oder? So herum scheint mir das einfacher. Ich werde mal versuchen ein paar Zeilen zu schreiben und hier posten.

    Ja, sozusagen. Wobei eben das Problem beim aktualisieren besteht um keinen Interrupt zu verpassen ;)
    Guck mal > hier <, kannste gerne verwenden und erweitern :fies:

  • Hey Leute,

    ich hänge gerade auch an dem gleichen Problem und wollte mal fragen, ob ihr schon weiter gekommen seid. Gibt es eine Möglichkeit von einem Python-Script ein Trigger oder Interrupt an ein PHP-Script zu schicken?

  • Ist schon ne ganze Weile her, sorry für die späte Rückmeldung. Ich hatte das damals entsprechend dem beigefügten Code hinbekommen. Das ist wahrscheinlich ziemlich unelegant, weil der pi ne ganze weile braucht den einen Prozess zu killen und den browser wieder mit einen anderen webpage zu starten, aber für mich reicht das. Ich hoffe das hilft.

    Gruß,
    dude


  • Was soll das eigentlich mit AJAX, da geht alles rein mit PHP. Mit Cron (crontab -e) @reboot eine php script das die Ports Initialisiert, mt Cron z.B. alle 5 sec eine php script das den satsus abfragt und in eine mysql Tabelle schreibt, ist viel schneller und effektiver als eine Status Datei zu schreiben und zu lesen. Die Weseite kann wiederum über reine php die Datenbank auslesen und status anzeigen, bzw. über php die Ports neu setzen und die Tabelle aktualisieren.

    geht alles ohne shell exec und benötigt nicht mal wiringPi

    Gruß

    Rainer

    Einmal editiert, zuletzt von muekno (15. Juli 2016 um 13:31)

  • Der von dir beschriebene Weg @ muekno ist nicht wirklich schneller, effektiver oder gar sinnvoll - deshalb einen Ressourcenfresser wie MySQL zu nutzen ist arg übertrieben. Bei der hier aufgeführten Problematik ging es um nahezu Echtzeit. Das ist über den von Dir beschriebenen Weg nicht ansatzweise möglich... Wenn man einen Taster drückt muss dessen Erfassung sofort geschehen, keiner drückt den Taster eine Minute (minimaler Crontab Intervall) lang und der Flankenwechsel findet auch nicht derart lange statt.

    Dieser Thread hier ist 2 Jahre alt, mittlerweile gibt es gute Möglichkeiten. Siehe dazu FAQ => Nützliche Links / Linksammlung => [Python] Webserver, Websocket und ein bisschen AJAX


    PS: Bitte erst Threads vollständig lesen bevor darin gepostet wird.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!