From d2c4ef06a62057fbf617d0b1b0516384a8df29bc Mon Sep 17 00:00:00 2001 From: Gunstick Date: Sat, 2 May 2015 01:58:10 +0200 Subject: [PATCH] changed from a normal RGB led to neopixel ws2812b --- README.txt | 21 +++++++++-- buzzctrl.sh | 99 +++++++++++++++++--------------------------------- setneocolor.py | 62 +++++++++++++++++++++++++++++++ videoplayer.sh | 2 +- 4 files changed, 114 insertions(+), 70 deletions(-) create mode 100755 setneocolor.py diff --git a/README.txt b/README.txt index 0cf65df..b437c7e 100644 --- a/README.txt +++ b/README.txt @@ -4,15 +4,21 @@ the button has an RGB led to show status how to install ============== +# login as user pi +sudo apt-get install unclutter xdotool git-core screen imagemagick +cd ~ +git clone https://github.com/syn2cat/doorbuzz.git + put into /etc/rc.local the following line: -su pi -c '/home/pi/buzzctrl.sh' & +su pi -c '/home/pi/doorbuzz/buzzctrl.sh' & sudo vi /etc/xdg/lxsession/LXDE/autostart remove screensaver -sudo apt-get install unclutter xdotool git-core screen imagemagick +cd ~ git clone git://git.drogon.net/wiringPi cd wiringPi ./build +cd ~ mkdir -p /home/pi/.config/lxsession/LXDE/ cat > /home/pi/.config/lxsession/LXDE/autostart <<"EOF" @@ -20,9 +26,18 @@ cat > /home/pi/.config/lxsession/LXDE/autostart <<"EOF" @xset -dpms @xset s noblank @unclutter -display :0 -noevents -grab -@./videoplayer.sh +@./doorbuzz/videoplayer.sh EOF +https://learn.adafruit.com/neopixels-on-raspberry-pi/software +sudo apt-get install build-essential python-dev git scons swig +git clone https://github.com/jgarff/rpi_ws281x.git +cd rpi_ws281x +scons +cd python +sudo python setup.py install + +cd doorbuzz connect the button and LED to pins as shown in buzzctrl.sh create a file "secret.txt" containing the http://user:pass@10.1.1.xx part of the URL diff --git a/buzzctrl.sh b/buzzctrl.sh index 5afcaf2..208f38a 100755 --- a/buzzctrl.sh +++ b/buzzctrl.sh @@ -1,57 +1,38 @@ #!/bin/bash +# led is not neopixel, so use the python lib for that BUTTONPIN=25 -REDLEDPIN=23 -GREENLEDPIN=18 -BLUELEDPIN=24 +SHOWLEDPRG="sudo python /home/pi/doorbuzz/setneocolor.py" BUZZERURL="$(cat "$(dirname "$0")"/secret.txt)/state.xml?relay1State=2&pulseTime1=5" BUZZERSTATUSURL="$(cat "$(dirname "$0")"/secret.txt)/state.xml" - +ATTENUATION=4 # file secret.txt should contain username:password # install by putting into /etc/rc.local -# su pi -c '/home/pi/buzzctrl.sh' & +# su pi -c '/home/pi/doorbuzz/buzzctrl.sh' & echo "Initializing hardware" # the button gpio -g mode $BUTTONPIN up gpio -g mode $BUTTONPIN in -# R -gpio -g mode $REDLEDPIN out -# G -gpio -g mode $GREENLEDPIN out -# B -gpio -g mode $BLUELEDPIN out pulseon() { - pin=$1 - value=0 - valueinc=64 - gpio -g mode $pin pwm - while true - do - gpio -g pwm $pin $value - value=$((value+valueinc)) - if [ $value -gt 1023 ] || [ $value -lt 0 ] - then - valueinc=$((0-valueinc)) - value=$((value+valueinc)) - fi - sleep 0.2 - done + red=$1 + green=$2 + blue=$3 + $SHOWLEDPRG pulse $((red/ATTENUATION)) $((green/ATTENUATION)) $((blue/ATTENUATION)) /dev/null 2>&1 & + echo $! } pulseoff() { - pin=$1 - kill $2 - gpio -g mode $pin out - gpio -g write $pin 0 + if [ $(ps -edf | grep pulse | grep "$1"|wc -l) -gt 0 ] + then + sudo kill "$1" + fi } ledcolor() { red=$1 green=$2 blue=$3 - gpio -g write $REDLEDPIN $red - gpio -g write $GREENLEDPIN $green - gpio -g write $BLUELEDPIN $blue + $SHOWLEDPRG set $((red/ATTENUATION)) $((green/ATTENUATION)) $((blue/ATTENUATION)) } declare -a morse morse[0]="-----" @@ -69,68 +50,54 @@ morseled() { echo $message msglen=${#message} pos=0 + morsecode="" while [ $pos -lt $msglen ] do - morsecode=${morse[${message:${pos}:1}]} + morsecode="$morsecode ${morse[${message:${pos}:1}]}" pos=$((pos+1)) echo $morsecode - morselen=${#morsecode} - morsepos=0 - while [ $morsepos -lt $morselen ] - do - ledcolor $2 $3 $4 -#echo "c($morsepos)=${morsecode:${morsepos}:1}" - if [ "${morsecode:${morsepos}:1}" = "." ] - then -#echo "." - sleep 0.1 - else -#echo "-" - sleep 0.2 - fi - ledcolor 0 0 0 - sleep 0.1 - morsepos=$((morsepos+1)) - done - sleep 0.2 -echo done + red=$2 + green=$3 + blue=$4 + $SHOWLEDPRG morse $((red/ATTENUATION)) $((green/ATTENUATION)) $((blue/ATTENUATION)) "$morsecode" + +echo } echo "morsing IP" -ledcolor 1 1 1 +ledcolor 255 255 255 sleep 3 ledcolor 0 0 0 sleep 1 -morseled "$(hostname -I|awk -F. '{sub(" ","",$NF);printf $NF}')" 1 0 0 -ledcolor 1 1 1 +morseled "$(hostname -I|awk -F. '{sub(" ","",$NF);printf $NF}')" 255 0 0 +ledcolor 255 255 255 sleep 1 echo "Main loop" while true do - ledcolor 0 1 1 - pulseon $GREENLEDPIN & - pulsepid=$! - trap "pulseoff $GREENLEDPIN $pulsepid;ledcolor 0 0 0;exit" 1 2 3 + ledcolor 0 255 255 + pulsepid=$(pulseon 0 0 255 ) + trap "pulseoff $pulsepid;ledcolor 0 0 0;exit" 1 2 3 gpio -g wfi $BUTTONPIN falling while [ $(gpio -g read $BUTTONPIN) != 0 ] do gpio -g wfi $BUTTONPIN falling done - pulseoff $GREENLEDPIN $pulsepid - ledcolor 0 1 1 + pulseoff $pulsepid + ledcolor 0 255 255 echo "Pushiii" wget -O - -S --timeout=1 --tries=1 "$BUZZERURL" 2>&1 ret=$? if [ $ret -ne 0 ] then - morseled "$ret" 1 0 0 + morseled "$ret" 255 0 0 else while wget -O - --timeout=1 --tries=1 $BUZZERSTATUSURL|grep '1' do - ledcolor 0 1 0 + ledcolor 0 255 0 sleep 0.9 - ledcolor 0 1 1 + ledcolor 0 255 255 sleep 0.1 done fi diff --git a/setneocolor.py b/setneocolor.py new file mode 100755 index 0000000..5b68c4c --- /dev/null +++ b/setneocolor.py @@ -0,0 +1,62 @@ +#!/usr/bin/python +# sets color of first neo pixel +from __future__ import division +import time +import sys +from math import * + +from neopixel import * + +# LED strip configuration: +LED_COUNT = 1 # Number of LED pixels. +LED_PIN = 18 # GPIO pin connected to the pixels (must support PWM!). +LED_FREQ_HZ = 800000 # LED signal frequency in hertz (usually 800khz) +LED_DMA = 5 # DMA channel to use for generating signal (try 5) +LED_BRIGHTNESS = 100 # Set to 0 for darkest and 255 for brightest +LED_INVERT = False # True to invert the signal (when using NPN transistor level shift) + +# Main program logic follows: +if __name__ == '__main__': + # Create NeoPixel object with appropriate configuration. + strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS) + # Intialize the library (must be called once before other functions). + strip.begin() + r=int(sys.argv[2]) + g=int(sys.argv[3]) + b=int(sys.argv[4]) + if(sys.argv[1] == "set"): + print "Color set to: ",r,g,b + strip.setPixelColor(0, Color(r,g,b)) + strip.show() + if(sys.argv[1] == "morse"): + print "Morsing with: ",r,g,b + speed=10 + morsecode=sys.argv[5] + for c in morsecode: + if c==".": + strip.setPixelColor(0, Color(r,g,b)) + strip.show() + time.sleep(0.2) + strip.setPixelColor(0, Color(0,0,0)) + strip.show() + time.sleep(0.2) + if c=="-": + strip.setPixelColor(0, Color(r,g,b)) + strip.show() + time.sleep(0.7) + strip.setPixelColor(0, Color(0,0,0)) + strip.show() + time.sleep(0.2) + if c==" ": + strip.setPixelColor(0, Color(0,0,0)) + strip.show() + time.sleep(1) + if(sys.argv[1] == "pulse"): + print "Pulsing with: ",r,g,b + pulsewidth=50 + while True: + for i in range(pulsewidth): + trigo=sin(i/pulsewidth*pi) + strip.setPixelColor(0, Color(int(r*trigo),int(g*trigo),int(b*trigo))) + strip.show() + time.sleep(50/1000.0) diff --git a/videoplayer.sh b/videoplayer.sh index 6286e58..7cff5ec 100755 --- a/videoplayer.sh +++ b/videoplayer.sh @@ -13,7 +13,7 @@ do then # test on false, so in case of network fail, it defaults to playing sleep 60 else - ls *mp4 | + ls ~/*mp4 | while read video do omxplayer "$video"