只要有想象力,打印机都能做游戏

不知道为什么,文本冒险游戏最近频频被人提及。这不,现在又出来一个基于实时打印的文本冒险游戏 —— Quest Smith。

这位脑洞较大的创客名叫 Bekir Dağ ,他用微型打印机和树莓派做出了这个手持游戏设备。

关于文本冒险游戏的背景知识:

1975年左右,程序员兼业余洞穴探险者 威尔·克劳瑟(Will Crowther)编写了第一个文本冒险游戏 —— Adventure。最初名为 ADVENT,因为在他使用的操作系统中,文件名不能超过六个字符,后来被命名为《巨大的洞穴冒险》 —— Giant Cave adventure。

玩家需要阅读周围环境的描述并从一组选项中进行选择,或者输入下一步并希望游戏能够理解玩家提及的内容。

Bekir Dağ 的创新之处是他把一个文本冒险游戏做成实时打印剧情了。玩家用 Yes 和No 两个按钮来决定游戏的走向 。

Quest Smith是个啥?

在柏林的一家游戏博物馆里,Bekir Dağ 看到了一个手持式游戏设备,于是他决定用树莓派 Zero W自己做一个。

他设计了Quest Smith 的躯壳,用3d绘图软件输出了 STL 文件并在
Thingiverse 网站上免费分享。

下载地址:

https://www.thingiverse.com/thing:3471217

树莓派 Zero W 与热敏打印机、电池和各种按钮紧密贴合在一起。由安装在外壳上的太阳能电池板供电,所有组件都连接到 TP4056 板,该板允许电池为树莓派供电。

硬件材料:

1、Raspberry Pi Zero Wireless 一个

2、GOOJPRT 热敏打印机一个

3、五伏电压升压模块 一个

4、 TP4056 板 一个

5、 18650电池 一个

6、瞬时触碰式开关

7、 Micro usb 转大口接头

8、螺钉 3.5 x 20毫米 四个

9、 滑动开关 一个

10、太阳能电池板60 x 60毫米 5.5V

另外要准备热熔枪、电烙铁和3D打印机。

相关的代码:

https://github.com/IoToutpost/quest_smith

1、系统需要安装的组件

sudo apt-get install libpython3-dev libpython3-stdlib libqt5printsupport5 php7.0-mbstring python3-rpi.gpio python-rpi.gpio python-setuptools python-dev build-essential

2、安装composer

步骤在此: https://getcomposer.org/download/

3、安装两个python库

pip install setuptools
pip install locustio

4、拉取代码

mkdir quest_smith
cd quest_smith
git clone git@github.com:bekirdag/quest_smith.git .
composer install

5、 在重新启动时,通过在crontab上添加一行来运行 Quest Smith 脚本

crontab -e
@reboot sudo /usr/bin/screen -dmS story-game /usr/bin/python3 /home/pi/thermal/push3.py

6、 再次向 crontab 添加另一行代码,以便在每次重启时更新软件,这样你的故事就会是最新的。

@reboot sudo cd /home/pi/quest_smith && sudo git pull origin master

Quest Smith 目前仍在开发中。虽然用户现在可以构建并开始玩这个游戏,但作者呼吁社区用户提交他们自己的故事(有好的分支剧情就发过去)。

Bekir Dağ 说:“每个关卡都需要两个版本的故事,这使得可能性呈指数级增长。所以一个人完成整个故事线对我来说是非常困难的。比如为了让玩家达到9级,我们需要编写1023个故事部分。如果你能帮我,那就太好了! ”

如果想看这个设备是怎么玩的点这里:

http://v.qq.com/x/page/y0846fbymnz.html

相关阅读:

Python写文本冒险游戏的要点

https://mp.weixin.qq.com/s/jtxOqDlYLt3VjdsnLXfdAg

新手可以在研究这篇文章的同时学会面向对象编程。

来自:Raspberrypi.org

编译:王文文

让相机根据GPS定位自动拍照

你是否厌倦了那种每到一个地方就要停下来摆pose的自拍?

但是在参观名胜古迹或知名景点的时候,还是希望能留下一些自己的照片做留念?

来看看一个名叫 Estefannie 的妹子发明了什么 —— 根据 GPS 定位来判断是否要拍照的GoPro相机。

具体是什么意思呢?有些妹子喜欢抓拍和自然拍摄,但要么走着走着错过关键景点,要么拍来拍去抓不到什么重点。让路人拍?人家也不一定愿意帮忙。

如果能有一个发现自己进入知名景点(指定地点)就自动拍照的装置,那就太省心了。旅途中的美好一个都不落下。

Estefannie 用Raspberry Pi 3、GPS模块、充电宝和带杆子的 GoPro,创建了PAGCPPT,可以在系统里预置伦敦各个景点的GPS坐标,到地方就自动触发拍摄。无需人工干预。

依靠尼龙搭扣和热胶,她把这个装置固定在背包上,然后又做了一些编程和设置,让她在城里晃悠的时候可以拍点照片。

白金汉宫到了,来一张

具体材料:

1、Raspberry Pi 3 Model B

2、GPS 模块 U-blox NEO-6M with 3m Active Antenna (STM32 51 )

3、PNY 7800 充电宝

4、 GoPro HERO 系列摄像头

5、GOPRO 3-way 三向摄像机手柄相机支架

硬件配置:

把 GPS 模块连接到树莓派上,树莓派通过 WiFi 向 GoPro 发送信号。

GPS:不用焊接,把GPS模块插到Raspberry Pi 的 USB 口上即可。

WiFi:打开 GoPro 的 WiFi ,让树莓派和它连接起来。WiFi SSD 由 GoPro App 配置。

树莓派:用那个充电宝供电。

都准备好了!你可以把 GoPro 手臂加到任何你想要的地方,比如旅行背包。

软件配置:

Estefannie 整理了一张她想去的伦敦景点(对应坐标)清单。然后用Python3写了一个脚本来计算她当前坐标和预置景点坐标之间的距离。

程序中比较关键的是 GoPro API库,基于这个库稍微做些开发,GoPro相机就可以在GPS预置地标(如塔桥、哈利波特魔法站台)半径10米以内的任何地方自动拍照。

你可以在树莓派上执行如下命令来安装它:

pip install goprocam

GPS的启动命令比较简单:

gpsd /dev/ttyACM0 -F /var/run/gpsd.sock

最后一步执行代码:

python3 /home/pi/LondonGPS.py 

代码地址:

https://github.com/IoToutpost/GoPro/

只要她打开电源(充电宝),她的树莓派就会在启动时运行脚本,并检查她的坐标。在预置景点内就自动拍照,从而满足 Estefannie 在游览名胜古迹时无需求人,也无需刻意摆造型就能拍到合适的照片。

当然,是妹子终究会有停下来认真拍照的时刻……比如这张。

项目作者 Estefannie 在纽约公立图书馆

相关视频链接:

http://v.qq.com/x/page/p0845yexsaw.html

素材:Raspberrypi.org
编译:王文文

Python写文本冒险游戏的要点

2019年伊始,游戏开发者Andrew Gillett在《Wireframe》杂志上介绍了如何用Python开发文本冒险游戏,以及在此过程中应该避免哪些陷阱。

最后他还给了一段示例代码,让人看完之后忍不住跃跃欲试。

文本游戏的形态

用BASIC语言编写游戏的经历

Andrew Gillett 写的第一款游戏叫做“Pooh”。

1982年9月,他4岁,ZX Spectrum 家用电脑刚刚发布,可以接到电视上玩游戏,这已经够不可思议的了,但它还内置了一种叫做 BASIC 的语言,以及一本讲解如何编程的手册。于是这便开启了他的创作生涯。

这个 BASIC 写成的游戏非常简单,玩家的任务是带一个婴儿去上厕所,没有障碍,也没有敌人,如果你试图走出屏幕(边界),该游戏进程将停止并弹出一条错误消息。婴儿和厕所都是用文本符号表示的。Andrew Gillett 当时不知道如何创建一个比 Pooh 更复杂的图形游戏。他甚至不知道如何在屏幕上显示有图形的角色。

文本冒险游戏

于是,Andrew Gillett 开始专注于编写文本冒险,即游戏用文字向玩家描述场景。

比如“你在一个舒适的隧道般的大厅中,你可以看到一扇门。”(这里在用1982年的《霍比特人》举例)

1982年的游戏《霍比特人》

玩家输入诸如“穿过门”或“用剑杀死妖精”等命令来推进游戏。

“虽然这款游戏相对来说比较容易编写,但我却以最糟糕的方式实现了它。这个游戏的代码本质上是一个巨大的IF语句列表。每个房间都有自己专门的一组代码,它们会打印出房间的描述,然后检查玩家输入了什么。这种‘硬编码’导致代码比实际需要的长得多,并且难于维护。” Andrew Gillett 说道。

正确的方法应该是将代码和数据分开。

每个房间有几组与之相关的数据,比如一个ID号码,空间的描述(你是在一个小山洞),一组可以在空间中找到的对象,以及一组空间的号码,这些号码表明如果玩家试图朝某个特定方向移动,他们将会到达哪里。

例如,如果玩家进入“北面” ,第一个号码可以显示玩家去具体哪个地方了。然后主程序会跟踪玩家当前所在的空间,并查找该空间对应的数据。有了这些数据,主程序就可以根据玩家输入的命令采取适当的行动。

来练个手

下面链接中的代码展示了如何在 Python 中实现文本冒险(入门)。

https://github.com/IoToutpost/Python_game

(注:以下内容基于上述链接的“text-adventure_original.py”)

用来演示的 Demo 中没使用数字 ID 和数组,而是使用了字符串 ID和字典数据结构。其中每一段数据都与一个ID或“键”相关联。

这是一个在 Spectrum BASIC 中没有提供的方便选项。

我们首先创建一个玩家可能移动的方向列表。然后创建指定每个位置的属性类 Location。我们存储名称、描述和字典数据结构,该结构存储当前位置,并链接到的其他位置。例如,如果你从树林向北走,你就会到达湖边。

该类包含一个名为 addLink 的方法,该方法在检查指定的方向和目的地存在后将条目添加到链接位置字典中。 

在类定义之后,我们创建一个名为 locations 的字典。它有两个条目,键是 woods 和 lake,值是 Location 类的实例。

接下来,我们在刚刚创建的每个位置上调用 addLink 方法,这样玩家就可以在它们之间行走。设置阶段的最后一步是创建变量 currentLocation,指定玩家从哪里开始游戏。

然后我们到达主游戏循环,它将无限重复。我们首先显示当前位置的描述,以及玩家移动的可用方向。然后我们等待玩家输入命令。

在这个版本的代码中,唯一有效的命令是方向。例如,在开始的位置键入“north”就可以来到湖边。当输入一个方向时,我们检查以确保它是当前位置的有效方向,然后将 currentLocation 更新到新位置。当主循环重新开始时,将显示新位置的描述。

写在最后

由于 Andrew Gillett 的原始版本比较抽象,为了帮助大家理解,IoT前哨站的 Medivh 和 Winter 在这个基础上写了中文版的 《回村》,大家可以拿回去自行拓展。

《回村》0.1版本

两个版本都放在 Github 上了,欢迎提建议。如果 Fork 了更有意思的版本,记得通知我们。

原文:Building a text adventure

来自:Wireframe 第6期

编译:王文文

转载请注明出处。

怕智能音箱泄漏隐私?给它种个“小蘑菇”

作者:长空无名

自从亚马逊Echo大热之后,喜欢智能音箱的人渐渐多了起来。

包括国内的天猫精灵和小米小爱,用的人也不少。

但随之而来的隐私泄露问题又来了,音箱总是在收听状态,一不小心把私人谈话传播出去怎么办?

2018年5月,西雅图当地媒体KIRO7称,在美国俄勒冈州波特兰市的一个家庭中,放置在室内的 亚马逊 Echo 记录了用户在家中的谈话,并将此对话发给了该用户电话簿中的某联系人。

尽管亚马逊和谷歌始终强调他们的智能音箱并不会收集用户对话,只是为了监听特定的唤醒词以便于随时待命,但谁也不能保证一个全天候开机的麦克风不会误录隐私信息。

于是各大厂商又纷纷给音箱加上硬件开关,但这来回开关总有忘记的时候。且不说洗衣服做饭如厕的时候,物理接触也不方便。

还有更好的办法吗?

让我们来看看 “ Project Alias ”。

这个项目的宗旨就是在不用物理接触的情况下,给智能音箱加个“声音开关”。

原理:通过扬声器不断播放“白噪音”阻止麦克风的聆听功能,直到用户说出唤醒词,Project Alias才会中止这种持续的噪音,让用户和智能音箱进行真正的交互。

目前Project Alias仅适用于Google Home和亚马逊Echo两款智能音箱,但该项目团队已经把相关设计文件和代码都公布了,世界各地的创客可以根据这些来给其他品牌的智能音箱量身定做类似的“小蘑菇”。

相关设计文件下载地址:https://www.instructables.com/id/Project-Alias/

相关代码(欢迎参与和维护该项目):

https://github.com/bjoernkarmann/project_alias

硬件清单:

1、树莓派3A+
2、ReSpeaker双麦克风扩展卡
3、 两个16毫米小型扬声器
4、 JST 2.0连接器或老的Jack接头
5、 4个螺丝
6、 一些电线
7、“蘑菇”外壳

制作流程:

1、首先你要有个树莓派,安装好Raspbian系统后,启用SSH并联网。

2、安装ReSpeaker麦克风驱动、TensorFlow、Keras以及其他依赖的软件Flask、Flask-SocketIO、python_speech_features等。

3、搭建好一切软件环境并部署程序后,用手机浏览器打开树莓派的5050端口,对它喊4-6次名字训练它,这个“小蘑菇”就能识别出你的声音了。

Project Alias曾被创建者描述为“寄生虫”(parasite),但我倒是觉得它更像一个“保镖”,为我们的智能生活增添了一份安全感。

相关视频链接:http://v.qq.com/x/page/d0832qrsj5x.html

树莓派北美团队 vs 树莓派驱动的“密室逃脱”

作者:Christina Foust

编译:IoT前哨站

几天前,树莓派北美团队在旧金山体验了一个非常特别的,由树莓派驱动的密室逃脱店。

这就是由Palace Games运营的一个充满灯光、传感器和大量惊喜体验的“爱迪生密室”。

以下是关于我们如何进入、探索并最终逃离这个房间的经过。

在今年的世界创客大会(World Maker Faire)上,我们的社交媒体明星亚历克斯•贝特(Alex Bate)遇到了乔丹•邦克(Jordan Bunker),他是制作Palace Games的艺术家之一。

经过电子邮件的连番轰炸后,树莓派北美团队订好日期,“直面交锋”爱迪生密室!

密室逃脱

“密室逃脱”是一种物理世界的冒险游戏,玩家通过线索、逻辑和策略来解决一系列的谜题和谜语,从而完成游戏的目标。许多密室逃脱设计师使用实体互动装置来控制玩家体验中涉及的众多传感器和触发器。

树莓派北美团队 vs 爱迪生密室

进入爱迪生密室后,我和我的团队很快意识到自己身处一个像巨型计算机一样的复杂系统中!所以即使这是我们第一次玩密室逃脱,也不是一个劣势。

(小编语:难道你们很擅长巨型计算机?)

我们的目标是完成各种任务。包括解决许多谜题,在任何事情中寻找隐藏的线索,完成电路,移动地板,并进行一些试验。

然而,真正的考验是我们之间的沟通和合作 —— 我们在这方面做得非常出色!

我们做了分工,以便有效地找出不同的谜题和线索,大家不停的在房间里大喊:“试试这样做”,“也许它是这个意思”,“如果它应该那样做呢?”

当我们完成最后一个挑战并最终逃脱时,我们欣喜若狂!每个人都戴上了爱迪生思维帽。

内部机制

逃离密室后,我们有机会去幕后一探究竟。

我们发现了一个由多个树莓派组成的本地网络,这些Pi由一个中心服务器(也是树莓派)协调。而Python写的Banyan框架(The Python Banyan framework)是树莓派及其附属组件之间的连接关键。

该框架帮助Pi和中心服务器之间的内网通信。树莓派被用来读取各种类型的传感器,控制灯光、开门或播放音乐。上面还跑着一个用来让工作人员设置和跟踪游戏的控制面板。

“树莓派让我们进步,它是我们密室的核心和灵魂。” ——伊丽莎白·桑德,密室设计师兼产品经理说道。

我们强烈推荐你去Palace Games(https://palace-games.com/)玩一个密室。这是一种很好的团建方式,可以让你了解和你一起工作的人。最后感谢Palace Games团队对我们的接待,希望不久以后能再回去探索他们的密室!

为避免重新洗衣服而做的降雨报警机

没有什么比刚晾干的衣服更舒服了,除非一场突如其来的阵雨把一切都毁了。

从一名家庭成员那里听到:“下雨了!”,然后紧接着是楼梯上雷鸣般的脚步声。

这样的话太惨了。

想要拯救你最好的周日时光,免于再一次去洗衣房的痛苦吗?

看看这个小东西。

当雨点开始时,这个简单的设备就会在你的手机检测到雨点时发出警报。不需要焊接,只需要几根电缆。借助低功耗电路板和WiFi,我们能做出一个基于Raspberry Pi Zero W的完美项目。

测雨器需要的组件:

2个雨水传感器板和一个控制器
面包板
充电宝
密封小食品容器
跳线
树莓派 Zero w

核心代码:

from gpiozero import DigitalInputDevice
from time import sleep
import http.client, urllib.parse

# Some setup first:
APP_TOKEN = ‘YOUR_PUSHOVER_APP_TOKEN’ # The app token – required for Pushover
USER_TOKEN = ‘YOUR_PUSHOVER_USER_TOKEN’ # Ths user token – required for Pushover

# Set up our digital input and assume it’s not currently raining
rainSensor = DigitalInputDevice(17)
dryLastCheck = True

# Send the pushover alert
def pushover(message):
print(message)
conn = http.client.HTTPSConnection(“api.pushover.net:443”)
conn.request(“POST”, “/1/messages.json”,
urllib.parse.urlencode({
“token”: APP_TOKEN, # Insert app token here
“user”: USER_TOKEN, # Insert user token here
“title”: “Rain Detector”,
“message”: message,
}), { “Content-type”: “application/x-www-form-urlencoded” })
conn.getresponse()

# Loop forever
while True:

# Get the current reading
dryNow = rainSensor.value
print(“Sensor says: ” + str(dryNow))

if dryLastCheck and not dryNow:

pushover(“It’s Raining!”)

elif not dryLastCheck and dryNow:

pushover(“Yay, no more rain!”)

# Remember what the reading was for next check
dryLastCheck = dryNow

# Wait a bit
sleep(5)

在做其他事情之前,在SD卡上安装一个Raspbian Stretch Lite(我们不需要桌面),然后插入到Pi中。确保已启用SSH访问。执行sudo apt更新和升级的常规程序,然后重启,检查SSH连接,然后关机。

将传感器安装到盖子上:

你可以使用任意数量的传感器,但是两个就可以了。用保温层或管道胶带将两块板固定在盖子上。

注:3d打印外壳图片(STL文件可从这里得到)。

需要连接两对跳线;每个传感器板一个,极性无关紧要。电缆的另一端必须穿入容器内,所以在适当的地方尽可能地挖一个小洞,这样电线才能通过,从而减少水进入的机会。

将传感器连接到控制器

为了让树莓派明白发生了什么,一个小的控制板(与传感器一起提供)是必需的。这就把被水短路的小电流转换成数字信号。利用面包板,将传感器上的两对导线并联起来(这样两个传感器都可以构成电路),然后将控制器的接收引脚(带有两个连接器的一侧)插入到面包板上,使每个引脚与传感器上的一根导线相连。

连接控制器

为了完成我们的电路,仔细看看控制板上的四个引脚。它们将被标记为A0、D0、GND和VCC。

使用一些跳线,将控制器与Pi连接如下:

VCC到GPIO pin 2 (5v),

GND到GPIO上的任何GND(例如pin 6),

D0到GPIO 17 (pin 11)。

D0和A0是传感器读取输出的两种不同方式。D0是一个直接的数字开关,阈值由板子上的可变电阻控制。A0是一个模拟输出(当转换为数字时),范围在0到1024之间,取决于雨的强度。

装配雨探测器

把充电宝接上树莓派,然后放进容器。理想情况下,东西不应该移动,所以要用胶带或大头针把所有东西都固定好。

你现在应该可以把所有东西都密封在容器里了,连接传感器板的电线不会被挤压或变形。一旦你高兴,打开它并连接电源,然后再次关闭它并检查你的连接。确保充电宝能给树莓派至少几个小时的电力。

检测软件

在这个特性的末尾添加脚本,并将其保存为rainbot.py(或从GitHub下载)到一个方便的位置,比如~/pi/rainbot。一旦就位,通过运行python3 ~/pi/rainbot/rainbo.py来执行一个初始测试。你应该每五秒钟就会看到一个读数:

如果是干的,是“真”;如果是湿的,是“假”。按CTRL+C停止脚本。

Pushover:在你的手机上获取降雨警报

为了获得提醒,我们将使用Pushover,这是一个向智能手机推送消息的服务(有七天的免费试用)。

注册pushover.net后,你将看到一个“用户密钥”,把这个复印一份。按照说明创建一个“应用程序令牌”。

编辑脚本,把现有的API键值替换成你自己的(在提示的地方),然后在你的手机安装了“pushover”程序。

再次运行脚本。把其中一块感应板稍微弄湿。控制器上应该亮一盏灯。如果一切正常,几秒钟后你的手机就会显示一个警报。

自动运行雨探测器

让我们设置脚本在启动时运行。 作为超级用户创建以下文件:

sudo nano /lib/systemd/system/rainbot.service
填入:

[Unit]
Description=Rainbot
After=multi-user.target

[Service]
Type=idle
ExecStart=/usr/bin/python3 /home/pi/rainbot/rainbot.py

[Install]
WantedBy=multi-user.target

按CTRL+X保存并退出nano。

然后输入以下命令:

sudo chmod 644 /lib/systemd/system/rainbot.service
sudo systemctl enable rainbot.service
sudo systemctl daemon-reload
重新启动树莓派。脚本将在重新启动时运行(尽管您不会看到任何输出)。再用水测试一下。

为你的雨天探测器做改进

Pushover很方便,而且可以很容易地替换为任何你喜欢的函数。检查的频率可以改变(目前是每五秒一次)。或者把模拟电路改成数字电路,然后用A0输出来测量雨下得有多大。

如果你开始记录这些数据,这对气象站项目来说也是一个很好的起步。你还可以增加一个使用后安全关闭树莓派的按钮。

编程计算加油轮次 —— 外国人是怎么省油的

我最近在开一辆烧 93 号汽油的车子。根据汽车制造商的说法,它只需要加 91 号汽油就可以了。然而,在美国只能买到 87 号、89 号、93 号汽油。而我家附近的汽油物价水平是每增加一号,每加仑就要多付 30 美分,因此如果加 93 号汽油,每加仑就要多花 60 美分。为什么不能节省一些钱呢?

一开始很简单,只需要先加满 93 号汽油,然后在油量表显示油箱半满的时候,用 89 号汽油加满,就得到一整箱 91 号汽油了。但接下来就麻烦了,剩下半箱 91 号汽油加上半箱 93 号汽油,只会变成一箱 92 号汽油,再接下来呢?如果继续算下去,只会越来越混乱。这个时候 Python 就派上用场了。

我的方案是,可以根据汽油的实时状态,不断向油箱中加入 93 号汽油或者 89 号汽油,而最终目标是使油箱内汽油的号数不低于 91。我需要做的是只是通过一些算法来判断新旧汽油混合之后的号数。使用多项式方程或许也可以解决这个问题,但如果使用 Python,好像只需要进行循环就可以了。

#!/usr/bin/env python

# octane.py

o = 93.0

newgas = 93.0 # 这个变量记录上一次加入的汽油号数

i = 1

while i < 21: # 20 次迭代 (加油次数)

    if newgas == 89.0: # 如果上一次加的是 89 号汽油,改加 93 号汽油

        newgas = 93.0

        o = newgas/2 + o/2 # 当油箱半满的时候就加油

    else: # 如果上一次加的是 93 号汽油,则改加 89 号汽油

        newgas = 89.0

        o = newgas/2 + o/2 # 当油箱半满的时候就加油

    print (str(i) + ‘: ‘+ str(o))

    i += 1

在代码中,我首先将变量 o(油箱中的当前混合汽油号数)和变量 newgas(上一次加入的汽油号数)的初始值都设为 93,然后循环 20 次,也就是分别加入 89 号汽油和 93 号汽油一共 20 次,以保持混合汽油号数稳定。

1: 91.0

2: 92.0

3: 90.5

4: 91.75

5: 90.375

6: 91.6875

7: 90.34375

8: 91.671875

9: 90.3359375

10: 91.66796875

11: 90.333984375

12: 91.6669921875

13: 90.3334960938

14: 91.6667480469

15: 90.3333740234

16: 91.6666870117

17: 90.3333435059

18: 91.6666717529

19: 90.3333358765

20: 91.6666679382

从以上数据来看,只需要 10 到 15 次循环,汽油号数就比较稳定了,也相当接近 91 号汽油的目标。这种交替混合直到稳定的现象看起来很有趣,每次交替加入同等量的不同号数汽油,都会趋于稳定。实际上,即使加入的 89 号汽油和 93 号汽油的量不同,也会趋于稳定。

因此,我尝试了不同的比例,我认为加入的 93 号汽油需要比 89 号汽油更多一点。在尽量少补充新汽油的情况下,我最终计算到的结果是 89 号汽油要在油箱大约7/12满的时候加进去,而 93 号汽油则要在油箱1/4满的时候才加进去。

我的循环将会更改成这样:

if newgas == 89.0:

    newgas = 93.0

    o = 3*newgas/4 + o/4

else:

    newgas = 89.0

    o = 5*newgas/12 + 7*o/12

以下是从第十次加油开始的混合汽油号数:

10: 92.5122272978

11: 91.0487992571

12: 92.5121998143

13: 91.048783225

14: 92.5121958062

15: 91.048780887

如你所见,这个调整会令混合汽油号数始终略高于 91。当然,我的油量表并没有 1/12 的刻度,但是 7/12 略小于 5/8,我可以近似地计算。

一个更简单地方案是每次都首先加满 93 号汽油,然后在油箱半满时加入 89 号汽油直到耗尽,这可能会是我的常规方案。就我个人而言,这种方法并不太好,有时甚至会产生一些麻烦。但对于长途旅行来说,这种方案会相对简便一些。有时我也会因为油价突然下跌而购买一些汽油,所以,这个方案是我可以考虑的一系列选项之一。

当然最重要的是:开车不写码,写码不开车!

via: https://opensource.com/article/18/10/python-gas-pump

作者:Greg Pittman 译者:HankChow 校对:wxy 编译:Linux.cn

一些实用的Python开发资料

Python是一种广泛使用的高级编程语言,由Guido van Rossum创造,第一版发布于 1991 年。Python 的设计哲学强调了代码的可读性和简洁的语法。随着物联网、大数据的兴起,越来越多的人开始研究起这门语言。

【Kaggle的免费Python教程】

Python – Learn the most important language for Data Science

https://www.kaggle.com/learn/python

英文,免费,偏向于数据科学方向。

××××××××××××××××××××××××××××××××××

【廖雪峰的Python3教程】

https://www.liaoxuefeng.com/wiki

/0014316089557264a6b348958f449949df42a6d3a2e542c000

中文,免费,零起点,完整示例,基于最新的Python 3版本。

××××××××××××××××××××××××××××××××××

【Python轻量级Web框架Flask教程】

http://flask.pocoo.org/docs/1.0/

英文,官方,零起点。

××××××××××××××××××××××××××××××××××

【Python 资源大全中文版】

https://github.com/jobbole/awesome-python-cn

我想很多程序员应该记得 GitHub 上有一个 Awesome – XXX 系列的资源整理。awesome-python 是 vinta 发起维护的 Python 资源列表,内容包括:Web 框架、网络爬虫、网络内容提取、模板引擎、数据库、数据可视化、图片处理、文本处理、自然语言处理、机器学习、日志、代码分析等。由伯乐在线持续更新。

Awesome 系列虽然挺全,但基本只对收录的资源做了极为简要的介绍,如果有更详细的中文介绍,对相应开发者的帮助会更大。这也是我们发起这个开源项目的初衷。

用树莓派构建一个婴儿监视器

香港很湿热,即便是晚上,许多人为了更舒适,在家里也使用空调。当我的大儿子还是一个小婴儿的时候,他卧室的空调还是需要手动控制的,没有温度自动调节的功能。它的控制器只有开或者关,让空调整个晚上持续运行会导致房间过冷,并且也浪费能源和钱。

我决定使用一个基于树莓派的物联网解决方案去修复这个问题。后来我进一步为它添加了一个婴儿监视器插件。在这篇文章中,我将解释我是如何做的,它的代码在 我的 GitHub 页面上。

设计空调控制器

解决我的问题的第一个部分是使用了一个 Orvibo S20 可通过 WiFi 连接的智能插头和智能手机应用程序。虽然这样可以让我通过远程来控制空调,但是它还是手动处理的,而我希望尝试让它自动化。我在 Instructables 上找到了一个满足我的需求的项目:他使用树莓派从一个AM2302 传感器上测量附近的温度和湿度,并将它们记录到一个 MySQL 数据库中。

使用压接头将温度/湿度传感器连接到树莓派的相应 GPIO 针脚上。幸运的是,AM2302 传感器有一个用于读取的 开源软件,并且同时提供了 Python 示例。

与我的项目放在一起的用于 AM2302 传感器 接口的软件已经更新了,并且我使用的原始代码现在应该已经过时了,停止维护了。这个代码是由一个小的二进制组成,用于连接到传感器以及解释读取并返回正确值的 Python 脚本。

将传感器连接到树莓派,这些 Python 代码能够正确地返回温度和湿度读数。将 Python 连接到 MySQL 数据库很简单,并且也有大量的使用 python-mysql 绑定的代码示例。因为我需要持续地监视温度和湿度,所以我写软件来实现这些。

事实上,最终我用了两个解决方案,一是作为一个持续运行的进程,周期性(一般是间隔一分钟)地获取传感器数据,另一种是让 Python 脚本运行一次然后退出。我决定使用第二种方法,并使用 cron 去每分钟调用一次这个脚本。之所以选择这种方法的主要原因是,(通过循环实现的)持续的脚本偶尔会不返回读数,这将导致尝试读取传感器的进程出现堆积,最终可能会导致系统挂起而缺乏可用资源。

我也找到了可以用程序来控制我的智能插头的一个 Perl 脚本。它是解决这种问题所需的一部分,因此当某些温度/湿度达到触发条件,将触发这个 Perl 脚本。在做了一些测试之后,我决定去设计一个独立的 checking 脚本,从 MySQL 去拉取最新的数据,然后根据返回的值去设置智能开关为开或关。将插头控制逻辑与传感器读取脚本分开,意味着它们是各自独立运行的,就算是传感器读取脚本写的有问题也没事。

配置一个打开/关闭空调的温度值是很有意义的,因此,我将这些值转移到控制脚本读取的配置文件中。我也发现,虽然传感器的值一般都很准确,但是,偶尔也会出现返回不正确读数的情况。这个传感器脚本被修改为不向 MySQL 数据库中写入与前值差异非常大的值。同样也在配置文件中写入了连续读取的温度/湿度之间允许的最大差异值,如果读取的值处于这些限制值以外,这些值写不会提交到数据库中。

虽然,做这个自动调节器似乎花费了很多努力,但是,这意味着,记录到 MySQL 数据库的数据是有效的、可用于进一步去分析识别用户使用模式的有用数据。可以用多种图形方式去展示来自 MySQL 数据库中的数据,而我决定使用 Google Chart 在一个 Web 页面上显示数据。

添加一个婴儿监视摄像头

树莓派开放的性能意味着我可以不断地为它增加功能 —— 并且我有大量的未使用的可用 GPIO 针脚。我的下一个创意是去添加一个摄像头模块,将它放在孩子的卧室中,配置它去监视婴儿。

我需要一个能够在黑暗环境中工作的摄像头,而 Pi Noir 摄像头模块是非常适合这种条件的。Pi Noir 除了没有红外过滤之外,同样也是树莓派常用的摄像头模块。这意味着它在白天时的图像可能有点偏紫色,但是它可以在黑暗中借助红外灯来显示图像。

现在我需要一个红外光源。由于树莓派非常流行,并且进入门槛很低,因此它有大量的外围配件和插件。也有适合它的各种红外光源,我注意到的其中一个是 Bright Pi。它可以从树莓派上供电,并且它很适合为树莓派的摄像头模块提供红外光和普通光。它唯一的缺点是太考验我的焊接技能了。

我的焊接技能还是不错的,但是可能花费的时间比其他人更长。我成功地连接了外壳上所有的红外 LEDs,并将它们连接到树莓派的 GPIO 针脚上。这意味着树莓派能够编程控制红外 LED 是否点亮,以及它的亮度。

通过一个 Web 流去公开捕获的视频也很有意义,因为这样我就可以从 Web 页面上查看温度和湿度的读数图表。进一步研究之后,我选择了一个使用 M-JPEG 捕获器的 流软件。通过 Web 页面公开 JPG 源,我可以在我的智能手机上去连接摄像头查看程序,去查看摄像头的输出。

做最后的修饰

没有哪个树莓派项目都已经完成了还没有为它选择一个合适的外壳,并且它有各种零件。在大量搜索和比较之后,有了一个显然的 赢家:SmartPi 的乐高积木式外壳。乐高的兼容性可以让我去安装温度/湿度传感器和摄像头。下面是最终的成果图:

在这以后,我对我的这个作品作了一些改变和更新:

    • 我将它从树莓派 2 Model B 升级到了树莓派 3,这意味着我可以使用 USB WiFi 模块。
    • 我用一个 TP-Link HS110 智能插头替换了 Orvibo S20。
    • 我也将树莓派插到了一个智能插头上,这样我就可以远程重启/重置它了。
    • 我从树莓派上将 MySQL 数据库移走了,它现在运行在一个 NAS 设备上的容器中。
    • 我增加了一个非常 灵活的三角夹,这样我就可以调整到最佳角度。
    • 我重新编译了 USB WiFi 模块,禁用了板载 LED 指示灯,这就是升级到树莓派 3 的其中一个好处。
    • 我因此为我的第二个孩子设计了另外一个监视器。
    • 因为没有时间去折腾,我为我的第三个孩子购买了夜用摄像头。

想学习更多的东西吗?所有的代码都在 我的 GitHub 页面上。

(https://github.com/jervine/rpi-temp-humid-monitor)

想分享你的树莓派项目吗?将你的故事和创意发送给我们。

via: https://opensource.com/article/18/3/build-baby-monitor-raspberry-pi
作者:Jonathan Ervine 译者:qhwdw 校对:wxy 来自:Linux中国

Python 推出新一代 PyPI 发布站点 —— Warehouse

PyPI 团队的成员 Sumana Harihareswara 发表博客表示,Python 已推出新的 PyPI 网站(Python 的官方第三方软件存储库),浏览器流量和 API 调用(包括”pip install”)已从旧版 pypi.python.org 重定向到新网站,而旧的 PyPI 网站将于 4 月 30 日关闭。

不过现在旧的代码库在 https://legacy.pypi.org 上仍然可用。

目前,权威的 PyPI(Python Package Index) 地址是:https://pypi.org/,使用了新的 Warehouse 代码库。

https://pypi.org 测试版早于 3 月 26 日已提供,到 4 月 16 日正式推出,而旧的 PyPI 网站 https://legacy.pypi.org 则计划于 4 月 30 日关闭,pypi.python.org 则继续重定向至新网站。

有关更多详细信息,请参阅路线图:https://wiki.python.org/psf/WarehouseRoadmap

如果你仍在使用 pypi.python.org,现在开始应该迁移至使用 pypi.org,迁移指南:https://warehouse.readthedocs.io/api-reference/integration-guide/#migrating-to-the-new-pypi