本文翻译自:https://www.raspberrypi.org/
使用Python requests 模块访问People in Space API,并创建一个指示灯,以显示当前在空间中的人数。
2015年12月15日,英国欧空局宇航员蒂姆·帕克(Tim Peake)起飞到国际空间站,他将在那里工作六个月。作为Astro Pi项目的一部分,Tim还将在太空中进行科学研究,他还将使用由两名Raspberry Pis学生学习的Python代码进行实验。通过这个资源,你可以保持蒂姆和他的宇航员在国际空间站上的数量。
浏览太空人物API
API代表应用程序编程接口。一种形式的API是一种Web API,可用于从在线提供的服务中提取数据。一些API对公众开放,免费提供数据; 其他API需要登录才能访问它们,这可以通过应用程序获取,或者可以作为服务提供给客户收费。
通过API提供数据的目的是允许人们访问它以供自己使用或使用它来构建程序。一些API提供业务关键数据集或其他重要数据,例如天气,金融活动,甚至提供访问Twitter流或Flickr的照片等。其他API只是为了好玩,如口袋妖怪API,星球大战API或冒险时间API。虽然这些API是有趣的,但它们仍然可以用于有趣和有用的方式。您可以在Minecraft中建立一个宠物小精灵游戏,或在冒险时间内建立关于角色的问答游戏!
对于这个项目,您将使用Nathan Bergey免费维护和提供的People in Space API。
首先打开网页浏览器并浏览以下网址:
http://api.open-notify.org/astros.json 您应该看到一个白色页面,其中包含一些如下所示的文本:
您正在查看API提供的数据。这是访问数据的手动方法。 观察所提供的数据。它应该看起来像这样: { “message”: “success”, “number”: 6, “people”: [ { “craft”: “ISS”, “name”: “Mikhail Kornienko” }, … } 该数据的格式称为JSON(发音为“Jason”),代表JavaScript Object Notation。虽然这个名字是指JavaScript的编程语言,但它是一种标准的数据交换格式,可以在语言和应用程序之间移植。如果您熟悉Python的 dictionary 数据结构,您将看到相似之处。在其他语言中,嵌套数组可以以相同的方式使用。 请注意,API提供了三个数据: message , number ,和 people 。 message 是包含该单词的单个字符串 success
是包含该单词的单个字符串 number 是整数值 6
是整数值 people 是一群宇航员 在 people 阵列中,有六个对象。每个对象包含两个数据: craft 是宇航员在哪里的航天器
是宇航员在哪里的航天器 name 是宇航员的全名
使用Python的请求模块
现在您将使用 requests Python中的模块来访问API。
从主菜单中打开Python 3:
在Python shell中,键入以下行,然后按Enter键: >>> import requests (注意 >>> 不是键入,而是表示shell输入)
您正在使用Python shell的REPL(Read-Eval-Print Loop),这意味着每一行都会立即执行,而不是写入一个文件,保存并一次运行所有命令 现在创建一个包含API的URL作为字符串的变量:http://api.open-notify.org/astros.json 输入以下内容,向API发出请求: r = requests.get(url) 现在只需键入 r 并按Enter键 ; 这与输入 print(r) 文件相同。REPL允许您以这种方式快速检查对象。您现在应该看到以下内容:
content
is_permanent_redirect
is_redirect
links
ok
text 这些属性本质上是一个对象内可访问的变量。例如, r.ok 是包含请求( True 或 False )的成功状态的变量。 通过在REPL中输入这些属性来尝试访问这些属性: >>> r.ok True >>> r.is_redirect False >>> r.text ‘{
“message”: “success”,
“number”: 6… 你会看到 r.text 似乎包含你需要的数据。然而,这被提供为使其难以使用的字符串。 观察 Methods defined here docstring 的部分,其中包括: json(self, **kwargs) Returns the json-encoded content of a response, if any. 这可以让您以JSON格式访问URL请求的内容,这将使其更有用。 一种方法是属于一个对象的函数。它以与属性相同的方式访问,但被称为像 () 例如函数 r.json() 输入 r.json() 。你应该看到: {‘number’: 6, ‘message’: ‘success’, ‘people’: [{‘craft’: ‘ISS’, ‘name’: ‘Mikhail Kornienko’}, {‘craft’: ‘ISS’, ‘name’: ‘Scott Kelly’}, {‘craft’: ‘ISS’, ‘name’: ‘Oleg Kononenko’}, {‘craft’: ‘ISS’, ‘name’: ‘Kimiya Yui’}, {‘craft’: ‘ISS’, ‘name’: ‘Kjell Lindgren’}, {‘craft’: ‘ISS’, ‘name’: ‘Sergey Volkov’}]} 将其另存为变量: j = r.json() 检查新变量的数据类型 type(j) >>> type(j)
添加LED
接下来,您将连接一些LED到Pi的GPIO引脚,并使用它们来代表一个人在空间。
首先使用公母对跳线将Pi的接地引脚连接到面包板,并添加一个电阻将其连接到地面导轨上:
现在将单个LED连接到您的面包板,将较短的腿(阴极)连接到地面导轨,并将较长的腿(阳极)放置在面包板的中间。然后使用公母对跳线将LED的行连接到Pi上的GPIO引脚2: 从GPIO Zero库导入LED类开始: >>> from gpiozero import LED LED 在引脚2上创建一个对象的实例: >>> led = LED(2) 尝试点亮LED: >>> led.on() LED现在应该点亮! 将第二个LED连接到引脚3:
以相同的方式将其余LED(总共10个)连接到连续的引脚(4,14,15,17,18,22,23,27)上:
确保您以前使用的针脚2上的LED已关闭: >>> led.close() 创建您使用的引脚号的列表: >>> pins = [2, 3, 4, 14, 15, 17, 18, 27, 22, 23] 使用这些引脚号创建LED列表: >>> leds = [LED(pin) for pin in pins] 这被称为列表理解:在一行中生成列表而不是使用传统的循环。 检查 leds 列表: >>> leds [
制作指示标
现在,您将使用LED显示当前在空间中的人数。
现在是把它们一起放在一个文件中的时候了。点击 File > New File 。 将您的文件保存为 astronauts.py 首先导入您使用的库: from gpiozero import LED import requests 添加LED设置: pins = [2, 3, 4, 14, 15, 17, 18, 27, 22, 23] leds = [LED(p) for p in pins] 添加 requests 代码: url = “http://api.open-notify.org/astros.json” r = requests.get(url) j = r.json() n = j[‘number’] 现在,而不仅仅是打印 n ,您可以使用它来确定应该点亮多少个LED。考虑以下循环: for led in leds: led.on() 这允许您依次访问每个LED。但是,我们需要知道什么时候我们应该停止这样做。 您需要能够比较 n 每个LED号码(序列中的顺序,而不是GPIO引脚号)的数字。您将需要使用该 enumerate 功能按顺序为每个LED分配一个数字。 enumerate 通过在shell中尝试它(而不是文件)来查看它的工作原理: >>> list(enumerate(leds)) [(0,
尝试用木头或纸板制作自己的指示器:
显示宇航员名字
最后,学习从API调用中获取宇航员名字。
当你最初检查了JSON对象时,它显示了所有的空间的人的名字以及数字。返回到Python shell并 j[‘people’] 从字典检查: >>> type(j[‘people’])
接下来是什么?
现在,您已经创建了一个带LED指示灯的People in Space Indicator,尝试扩展您的项目:
重要的日子
请注意国际空间站航天员计划交付和离职的以下日期:
2015 年 12月11日 – Oleg Kononenko,Kimiya Yui和Kjell Lindgren离开
年 – Oleg Kononenko,Kimiya Yui和Kjell Lindgren离开 2015 年 12月15日 – 蒂姆·皮克,尤里·马伦琴科和蒂莫西·科普拉抵达
年 – 蒂姆·皮克,尤里·马伦琴科和蒂莫西·科普拉抵达 2016 年 3月18日 – 阿列克谢Ovchinin,Oleg Skripochka和Jeffrey N. Williams到达
年 – 阿列克谢Ovchinin,Oleg Skripochka和Jeffrey N. Williams到达 2016 年 5月30日 – Anatoli Ivanishin,Takuya Onishi和Kathleen Rubins抵达
年 – Anatoli Ivanishin,Takuya Onishi和Kathleen Rubins抵达 2016 年 9月30日 – Sergey N. Ryzhikov,Andrei Borisenko和Robert S. Kimbrough到达
年 – Sergey N. Ryzhikov,Andrei Borisenko和Robert S. Kimbrough到达 2016年11月30日 – Oleg Novitskiy,Thomas Pesquet和Peggy Whitson抵达
转自 blog.lxx1.com