#!/bin/bash # # reapberry zero w & pi 3. # GPIO module # Date: 20180118 # Time: 17:17 # # # AUthor: aixiao@aixiao.me. # : 等待. function SLEEP() { sleep $@ } : 18b20温度传感器. function get18b20data() { MODEL="28-04174019f0ff"; while true; do if test -d "/sys/devices/w1_bus_master1/${MODEL}"; then temperature=$(cat /sys/devices/w1_bus_master1/28-031682c7baff/ | grep 't=' | sed 's/^.*t=//g' | awk '{print $1/1000}'); #echo $y年$m月$d日$H时$M分$S秒 #echo -ne "当前室内温度: "; #echo -e "\e[1;31m${temperature}℃ \e[0m"; echo "${temperature}" >> ${bindir}/data/temperature.data; fi SLEEP 60; done } : CPU温度. function getcpudata() { MHZ=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq | awk '{print $1/1000}'); temperature=$(cat /sys/class/thermal/thermal_zone0/temp | awk '{print $1/1000}'); percentage=$(top -b -n 2 | grep ^%Cpu | sed -n "2p" | sed -e 's/^.*://g;s/..,//g;s/st//g' | awk '{print "scale=1; 100-" $4 }' | bc); echo "Cpu Frequencyi: ${MHZ}MHZ"; echo -e "\e[1;31mCpu temperature: ${temperature}℃ \e[0m"; echo "Cpu Percentage: ${percentage}%"; } function INIT() { null="/dev/null"; bindir="/root/gpio"; ! test -d ${bindir} && exit 1; . ${bindir}/conf/info.conf #时间 y=$(date "+%y"); m=$(date "+%m"); d=$(date "+%d"); H=$(date "+%H"); M=$(date "+%M"); S=$(date "+%S"); W=$(date "+%w"); : 周几? start=1; stop=0; #当前时间 now=$(date +%H%M); #判断手机是否在线 #phoneip="192.168.99.60"; phonelogic="$(ping ${phoneip} -c 1 -S 1 &> /dev/null; echo $?)"; #判断人体红外线传感器 wiringpi_infrared="6"; #infrared=$(${bindir}/info_infrared ${wiringpi_infrared}); infrared=$(cat ${bindir}/data/infrared.data 2> /dev/null); #声音传感器 wiringpi_sound=25; sound=$(cat ${bindir}/data/sound.data 2> /dev/null); #距离传感器 l="60"; s="150"; wiringpi_tring="8"; wiringpi_echo="9"; #distance="$(${bindir}/info_ultrasound ${wiringpi_tring} ${wiringpi_echo})"; { #读取灯pin值 lightpinvalue="$(${bindir}/info_pin ${wiringpi_lightpin})"; #lightpinvalue="$(gpio -g read ${bcm_lightpin})"; #开灯&关灯 #high="1700"; #时间范围 #low="2300"; #wiringpi_lightpin="4"; start_light="${bindir}/info_light ${wiringpi_lightpin} 1"; stop_light="${bindir}/info_light ${wiringpi_lightpin} 0"; } #风扇 #wiringpi_wind="1"; #脚位 #l_temperature="28"; #不高于这个摄氏温度 temperature=$(cat ${bindir}/data/wind.data 2> ${null}); #温度,摄氏度 start_wind="${bindir}/info_light ${wiringpi_wind} 1"; #${wiringpi_wind} 高电压 stop_wind="${bindir}/info_light ${wiringpi_wind} 0"; #${wiringpi_wind} 低电压 status_wind="$(${bindir}/info_pin ${wiringpi_wind})"; : PIN状态. #霍尔元件 helement_pin="1"; } # 红外线守护进程. function infrared() { while true; do ${bindir}/info_infrared ${wiringpi_infrared} > ${bindir}/data/infrared.data; SLEEP 1; done } # 灯主进程. function light() { INIT; while true; do if test ${W} != "0"; then : 不是周日. if [ $now -ge $high -a $now -le $low ]; then : 19:30 - 23:00自动检测,其他时间段不管,手动. if [ "${phonelogic}" == "0" ]; then : phone 如果在线. if test "${lightpinvalue}" = "0"; then : 检测灯pin值. ${start_light}; fi else if test "${lightpinvalue}" = "1"; then ${stop_light}; fi fi else if [ ${now} -gt ${high} ]; then : 如果大于23点就关灯,不管,手动. if test "${lightpinvalue}" = "1"; then ${stop_light}; fi fi fi else : 还一个周日 if test "$W" = "0"; then : 是周日. if [ ${now} -le ${low} -a ${now} -ge ${s_low} ]; then : 8:00 - 23:00,自动化. if [ "${phonelogic}" == "0" ]; then : phone 如果在线. if test "${lightpinvalue}" = "0"; then : 检测灯pin值. ${start_light}; fi else if test "${lightpinvalue}" = "1"; then ${stop_light}; fi fi else : 不在时间段就关闭,手动. if test "${lightpinvalue}" = "1"; then ${stop_light}; fi fi fi fi INIT; SLEEP 60; done } # 声音传感器守护进程. function sound_daemon() { while :; do ${bindir}/info_sound ${wiringpi_sound} > ${bindir}/data/sound.data SLEEP 0.3; done } # 声音传感器主进程. function sound() { : } # 风扇守护进程. function wind_daemon() { while true; do ${bindir}/wind -d ${device} > ${bindir}/data/wind.data; : 温度传感器获取室内温度信息. SLEEP 9; done } # 风扇主进程. function wind() { INIT while true ; do if [[ "${phonelogic}" == "0" ]]; then : 手机在不在? if [[ "${temperature}" -ge "${l_temperature}" ]]; then : 温度大于等于$l_temperature摄氏度. if test "${status_wind}" = "0"; then ${start_wind}; SLEEP $step_wait; : 开启后风扇运行5分钟. ${stop_wind}; SLEEP $step_stop; : 开启后风扇停止运行1分钟,这样是怕吹感冒了. fi else test "${status_wind}" = "1" && ${stop_wind}; : 小于$l_temperature温度就检测或关闭. fi else test "${status_wind}" = "1" && ${stop_wind}; : 手机不再就检测或关闭. fi SLEEP 7; INIT; done } # 霍尔元件守护进程 function helement_daemon() { while true; do ${bindir}/helement ${helement_pin} > ${bindir}/data/helement.data; : 霍尔传感器获取状态信息. SLEEP 0.1; done } # 霍尔元件主进程 function helement() { while true; do DATE=$(date "+%y年%m月%d日%H时%M分%S秒"); status="$(cat ${bindir}/data/helement.data)"; if [ "$status" = "0" ]; then /root/c/c 192.168.1.89 "echo ${DATE} 请注意,抽屉已经打开" fi done } # 主进程 function main_() { INIT; while getopts :ds:x ai do case ${ai} in d) daemon='&'; ;; s) #echo $@ #exit case $OPTARG in "stop") case $3 in "wind") kill $(cat ${bindir}/log/wind_daemon.pid) 2> ${null} kill $(cat ${bindir}/log/wind.pid) 2> ${null} exit 1; ;; "light") kill `cat ${bindir}/log/light.pid` 2> ${null} exit 1; ;; esac array=$(ls ${bindir}/log/) for arr in ${array[@]}; do kill $(cat ${bindir}/log/${arr}) &> ${null} rm ${bindir}/log/${arr} 2> ${null} done exit 0 ;; "reload") case $3 in "wind") kill $(cat ${bindir}/log/wind_daemon.pid) 2> ${null} kill $(cat ${bindir}/log/wind.pid) 2> ${null} : 重启wind bash $0 -d wind ;; "light") kill `cat ${bindir}/log/light.pid` 2> ${null} : 重启light bash $0 -d light ;; esac ;; *) : ;; esac exit 0 ;; x) set -x ;; h|?) echo -ne " \e[1;31mraspberrypi zero w & 3, GPIO Modular\e[0m $0 Usage: $0 [-?|h] [-d] [-s] [-x] [light|temperature|wind] -?|h : Printf Help -d : Daemon. -s : kill Daemon, signal: stop, reload. -x : Print commands and their arguments as they are executed. light : light Modular. temperature : temperature Modular. wind : Wind Modular. helement : Hall element. by aixiao@aixiao.me. " exit 0 ;; esac done shift $((OPTIND-1)) #array=($(echo ${@})) eval array=(${@}) for i in ${array[@]}; do case $i in light) eval light ${daemon} echo $! > ${bindir}/log/light.pid 2> ${null} ;; temperature) #get18b20data & #echo $! > log/temperature.pid 2> ${null} : ;; sound) sound_daemon & echo $! > ${bindir}/log/sound.pid 2> ${null}; eval sound ${daemon}; ;; wind) wind_daemon & echo $! > ${bindir}/log/wind_daemon.pid 2> ${null} eval wind ${daemon} echo $! > ${bindir}/log/wind.pid 2> ${null} ;; helement) helement_daemon & echo $! > ${bindir}/log/helement_daemon.pid 2> ${null}; eval helement ${daemon} echo $! > ${bindir}/log/helement.pid 2> ${null} ;; *) exit 1; ;; esac done } main_ $@