PHP Konferenzraum Steuerung mit 2 Leinwänden

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo Leute,

    ich bin an einem Punkt ich komm garnicht mehr weiter. Ich bin absoluter Leie in html und php. Hab mir die Codes aus dem Internet durch lesen und (versuchen zu) verstehen zusammengekramt.

    Wir haben ein Konferenzraum mit 2 Leinwänden und 2 Beamern. Diese werden teilweise Gleichzeitig, Teilweise auch Einzeln genutzt. Dafür hab ich eine Weboberfläche (Erstmal Provisorisch) eingerichtet.


    4 Befehle
    1. Linke Leinwand nutzen
    2. Rechte Leinwand nutzen
    3. Beide nutzen
    4. Alles Ausschalten

    Was ich versuche ist:
    Wenn zB die Rechte Leinwand seite heruntergefahren wurde und man sich umentscheidet um beide seiten zu nutzen und statt "Linke Leinwand nutzen" button zu drücken "Beide Nutzen" klickt. Sollte Sich die seite die bereits heruntergefahren wurde nicht bewegen.

    Dies hab ich versucht mit variablen zu lösen. Hab global, Cookie und session probiert. Irgendwo mach ich fehler. Nur wo?

    Hoffe ihr habt hier eine Lösung

    Hier der Code

    Ich hab Raspberry PI 2 B

    PS: Später kommt noch IR dazu um die Beamer ordentlich hoch und herunterzufahren. (Wegen der Kühlung)

    Einmal editiert, zuletzt von strife (10. Juni 2016 um 16:14)

  • Hi,

    ich würde die Daten per session Speicher.
    In deinem code verwendet du eine session variable ohne die session überhaupt zu starten.

    Schau dir mal "session_start()" an.

    Dann sollte es auch mit dem speichern in der session klappen.

    Edit: fals du den Weboberfläche jedoch von überall öffnen willst solltest du die Daten in einer Datenbank Speichern.

    Einmal editiert, zuletzt von St3v3 (11. Juni 2016 um 09:47)

  • EDIT: Ich habe mit print_r($_SESSION); die variablen auslesen können und dort steht ARRAY([] => 1)
    Wo mach ich den fehler?

    Danke für den Tipp, hatte es zwar ausprobiert aber an irgendeinem punkt nicht mehr hinbekommen.

    ich hab es jetzt teilweise hinbekommen. Wenn ich aber rechts und links überprüfen will klappt es irgendwie nicht.

    elseif ($_SESSION[$j] == 1 AND $_SESSION[$i] == 0)

    ist das denn richtig so? wenn (links) j=1 dann nur die befehle für rechts ausführen, und umgekehrt?


    Einmal editiert, zuletzt von strife (11. Juni 2016 um 14:11)

  • so, hatte nun mal zeit es mir am PC anzugucken. Am Handy etwas blöd.

    Du hast immer $_SESSION[$i] und $_SESSION[$j] verwendet. das ist falsch.
    Speichere es in $_SESSION['i'] und $_SESSION['j'] ab und es klappt.

    Noch ein paar tipps:

    • Wähle deutliche namen für die Variablen
    • Arbeite nicht mit verschachtelten if-anweisungen sondern nutze switch-case
    • Speichere den zustand in einer datei oder Datenbank ab und nicht in der Session, da sonst Fehler entstehen wenn du das Script woanders ausführst.
    • Schreibe dir Funktionen für die verschiedenen Operationen (verkürzt das Script)
    • Setze die GPIO pins am anfang des scriptes mit "define" fest, so kannst du die Pin Nummern später schneller ändern.
    • ggf. kanst du die GPIO befehle in bash dateien abspeichern und ausführen lassen.


    Hier nun noch eben dein Script (funktionierend):

    [code=php]<!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8" />
    <title>Konferenzraum</title>
    <!--<meta http-equiv="refresh" content="10; URL=/">-->
    <link rel="stylesheet" type="text/css" href="style/style.css" />

    <?php
    session_start();
    //GPIO PORTS AUF AUSGANG STELLEN
    $val = trim(@shell_exec("/usr/local/bin/gpio -g mode 17 out"));
    $val = trim(@shell_exec("/usr/local/bin/gpio -g mode 18 out"));
    $val = trim(@shell_exec("/usr/local/bin/gpio -g mode 27 out"));
    $val = trim(@shell_exec("/usr/local/bin/gpio -g mode 22 out"));
    $val = trim(@shell_exec("/usr/local/bin/gpio -g mode 23 out"));
    $val = trim(@shell_exec("/usr/local/bin/gpio -g mode 24 out"));
    $val = trim(@shell_exec("/usr/local/bin/gpio -g mode 16 out"));
    ?>
    </head>
    <body bgcolor="#00BFFF"; >

    <?php

    //ACHTUNG PIN BELEGUNG BEACHTEN
    //PIN 17 LEINWAND RUNTER BEFEHL LINKS
    //PIN 18 LEINWAND STOP BEFEHL LINKS
    //PIN 27 LEINWAND HOCH BEFEHL LINKS

    //PIN 22 LEINWAND RUNTER BEFEHL RECHTS
    //PIN 23 LEINWAND STOP BEFEHL RECHTS
    //PIN 24 LEINWAND HOCH BEFEHL RECHTS

    //PIN 26 BEAMER LINKS
    //PIN 20 BEAMER RECHTS

    //i = rechte leinwand fläche
    //j = linke leinwand fläche

    if(isset($_GET['Befehl']))
    {

    //LINKE LEINWAND FLACHE MIT BEAMER NUTZEN
    if($_GET['Befehl'] === 'D3')
    {
    $val = trim(@shell_exec("/usr/local/bin/gpio -g mode 26 out"));//MODI UMSCHALTEN
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 17 1")); //LEINWAND LINKS RUNTER
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 17 0"));
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 26 0")); //BEAMER LINKS EINSCHALTEN
    sleep(5); //warten
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 18 1")); //LEINWAND LINKS STOP
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 18 0"));
    $_SESSION['j'] = 1;
    }

    //RECHTE LEINWAND FLACHE MIT BEAMER NUTZEN
    elseif($_GET['Befehl'] === 'D2')
    {
    $val = trim(@shell_exec("/usr/local/bin/gpio -g mode 20 out"));//MODI UMSCHALTEN
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 22 1")); //LEINWAND RECHTS RUNTER
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 22 0"));
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 20 0")); //BEAMER RECHTS STROMZUFUHR EINSCHALTEN
    sleep(5); //warten
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 23 1")); //LEINWAND RECHTS STOP
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 23 0"));
    $_SESSION[i] = 1;
    }

    //BEIDE BEAMER EINSCHALTEN UND LEINWAND AUSFAHREN
    elseif($_GET['Befehl'] === 'D1')
    {
    if (($_SESSION['j']) == 0 AND ($_SESSION['i']) == 0)
    {
    $val = trim(@shell_exec("/usr/local/bin/gpio -g mode 20 out"));//MODI UMSCHALTEN
    $val = trim(@shell_exec("/usr/local/bin/gpio -g mode 26 out"));//MODI UMSCHALTEN
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 17 1")); //LEINWAND LINKS RUNTER
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 17 0"));
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 22 1")); //LEINWAND RECHTS RUNTER
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 22 0"));
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 26 0")); //BEAMER EINSCHALTEN LINKS
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 20 0")); //BEAMER EINSCHALTEN RECHTS

    sleep(5); //warten
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 18 1")); //LEINWAND LINKS STOP
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 18 0"));
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 23 1")); //LEINWAND RECHTS STOP
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 23 0"));
    $_SESSION['j'] = 1;
    $_SESSION['i'] = 1;
    }

    elseif ($_SESSION['j'] == 0 AND $_SESSION['i'] == 1)
    {
    $val = trim(@shell_exec("/usr/local/bin/gpio -g mode 20 out"));//MODI UMSCHALTEN
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 22 1")); //LEINWAND RECHTS RUNTER
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 22 0"));
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 20 0")); //BEAMER RECHTS EINSCHALTEN
    sleep(5); //warten
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 23 1")); //LEINWAND RECHTS STOP
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 23 0"));
    $_SESSION['j'] = 1;
    }

    elseif ($_SESSION['j'] == 1 AND $_SESSION['i'] == 0)
    {
    $val = trim(@shell_exec("/usr/local/bin/gpio -g mode 26 out"));//MODI UMSCHALTEN
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 17 1")); //LEINWAND LINKS RUNTER
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 17 0"));
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 26 0")); //BEAMER LINKS EINSCHALTEN
    sleep(5); //warten
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 18 1")); //LEINWAND LINKS STOP
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 18 0"));
    $_SESSION['i'] = 1;
    }

    elseif ($_SESSION['j'] == 1 AND $_SESSION['i'] == 1)
    {
    $message = "DIE LEINWANDE SIND HERUNTERGEFAHREN";
    echo "<script type='text/javascript'>alert('$message');</script>";
    }
    }

    //ALLES AUSCHALTEN UND LEINWANDE EINFAHREN
    elseif($_GET['Befehl'] === 'D4')
    {
    $_SESSION['i'] = 0;
    $_SESSION['j'] = 0;
    $val = trim(@shell_exec("/usr/local/bin/gpio -g mode 26 out"));
    $val = trim(@shell_exec("/usr/local/bin/gpio -g mode 20 out"));
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 27 1")); //LEINWAND HOCH LINKS
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 27 0"));
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 24 1")); //LEINWAND HOCH RECHTS
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 24 0"));

    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 26 1")); //ACHTUNG! BEAMER WERDEN SOFORT VOM STROM GETRENNT
    $val = trim(@shell_exec("/usr/local/bin/gpio -g write 20 1")); //ACHTUNG! BEAMER WERDEN SOFORT VOM STROM GETRENNT
    }
    }
    ?>
    <table style="width: 100%">
    <tr>
    <td style="width: 171px">
    <a href="<?php print($_SERVER['PHP_SELF']);?>?Befehl=D3">LINKS AUSFAHREN</a></td>
    <td style="width: 96px"><a href="<?php print($_SERVER['PHP_SELF']);?>?Befehl=D2">RECHTS AUSFAHREN</a></td>
    <td rowspan="3" style="width: 145px">
    <?php
    echo $_SESSION['id'];
    ?>
    </td>
    <td rowspan="3" style="width: 145px"> </td>
    <td rowspan="3" style="width: 1019px"> </td>

    </tr>
    <tr>
    <td colspan="2" style="height: 95px"><a href="<?php print($_SERVER['PHP_SELF']);?>?Befehl=D1">BEIDE AUSFAHREN</a></td>
    </tr>
    <tr>
    <td colspan="2" style="height: 127px"><a href="<?php print($_SERVER['PHP_SELF']);?>?Befehl=D4">ALLES AUSCHALTEN</a></td>
    </tr>
    </table>
    <p>&nbsp;</p>
    <p><br><br></p>

    <?php
    echo 'PHP Version: ' . phpversion();
    ?


    >


    <

    /bo
    dy>

    </html>[/php]

    Ich hoffe du Kopierst es nicht nur, sondern setzt einpaar tipps von mir um.


    MfG


    St3v3

  • Wow, sowas brauchte ich =) endlich.

    Das mit den apostroph hat sofort geklappt. Die tipps werd ich mit der zeit umsetzen. Allerding wird es nur lokal ausgeführt mit touchdisplay ohne pipapo.

    Switchcase ist auch eine gute idee. Erster kontakt mit PHP sieht halt so aus xD

    Wonach muss ich suchen wenn ich die funktionen in Operatoren schreiben will? Stichwort?

    Aber vielen vielen dank.

  • Erster kontakt mit PHP sieht halt so aus xD

    Kenne ich. Meine Anfänge sahen auch nicht besser aus :)


    Wonach muss ich suchen wenn ich die funktionen in Operatoren schreiben will? Stichwort?

    Damit meinte ich, dass du zum Beispiel das ausfahren der linken seite in eine Funktion packst. Den du hast 2 mal exakt das gleiche da stehen. Einmal, wenn du links runter fährst und einmal, wenn du beides runterfahren lässt. Das selbe gilt für rechts.

    Einmal editiert, zuletzt von St3v3 (12. Juni 2016 um 17:32)

  • Achso, ok, verstanden. Muss mich dann mal mit funktionen auseinandersetzen.

    Kurze info falls jemand irgendwie zu diesem Forum stoßen sollte. (Es ist zwar noch nicht alles fest verlötet und getestet jedoch...)

    Leinwände sind Celexon Motor Economy 16:9er
    Die GPIOs Haben einen Kurzschluss erzeugt welches die leinwand hoch oder runterfahren ließ (ohne kontrolle) obwohl die GPIO PIN auf 0 war. Deshalb kommen jetzt normale SI-Dioden dran. Sobald alles funktioniert werd ich das hier schreiben.

    Vielen dank für eure hilfe


    EDIT:
    Hi nochmal, PHP etc. funzt bis jetzt gut. TUT auch das was ich will. Allerding nur in der Theorie...

    An der Leinwand hab ich Probleme mit den GPIOs. Wollte dafür jetzt nicht ein neues Thema eröffnen. (hab auch recherchiert, also hängt mich bitte nicht direkt :) )

    Die Leinwandsteuerung hat diese Anschlüsse
    img2016061513jcl8wzp1ko_thumb.jpg img2016061513rq0w7g3p5y_thumb.jpg

    COM-----------
    HOCH---------
    STOP----------
    RUNTER------

    Diese sollen an den Pi, haben aber ausser COM alle 4,7v Spannung drauf. Relais war eine überlegung. Aber bei 2 Leinwänden sind das 6 relais, plusnoch 4 weitere geräte die auf jeden fall mit relais betrieben werden. Das ist zu viel arbeit für den Pi.

    Zuerst dachte ich das wird was wenn ich die GPIO wie Taster einsetze (wie in dem PHP code zu sehen). Die Leinwand hat aber verrücktgespielt, da die GPIO und GND vom PI nicht absolut getrennt sind. Also am Messgerät SHORT anzeigt, obwohl zB GPIO 6 auf 0 ist. Dann dacht ich, setz dioden ein, vllcht klappt damit. Aber nein, fehlanzeige.

    Ich weiß grad nicht weiter, kann mir da jemand vllcht behilflich sein? ==(

    EDIT2: Optokoppler? Ist es das was ich brauche? Gpio an optokoppler und Optokoppler an je eine "Taste" an der Leinwand.

    Einmal editiert, zuletzt von strife (15. Juni 2016 um 15:47)


  • Also am Messgerät SHORT anzeigt, obwohl zB GPIO 6 auf 0 ist.

    Versuch mal einen hohen wiederstand Zwichen pin und gnd zu tuen (parallel zur Leinwand also).
    So hatte ich ich das Problem gelöst, dass meine öffnungskontakte erst sehr spät oder gar nichts auslösten.
    Der wiederstand muss größer sein, als der wiederstand der Schaltung zum steuern der Leinwände. (Ich denke mal 10K sollten hinkommen. :) )

  • Igitt, wenn ich "$val = trim(@shell_exec("/usr/local/bin/gpio -g mode 17 out"));" sehe wird mir jedes mal schlecht. Der Blog der das verbreitet hat sollte gelöscht werden :@
    Warum wird in der Mitte von folgendem Beitrag beschrieben: FAQ => Nützliche Links / Linksammlung => Befehle über PHP mit root Rechten ausführen (sudo webscript)

    Besser jedoch wäre es wie folgt umzusetzen: FAQ => Nützliche Links / Linksammlung => PHP: Anleitung zum schalten von GPIO

    Und auch wenn Einrückungen für PHP nicht lebenswichtig sind sollte man trotzdem welche verwenden, steigert die Lesbarkeit enorm.

    (Funktionen werden auch im 2.Link beschrieben)

    Nachteil bei den bisher genannten Möglichkeiten ist dass die komplette Seite jedes mal neu geladen wird wenn man einen Button/Link drückt. Eine elegantere Lösung wird hier beschrieben:
    FAQ => Nützliche Links / Linksammlung => [Python] Webserver, Websocket und ein bisschen AJAX

  • Wie gesagt, erster kontakt mit der Materie ist nun mal so. Lernfähig bin ich. Wenn du dir gedanken um die sicherheit machst: Es bleibt lokal. Ohne Internet.

    Über Python kann man das auch lösen. Klar, ich hab schon etwas eingelesen. Man kann immer etwas verbessern. (Was ich auch tun werde)


    Versuch mal einen hohen wiederstand Zwichen pin und gnd zu tuen (parallel zur Leinwand also).

    Warum ich nicht daran gedacht hab... Werd ich gleich morgen ausprobieren. Hab aber auch schon optokoppler zur hand die ich einsetzen kann.

    EDIT:
    Wiederstände nix gut. Optokoppler perfekt.

    btw. zu den Einzügen, ich hab den Tabulator knopf schon benutzt. Aber als ich den code hier rein kopiert hatte, waren keine mehr da. ka. Benutze Sublime Text.

    Einmal editiert, zuletzt von strife (17. Juni 2016 um 11:46)

Jetzt mitmachen!

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