Запуск приложения по состоянию GPIO входа

Тема в разделе "Raspberry Pi", создана пользователем beivev, 14 авг 2016.

  1. beivev

    beivev Нуб

    Здравствуйте!
    Хотелось бы организовать запуск, а так же их отключение приложений написанных на питоне в бесконечном цикле, по состоянию GPIO входа. Если логическая единица то приложение работает, если логический ноль, то не работает.
    Можно сделать большое приложение в котором все это крутилось в "длинном" цикле, но по мне это не удобно. Веб-сервер на Flask мне нужен не всегда, хотелось бы его отключать, отправка смс через модем тоже.
    Хочется чтобы щелкнул тумблер на корпусе и запустилось то что нужно.
    Может это как-то можно сделать через скрипт?
    Подскажите.
     
  2. DZIDBAEV

    DZIDBAEV Нерд

    Ну дык а чего мешает, запустить скрипт на пайтоне...
    И с помощью него запускать всё....
     
  3. MilkyWay

    MilkyWay Нерд

    Погуглите про subprocess для Python. Создаете скрипт на Python который с помощь RPi.GPIO слушает нужный вам GPIO вход и отправляет команду в linux терминал(с помощью subprocess) на запуск любого приложения, или отправляет команду на закрытие приложения (или убивает процесс). Потом добавляете в автозапуска(тоже погуглите) и все.
     
  4. Igor68

    Igor68 Гуру

    Вот ссылочка:
    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
     
    проверяйте на повторность запуска в цикле
     
  5. beivev

    beivev Нуб

    Думал об этом, решил что буду делать на 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?
     
  6. Igor68

    Igor68 Гуру

    Про питон я несколько затрудняюсь ответить... хотя какая разница. В консоли вы запустили свою программу... если без &... то по 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.
     
  7. Igor68

    Igor68 Гуру

    Код (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/
     
    Последнее редактирование: 28 янв 2017
  8. beivev

    beivev Нуб

    Тут я делал как по примеру и немного не понял ваши мысли с "-"
    А так как я понял, запускаю файл onligh.py, в директории /home/pi/onlight.

    Код (Bash):

            <ваша программа - путь> & #не забудьте про &
     
     
    Осознаю свою ошибку, что пропустил предложение про проверку повторности запуска.
    Амперсанд нужно лишь поставить в автозагрузке раз и все.
     
  9. Igor68

    Igor68 Гуру

    Доброго времени суток.
    Код (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 - это полный путь к вашему файлу.
     
  10. beivev

    beivev Нуб

    Доброго!)
    Да это полный путь)
    Спасибо огромное за помощь.
     
  11. pavelbor

    pavelbor Нерд

    Может вместо того, чтобы постоянно в цикле считывать состояние GPIO, использовать функцию прерывания ?
    GPIO interrupt. Смысл в том, что GPIO сам "сообщит о срабатывании" контакта.
    Тут есть пример схемы и кода на питоне