Читать «Цифровая электроника для начинающих» онлайн - страница 53
Дмитрий Витальевич Елисеев
import RPi.GPIO as GPIO
import time
btn_pin = 24 # Button to GPIO24
# Setup
GPIO.setmode(GPIO.BCM)
GPIO.setup(btn_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
def btn_callback(channel):
if GPIO.input(btn_pin) != False:
print "Rising edge detected"
else:
print "Falling edge detected"
GPIO.add_event_detect(btn_pin, GPIO.RISING, callback=btn_callback, bouncetime=300)
# Loop
try:
while True:
time.sleep(1.0)
except:
GPIO.cleanup()
Разница значительна - здесь в основном цикле программы не делается ничего, кроме вызова time.sleep, такой код будет гораздо меньше нагружать процессор. Когда кнопка будет нажата, сработает функция btn_callback. Функция здесь только выводит сообщение, в реальном коде может обновляться содержимое дисплея или выполняться какое-то другое действие. Как можно видеть из кода, можно подписаться как на срабатывание кнопки (GPIO.RISING), так и на ее отпускание.
Разумеется, в реальном проекте может быть более одной кнопки, достаточно будет лишь добавить соответствующие вызовы GPIO.setup и GPIO.add_event_detect.
Самостоятельная работа: изучить код вывода текста на дисплей из предыдущей части, и объединив его с чтением состояния 4х кнопок, сделать систему меню. Простор для творчества тут большой, можно например использовать кнопки “вверх”, “вниз”, “OK” и “Cancel”.
4.8. Выходим в Web: запросы к серверу
Мы уже рассматривали получение количества друзей в “Контакте” в главе 3.6. Сделаем тот же самый запрос на языке Python. Здесь мы видим всю красоту и мощность данного языка, позволяющего делать вполне сложные вещи очень коротко и лаконично. Весь код умещается в 6 строк:
import json, urllib2
try:
data = json.load(urllib2.urlopen(url))
cnt = len(data['response'])
print cnt
except:
pass
Кстати, одна из полезных особенностей Python - его кроссплатформенность. Этот код можно выполнить и на Raspberry Pi, и на Windows, и на OSX, он будет работать одинаково.
Практически, подобные фрагменты удобно вынести в отдельную функцию, это делает код читабельнее и понятнее.
def getFriends(friendID):
try:
data = json.load(urllib2.urlopen(url))
cnt = len(data['response'])
return cnt
except:
return -1
Тогда вызвать его можно так:
n = getFriends(29744451)
print “Number of friends:”, n
Аналогично с числом подписчиков канала Youtube, все это можно записать в виде функции:
apiKey = "AIzaSyC26UJw-ubU6NXXXXXXXXXXXXXXXXXX"
def getSubscribersCount(channelID):
url = "https://www.googleapis.com/youtube/v3/channels?id=" + channelID + "&part=statistics&key=" + apiKey
try:
data = json.load(urllib2.urlopen(url))
return data["items"][0]["statistics"]["subscriberCount"]
except:
return -1
Может возникнуть вопрос, как мы получили строчку data["items"][0]["statistics"]["subscriberCount"]? Это просто, если посмотреть на json в браузере. Выглядит он напомним, так:
{
"kind": "youtube#channelListResponse",
"items": [
{
"kind": "youtube#channel",
"etag": "\"_gJQceDMxJ8gP-8T2HLXUoURK8c/Ea_ipJwsnrECB064UURA_RcRR0Y\"",
"id": "UCzz4CoEgSgWNs9ZAvRMhW2A",
"statistics": {
"viewCount": "30872448",
"commentCount": "313",
"subscriberCount": "258797",