PIR
Vi har en Scoreboard på m.nu som visar aktuellt orderläge. Här kan du läsa om hur vi gjort för att automatiskt starta webbläsare i helskärmsläge när vår Raspberry Pi startar.

Vi vill inte att skärmen ska stå på och dra el när vi inte är där, så vi har satt en Rörelsesensor direkt på GPIO-porten. Rörelsesensor drivs med 5V, men lämnar praktiskt nog 3,3V som utsignal, så utsignalen kan kopplas direkt till GPIO-pinne på vår Raspberry Pi.
GPIO
Så här kopplade vi:

  • 5V på GPIO-porten (pinne 2) kopplas till 5V på rörelsesensorn
  • GND (pin 6) kopplas till GND
  • Rörelsesensorns utsignal till GPIO1 (pin 12).

När rörelse detekteras är utsignalen hög i några sekunder.

Läsa från GPIO-porten

Vi använder mjukvaran WiringPi för att läsa från GPIO-porten. Wiring pi är installerat på din pi om du kör en ny version av Raspbian Jessie

När WiringPi är installerat kan man använda mjukvaran gpio för att interagera med GPIO-porten.

Exempel:

gpio read 1

Som returnerar 1 om GPIO1 är hög och 0 om GPIO1 är låg. På WiringPi finns en bra översikt över vilka pinnar som är vilka, det är minst sagt rörigt

Slå på och av skärmen

Eftersom skärmen är ansluten via HDMI går det att skicka signaler via HDMI-kabeln för att stänga av och slå på skärmen.

Vi skapade ett litet script som löser detta på en mycket enkelt sätt:

nano /home/pi/screen.sh

Lägg sedan in följande i filen:

#!/bin/bash
if [ "$1" == 'on' ]; then
  tvservice -p #Slå på skärmen
  fbset -depth 8 #Trick för att se till att skärmen uppdateras
  fbset -depth 16 #Trick för att se till att skärmen uppdateras
  sudo chvt 6 #Trick för att se till att skärmen uppdateras (Växla till terminalfönster)
  sudo chvt 2 #Trick för att se till att skärmen uppdateras (Växla till grafiskt fönster)
  echo 'Switched Screen ON!'
fi
if [ "$1" == 'off' ]; then
  tvservice -o #Stäng av skärmen
  echo 'Switched Screen OFF!'
fi

Gör filen körbar:

chmod 700 /home/pi/screen.sh

Nu går det enkelt via scriptet att slå på och av skärmen genom att köra screen.sh med on respektive off som parametrar

Helheten

Nu skapar vi ett script till som läser av GPIO-porten och tänder släcker skärmen med rörelsesensorn som insignal:

nano /home/pi/movement.sh

Innehåll:

#!/bin/bash
/home/pi/screen.sh off #Vi börjar med att stänga av skärmen vid uppstart, annars kommer den stå på i onödan
counter="0" # Sätter en variabel vi använder i scriptet
while true; do #Loopa för evigt
if [ `gpio read 1` = "1" ]; then #Om rörelsesensor detekterat rörelse
 echo "Rörelse detekterad"
 if [ $counter = 0 ]; then # Om counter-värdet är 0 är skärmen släckt och vi aktiverar den 
         /home/pi/screen.sh on
 fi
 counter=1200 # Sätt counter till 1200, vilket kommer innebära att skärmen är på ca 20 minuter. Detta görs varje gång rörelse dekterats så om rörelse detkteras gång på gång kommer skärmen inte att släckas.
else # om ingen rörelse detekterats...
 echo "ingen rörelse"
 if [ $counter -gt "0" ]; then # om räknarvärdet är större än 0
        counter=`expr $counter - 1` #räkna ner med 1
 fi
 if [ $counter = 0 ]; then # om räknarvärdet är 0 har ingen rörelse detekterats på 20 minuter och vi stänger av skärmen
        /home/pi/screen.sh off
 fi
fi
sleep 1 #Vänta en sekund innan vi börjar om.
echo "$counter\n"

done