Hallo,
ich weiß PHP und Python scheinen wohl nicht so gut zu harmonieren, und es gibt hier schon etliche Themen aber ich finde wie bis jetzt jeder meiner Vorredner nicht mein Problem.
Erstmal warum PHP und Python:
Ich absolviere ein Praxissemester und im Rahmen dessen soll ich einen Fernlichtassistenten entwickeln und ihn in ein bestehendes Programm implementieren.
Für meinen Fernlichtassistent habe ich Python verwendet und das bestehende Programm ist leider in PHP, da der Modelltruck für den der Assistent ist von jeden bedienbar sein soll. Die PHP-Seite ist aber nicht über das Internet erreichbar sondern nur über einen eigenes Netzwerk welches der Pi 2B erzeugt. Damit verbindet man sich über W-Lan. Sicherheit ist daher nicht die wichtigste Priorität.
Was habe ich bisher gemacht?
Ich habe dem User www-data die Berechtigung mit sudo adduser www-data gpio erteilt auf die GPIO´s zuzugreifen. Der Befehl Groups www-data ergibt auch www-data : www-data gpio
Dann habe ich mein Pythonscript mit chmod -a+x fernassv3.py für alle User ausführbar gemacht. Der Befehl ls -l ergibt -rwxrwxr-x
Dann habe ich mein Pythonscript mit #!/usr/bin/python ohne den Befehl python ausführbar gemacht. Ob das nötig war weiß ich ehrlich gesagt nicht.
Wenn ich nun versuche das Pythonscript über PHP zu starten, finde ich folgende Meldung unter sudo tail /var/log/apache2/error.log:
Usage: /usr/bin/gpio mode pin mode Damit kann ich leider überhaupt nichts anfangen. Wenn ich mir usage übersetze scheint das Problem wohl nicht zu wissen wie er die Befehle verwenden soll?
Ich hoffe, dass ihr mir helfen könnt und ich nicht das Forum um einen Sinnloses Thread erweitert habe weil ich nicht richtig suchen kann oder nicht genug verstanden hab, um mein Fehler in den anderen Threads wieder zu erkennen Falls es so ist bitte verweist darauf.
PHP-Code:
else if ($Switch[0] == 17 && $Switch[1] == 1) { //Fernlichtassistent
$val = trim(@Shell_exec("/home/pi/fernlichtassistent/fernassv3.py ".$pins[$Switch[0]]["Ausgang"]." 3"));
}
Wenn der ganze Code benötigt wird kann ich ihn gerne Nachreichen aber das schaffe ich erst heute Abend.
Erklären kann ich leider auch nicht viel, da ich mich nur für die Aufgabe in PHP eingelesen habe. Leider war mein Vorgänger mit den Kommentaren auch sehr geizig
Auf diese 2 Zeilen kam ich in dem ich den Code des Vorgängers, in dem er auf das Terminal kopiert habe und für meine Zwecke hoffentlich richtig umgeändert habe.
So konnte ich schon erfolgreich in dem gleichen Programm andere Funktion einbinden. Es waren aber alles Scripte mit der Endung .sh.
Also leider eher die Methode try and error.
Python-Code:
#!/usr/bin/python
import cv2
import picamera
import time
Import RPi.GPIO as GPIO
import picamera.array
from picamera.array Import PiRGBArray
# Definieren Ursprung Koordinatensystem und Farbwerte/ Farbgrenzen
y = 0 # Ursprung (0|0) befindet sich oben links. Nach unten und nach rechts positiv zaehlen
x = 0
GPIO.setwarnings(False) # Warnungen unterbinden
GPIO.setmode(GPIO.BCM) # Pinnummerierung auf BCM
GPIO.setup(5, GPIO.OUT) # Pin der das Fernlicht steuert
GPIO.setup(15, GPIO.OUT) # Pin der das Abblendlicht steuert
GPIO.output(5, GPIO.HIGH) # Fernlicht ausschalten
GPIO.output(15, GPIO.HIGH) # Abblendlicht ausschalten
lower = 200 # definiert untere Grenze fuer Filterung
upper = 255 # definiert obere Grenze fuer Filterung (absoluter Maxwert: 255)
i = 0 # zaehl Variabel
# Kamera initialisieren
cam = picamera.PiCamera() # Kamera auf cam
cam.resolution = (640, 480) # Aufloesung der Kamera
cam.brightness = 45 # Helligkeit der Kamera
#cam.color_effects = (128, 128) # stellt die Kamera auf schwarzweis
#cam.start_preview() # startet Kameravorschau
print "start" # Ausgabe um zu erkennen wann die Schleife beginnt
time.sleep(1) # eine Sekunde warten
# Start Bildanalyse
while (i<=30): # damit das Programm zum testen von alleine aufhoert
# Foto erstellen
rawCapture = PiRGBArray(cam)
cam.capture(rawCapture, Format="bgr")
Image = rawCapture.array
# Bestimmten Ausschnitt definieren, diesen filtern und Pixel zaehlen
region = Image [y+280:y+480, x:x+640] # defeniert den unteren Teil des Bildes mit einer Flaeche von 200x640 Pixel (h x b)
gray = cv2.Color(region, cv2.COLOR_BGR2GRAY) # konvertiert den Ausschnitt in Graustufen
graypart = cv2.inRange(gray, lower, upper) # zeigt nur noch Pixel heller als lower und dunkler als upper
pixdetected = cv2.countNonZero(graypart) # zaehlt alle Pixel die nicht schwarz sind
i = i +1 # zaehlt hoch fuer while
# Entscheidung ob Fernlicht an oder aus
if pixdetected <= 2000: # kein Licht kommt entgegen
print "Fernlicht An" # Ausgabe
GPIO.output(5, GPIO.LOW) # Fernlicht einschalten
GPIO.output(15, GPIO.LOW) # Abblendlicht einschalten
elif pixdetected >= 2000:
print "Fernlicht Aus" # Ausgabe
GPIO.output(5, GPIO.HIGH) # Fernlicht ausschalten
GPIO.output(15, GPIO.HIGH) # Abblendlicht einschalten
#cam.stop_preview() # beendet Kameravorschau
Alles anzeigen