Здравствуйте! Хотелось бы организовать запуск, а так же их отключение приложений написанных на питоне в бесконечном цикле, по состоянию GPIO входа. Если логическая единица то приложение работает, если логический ноль, то не работает. Можно сделать большое приложение в котором все это крутилось в "длинном" цикле, но по мне это не удобно. Веб-сервер на Flask мне нужен не всегда, хотелось бы его отключать, отправка смс через модем тоже. Хочется чтобы щелкнул тумблер на корпусе и запустилось то что нужно. Может это как-то можно сделать через скрипт? Подскажите.
Погуглите про subprocess для Python. Создаете скрипт на Python который с помощь RPi.GPIO слушает нужный вам GPIO вход и отправляет команду в linux терминал(с помощью subprocess) на запуск любого приложения, или отправляет команду на закрытие приложения (или убивает процесс). Потом добавляете в автозапуска(тоже погуглите) и все.
Вот ссылочка: https://thedrhax.pw/?p=1460 И не нужен питон... уж лучше "крутите" программу на си. Ставите в автозапуск ваш скрипт... циклический скрипт укажите его в /etc/rc.local ну к примеру... не забудьте что строка запуска должна быть с ключём & например: <полный путь к скрипту> & иначе при включении дальнейшей загрузки не произойдёт, а будет только крутиться ваш скрипт. Учтите - он будет запущен с правами ROOT. Добавлять его надо только после полной его отладки. Только после отладки!!! Читайте кнопку подкюченную на корпус: Код (Bash): gpio mode 0 in #переводим вывод в режим IN gpio mode 0 up #подключаем подтягивающий резистор gpio read 0 #считываем значение с вывода 0 ну сам параметр оформите так: Код (Bash): key=$(gpio read 0) case $key in 0) #нажата <ваша программа - путь> & #не забудьте про & ;; 1) #отжата killall <ваша прогрпмма> ;; *) ;; esac проверяйте на повторность запуска в цикле
Думал об этом, решил что буду делать на bash Помогите проверить правильность и устранить некоторые проблемы, со скриптами имею дело первый раз. 1) Я создаю файл onlight.sh, сохраняю его в директории со своей программой /home/pi/onlight Мне нужно его сделать исполняемым? сhmod +x onlight.sh 2) В фале /etc/rc.local указываю: /home/pi/onlight/onlight$ exit 0 3) Сам код файла onlight.sh, правильно ли я его написал, особенно пункт с запуском программы Код (Bash): #!/bin/bash echo "4" > /sys/class/gpio/export # экспортируем контакт echo "in" > /sys/class/gpio/gpio4/direction # заставляем работать его на как вход while [ 1 ]; do STAT=$(/sys/class/gpio/gpio4/value) #считываем значение со входа case $STAT= in 0) #нажата onligh.py - /home/pi/onlight& #не забудьте про & ;; 1) #отжата killall onlight.py ;; *) ;; esac done У меня еще пара вопросов: Я запускаю файл onlight.py в ручную в консоли с рут правами, у меня так же запуститься программа без фона с терминалом? Убийство программы происходит так же как командой Сtrl-C?
Про питон я несколько затрудняюсь ответить... хотя какая разница. В консоли вы запустили свою программу... если без &... то по Ctrl+C и выйдете из неё... и ещё при закрытии сессии консоли и при разъединении если по SSH. Это в порядке вещей... ведь запущено в текущей сессии. Для нормального продолжения работы я запускаю от имени WEB сервера на устройстве... в моём случае пользователь www-data. С правами ROOT если запустили (обычное дело в автозапуске) то и останавливать надо тоже с правами ROOT. У меня была проблема с перезапуском... но я применил TELNET по локальному соединению и запускал в автозапуске с правами пользователя вот так: http://www.moxa.ru/forum/index.php?/topic/6748-avtozapusk-ot-polzovatelia-v-ia240/ ну как видите для IA240... но какая разница, если это Linux.
Код (Bash): #!/bin/bash echo "4" > /sys/class/gpio/export # экспортируем контакт echo "in" > /sys/class/gpio/gpio4/direction # заставляем работать его на как вход while [ 1 ]; do STAT=$(/sys/class/gpio/gpio4/value) #считываем значение со входа case $STAT= in 0) #нажата [B]onligh.py - /home/pi/onlight& #не забудьте про &[/B] ;; 1) #отжата killall onlight.py ;; *) ;; esac done Вы с цикле пытаетесь всё время запускать onligh.py. Сколько экземпляров этой программы запуститься в цикле? Проверяйте... вдруг уже запущена. Проще сделать через флаг (если без проверки уже запущенного): Код (Bash): #!/bin/bash echo "4" > /sys/class/gpio/export # экспортируем контакт echo "in" > /sys/class/gpio/gpio4/direction # заставляем работать его на как вход FLAG="0" while [ 1 ] do STAT=$(/sys/class/gpio/gpio4/value) #считываем значение со входа case $STAT in 0) #нажата if ( ((FLAG == 0)) ) then FLAG="1" onligh.py - /home/pi/onlight #& - больше не надо... у вас ваш текущий скрипт в бесконечном цикле и это его надо запускать с & fi ;; 1) #отжата FLAG="0" killall onlight.py ;; *) ;; esac done Правда я сам не понял этого: onligh.py - /home/pi/onlight Вот кое что: http://www.opennet.ru/docs/RUS/bash_scripting_guide/
Тут я делал как по примеру и немного не понял ваши мысли с "-" А так как я понял, запускаю файл onligh.py, в директории /home/pi/onlight. Код (Bash): <ваша программа - путь> & #не забудьте про & Осознаю свою ошибку, что пропустил предложение про проверку повторности запуска. Амперсанд нужно лишь поставить в автозагрузке раз и все.
Доброго времени суток. Код (Bash): #!/bin/bash echo "4" > /sys/class/gpio/export # экспортируем контакт echo "in" > /sys/class/gpio/gpio4/direction # заставляем работать его на как вход FLAG="0" while [ 1 ] do STAT=$(/sys/class/gpio/gpio4/value) #считываем значение со входа case $STAT in 0) #нажата if ( ((FLAG == 0)) ) then FLAG="1" /home/pi/onlight/onligh.py #& - больше не надо... у вас ваш текущий скрипт в бесконечном цикле и это его надо запускать с & fi ;; 1) #отжата FLAG="0" killall onlight.py ;; *) ;; esac done Если я... ну вроде как телепат... /home/pi/onlight/onligh.py - это полный путь к вашему файлу.
Может вместо того, чтобы постоянно в цикле считывать состояние GPIO, использовать функцию прерывания ? GPIO interrupt. Смысл в том, что GPIO сам "сообщит о срабатывании" контакта. Тут есть пример схемы и кода на питоне