Присоединяйтесь!
Авторизация
GPIO    Python    RPIO    прерывания   

Запись времени захода в комнату или простой пример работы с прерываниями по GPIO на Python

31 August 2013 - Автор blblbl2

Привет всем! Сейчас я покажу как можно работать с прерываниями на нашем мини-компьютере, то есть выполнять определенное действие в момент смены сигнала на GPIO.

В этом примере будем записывать в файл время открытия и закрытия двери в комнату. Для этого я подцепил герконовый извещатель от охранной сигнализации между выводами +3.3V и GPIO7 (номер может быть любым).

Выглядит это так:

Здесь задействованы только красный и черный провода, которые идут к извещателю, остальные лишние.

Извещатель состоит из двух частей, это магнит и геркон. Геркон вешаем на дверной косяк, а магнит на саму дверь. Когда магнит находится у геркона (дверь закрыта), его цепь замкнута и на GPIO7 поступает единица. Если же открыть дверь или перерезать провод, то она оттуда исчезнет, о чем мы и запишем в файл.

Программная реализация

Для работы с GPIO нашей малинки существует очень удобная библиотека для Python под названием RPIO (http://pythonhosted.org/RPIO/). Рекомендую всем зайти на этот сайт и изучить документацию и примеры, благо объем ее невелик и написана она несложным языком. Итак, для начала собственно установим Python

 sudo apt-get install python python-setuptools

И библиотеку RPIO

sudo easy_install -U RPIO

Создадим файл нашего скрипта с названием, к примеру, door.py. Дадим ему права на исполнение:

chmod +rx door.py

Заполним этот файл следующим содержимым:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import RPIO # Импортируем библиотеку RPIO
import time # ...и для работы со временем
input_pins = (7,8,9,10) # Задаем номера пинов, которые будут использоваться под ввод. Лучше внести в этот список побольше пинов, дабы избежать наводок.
for i in xrange(len(input_pins)): # Включаем их на ввод и подтягиваем к земле
RPIO.setup(input_pins[i], RPIO.IN, pull_up_down=RPIO.PUD_DOWN)
door = open('/home/pi/door', 'a',0) # Открываем файл в который будем записывать инфу. 'a' означает режиме записи в конец файла 0 - отключить буферизацию, чтбы информация записывалась незамедлительно.

def write_door_state(gpio_id, val): # Создаем функцию, запускаемую при изменении состояния GPIO
	if val==0: 
		door.write (time.strftime("%d.%m.%Y %H:%M:%S")+"\tОткрытие\r\n") #\t - символ табуляции, \r\n - перевод строки
	else:
		door.write (time.strftime("%d.%m.%Y %H:%M:%S")+"\tЗакрытие\r\n")
RPIO.add_interrupt_callback(7, write_door_state,pull_up_down=RPIO.PUD_DOWN,threaded_callback=True, debounce_timeout_ms=50) #Добавляем прерывание, с подтяжкой к земле и подавлением дребезга контактов

RPIO.wait_for_interrupts() # Запускаем ожидание прерываний

Чтобы наш скрипт запускался от имени суперпользователя (а иначе он работать не будет) при старте системы, необходимо в файл /etc/rc.local перед строчкой exit 0 записать путь к нашему скрипту и добавить амперсанд (&) в конце, например

/home/pi/door.py&

Также можно для удобства в файл ~/.bashrc добавить строки

echo "Последние 10 событий двери:"
tail door

Теперь при каждом входе в систему будет выводиться последние 10 строк из нашего лога:

Последние 10 событий двери:
26.08.2013 14:24:52     Открытие
26.08.2013 14:25:03     Закрытие
27.08.2013 01:37:57     Открытие
31 August 2013
blblbl2
автор статьи

Комментариев: 7

  1. Gasinskiy12

    31 August 2013 - Ответить

    Спасибо за интересную статью!!! Особенно за программную реализацию!!! Хочу сделать спидометр для велосипеда с применением геркона =) Думаю, что код с нуля писать не придется, а достаточно будет этот переделать под свои нужды))

    • jurik_h

      30 August 2014 - ответить

      Для практики хорошая адача, но по-делу, стоимость велокомпьютера 300-450 руб и их так много…

  2. blblbl2

    28 October 2013 - Ответить

    А с велокомпьютером кстати неплохая идея, можно забить в него что-то вроде базы данных компонентов и чтобы были предупреждения о необходимости обслуживания или замены определенного компонента при определенном пробеге.

    • Lord12

      02 March 2014 - ответить

      Здравствуйте, как с вами связаться ? Есть предложение по расширению этой статьи. Личка на сайте отключена.

      • blblbl2

        03 March 2014 - ответить

        jabber blblbl@dukgo.com. или vk.com/a.s.savchenko

  3. severniyvolk

    18 April 2014 - Ответить

    Здравствуйте. я в программировании чайник без ручки. подскажите как написать программу на питоне чтобы при нуле или 1(без разницы) на gpio порт к примеру 17 открывалась ссылка на сайт.

    • blblbl2

      17 May 2014 - ответить

      Попробуйте следующий вариант: import rpio import webbrowser RPIO.add_interrupt_callback(17, webbrowser.open("http://raspberrypi.ru"),pull_up_down=RPIO.PUD_DOWN, debounce_timeout_ms=50, edge='rising') RPIO.wait_for_interrupts() Ссылка откроется когда на 17 порту будет единица

  4. rw4cju

    06 August 2014 - Ответить

    добрый день! Такая же ситуация только разбираюсь как работать с GPIO. Задача состоит в том чтобы при срабатывании контактных датчиков (через оптопары) на Localhost отправлялась следующее: Например сработал Pin 17 т.е на нем 1 (или другой контакт всего их задействовано 4 (это датчики положения ворот открыто/закрыто а также кнопки открыть закрыть) то отправится должно: GET/objects/object=sensorMovement2&op=m&m=statusChanged&status=%i HTTP/1.0", Это для управления сценариями в системе MajorDoMo все варианты перепробовал но знаний не хватает…

    • blblbl2

      17 November 2014 - ответить

      Запросы можно осуществлять при помощи библиотеки urllib

  5. s0r0ka

    15 April 2016 - Ответить

    А есть программа наподобие ArduBloсk но для малинки?

  6. etamin419

    10 December 2016 - Ответить

    Добрый вечер попробовал сделать так же, но в логи почему то пишет часто состояние, я думал он писать только будет когда изменится статус. 10.12.2016 18:32:35 Закрытие 10.12.2016 18:33:03 Закрытие 10.12.2016 18:33:32 Закрытие 10.12.2016 18:33:33 Закрытие никто не сталкивался с таким?

    • blblbl2

      19 December 2016 - ответить

      Возможно, наводки или дребезг контактов. Добавьте побольше пинов в input_pins и поэкспериментируйте с различными значениями debounce_timeout_ms.

      • etamin419

        28 January 2017 - ответить

        так и не получилось, играя со значениями, добиться нужного результата… пришлось применить немного говнокода :-D может кому пригодится, у кого геркон будет так же «дрибезжать». возможно проблема в нем, надо попробовать другой поставить. цель была оповещать когда произойдет открытие. #!/usr/bin/python # -*- coding: utf-8 -*- # import RPIO # Импортируем библиотеку RPIO import time # ...и для работы со временем import MySQLdb import gc #чистка мусора import requests import datetime from time import sleep close=0 input_pins = (18,19,20,21,22,23,24,25,26,27) # Задаем номера пинов, которые будут использоваться под ввод. Лучше внести в этот список побольше пинов, дабы избежать наводок. for i in xrange(len(input_pins)): # Включаем их на ввод и подтягиваем к земле RPIO.setup(input_pins[i], RPIO.IN, pull_up_down=RPIO.PUD_DOWN) def write_door_state(gpio_id, val): # Создаем функцию, запускаемую при изменении состояния GPIO dat=datetime.datetime.now().strftime("%d.%m.%Y %H:%M:%S") if val==0: global close if close==0: close=1 try: db = MySQLdb.connect(host="localhost",user="log",passwd="pas",db="1") except: print "connection failed" door = open('/home/pi/project/door', 'w', 0) door.write (time.strftime("0 "+"%Y-%m-%d %H:%M:%S")+"\tОткрытие\r\n") #\t - символ табуляции, \r\n - перевод строки try: cursor = db.cursor() sql = """insert into door (bool,date,name) values ('%(val)s','%(date)s','%(stat)s')"""%{"val":'0', "date":dat, "stat":'Open'} cursor.execute(sql) db.commit() cursor.close() time.sleep(5) # delays for 5 seconds except MySQLdb.Error as e: print "MySQL Error: %s" % str(e) else: db.close() gc.collect() door.close() requests.get("http://sms.ru/sms/send?api_id=блабла&to=номер&text=Door open!") time.sleep(60) # delays for 60 seconds else: door = open('/home/pi/project/door', 'w', 0) close=0 door.write (time.strftime("1 "+"%Y-%m-%d %H:%M:%S")+"\tЗакрытие\r\n") door.close() # Настраиваем порт на ожидание прерываний и выполнение выщенаписанной функции#Добавляем прерывание, с подтяжкой к земле и подавлением дребезга контактов RPIO.add_interrupt_callback(22, write_door_state,pull_up_down=RPIO.PUD_DOWN, threaded_callback=True, debounce_timeout_ms=50) RPIO.wait_for_interrupts() # Ждем прихода прерывания.

  7. toto976

    14 October 2018 - Ответить

    SystemError: This module can only be run on a Raspberry Pi! https://github.com/metachris/RPIO/issues/53

Отправить комментарий

Авторизуйтесь для отправки комментария

Присоединяйтесь
Новые сообщения
  • Raspberry pi 4 не включается
    27 June, 2020
    @antonabsatarov#6188 что ты имеешь введу под "правильным" форматированием флешки? Все же исправно работало, а в один момент...…
  • Raspberry pi 4 не включается
    27 June, 2020
    @x6vital#6185 я сам столкнулся со схожей проблемой. Решил правильным форматированием флэшки (криво устанавливалась ОС), а...…
  • Как запустить X без монитора?
    22 June, 2020
    Как вы поняли, что они не запускаются? …
  • Как запустить X без монитора?
    22 June, 2020
    Добрый день, поставил на малину расбери ос с рабочим столом, если она загружается без монитора то не стартуют приложения...…
  • Raspberry pi 4 не включается
    19 June, 2020
    @mojo#6171 дело в том что она вообще неадекватно себя как то ведёт. Просто в один момент перестала включаться. Пробую...…
  • Troyka Cap
    19 June, 2020
    Всем спасибо вопрос больше не актуален …
  • Troyka Cap
    19 June, 2020
    @mojo#6178 спасибо скорее всего я уже нашёл ответ: Подключение Платформа устанавливается сверху на одноплатник Raspberry...…
  • rap os без Х + twinkle + service чо происходит
    18 June, 2020
    Добрый день, подскажите пожалуйста, установил настроил twinkle на малину(rasp os linux 10), запускаю через терминал twinkle...…
  • Troyka Cap
    18 June, 2020
    @mojo#6178 держу в курсе) я гулять пошёл и по этому от меня связи не будет до след дня надеюсь что Вы сможете помочь …
  • Troyka Cap
    18 June, 2020
    @mojo#6178 да и как могут быть проблемы с пинами Pi если вентелятор работает от тройка кэп просто от других пинов вопрос...…
  • Troyka Cap
    18 June, 2020
    @mojo#6175 дело не в разбери пинах так как я пробовал ставить вентилятор на саму разбери и он работал и на тройке он...…
  • Troyka Cap
    18 June, 2020
    нет. проблема врядли в токе. Там 1 светодиод, ему вполне хватит питания от RasPi …
  • Troyka Cap
    18 June, 2020
    @mojo#6176 просто в видео у амперки где обзор на тройку обзор там доп блок питания может просто не хватает тока? …
  • Troyka Cap
    18 June, 2020
    В самом Cap'е врядли могут быть проблемы. Там почти нет ничего такого, что может не работать. …
  • Troyka Cap
    18 June, 2020
    На схеме есть соответствие пинам Cap'а пинам на Raspberry Pi Попробуй модуль со светодиодом подключить напрямую к RasPi...…
  • Troyka Cap
    18 June, 2020
    > @Artem90056#6167 какие подробности я не сказал? Никаких. Я в принципе не понимаю, как ПИН может не работать....…
  • Troyka Cap
    18 June, 2020
    @mojo#6170 возможно что я не втыкаю в тройку кэп доп зарядник и мне не хватает мощности? …
  • Troyka Cap
    18 June, 2020
    @mojo#6170 http://wiki.amperka.ru/продукты:raspberry-troyka-cap пролистни чуть ниже проект маячок дана схема и код …
  • Raspberry pi 4 не включается
    18 June, 2020
    так и должно быть. Без SD карты горят все светодиоды Скорее всего не тот образ записал на карту …
  • Troyka Cap
    18 June, 2020
    Скидывай код и схему к какому пину Troyka Cap и что ты подключаешь …
  • Troyka Cap
    18 June, 2020
    @sv-lary#6166 не работают пины на troyka cap беру пример кода с амперки делаю всё по схеме но результата нет …
  • Troyka Cap
    18 June, 2020
    @sv-lary#6166 скажи что тебе ещё сказать? …
  • Troyka Cap
    18 June, 2020
    @sv-lary#6166 какие подробности я не сказал? я то знаю почему пины не работают да? …
  • Troyka Cap
    18 June, 2020
    > @Artem90056#6165 Troyka Cap не хочет работать И? А можно - хоть какие-то подробности? Или Вы предполагаете, что...…
  • Troyka Cap
    18 June, 2020
    Добрый день, подскажите пожалуйста в чём проблема. У меня заказана Troyka Cap с amperka.ru и Raspberry Pi 4b . Проблема в...…