Pi Dashboard:给你的派装一个仪表盘

2020.3.21 更新:树莓派安装 Nginx + PHP7.3 + Pi Dashboard

2018.4.25 更新:树莓派安装 Nginx + PHP7.0 + Pi Dashboard

Pi Dashboard (Pi 仪表盘) 是树莓派实验室发布的一款开源的 IoT 设备监控工具,目前主要针对树莓派平台,也尽可能兼容其他类树莓派硬件产品。你只需要在树莓派上安装好 PHP 服务器环境,即可方便的部署一个 Pi 仪表盘,通过炫酷的 WebUI 来监控树莓派的状态!

目前已加入的监测项目有:

CPU 基本信息、状态和使用率等实时数据

内存、缓存、SWAP分区使用的实时数据

SD卡(磁盘)的占用情况

实时负载数据

实施进程数据

网络接口的实时数据

树莓派IP、运行时间、操作系统、HOST 等基础信息

项目主页:http://make.quwj.com/project/10

GitHub地址:https://github.com/nxez/pi-dashboard

视频预览

安装方法

安装共2步,首先安装 Nginx(或 Apache)和 PHP。然后在 Nginx 目录通过 SFTP 或 GitHub 部署好本项目的程序。

1.安装 Nginx 和 PHP

在 Pi 的终端运行以下命令。

sudo apt-get update sudo apt-get install nginx php5-fpm php5-cli php5-curl php5-gd php5-mcrypt php5-cgi sudo service nginx start sudo service php5-fpm restart

如果安装成功,可通过 http://树莓派IP 访问到 Nginx 的默认页。Nginx 的根目录在 /var/www/html 。

进行以下操作来让 Nginx 能处理 PHP。

sudo nano /etc/nginx/sites-available/default

将其中的如下内容

location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; }

替换为

location / { index index.html index.htm index.php default.html default.htm default.php; } location ~ .*\.php(\/.*)*$ { #fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; set $real_script_name $fastcgi_script_name; if ($fastcgi_script_name ~ “(.+?\.php)(/.*)”) { set $real_script_name $1; set $path_info $2; } fastcgi_param SCRIPT_FILENAME $document_root$real_script_name; fastcgi_param SCRIPT_NAME $real_script_name; fastcgi_param PATH_INFO $path_info; }

Ctrl + O 保存再 Ctrl + X 退出。

sudo service nginx restart

最后重启 Nginx 即可,以上步骤在树莓派 Zero + Linux version 4.9.41+ 系统版本上测试通过。

对在树莓派上部署 LNMP 有兴趣可以参考实验室更详细的介绍《树莓派搭建LNMP环境》。

2.部署 Pi Dashboard

这里介绍两种方法将 Pi Dashboard 部署在 Nginx 上。

2.1. SFTP 上传

在 GitHub 下载本项目源码。通过 FileZilla 等 FTP 软件将解压出来的目录上传到树莓派的 /var/www/html 目录下。

那么可以通过 http://树莓派IP/pi-dashboard 访问部署好了的 Pi Dashboard。

如果页面无法显示,可以尝试在树莓派终端给源码添加运行权限,例如你上传之后的路径是 /var/www/html/pi-dashboard ,则运行。

cd /var/www/html sudo chown -R www-data pi-dashboard

2.2. GitHub 部署

如果你了解过 GitHub 的基本操作,通过 GitHub 来下载本项目到 Pi 上会相当方便。

cd /var/www/html sudo git clone https://github.com/nxez/pi-dashboard.git

即可通过 http://树莓派IP/pi-dashboard 访问部署好了的 Pi Dashboard。

同样如果页面无法显示,可以尝试在树莓派终端给源码添加运行权限,例如你上传之后的路径是 /var/www/html/pi-dashboard ,则运行。

cd /var/www/html sudo chown -R www-data pi-dashboard

以上步骤在树莓派 Zero + Linux version 4.9.41+ 系统版本上测试通过。

常见问题

Q:Pi Dashboard 的 WebUI 支持在哪些终端上查看?

A:任何带有浏览器的终端都可以查看,无论是在内网还是外网的电脑、Pad或是智能手机上。Pi Dashboard 对不同的设备做了响应式布局,能很好兼容手机浏览。

Q:我没法通过外网IP访问到怎么办?

A:国内很多地区的ISP都不提供独立的外网IP了,可以通过花生壳等工具实现外网访问。对于已有外网独立IP的用户,可以尝试把 Nginx 服务端口从 80 改成其他端口号,再在 IP 地址后添加端口号访问。这是因为国内ISP普遍禁用了80端口。

Q:我有一个域名,如何将域名绑定到树莓派上?

A:可以参考DNSPod动态IP解析更新程序和树莓派搭建LNMP环境。将域名指向树莓派IP后需要修改 Nginx 网站配置的 servername 这项为你的域名即可。

Q:使用遇到问题可以提供技术支持吗?

A:可以加树莓派实验室Q群 549418432 和其他用户交流获得协助。

使用条款

本项目是开源项目,NXEZ.com 保留作为发起者的权利。

允许在 GPL v3.0 协议下对项目进行使用。请务必在保证项目的出处、声明、超链接等内容完整。

完善计划

欢迎有兴趣的朋友通过 GitHub 参与到本项目的完善。下面是项目后续完善的几个方向。

全新配置 HiFiBox DAC + Volumio 2.X 系统

之前《全新配置 HiFiBox DAC + Volumio 1.55 系统》一文介绍了在树莓派上安装 HiFi DAC + Volumio 1.55 的方法。目前 Volumio 2.x 已经趋于成熟,没有困扰顺畅使用的各种兼容性问题了。

加上最近部分 HiFiBox DAC 用户对 Volumio 2.x 的安装还有些疑问,我们专门整理一篇作一个介绍。同时我们也更新了一份说明书,点这里下载(v1.1)(11MB),点这里下载(v1.0)(6MB)。

首先,Volumio 2.x 不再需要手工修改 config.txt 等配置文件。刷好系统,有线或 WIFI 连入路由器之后,就可以通过IP或者直接浏览器输入 http://volumio.local 访问 Volumio 的 WebUI。

在右上角设置菜单中“Playback Options”菜单中可设置音频输出设备,设置音频输出设备。HiFiBox DAC 需开启 I2S DAC,再分别选择 DAC Model 和 Output Device 为 HiFiBox DAC,保存。需要重新启动系统使设置生效。(如没有 HiFiBox DAC 这项,选择 Hifiberry DAC Plus 效果完全一样。)

因直接在 volumio.org 官方下载不需要额外配置即可使用,所以我们不再提供添加任何配置的系统IMG。各版本下载链接请参考这里。 保存并重启即可让播放器通过 HiFiBox DAC 输出音频了!

更多有关树莓派 HiFi 相关的内容请参考这里:

HiFi DAC V1.1:https://shumeipai.nxez.com/hifidac-hat-for-raspberry-pi

HiFi DAC V1.0:https://shumeipai.nxez.com/hifibox-dac-hat-for-raspberry-pi#expert

家具变智能:用HomeKit+Siri声控家里电器

无需焊接、不用拆,只需要跟着步骤操作,30 分钟后,让Siri为你管理家电。文中视频演示了房间里有两盏宜家的台灯,我现在可以通过Siri,用语音来控制灯的开关、颜色变换,还可以用 iPhone 原生的「家居」应用,通过上滑调出控制中心进行操作,大大减少了打开其他应用的时间。

一些成果

在文章开始之前,我想先展示目前一些突破性的成果(优酷视频):

视频地址:http://v.youku.com/v_show/id_XMjUzMDQ3MDE4NA==.html

房间里有两盏宜家的台灯,我现在可以通过Siri,用语音来控制灯的开关、颜色变换,还可以用 iPhone 原生的「家居」应用,通过上滑调出控制中心进行操作,大大减少了打开其他应用的时间。

工作原理:

米家(小米智能家居)设备:作为连接普通家具的媒介;

米家多功能网关+树莓派:网关是控制设备的中枢,树莓派则是为网关加入苹果家居(HomeKit)所需要的 homebridge 插件,它更像是一个 Apple TV 的枢纽的作用;

支持 iOS 10 的设备:目前只有 iOS 10 支持原生的「家居」应用;

Yeelight:调节灯泡亮度,变化颜色,我们知道,要达成这两点,要求的就不是插座那么简单,是硬件上的问题了

​一点想法

智能家居门槛过高

止步于高昂的售价和不完整的功能

苹果发布 HomeKit 也有两年了,当时就有改造房间的想法,奈何我果高冷,支持的设备寥寥无几,在今年的 CES 上,支持的设备也不过 100 款左右,甚至被媒体评论道「不敌亚马逊 Alexa 」。在官方网站上看来,厂商水准也参差不齐, 看着确实捉急。

好了说了这么多,最重要是价格不菲,产品单价普遍四位数,怎么玩?

连接只是小问题

更需要的是真正的智能

很多品牌和厂商还是研发出了很多智能设备,通过自家的应用软件平台实现了所谓的「智能起居」。

然而文明的发展就是从「不满足」开始的,只能凭软件去控制未免有点本末倒置,变得有点像是机器在操控人类,于是,实现人与设备同步,而不是软件同步就变得尤为重要。

现在 就让 Siri 成为你的智能管家

Jarvis ,《钢铁人》里 Tony Stark 的管家,应该就是人们最容易理解的人工智能了, 苹果和谷歌等大腕也争相推出了自己的机器人,目前最多人用的大概就是 Siri 了吧。

下面就开始实现通过 Siri 声控家里的普通电器吧!

购买清单​

虽然过程非常简单,但是该买的还是得买,这里是一些需要用到的硬件,有的应该是家里就会有,按照个人需求购买

※ 支持 iOS10 的苹果设备( iPhone 5 以上、 iPad mini 2 以上、 iPod 第六代以上,官网提供资料)

● 搭载安卓系统的设备(用于获取网关局域网的协议密码, iPhone 的米家 APP 上最近无法操作,也可以用PC模拟器,参考价格:随便找人借电话就好了)

※ 小米多功能网关二代( *注意:一定要二代!米家商城有一款「 Aqara 空调伴侣」附加了红外功能,但是不确定是不是二代,参考价格: RMB 149 )

※ 任意一个或多个支持 HomeKit 的设备:小米智能插座 ZigBee 版(√)、小米人体传感器(√) 、小米门窗传感器(√) 、小米温湿度传感器(√) 、Yeelight智能灯泡(√) 、 Aqara 墙壁开关( *其中「√」为已测试可用的设备,墙壁开关需要更换面板,动手能力强可以尝试,另外关于智能插座,一定要是 ZigBee 版,基础版目前暂时不支持,参考价格: RMB 49 起)

​※ Raspberry Pi 3B (树莓派 3 代 B 型,一搜一大把,参考价格: RMB 269 )

​※ 读卡器 & 8 Gb 以上 TF 内存卡一张(就是手机里用的小张内存卡,如果日后还有研究最好买 16 Gb ,参考价格: RMB 40 )

● HDMI高清视频线(接上屏幕是用树莓派,参考价格:不敢拔你家电视上的话,RMB10+)

● 网线一根(树莓派 3 代本身自带 WiFi 模块,不过凡事都要稳,所以常备一条,参考价格: RMB 5 +)

※ USB 线一根(供电,虽然树莓派的供电要求很低,但电源仍然不容忽视,参考价格:用电话充电线就好)

※ 键鼠一套(建议是无线,这样就不用接太多线整得很乱,参考价格:用现有的就好啦!)

※ 路由器(有专用APP的话,获取设备的 IP 信息和 MAC 地址会更加方便,参考价格:用家里的就可以了)

(* 其中 ※必备 ●可选)

3 步实现小米智能家具接入 HomeKit

要买的都买了,那么现在就可以正式开始了!看着好像买了很多东西,其实仅需 3 步就能完成

第一步:获取网关信息 → 第二步:配置树莓派环境 → 第三步:运行 HomeKit

第一步 获取网关信息

①安卓设备上,下载「米家」应用,并按说明连接多功能网关

②成功后点击图标进入「控制界面」

③点击右上角,进入「关于」设置

④快速连续点击「版本号」,进入「开发者模式」

⑤打开「网关信息」,找到 mac 地址,记录为【密码 A 】

⑥打开局域网通讯协议,启动该功能,找到密码,记录为【密码 B 】(*严重注意:密码很长很杂,记下后一定要检查清楚,否则运行的时候会无法控制设备)

网关 mac 地址,注意不是「 gw_mac 」(左)局域网协议密码(右)

*注意

【密码 A/B 】是最终设置的关键,建议在电脑上用记事本保存好

​第二步 配置树莓派环境

开始之前,先下载几个软件:

● Raspbian Jessie(树莓派系统)

● SDFormatter (格式化TF卡,虽然格式化好像也可以,不过号称专业洗卡,大概会洗得更干净一点,链接: https://pan.baidu.com/s/1eR7LhxK )

● Win32DiskImage(将系统写入内存卡里,链接同上)

● PuTTy(利用 ssh 让你在Windows上敲码,树莓派供电正常就可以了,链接同上)

● Codes 代码合集. Txt (有了这个,你就可以直接复制粘贴了,链接同上)

以上软件百度一下就能找到,或者在我的网盘分享里下载

*为什么要用 Windows 敲代码?

在教程文件夹里有代码合集,可以复制直接粘贴在 PuTTy ,减少错码率

​1.安装系统

①下载镜像:树莓派官方网站下载页:https://www.raspberrypi.org/downloads/raspbian/

*建议登陆树莓派官网下载2016版的系统,新版需要进入系统设置,打开「允许 ssh 「才能进行Win上的操作。

下面是关于 2017 版的建议,值得一提的一点: Pixel 才是拥有 UI 界面的系统,建议下载Pixel,支持更多很方便的功能。​下载zip更稳定,迅雷会员离线下载速度感人。

②打开安装好的「 SDFormatter 」,并把TF卡塞进读卡器,插入你的 Win 电脑

③默认设置即可,点击「格式化」,然后一路「确定」就完成了洗卡

④打开 Win32DiskImage ,选择下载好的「树莓派系统」,点击「 Write 」然后一路「 yes 」,开始写入系统

⑤写入完成后,将 TF 卡插进树莓派,第一次插入要轻一点,插深一点…(气氛变得有点奇怪…)

​2.树莓派开机

树莓派没有开关,一接电,就开机。

那么开机之前,先确认线缆接好了没,大概会有两种情况:

a. 使用无线网络和无线键鼠:先接 HDMI ,后接电源线;

b. 传统连接:那么久看看下面的示意图

因为接线相当于一切就绪,所以下面是在「情况 a 」下的操作:

​接通电源,开机了

①连接无线网络和鼠标:开机之后就进入 Raspberry 的 UI 了,右上角有「蓝牙」和「无线网络」设置

*如果你希望在树莓派上写代码也是可以的,把 Codes 代码合集. Txt 放在你的移动硬盘里,插到树莓派上打开,然后打开终端就可以复制粘贴了

​②打开树莓派的「允许 SSH 远程操控」,现在开始可以在 Windows 上操作了

点击「开始」菜单 → 偏好设定 → 树莓派设置 → 连接界面 → SSH ON/OFF

③获取树莓派的 IP 地址,两种方法:

a. 打开路由器的 APP ,找到「连接中设备」,点开找到 IP 地址;

​b. 没有 APP 的话,打开树莓派终端,输入 ifconfig ,无线网是「 wlan0 」,有线网则是「 lan0 」

​④打开PuTTy,输入刚才获取的 IP 地址,然后确定进入。第一次接入只要一路「 OK 」就可以了

⑤登陆树莓派:初次登陆,用户名「 pi 」,初始密码「 raspberry 」,输入密码的时候看不到字符是正常的

​⑥登陆成功后,就可以开始「复制粘贴」 ,也可以下载并打开「 Homebridge.txt 」

3.写入 Homebridge

-Start-

注意 Notice

一定要看的重点:

①保存技巧

遇到「编辑」或「配置」时,完成后先按下「 Ctrl+X 」,提示保存时键入「 Y 」确定,再按下「 Enter 回车」完成

②要有耐心!

树莓派输入命令后,无论是报错或任何情况导致无法运行,都一定会回到「 pi@raspberry:~ $ 」

载入和安装镜像都需要时间,长短由网速和镜像源决定,少则五分钟,多则半小时以上,

所以,不见到「 pi@raspberry:~ $ 」就说明:还在运行!不要随便关掉,否则浪费很多时间!

③认准代码行,不要跨行复制!

复制代码的时候,只需要复制「$」以后的红色部分,不要图方便一下子复制几行,行不通的, OK ?

*可以不看的废话:

基本而言,只要按照以下步骤,一步一步复制粘贴,就能顺利运行,无需思考,各位请加油!

-Start-

​Step1 切换镜像源

*默认源是外网资源,给 iPhone 越狱过的人就会知道,网速再快也还是会很慢,所以把源切换到阿里云的国内源。【再次提醒:复制时只需要复制红字部分, PuTTy 直接鼠标右键就会粘贴,粘贴后按下 enter 自动运行】

sudo nano /etc/apt/sources.list

deb http://mirrors.aliyun.com/raspbian/raspbian/ jessie main non-free contrib deb-src http://mirrors.aliyun.com/raspbian/raspbian/ jessie main non-free contrib ↓ sudo apt-get update

​Step2 安装 Nodejs

curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash – sudo apt-get install -y nodejs sudo apt-get install -y build-essential

​Step3 安装 avahi

sudo apt-get install libavahi-compat-libdnssd-dev

​Step4 安装 homebridge

sudo npm install -g –unsafe-perm homebridge

​Step5 安装 homebridge-aqara

sudo npm install -g homebridge-aqara

(若已经购买 Yeelight ,则再写一行命令: sudo npm install -g homebridge-yeelight )​

​Step6 创建 config.json (根据顺序分别是:

返回主目录→创建” .homebridge “文件夹→进入” config.json “文件)

cd ~ mkdir .homebridge nano .homebridge/config.json

Step7 配置 config.json

#从下一行开始复制

{ “bridge”: { “name”: “Homebridge”, “username”: “CC:22:3D:E3:CE:30”, “port”: 51826, “pin”: “031-45-154” }, “platforms”: [ { “platform”: “AqaraPlatform”, “sid”: [“【(密码A)网关MAC地址,去掉冒号,全部小写】”], “password”: [“【(密码B)网关局域网密码】”] }] }

#到上一行停止复制

​Step9 运行 homebridge

cd ~ homebridge

​运行状态如上图,出现红字就是出毛病了,绝大多数情况是Step 8出错了,输入

nano .homebridge/config.json

仔细检查「网关 mac 」和「局域网协议密码(重点留意)」,直到成功后会跳出小方框,其实就是刚才配置 config.json 里面的 pin ,不管怎么样,将这个记录为【密码 C 】

​Step10 iPhone操作

打开「 Home 」应用,点击「加入配件」就会自动检测到「 Homebridge 」了,点开它会要求输入密码,就是刚才获取的【密码 C 】

成功连接之后,支持 HomeKit 的设备就会自动连接到界面上,这个时候就会有三种使用场景:

Scene 1:打开应用「 Home 」,直接进行操作

Scene 2:屏幕底部上滑,「控制中心」实现监测和控制

​Scene 3:说「喂, Siri 」,然后告诉他你想做什么,比如说:「关灯!」

使用感受​

简单程度基本可以达到上手就会用了,论手机系统实力始终还是 iOS 更胜一筹,同时更要佩服 GitHub 上及各路高手的倾力贡献!

在很多设备上都有着相当有趣和便利的功能,下面是 Yeelight 的一点感受:

我用的是 iPhone SE ,会有一个「伪压感」的过度,进入到亮度调节;同时还能够快速选定灯泡颜色,可玩性很高!

​以「智能插座 ZigBee 版」为例,可以选择它的用途,比方说我接的是台灯,在于 Siri 的互动中,只要说「开灯」,Siri就会把智能插座打开了,那么灯也就打开了。同理可得,如果插座上接的是风扇,可以发挥同样的效果。

添加成功后,返回主画面,并点击进行试验,能够开关就证明成功了!

P.S 常见问题

①程序运行如果出错会「出现红字」或「回到输入命令状态」,如果遇到这种情况,检查「 config.json 」,通常是(密码 B )出错,拿出你的安卓系统手机,再次检查协议密码是否正确!

方法:输入以下命令:

nano .homebridge/config.json

​②如果你同时买了 yeelight ,那么首先要先下载「 Yeelight 」手机客户端,在设置中打开「极客模式」,完成 Step 5 后,输入以下命令:

sudo npm install -g homebridge-yeelight

-The End-

​Q:完了吗?

A:没完,这个时候,如果关闭了 PuTTy ,你会发现 homebridge 停止工作了,因为刚才都是远程操作

Q:可以设置开机自动启动吗?

A:当然可以,但是我不会

Q:那你说个毛?

A:淡定,还有另一个办法

用你的手机打开树莓派

这是一个折中的解决方案:

Step 1:电话or平板设备上,下载「 VNC Viewer 」,以下是安卓版

​Step 2:先打开 PuTTy ,登陆树莓派,输入「 vncserver 「,找到连接 IP 地址

Step 3:打开设备上的VNC Viewer,点击「添加」,输入「 Step 2 」找到的IP,然后「 Connect 」

Step 4:输入用户名「 pi 」和密码「 raspberry 」,确定后再「 Continue 」

​那么现在你就可以在电话或平板设备上,利用触屏触控树莓派了

接下来还是老套路,打开树莓派终端,输入「 homebridge 」

现在,只要树莓派不断电,你的 homebridge 就会一直运行了!

P.S

VNC Viewer支持多平台共用,你可以在iOS、Android、macOS、Windows上同时使用!

现在,打开「 Home 」应用,试着给你的设备取个名字,例如:皮卡丘

然后说:「喂, Siri ,打开皮卡丘」试试看!

Done !完美!

​鸣谢

最后,需要感谢各路高手的技术支持,以下是本文参考的各种教程:

【再更新】小米网关接入Homekit完整教程,声控家中设备!

智能宿舍搭建 1 | 借助树莓派与 HomeBridge ,将 YeeLight 彩光灯接入 Apple HomeKit

树莓派Raspberry之HomeKit智能家居体验!

关于作者

Weibo:山上有猴子

Instagram:johnnyimm

原微博地址:http://weibo.com/1787199017/ExcMzvBqv

本文出处:https://sspai.com/post/38378

趣无尽 Maker 平台开放,搬家入驻拿树莓派等实物奖品

Maker 是一群努力把各种创意转变为现实的人(Hacking The Physical World)的人。

有的搞庄稼、有的搞核聚变、有的搞木头板凳、有的搞火箭、有的搞电路板、有的搞基因、有的发明新菜……

我们就是爱这些东西,而或许我们中的一些有点看起来挺叛经离道的样子但是这都不重要,重要的是我们在搞一些东西自娱自乐,因为在我们看来,自己动手是唯一答案!

作为 Maker 的你曾经 DIY 过什么好玩意?正在 DIY 什么新东西?

不论是炫酷的装备、高科技 Hacking、软件、APP,亦或是模型、玩具、手工活,再或是绘画、雕塑、绿色植物、亲手饲养的萌宠(造人除外)……

So……我们发起了Maker 趣无尽(maker.quwj.com)这样的一个项目,是为给和我们一样的 Maker 们提供一个通过作品表达自己的最佳方式,以便自己以及自己的作品被其他人更好地了解。更多的 Maker 还可以通过平台去发现感兴趣的项目、作品和值得关注的人。

Maker 趣无尽专门针对DIY作品而设计的展示页面,方便系统性地展示作品;Maker 们还有属于自己的个人主页,Follow 大神好串门看看他又捣鼓了什么新玩意儿。

欢迎大家带上自己已经做过的、放弃过的作品以及正在做的作品入驻到平台。我们一如既往地渴望从大家的作品中发现闪光点,因此推出了内容激励活动:

发布符合要求的原创作品,可以获得“螺钉”。积攒“螺钉”一定的数量就可以兑换到 Raspberry Pi Zero W、HiFiBox DAC 扩展板、Arduino 兼容板等实物奖励,数量不设上限(只要内容够给力,奖励一定就在那等你)。

搬家入驻拿树莓派等实物奖品活动

活动时间:即日起 – 2017.10.10 (周期月为一个月,当期结束后提前一天会公告开启下一期活动)

面向人群:DIY过任何作品技术宅、手工客、模型控、工程狮、铲屎官、艺术家、以及吃瓜群众……

参与活动的项目或作品要求:要求就俩字——原创

活动详情移步此处:

http://make.quwj.com/page/7

下面的页面帮助你快速上手 Maker 趣无尽平台

Maker 趣无尽 平台指引

“材料”的获取和使用攻略

合作站点:树莓派实验室、NXEZ.com

对于平台的使用有疑问、发现异常BUG、勾搭站长、调戏NPC、Maker 面基、兑换奖励等需要可以加我们的Q群(139233005)解决哦~

直播续章:用树莓派搭建B站直播“点歌台”

感谢IT之家网友 晨旭喵 的投稿

写在前面:

之前我写了篇教程(用树莓派在B站24小时直播音乐),评论里有很多人都想要点歌功能。

点歌这个功能吧,其实想加也不算太难,可是啊…这是树莓派啊!直播姬弹幕姬实时渲染什么的带不动的啊!(好像也装不上)

可是啊…点歌这个功能好像也是很有必要的呢……

所以呢…我今天花了一个上午+一个中午的时间自己做了一个能在树莓派上运行的点歌台,虽然很简陋,但是能实现这个功能就已经很不错了嘛

(不会php和python的我靠着搜索引擎用php和python实现了这个功能…不是计算机专业的我已经尽力了……)

最终效果:http://live.bilibili.com/16703

本文着重于讲解如何搭建,不会涉及代码的详细解释。

下面开始教程

第一步:

请先按照之前的教程装上该装的东西(IT之家学院:利用树莓派在B站24小时直播音乐)

第二步:安装python的库

我们的python脚本需要一些必不可少的库,依次运行下面两个命令进行安装:

sudo pip install eyed3 sudo pip install pathlib

第三步:安装nginx+php环境

这一步是为了能运行点歌的网页

安装nginx:

sudo apt-get install nginx

启动 nginx:

sudo /etc/init.d/nginx start

接下来修改配置文件:

sudo nano /etc/nginx/sites-available/default

在 “listen 80” 那个大括号里,把 “index index.html index.htm” 后面加上 “index.php”,像下面这样:

listen 80; root /usr/share/nginx/www; index index.html index.htm index.php;

然后再找到 php 那一段,改成下面这样:

location ~ .php$ { fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; }

改完配置文件之后,保存关闭(ctrl+o回车,ctrl+x)。

安装 php 和必要组件:

sudo apt-get install php5-fpm php5-sqlite

重启 nginx:

sudo /etc/init.d/nginx reload

如果你不嫌烦的话,可以再把所有php组件装上,我也不知道后面的代码需不需要这些东西,因为我全都装上了。

sudo apt-get install php5-mysql php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-ming php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl

第四步:内网穿透(有公网IP的各位可以跳过,你们直连ip就行了)

网站搭建好了,我们要实现别人可以访问,可是呢,我这里是学校的局域网(哭),所以需要内网穿透。

这里我是用的是ngrok,水家之前有人发过nat123的,感兴趣的可以去找找。

其实用法很简单(如果你不想自己搭建服务器的话)。

用 ngrok.cc 提供的服务举例:

首先到后台开通一个隧道,隧道协议选择 “http”、本地端口写你前面设置的端口(前面配置文件里写的是 80)“127.0.0.1:80” 其他的按照自己的需求来写就行,

然后下载官网提供的软件,树莓的话要选linux arm版,

下载之后先给 777 权限:

sudo chmod 777 xxxx#文件名

然后按教程运行就行了:

./sunny clientid xxxxxxxxxxxxxx

如果前面没有做错什么的话,你的网站应该就能从ngrok.cc里获取的链接里访问了。

第五步:点歌系统所需的php文件

这里php所需要实现的功能就是:

1.可以自动搜索歌曲;

2.可以获取到歌曲的下载链接;

我网上找到一个远古的网易云api,所以我就拿来用了。

php代码在水家文章里发可能被转码,所以我发到了这里:glist。

php文件放置请放到/usr/share/nginx/www/这一级文件夹的下面任意位置(你要保证别人能访问),

为了能让脚本正常运行,建议在赋予其读写文件夹的权限:

sudo chmod -R 777 /usr/share/nginx/www/

注意事项:本人的php水平不高,毕竟没有系统性学过,这个文件是靠着必应来的代码拼凑+模仿写成的,可能会有漏洞(应该问题不大)。

第六步:使用python脚本实现下载歌曲、调用ffmpeg渲染视频的功能

python脚本如下,请注意缩进和准备好游标卡尺(笔者将php文件放到了/usr/share/nginx/www/songs/文件夹):

import os import urllib import eyed3 import time while True: for i in range(1, 30+1): if(os.path.exists(‘/usr/share/nginx/www/songs/’+str(i)+’.txt’)): #判断待渲染文件是否存在 f = open(‘/usr/share/nginx/www/songs/’+str(i)+’.txt’) content = f.read() #读取文件 print(‘downloading ‘+str(i)+’.mp3′) #debug urllib.urlretrieve(content, str(i)+’.mp3′) #下载mp3文件 print(‘download success’) #debug xx=eyed3.load(str(i)+’.mp3′) seconds=xx.info.time_secs #获取音乐时长,为渲染一图流视频做准备 os.system(‘ffmpeg -loop 1 -r 1 -t ‘+str(seconds)+’ -f image2 -i ‘+str(i)+’.png -vcodec libx264 -pix_fmt yuv420p -crf 24 -y SinglePictureVideo.mp4′) #渲染一图流视频,参数都是我做完试出来的,尤其是-pix_fmt yuv420p这个参数,缺了它视频就是黑屏了 os.system(‘ffmpeg -i SinglePictureVideo.mp4 -i ‘+str(i)+’.mp3 -c:v copy -c:a aac -y ‘+str(i)+’.flv’) #合并视频与音频 os.remove(str(i)+’.mp3′) #删掉临时文件 os.remove(‘SinglePictureVideo.mp4’) os.remove(‘/usr/share/nginx/www/songs/’+str(i)+’.txt’) print(str(i)+’output finished’) time.sleep(10)

注意事项:本人的python水平也不高,所以……(逃

第六步:做好视频封面

请在py脚本的同级目录新建三十个png图片,文件名也要1-30,看我多么有诚意的手绘(真难看):

第七步:修改ffmpeg运行脚本

因为我们是运行多个文件,所以我们需要连续推流,这时ffmpeg网站的帮助文档就起作用了(我找了半天没找到发现官网就有…

官网说明:https://trac.ffmpeg.org/wiki/Concatenate

下面直接说做法了,首先新建一个txt,内容类似为:

file ‘/home/pi/songs/1.flv’ file ‘/home/pi/songs/2.flv’ file ‘/home/pi/songs/3.flv’ file ‘/home/pi/songs/4.flv’ file ‘/home/pi/songs/5.flv’ file ‘/home/pi/songs/6.flv’ file ‘/home/pi/songs/7.flv’ file ‘/home/pi/songs/8.flv’ file ‘/home/pi/songs/9.flv’ file ‘/home/pi/songs/10.flv’ file ‘/home/pi/songs/11.flv’ file ‘/home/pi/songs/12.flv’ file ‘/home/pi/songs/13.flv’ file ‘/home/pi/songs/14.flv’ file ‘/home/pi/songs/15.flv’ file ‘/home/pi/songs/16.flv’ file ‘/home/pi/songs/17.flv’ file ‘/home/pi/songs/18.flv’ file ‘/home/pi/songs/19.flv’ file ‘/home/pi/songs/20.flv’ file ‘/home/pi/songs/21.flv’ file ‘/home/pi/songs/22.flv’ file ‘/home/pi/songs/23.flv’ file ‘/home/pi/songs/24.flv’ file ‘/home/pi/songs/25.flv’ file ‘/home/pi/songs/26.flv’ file ‘/home/pi/songs/27.flv’ file ‘/home/pi/songs/28.flv’ file ‘/home/pi/songs/29.flv’ file ‘/home/pi/songs/30.flv’

然后多复制粘贴十几遍保存,免得放完又重启。启动的sh脚本也不能用昨天的了,要改成下面的样子:

#!/bin/bash while true do ffmpeg -re -f concat -safe 0 -i playlist.txt -vcodec copy -acodec aac -b:a 192k -f flv “你的。。。那啥网址和码” done

注意本sh脚本要与playlist.txt在同级目录(废话)…

这样ffmpeg就会连续按txt里的顺序进行推流。

第八步:把初始视频文件生成好

这一步非常简单,就是把1-30.flv全部生成完就行,

我这里全部选择了“种太阳”,我对不起直播间的那位小伙伴(Sortana)的耳朵。

第九步:启动

启动就行了。。

screen nohup sh live.sh & screen nohup python live.py &

教程完毕。

由于内容比较多,可能有遗漏的部分,请谅解。

出处:https://www.chenxublog.com

树莓派 Zero 无需键盘网络的开机配置

我大概是个Raspberry Pi粉丝,到了英国后总感觉不买点树莓派的东西亏,可是之前已经在中国买了树莓派3了,于是决定买点特别的,做点有意思的事情。

上个月,鉴于我在英国的巨大地理优势的缘故,买了一个4磅的Raspberry Pi Zero,不过网络上关于树莓派Zero的文章真的甚少,因为实在太难原价买到了。

请注意,不要认为所谓的4磅很便宜,毕竟,我还多掏了2.50磅的邮费。树莓派Zero在中国并不便宜,因为树莓派Zero的产能有限,每周只能供很少的货,买树莓派Zero就像抢12306一样,我抢了两周,也正是因为这个原因,树莓派Zero在亚马逊的黄牛卖家卖20磅,淘宝卖120元左右,实际上原价只有40元左右。

信仰充值

滴!信仰充值成功!

没有错,你没有看错,就是这么小,但是小也有小的坏处,没有USB口,没有Wi-Fi,没有网线接口,似乎什么都没有用。

1Ghz, Single-core CPU

512MB RAM

Mini HDMI and USB On-The-Go ports

Micro USB power

HAT-compatible 40-pin header

Composite video and reset headers

不过值得一提的是,USB On-The-Go接口也可以用来供电。

发车

网络上关于树莓派Zero如何连接配置大概有以下几种:

OTG口转USB 接 USB以太网适配器

OTG口转USB 接 USB Wi-Fi

OTG口转USB 接 USB键盘 且 用HDMI接显示器

GPIO接以太网适配器

但是以上,都太麻烦了,对不对?

那么关键问题就来了,如何才能在 没有网口、没有Wi-Fi、没有显示器、没有鼠标、没有键盘的情况下 配置可爱的树莓派Zero呢?

我们 可以 把 树莓派 虚拟为 网卡,然后在内网连接它。

1.下载完整版 Raspbian Jessie 或 Raspbian Jessie Lite 系统,并且刷到你的SD Card里,Windows用Win32 Disk Imager, Mac/Linux 用命令,如下:

diskutil list diskutil unmountDisk /dev/SD卡的标号 #如disk2 cd /Users/ivan/Downloads/2016-11-25-raspbian-jessie #进入目录 sudo dd bs=1m if=2016-11-25-raspbian-jessie.img of=/dev/rdisk2

2.刷好系统后编辑 config.txt 文件,在最后一行下,另起一行添加:

dtoverlay=dwc2

保存文件

3.最后,打开 cmdline.txt 文件。

找到单词 rootwait ,在其之后添加:

modules-load=dwc2,g_ether

4.添加一个文件名为 ssh 到根目录下,内容为空

5.把SD Card放到树莓派Zero,用安卓数据线与电脑连接,USB口接OTG口,等待60-90s,电脑会发现网卡并且自动配置ip地址。

6.Ping 一下raspberrypi.local看是否能通

PING raspberrypi.local (169.254.70.245): 56 data bytes 64 bytes from 169.254.70.245: icmp_seq=0 ttl=64 time=0.570 ms 64 bytes from 169.254.70.245: icmp_seq=1 ttl=64 time=0.338 ms 64 bytes from 169.254.70.245: icmp_seq=2 ttl=64 time=0.316 ms 64 bytes from 169.254.70.245: icmp_seq=3 ttl=64 time=0.344 ms

7.ssh连接raspberrypi.local,默认密码为raspberry

pi@raspberrypi.local

配置

因为没有网络,只能通过下载离线安装文件,传输到树莓派内,再在树莓派里安装。

配置树莓派

通过直接运行 raspi-config 命令

你需要做

容量扩展

更改系统时区

更改系统密码

同时你需要通过执行 sudo passwd root 更改root密码

安装vnc-server

首先,去VNC官网下载最新版本的vnc-server

用scp命令传到树莓派上

scp /Users/ivan/Downloads/VNC-5.3.2-Linux-ARM-DEB.tar.gz pi@raspberrypi.local:~

在树莓派shell下,安装VNC

tar xvf VNC-5.3.2-Linux-ARM-DEB.tar.gz sudo dpkg -i VNC-Server-5.3.2-Linux-ARM.deb

vncpasswd -user # 设置连接密码 vncserver # 启动vncserver

连接raspberry.local:1测试成功

设置代理

本来想着,既然把它虚拟为网卡了,能否NAT网络给他让他上网?事实上,是失败的。

那么我们有一个临时解决方案,就是设置代理

首先,在本机搭建一个squid

brew update brew install squid

然后下载SquidMan,安装。

在本机开启端口为8080的HTTP代理服务,并把本机名称更为Mac。

进入树莓派shell,输入:

cd /etc/apt/apt.conf.d sudo vi /etc/apt/apt.conf.d

最后一行加入一句话:

Acquire::http::Proxy “http://Mac.local:8080”;

保存

apt-get update一下,怎么样是不是能装软件了?

感想

这块小板子,我太喜欢了,好精致

参考

https://gist.github.com/gbaman/975e2db164b3ca2b51ae11e45e8fd40a#file-howtootgfast-md

本文转自 blog.yfgeek.com

Diskio Pi:基于树莓派的“终极开源平板”

几天前,Kickstarter 上冒出了一个开源项目,它就是基于树莓派、兼容 Raspberry Pi 和 Odroid、欲成为“终极开源平板”的 Diskio Pi 套件。项目发起人为拥有 10 余年制造销售经验的光学仪器商 Guillaume Debray,但他其实也是一名富有激情、深谙编程与硬件组装制造的计算机工程师。为了这款基于单板机上的通用设备,他花了 18 个月去开发。

当前 Diskio Pi 兼容树莓派 2 / 3 / Zero、Odroid C1 / C2 SBCs,且能够运行 Ubuntu、Debian、Raspbian Pixel 或 Android 。

Diskio Pi 是一款非常模块化是设备,且 100% 基于开源硬件,非常适合那些追求完美的用户。

用户无需自行拆开该设备去安装 PC 板子,但里面依然提供了丰富的 GPIO / USB 端口让你去 Hack 。

Diskio Pi 默认配备了一块电容式全高清 IPS 触控屏和主板,但也可选支持电池包和官方的树莓派摄像头模块。

套件售价为 350 美元(不含 SBC 和电池),约合 2380 元 RMB 。

感兴趣的网友可移步至 Diskio Pi 的 Kickstarter 主页了解详情。

Diskio Pi – the Ultimate Open Source Tablet

叮当:一个开源的树莓派中文智能音箱项目

这个项目其实来源于我生活中的一个需求:我每天晚上都会去厨房做一个面包当明天的早餐,当我把用料按顺序准备好放进面包机时,我需要准确预约到明天早上我吃早餐的时间。然而,几乎每次在这个时候我都没有带手机在身边,而是都放在客厅里充电,这时只能跑去客厅看时间。虽然厨房到客厅只有几步之遥,但自己又是懒癌患者,每天都要这么来回奔波就觉得很不方便。要解决这个问题当然有很多种方法,比如直接买个小时钟放在厨房。不过我更希望“连看都不用看”,直接有人告诉我时间。所以,我需要一个像 Amazon Echo 那样的智能音箱。

然而,不论是 Amazon Echo 、Google Home 还是微软 Cortana 音箱,在国内的使用都是个问题。虽然国内也有类似的智能音箱产品,但我没有用过这些产品,不知道可定制性如何。比如,如果我需要开发个功能让它告诉我某种面包的配方是什么,这些产品就不一定能做到了。考虑再三,我决定自己动手写一个。整个项目用了差不多三个星期的业余零碎时间。

先放上项目主页:http://dingdang.hahack.com

下面分享一下我在开发这个项目过程中的心得。

如果您在使用微信或者其他客户端程序阅读本文时发现视频无法播放,请改为在浏览器中打开。

硬件

首先要解决的是硬件问题。我选择在 Raspberry Pi 上开发。于是我买了块 Raspberry Pi 三代主板。麦克风和音响方面,出于美观的目的,买了个自带音响的 USB 全向会议麦克风。整套设备看起来就像这样:

后面觉得这个麦克风自带的音响音质太一般了,所以我又外接了一个小音箱。然后再插了一个摄像头,用来实现拍照功能。最终的完全体进化成了这样:

硬件有了,接下来就得开始写软件了。主要的框架借鉴了 Jasper 项目,并加入了我自己的定制和想法。这里说说一些有意思的部分。

指令接收

智能音箱要解决的一个最重要的问题就是如何接收指令。这里头主要涉及两个问题:

被动唤醒(Passive Listening),即“什么时候开始听”。这个阶段只监听唤醒词。当听到唤醒词时,进入主动聆听。 主动聆听(Active Listening),即“什么时候结束听”。这个阶段主动聆听用户的任何语音指令,然后对听到的内容进行分析处理。

被动唤醒阶段的基本策略是:每次以 16000 的采样率录制 1024 个采样作为一个采样集,然后对采样集进行信号强度估计,当某个采样集信号强度大于一个阈值时,就认为可能接受到了指令。然后持续录制多 1 秒时间,再转交给语音识别模块。当语音识别模块认为是唤醒词时,进入主动聆听阶段。

主动聆听的策略与被动唤醒基本相似,每次以 16000 的采样率录制 1024 个采样作为一个采样集,然后对采样集进行信号强度估计,当某个采样集信号强度低于一个阈值约 1 秒的时间时,就认为用户已说完了指令。当然还要考虑环境吵杂,一直处于聆听的可能。因此可以再加一个超时保护,超过 12 秒就结束聆听。

语音处理

说说STT(语音识别)引擎和TTS(文本转文本)引擎的选择。由于被动唤醒会试图识别所有听到的内容,出于隐私保护的目的,应该使用离线的语音识别引擎,因此我选择的是 PocketSphinx 。而对于主动聆听,由于是在唤醒阶段才会进行转换,进入主动聆听前会有蜂鸣提示,用户也会清楚此时叮当正在听他们说话,相对来说隐私泄露的可能性就比较低,因此我选择的是在线的百度 STT 语音识别服务,也省下了扩展语音识别模型的工夫,有利于更好地实现插件可扩展。TTS 引擎方面同样也先支持了百度的语音合成。

在实际测试中,PocketSphinx 的识别出乎意料的好。由于我的离线指令集只有几个候选唤醒词,PocketSphinx 对这些唤醒词的识别非常灵敏,甚至有时候其他声音也可能被误当成唤醒词而唤醒叮当。但即使被意外唤醒了,不去理会叮当就可以了。

相比之下,百度的语音识别就比较迟钝了。有时候明明我发音很清晰了,还是会识别成另外的含义。通过在百度的语音识别平台上传自定义的语音识别词库 可以提高识别的准确率。另外,由于我用的是 Restful API,网速比较差的时候响应也比较慢。我在家用的是 10M 带宽的网络,反应速度还算可以接受。我准备后面尝试接入更多的语音识别平台,看看识别速度和准确度方面能否有所提升。

下面这个视频是我与叮当对话的演示。我把唤醒词设置成了“小梅”:

一个问题是当回答内容比较长(比如问叮当当天的新闻)时,合成语音的耗时会变得很长,给人的感受是叮当的响应很慢。所以我加了个 read_long_content 的选项。当内容过长时,改成发送到用户的邮箱或者微信。下面这段音频是一个例子:

长内容发微信

插件

叮当最好玩的部分当然就是玩插件了,通过写插件可以让叮当接入各种各样的服务,完成各种各样的事情。我在叮当里也内置了几个插件(见注脚1)。为了方便用户扩展,我把 ~/.dingdang/contrib 设定为第三方插件目录,允许让用户在里头编写插件并提交到 dingdang-contrib 项目共享。

Time:顾名思义就是询问时间的,先满足我的个人需求。

Echo:简单的回声/传话功能。当接入微信时,可以利用这个功能实现远程给家里发语音消息。

Email:询问邮箱中有多少未读邮件。在这之前用户需要先配置好邮箱账户。另外,叮当还有个定期消息检查机制,每 30 秒会执行一次邮件检查,如果有未读邮件,将会在当次运行会话中给用户语音播报一次。

Camera:用于调起摄像头拍照(如果安装了摄像头的话)。如果接入了邮箱或微信,照片将发送到用户的邮箱或微信中(选择哪种取决于配置中 prefers_email 的值)。

Unclear:用于处理未知的问题。如果接入了对话机器人(例如图灵机器人),将转交给对话机器人应答;否则将给予类似 “我没听清楚” 这样的回复。

下面这个视频是 Camera 插件的演示(见注脚2):

另外,如果接入了微信,还可以让叮当安静地拍一张家里的照片,而不发出任何声音。下面这个视频演示了如何使用微信与家里的机器人交互,包括远程控制拍照。

这对于需要远程监控家里的情况的用户而言就非常方便了,比如家里有小孩的情况。

音乐播放

既然是智能音箱,当然少不了播放音乐的功能。所以我额外写了个播放网易云音乐的插件 NetEaseMusic 。出于版权考虑,并不集成进官方插件中,而是放进 dingdang-contrib 里头。

这个插件的实现比较复杂。普通的插件接受到指令,响应完就退出了。而为了能支持各种指令控制音乐播放,这个插件在接收到播放控制指令后并不退出插件,而是进入一个播放器模式,这个模式主动聆听得到的指令只会在播放控制指令集中匹配,其他的插件指令都不起作用。只有当用户要求退出播放时才回到普通模式。NetEaseMusic 的播放控制指令如下:

指令 相同指令 用途 播放音乐 – 进入音乐播放模式。在音乐播放模式下,其他的插件功能将不可用。 下一首 切歌, 下一首歌, 下首歌 切换到下一首歌。如果没有下一首歌,就回到列表中第一首歌 上一首 上一首歌,上首歌 切换到上一首歌。如果没有上一首歌,就跳到列表中最后一首歌 大声点 大点声,大声 调高播放音量 小声点 小点声,小声 降低播放音量 随机播放 – 随机播放列表中的音乐 顺序播放 – 顺序播放列表中的音乐 暂停播放 – 暂停音乐的播放 播放 继续 继续音乐的播放 榜单 – 播放推荐榜单 歌单 – 播放用户的歌单(如果有多张,将只播放第一张) 结束播放 退出播放,停止播放 退出音乐播放模式。 搜索 查找 搜索歌曲/歌手。将自动播放搜索结果。 什么歌 – 正在播放的是什么歌

实现这个插件的过程中还参考了 Vellow 的 MusicBox 项目(见注脚3)以及 yaphone 的 RasWxNeteaseMusic 。为了方便重用,我把 MusicBox 的核心 API 抽离了出来封成了一个 MusicBoxApi 库 。比较坑爹的是就在我准备发布叮当的前几天,老的获取音乐地址的方式彻底不能用了,而新的接口批量获取的地址不知道为什么是乱序的,于是我只能在播放每首歌前都调用一下新版的获取地址的 POST 接口,又增加了一点响应时间(见注脚4)。

下面这段音频是使用叮当控制音乐播放的演示:

播放音乐

完成了音乐播放功能后,叮当的好玩程度提高了很多。以前要听歌,至少得把电脑或者手机打开。现在只需要喊一声叫叮当播放歌曲就可以了。想换歌、搜索歌曲、调节音量都是说句话就搞定的事情,生活幸福指数大幅提升 ^_^ 。

总结和后续

对于有 Coding 能力的 Hacker 而言,自己动手做一个智能音箱,不仅可以当做业余练手项目,还可以自由地定制硬件模块,并实现自己需要的各种功能,这远比直接购买一个 Amazon Echo 有趣得多。

后面我计划做的事情有:

尝试接入更多的 STT / TTS 服务,优化叮当的响应时间;

结合 NLP 技术实现更复杂的指令识别,比如提醒功能;

加入人体感应模块等传感器,把它变得更加智能。

更重要的,我更希望能有其他有兴趣的朋友参与进来,一同开发完善这个智能音箱项目。我相信,这种个性化服务的产品本身就应该是完全可定制的。而您的加入可以使叮当变得更智能!

完整的插件信息可以在这里找到。 能支持拍照的智能音箱估计没多少吧?这就是自己开发智能音箱的好处,想接什么模块就接什么模块。想实现什么功能就实现什么功能。 Github 上搜索关键词“musicbox” 可以找到好几个类似的仓库,其实都是基于 Vellow 最初的那个版本的修改。我实际上参考的是 darknessomi 的版本 ,但我认为最大的功劳还是该给 Vellow 。 如果您知道如何批量获取播放地址且保持原来的列表顺序,还请告诉我方法。

感谢 hahack42 的投稿。

树莓派搭建指示灯自动显示在空间站的人数

本文翻译自: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允许您以这种方式快速检查对象。您现在应该看到以下内容: 这表示 r 包含一个 Response 类型对象,并显示 200 。这是请求的状态代码,这意味着“成功”。其他状态代码包括 404 ,这意味着“找不到文件”和 500 – “服务器错误”。 现在进入 help(r) 。这显示对象的docstring(文档字符串) Response 。你应该看到: Help on Response in module requests.models object: class Response(builtins.object) | The :class:`Response ` object, which contains a | server’s response to an HTTP request. … 观察docstring的部分 Data descriptors defined here 。您将看到可用属性及其描述的列表,包括: apparent_encoding

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) 你会看到这 j 是一个字典,它是Python中非常有用的数据结构,基本上与JSON格式相同。 要访问字典中的数据,请按以下名称对其进行索引 [] : >>> j[‘number’] 6 而已! 回顾所使用的命令并将其放在一起,需要以下代码来检索空间中的人数: import requests url = “http://api.open-notify.org/astros.json” r = requests.get(url) j = r.json() n = j[‘number’] print(n)

添加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 [, , , , …] 这将打印列表中每个对象的表示,显示一些有用的信息。 leds 通过将它们全部打开来测试列表: >>> [led.on() for led in leds] 这是列表理解的另一个用途:在列表中的每个项目上运行命令 关闭它们: >>> [led.off() for led in leds] 提示:使用 Alt + P (上一个)完成命令历史记录并编辑输入的最后一个命令。

制作指示标

现在,您将使用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, ), (1, ), (2, ), …] 您可以看到,它提供了与索引号相关联的LED列表,从 0 。 由于 enumerate 返回两个值,索引号和LED对象,您可以循环使用它并通过使用访问这两个值 for i, led in enumerate(leds) 。将以下循环添加到文件中的代码中: for i, led in enumerate(leds): if n > i: led.on() else: led.off() 保存并运行您的代码。假设API返回 6 ,你应该有6个LED点亮! 您将需要定期检查API的变化。确保您没有对API提出太多请求非常重要。首先通过 sleep 在其他文件的顶部添加导入: from time import sleep 现在将循环中的代码 requests 和 LED 代码进行 while 循环,使其持续运行并不断更新LED: while True: r = requests.get(url) j = r.json() n = j[‘number’] for i, led in enumerate(leds): if n > i: led.on() else: led.off() sleep(60) # update every minute 确保最后添加睡眠,所以它在API调用之间等待60秒钟,以便每分钟检查一次结果。 运行代码,它应该总是显示当前的空间人数。让它运行,它应该在将来更新,因为宇航员交付到和从国际空间站。

尝试用木头或纸板制作自己的指示器:

显示宇航员名字

最后,学习从API调用中获取宇航员名字。

当你最初检查了JSON对象时,它显示了所有的空间的人的名字以及数字。返回到Python shell并 j[‘people’] 从字典检查: >>> type(j[‘people’]) >>> j[‘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[‘people’] 是一个列表。现在进一步检查清单: >>> len(j[‘people’]) 6 >>> type(j[‘people’][0]) >>> j[‘people’][0] {‘craft’: ‘ISS’, ‘name’: ‘Mikhail Kornienko’} 您可以看到该列表包含6个元素,并且每个元素是另一个字典。剩下的只是访问字典中的各个元素: >>> type(j[‘people’][0][‘craft’]) >>> j[‘people’][0][‘craft’] ‘ISS’, >>> type(j[‘people’][0][‘name’]) >>> j[‘people’][0][‘name’] ‘Mikhail Kornienko’ >>> j[‘people’][1][‘name’] ‘Scott Kelly’ 尝试打印所有的宇航员名字: >>> for astronaut in j[‘people’]: print(astronaut[‘name’]) Mikhail Kornienko Scott Kelly Oleg Kononenko Kimiya Yui Kjell Lindgren Sergey Volkov 现在返回你的代码,并在保存后添加一行来保存宇航员列表作为变量 n : n = j[‘number’] astronauts = j[‘people’] 然后在循环开始之前添加一行以关闭所有LED: [led.off() for led in leds] 在 if n > i 声明内,之后 led.on() ,添加两行打印宇航员姓名,然后睡眠1秒,以便在每个光线之间暂停: if n > i: led.on() print(astronauts[i][‘name’]) sleep(1) 再次运行代码,LED一次一个,同时打印出宇航员的姓名。

接下来是什么?

现在,您已经创建了一个带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,Takuy​​a Onishi和Kathleen Rubins抵达

年 – Anatoli Ivanishin,Takuy​​a 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

树莓派实现温度监控并控制风扇散热

眼看已经进入三伏天,你的树莓派有没有开始发烧呢?为了提高树莓派散热效果,通常我们在树莓派上加装散热风扇,但是问题是只要通电,散热风扇就一直转,有的强力风扇甚至会发出噪音。为解决这个问题,下面使用了一个三极管来控制树莓派散热风扇。当树莓派CPU温度超过设定的值时,就开启风扇进行散热;当温度降到设定值时,就关闭风扇,减少风扇运转的噪音。

连接原理图

三极管的三个管脚分别为发射极、基极和集电极,我使用的时D8550,其封装图为:

三极管D8550和树莓派的连接如下图。

原理图如下图。

风扇控制脚本

树莓派的15号引脚连接到了三极管的基极(引脚编号可参看这里),当温度过高时,GPIO引脚输出低电平,可以开启风扇。python程序为:

#!/usr/bin/python2 #coding:utf8 #自动风扇控制程序,使用wiringPi的gpio命令来操作GPIO import commands,time #控制风扇的GPIO FAN_GPIO = 15 commands.getoutput(‘sudo gpio mode ‘+str(FAN_GPIO)+’ OUTPUT’) while True: # 获取CPU温度 tmpFile = open( ‘/sys/class/thermal/thermal_zone0/temp’ ) cpu_temp_raw = tmpFile.read() tmpFile.close() cpu_temp = round(float(cpu_temp_raw)/1000, 1) print cpu_temp #如果温度大于50`C,就启动风扇 if cpu_temp >= 50.0 : commands.getoutput(‘sudo gpio write ‘+str(FAN_GPIO)+’ 0′) #如果温度小于45`C,就关闭风扇 if cpu_temp <= 45.0 : commands.getoutput('sudo gpio write '+str(FAN_GPIO)+' 1') time.sleep(10) 保存为 cool.py 后,运行程序。 sudo python cool.py 当温度高于50度就开启风扇降温,温度降到45度以下时关闭风扇,这样可以防止风扇在临界点往复。 效果图 完成后的效果图如下。 文章来源 blog.lxx1.com

树莓派实现二维码门禁系统,支持预约管理

来自 leafspace 的投稿,感谢~

本文使用树莓派DIV搭建一个二维码门禁预约管理系统。起源是学校里需要对活动室进行人员管理,保护学校固定资产。原先学校的活动室安装的门禁系统是IC卡片式的,由于时间较长,管理不当,相当一部分的IC卡丢失,导致活动室被迫只能强制每天直接开放。所以,经过学校教工会商量,由学生外包开发基于二维码的门禁预约系统,而我是项目经理。

接手项目后,我将工程分为三个模块,微信模块(老师要求的)、网站预约模块、硬件控制模块。用户通过微信或浏览器进入网站,在网站上预约有关于使用某个活动室的情况,将信息保存进入数据库并提供给用户一个二维码。到了预约的时间范围之内,用户携带二维码到活动室控制前,扫描二维码,硬件控制模块读取二维码内容,如果二维码是本系统的,则到数据库中查询相关预约,如果当前时间与预约的时间符合,则开门。

在开始之前需要准备这样几个东西:树莓派开发板一个、电源箱一个(输出12V)、电磁锁一个(12V 220MA)、继电器一个(5V驱动)、树莓派官方摄像头一个(NoIRCamera)、装有树莓派原装系统SD卡一张、面包板(建议使用焊锡直接将线焊起来)、线若干。

先放上Github地址:https://github.com/leafspace/CSLG-Access-Reservation-System

首先我们需要一个数据库,这个数据库用于保存有关于预约方面的信息。我在这个工程中使用的是SQL Server,原因是与学校的数据库兼容。表结构如下:

CREATE TABLE [dbo].[Users]( [user_id] [int] NOT NULL, [userName] [varchar](20) NOT NULL, [password] [varchar](16) NOT NULL, [wechat_id] [varchar](16) NULL, [phone_number] [varchar](13) NULL, [identity_number] [varchar](9) NULL, [is_temporary] [bit] NULL, [is_manager] [bit] NULL, [information] [varchar](max) NULL ) CREATE TABLE [dbo].[Reservations]( [reservation_Id] [int] NOT NULL, [user_id] [int] NULL, [room_id] [int] NULL, [valid] [bit] NOT NULL, [lock] [bit] NOT NULL, [year] [int] NULL, [month] [int] NULL, [day] [int] NULL, [start] [int] NULL, [finish] [int] NULL, [qr_location] [varchar](50) NULL, [information] [varchar](max) NULL ) CREATE TABLE [dbo].[ActivityRooms]( [room_Id] [int] NOT NULL, [information] [varchar](max) NULL )

其中Reservations表中的year、month、day、start、finish就表示了用户某个预约的预约时间,(start和finish都为三位数或四位数,例如开始时间14:30,则start为1430)。用户每进行一次预约就在Reservations表中新增一条记录。然后将其reservation_Id添加一段密钥生成二维码,生成二维码使用的是zxing库。下载地址:http://www.oschina.net/p/zxing/。

然后就是搭建部署预约网站,这个在此不多讲,因为当前开发方案有很多,网站烂大街了,我这边使用的是JSP/Servlet的形式开发的。

然后就是组装硬件,先将摄像头穿过亚克力板插进树莓派(蓝色部分朝网络接口)。如下图(来自网络):

插入摄像头后还无法直接使用,需要在系统内进行配置。以树莓派原装系统为例:

进入命令行窗口,输入$sudo raspi-config

按动键盘上下键到“Enable Camera”,按回车键,将其设为Enable。

使用$sudo raspistill -o image.jpg来拍照测试

如下图(来自网络):

摄像头安装完成之后开始组装门禁控制系列其他硬件,先用一张原理图来说明接线结构,如下图:

这张图上,从左至右,从上至下分别为:树莓派3b,继电器,树莓派风扇,电磁锁,电源。

树莓派总共使用了三个引脚,电源脚、地线脚、GPIO1号脚,其中,电源脚与地线脚同时为风扇,继电器供电。(注:图中有稍许错误,继电器的GND脚(3号)应该与树莓派的地线脚相连)。GPIO1号脚与继电器的PIN(5号)相连,这条线用于输出控制信号,绝对不能弄错。

继电器使用了五个针脚(共6根),DOM脚连电子锁的负极,NO脚接交流电的负极。

电磁锁的正级与电源的正级相连。

我在实际操作的时候将由树莓派提供电源部分的线焊接起来了,所以没有用面包板。见下图:

这是继电器与树莓派相连的部分, 下面这个是继电器与其余模块相连的部分:

然后就可以开始编写程序控制。

这里我是使用java编写的程序,使用java对树莓派针脚控制就需要使用PI4J库,下载地址:http://pi4j.com/。

程序逻辑如下:

1)设置GPIO1号门为持续高电平:

final GpioController gpioController = GpioFactory.getInstance(); final GpioPinDigitalOutput doorController = gpioController.provisionDigitalOutputPin(RaspiPin.GPIO_01, “MyControl”, PinState.HIGH); doorController.setShutdownOptions(true, PinState.LOW);

2)拍照,将照片保存在一个固定的文件夹下:

private static String path = “/home/pi/qrCode/image.jpg”; private static String[] cmdOrder = {“sh”, “-c”, “raspistill -w 500 -h 500 -o ” + path}; public static boolean TakePhoto() { try { Process process = Runtime.getRuntime().exec(cmdOrder); process.waitFor(); InputStream inputStream = process.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String line = null; while((line = bufferedReader.readLine()) != null) { System.out.println(“Information : (Take photo) ” + line); } } catch (InterruptedException exception) { return false; } catch (IOException exception) { return false; } return true; }

3)使用ZXing库解析二维码,如果成功则跳转到3

4)开门,设置GPIO1号脚的电平为低电平(让电磁铁断电,失去磁性),系统等待3秒,3秒后自动设置回高电平(关门)

public static void OpenDoor(GpioPinDigitalOutput doorController) { doorController.setState(PinState.LOW); try { Thread.sleep(3000); } catch (InterruptedException exception) { exception.printStackTrace(); } finally { doorController.setState(PinState.HIGH); } }

最后来张部署后的全家福:

视频演示(实验室小编按:电蚊香液这样的使用角度是不正确的):

使用叮当声控智米电风扇

感谢 hahack42 的投稿。作为一个完全开源的智能音箱项目,叮当也能够很方便的接入其他智能家电,并声控它们。本文将介绍如何使用叮当声控智米电风扇。

前言

dingdang-robot (以下简称“叮当”),是我在今年5月20号开源的一个基于树莓派的中文智能音箱项目。

起初,我只是抱着一个好玩的心态做这个项目,并不期望这个项目能得到多少关注。然而,随着 QQ 用户群人数的不断壮大,越来越多的朋友安装了叮当,并且真正将它投入在了日常的使用上。很多朋友也提出了各种好玩的建议、想法,甚至为叮当贡献了插件或者捐赠了这个项目,让我觉得这个项目是很有价值的,也让我知道,我能做的还有很多东西。因此,我并不是开源了叮当之后就撒手不管了,而是利用业余时间不断完善叮当,又陆续发布了 8 个小版本,使得叮当在响应速度和功能丰富程度上都有了很大提升:

自 v0.1.1 起,邮件通知也增加了 echo 功能,用户可以发送带 [echo] 前缀的邮件给叮当接入的邮箱,从而实现让叮当朗读标题的消息,而不是提醒有新的邮件。利用这个功能,可以很方便地和 ifttt 结合,当满足某个条件时让图灵通知这个事件。例如,我将 ifttt 的 Date & Time 触发器和 Email 做了联动,实现定时在每天晚上 11 点发送邮件通知我睡觉;

前缀的邮件给叮当接入的邮箱,从而实现让叮当朗读标题的消息,而不是提醒有新的邮件。利用这个功能,可以很方便地和 ifttt 结合,当满足某个条件时让图灵通知这个事件。例如,我将 ifttt 的 Date & Time 触发器和 Email 做了联动,实现定时在每天晚上 11 点发送邮件通知我睡觉; 自 v0.1.2 起,叮当的响应速度有了很大提升;

v0.1.3 增加了 snowboy 离线唤醒 STT 引擎,目前有 PocketSphinx 和 snowboy 两套离线唤醒引擎可供选择;

v0.1.4 增加了 SendQR 插件,可以让叮当将微信的登录二维码发送到邮箱。@hhao 也给叮当写了个可以获取二维码图片文件的服务器插件。另外,邮箱增加了 [control] 前缀支持,用户可以发送带 [control] 前缀标题的邮件,该标题里的内容会被当成一句指令交给叮当执行,从而实现类似微信的远程控制叮当的功能;

前缀支持,用户可以发送带 前缀标题的邮件,该标题里的内容会被当成一句指令交给叮当执行,从而实现类似微信的远程控制叮当的功能; v0.1.5 开始,可以微信控制音乐播放了;

v0.1.7 开始,所有插件都可以通过在插件配置里头通过 enable 选项开关;

选项开关; 叮当的官方+第三方插件数量由 6 个增加到了 13 个。

除了完善已有的功能,我也正试图让叮当往智能家电控制中心的方向上发展。

如今很多智能音箱除了用来听歌对话之外,还扮演了家庭中的一个控制中心的角色。不过,由于各家采用的接入协议有所区别,A 家的智能家电并不见得能得到 B 家的智能音箱的支持。而由于叮当是开源的项目,对其进行定制,接入控制家电所需的协议,从而实现声控大部分的智能家电是完全可能的。今天我就分享一下如何用叮当控制智米电风扇。

智米风扇声控插件

先上视频。这个视频演示了使用叮当实现对智米风扇的电源开关、摇头开关、自然风开关、风量调节、预约关机的声控:

插件的主页:https://github.com/wzpan/dingdang-smart-mi-fan 。

安装插件

先安装 python2-miio :

pip install python2-miio

之后,克隆本项目到任意目录:

sudo git clone https://github.com/wzpan/dingdang-smart-mi-fan.git

再将里头的 SmartMiFan.py 拷贝至 /home/pi/.dingdang/custom 目录。

cp dingdang-smart-mi-fan/SmartMiFan.py /home/pi/.dingdang/custom/

如果没有 custom 目录,就先创建它然后再执行上面的拷贝命令:

mkdir /home/pi/.dingdang/custom

然后,确保你的智米电风扇已开机并和叮当所在的机器处于同一个局域网下。然后执行以下命令获取风扇的 host 和 token :

miio2 discover

最后在 /home/pi/.dingdang/profile.yml 中添加如下配置:

# 智米风扇 smart_mi_fan: host: “192.168.1.106” token: “32e9af2050bc9d6f599c061733effee0” angle: 60 # 摇头的角度范围。可选值为 30/60/90/120

完成后重启叮当即可使用本插件。

指令列表

指令 相同指令 用途 打开风扇 启动风扇 打开风扇 关闭风扇 – 关闭风扇 开启自然风 启动自然风 切换到自然风模式 关闭自然风 关闭自然风 切换到普通模式 开始摇头 开启摇头 开始摇头 停止摇头 结束摇头,关闭摇头 结束摇头 加大风速 加快风速,加大风量,加大风力 加大风扇转速 减少风速 减慢风速,减少风量,减小风力 降低风扇转速 $num $unit 后关闭风扇 $num 是数字, $unit 可以是秒/分钟/小时 预约关机

开发心得

下面说说开发心得。小米的智能家电使用的是 miio 协议。在编写这个插件之前,我先试用了 @homeassistantchina 提供的 HomeAssistant 的智米风扇插件 smart_mi_fan.py,这个插件在 HomeAssistant 里头的体验非常不错:

通过阅读这个插件,我发现这个插件依赖了一个封装了 miio 协议的 Python 3 的库 python-miio 。再阅读 python-miio 的源码,可以发现这个库就是通过 socket 来实现和家电的通讯的。整个发送消息的逻辑写成了一个 send 函数:

def send(self, command, parameters=None)

使用这个函数非常简单,只需要传入要发送的指令即可。

通过阅读 smart_mi_fan.py 的源码,不难发现 miio 的指令主要是两个类型:

获取属性。获取风扇的温度、角度、电源、风速等属性。通过发送 get_prop 指令并带上需要获取的属性名即可得到这些属性的值。具体有如下这些: temp_dec :温度;

:温度; humidity :湿度;

:湿度; angle :角度;

:角度; speed :风速;

:风速; poweroff_time :预约关机的时间(秒);

:预约关机的时间(秒); power :是否开机;

:是否开机; ac_power :是否使用交流电供电;

:是否使用交流电供电; battery :电池剩余电量;

:电池剩余电量; angle_enable :是否摇头;

:是否摇头; speed_level :正常风风速等级;

:正常风风速等级; natural_level :自然风风速等级;

:自然风风速等级; child_lock :儿童锁;

:儿童锁; buzzer :是否有声音反馈;

:是否有声音反馈; led_b :LED指示灯的亮度。 设置属性。设置某个属性的值。通过发送 set_属性名 指令并带上值即可对该属性进行控制。

了解了这个套路后,我只需要照着写一个叮当的插件,即可实现让叮当声控智米风扇的目标。

不过,在完成这个目标前,我还遇到了一个问题:python-miio 只能在 Python 3 环境中使用,而叮当是使用 Python 2 编写的。于是我对 python-miio 进行了 Python 2 版本的移植,发布为 python2-miio 。为了避免两个版本的 miio 命令行工具冲突,我把 python 2 版本的 miio 更名为 miio2 。

插件的编写过程也很轻松,和写其他的叮当插件一样的套路,所以整个插件我只用了一个晚上的时间就写好了。如果你看过我之前写的一篇编写叮当插件的教程《手把手教你编写叮当机器人插件》,那么阅读风扇声控插件的源码也不会很困难,这里就只放上源码链接:https://github.com/wzpan/dingdang-smart-mi-fan/blob/master/SmartMiFan.py。

最后就是插件的发布问题。考虑到这个插件比较私人——大部分用户并没有智米风扇,因此我并没有把它丢进 dingdang-contrib 中,而是单独创建了一个仓库来托管。对于需要使用这个插件的人,只需要将它放到个人的插件目录 /home/pi/.dingdang/custom 中,即可让该插件生效 。这样的好处是无需改动 contrib 目录,也不会影响 contrib 目录的更新。

原文 hahack.com

树莓派上使用串口调试工具xgcom

一、安装 xgcom

项目源码下载:

项目管理地址:http://code.google.com/p/xgcom/

自备梯子,从这里获取源码压缩包:

http://code.google.com/p/xgcom/downloads/list

先解压,下文会用到。

需要安装的库和工具:

make, automake,libglib2.0-dev,libvte-dev,libgtk2.0-dev

在项目文件根目录下执行一下命令即可:

sudo apt-get update sudo apt-get install automake libglib2.0-dev libvte-dev libgtk2.0-dev

安装好后再根据网上的资料修改下配置文件。

二、修改串口配置

修改/boot/cmdline.txt

在终端输入如下指令

sudo nano /boot/cmdline.txt

打开后将 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 这部分删除

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

删除后,变成如下结果保存退出

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

修改 /etc/inittab

sudo nano /etc/inittab

打开后将最后一行注释掉 在前面加上一个#号即可

#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

三、修改编译源码

到这里还是无法打开树莓派的串口,因为树莓派的串口名称叫ttyAMA0,但是xgcom只能搜索名称ttyS0的串口。

所以把xgcom的源代码修改下:

找到下面三个模块里的ttyS0,都改成ttyAMA0,编译make下

CfgFace.c

“/dev/ttyS0”,

Funs.c

strncpy(comcfg->port, “/dev/ttyS0”, strlen(“/dev/ttyS0”));

Main.c

strcpy(xcomdata->comcfg.port

改好后在源码解压后的根目录下执行:

./autogen.sh make sudo make install xgcom

弄好后去dev目录下把ttyAMA0文件读写权限改下

cd dev/ sudo chmod 666 ttyAMA0

大功告成。

另外找了一篇在PC的Linux下安装配置xgcom的方法,可互作参照:

http://blog.csdn.net/ropai/article/details/12955341

树莓派上安装配置Python+PyQt+Eric教程

本文是一篇在树莓派上安装运行Python3.5.3 + PyQt 5.8.2 + Eric 6.1.11(配套Sip_4.19.2,QScintilla_2.10)的过程教程。来自 zhaoker 的投稿,感谢~

对于一个完美主义和理想主义者来说,一个产品到手,总想把它发挥到极致,树莓派pi2和pi3都在手玩了很久,没发挥啥作用,最近突发奇想要在上面搞编程,对于Raspberry Pi3 来说,直接接个显示器在上面打代码跑跑小项目,性能是足够的,包括这篇文章也全部是在这上面完成,设备入门使用问题就不说了,百度上一堆可以查询,如果apt安装pyqt,默认只有pyqt5.3.2,配合python3.4.2版本有些旧。

写python代码,IDLE默认的太简单了,没有代码提升,本来想用pycharm2.17的,但是,它的index字典索引,每次扫描到pyqt 中Qtgui 就会卡住,然后整个python就呈死机状态。而sublime不熟悉,貌似没有相关资料,只能考虑eric6了。

这里主要说说,在树莓派上安装运行Python3.5.3 + QyPt 5.8.2 + Eric 6.1.11 (配套Sip_4.19.2,QScintilla_2.10)的过程,原系统pyhon2 .7和 python 3.4 保持不变。python3.5安装到新的目录,全程都是编译,很累,折腾了三天,很多大坑。

这里面要注意版本之间的配套,不清楚配套关系的可以看看版本的发布时间,基本在同一天就对了,之前就遇到过sip版本不对造成的c++错误。相关下载可以在:https://www.riverbankcomputing.com/news 上找到。

如果pi用的是64位linux系统,这些过程会很简单,像sip,pyqt,qscintilla可以直接用pip install 搞定最新版,就不用这么麻烦了。去年suse发布了64位的pi3但是貌似没有桌面,而且只能用一年,后期不知道如何,国外有大神安装了debian9的64位版本到pi上面,但是bug很多,这里也不好弄,既然pi4的发布日期没定年内不会推出,在pi3性能够用的情况下,树莓派官方应该在系统上下功夫,对兼容性,性能做一些有力的升级,网上有高手已经测试了64位在pi上的性能,运算居然比32位的快4倍,很是期待。

我当前系统是官方的基于Debian8的 Jesscia 2017.4.10 版本,以下过程建议直接输入su,输入密码后在root模式下运行,方便,全程不再sudo,容易忘记。

1、安装python3.5.3

参考:http://www.cnblogs.com/infopi/p/update_python_raspbian.html

下面开始编译安装:

先安装一些依赖,有些已经存在,不影响。

apt-get install build-essential libsqlite3-dev sqlite3 bzip2 libbz2-dev libssl-dev openssl libgdbm-dev liblzma-dev libreadline-dev libncursesw5-dev wget https://www.python.org/ftp/python/3.5.3/Python-3.5.3.tgz tar zxvf Python-3.4.3.tgz cd ./Python-3.5.3 ./configure –prefix=/opt/python3.4 make 估计会提示错误,根据错误百度一下,安装一些依赖包 make 第二次一般就没问题了 make install

创建软链接。创建之后,打python35就能启动python 3.5.3了

这里不建议更换原来的python3,我这里新建了python35用来指向

创建/usr/bin/python35这个软链接指向python 3.5.3,我这里创建新终端来操作:

sudo ln -s /opt/python3.5/bin/python3.5 /usr/local/bin/python35 sudo ln -s /opt/python3.5/bin/pip3.5 /usr/local/bin/pip35

第三行创建一个pip的软链接。pip已经被官方集成到python3.5里,用它安装pypi上的第三方模块很方便。

我们可以用pip35 -V 可以看版本,pip list 可以看到已安装的模块,目前应该是空的了,这里建议把pip升级到最新的9.0.1版本pip35 install pip –upgrade(升级完成后pip list会有警告提示,新建个pip.conf写入些配置解决,自行百度即可) 把原系统 python3.4的模块在/usr/lib/python3/dist-packages 下的pip35的程序可以引用:

在/opt/python3.5/lib/python3.5/site-packages 目录下新建一个 sys.path 文件

在里面这接写上 /usr/lib/python3/dist-packages 回车保存即可,以后很多这样的操作建议直接开个终端,输入 sudo pcmanfm 以root方式打开文件管理操作,会很方便,系统了win下的操作,少用一些命令,免得太累。

2、安装SIP

进入su模式

参考:http://www.iloveandroid.net/2015/10/06/setPyqtEnvironment/

wget https://sourceforge.net/projects/pyqt/files/sip/sip-4.19.2/sip-4.19.2.tar.gz

然后 apt-get install python3-dev libpython3-dev 解压进入目录后

python35 ./configure.py make make install

成功后 sip-V 如果哦没有,则用了ln建立个软链接到/opt/python3.5/bin/sip

输入python35看sip版本:

python35 >import sip >print(sip.SIP_VERSION_STR)

正常两个都显示 4.19.2

3、安装pyqt5.8.2

这里安装 pyth5.8.2时候一定要安装QtSvg,之前没有安装成功,导致思考了很久耽误了很久,安装之前可以先装官方的qt creator5.3.2

参考:http://blog.csdn.net/coekjin/article/details/52049273

一些基础环境就附带装上了,一个命令搞定:

sudo apt-get install qt5-default qt-sdk qtcreator

安装后,由于Qt Creator不能自动识别树莓派上的工具链,因此需要手动添加。点击Tools -> Options打开配置对话框,在Build & Run -中先添加gcc对应/usr/bin/gcc,Debugger可设置为/usr/bin/gdb , Kits选项卡中点击Add。Compiler设置为刚刚的gcc /usr/bin/gcc,Debugger可设置为刚刚的的gdb /usr/bin/gdb,Devices type选择默认的Desktop,Device选择local,Qt version选择/usr/bin/qmake。如果没装QtSvg软件运行会有警告。

下载5.8版本,解压缩后进入目录。

wget https://sourceforge.net/projects/pyqt/files/PyQt5/PyQt-5.8.2/PyQt5_gpl-5.8.2.tar.gz

正常编译安装即可:

python35 ./configure.py make make install

如果这里sip版本不配套,就会出现 从C++ mode 错误之类

4、安装QScintilla2

解压缩后进入目录:

(1)安装本体:

cd Qt4Qt5 qmake qscintilla.pro

完成这步后,修改MAKEFILE 文件,在CFLAGS 和 CXXFLAGS 后面 加上 -std=c++11 否则make会提示出错。

CFLAGS = -pipe -O2 -fvisibility=hidden -D_REENTRANT -w -fPIC $(DEFINES) -std=c++11 CXXFLAGS = -pipe -O2 -fvisibility=hidden -fvisibility-inlines-hidden -D_REENTRANT -w -fPIC $(DEFINES) -std=c++11

之后编译

make make install

这里configure.py 要看提示,是否会安装,QtSvg 模块,如果没有,则要

apt-get install libqt5svg5 python3-pyqt5.qtsvg qtsvg5-doc

他检测的过程其实挺简单,就是在目录下生成cfgtest_QtXXXXXSupport.cpp文件,然后编译看能否生成执行文件,如果不能安装,就不安装该模块,其实我之前没安装qtsvg,后面单独再补安装的,就是修改了configure.py,查找 def check_module

修改如下:

def check_module(target_config, disabled_modules, verbose, mname, incfile, test): “”” See if a module can be built and, if so, add it to the target …………………… the test. “”” if mname==”QtSvg”: print(“========= force add QtSvg module ========”) target_config.pyqt_modules.append(mname) else: if mname in disabled_modules: return # Check the module’s main .sip file exists.

Pyhton35 configure.py 就会在目录中生成Qtsvg文件夹,进文件夹,

qmake QtSvg.pro make make install#这样单独安装也是可以的。

(2)安装designer :

cd designer-Qt4Qt5 qmake designer. make make install

(3)安装Python bingdings:

cd Python python3 configure.py –pyqt=PyQt5 make make install

5、安装eric6-6.1.11

下载两个包

https://sourceforge.net/projects/eric-ide/files/eric6/stable/6.1.11/eric6-6.1.11.tar.gz

https://sourceforge.net/projects/eric-ide/files/eric6/stable/6.1.11/eric6-i18n-zh_CN-6.1.11.tar.gz

解压到同一个目录,进入目录,直接运行

sduo python35 ./install.py

有说要安装中文包,我一安装就是中文,没有继续装install-i18n.py了,如果不是中文就自己再装下。

进入后设置下API,手工编译下,新建项目就会有提示了。

后记:整个过程持续了4天,回头再写难免会有下许多差错,大概思路没变,可能个别依赖包漏了,不过我反正按照油多不坏菜的原则,要装的都装,用apt-get qt5* 类似之类的看看需要装的包,有疑问可以留言。

2020.8.25 更新:树莓派上 Qt 开发环境的搭建

谷歌发布首款DIY开源AI硬件,树莓派玩家是时候行动了

众所周知,谷歌专注人工智能已有很长一段时间。不仅在其Google Now和语音辅助项目中使用AI来改善用户的生活,而且在Google Home中也运用了Alexa语音助手。同时,谷歌在开源上也做了很多的支持和倡导工作:发起了一项以开源为主题的AIY倡议活动,目的就是想调动公众对AI项目的关注和兴趣。创立以来,谷歌已公开了多个开源AI项目。

谷歌AIY项目:Voice Kit

今日,谷歌宣布了AIY项目的最新进展——谷歌首款开源AI硬件产品“Voice Kit”宣告发布。Voice Kit可利用树莓派来创建基于语音的虚拟语音助手,但是其并不包含树莓派,需要用户自备,用户可以使用Pi 3 Model B,Pi 2以及Pi Zero来设计和测试。

据谷歌AIY项目总监Billy Rutledge介绍:

Voice Kit是谷歌首个开源的AIY项目:根据相关说明可创建一个语音用户接口(VUI),能够使用云服务(类似于全新的Google Assistant SDK或者Cloud Speech API),或者完全在设备上运行。该项目极大的扩展了树莓派的功能。

Voice Kit套件

Rutledge进一步表示,Voice Kit配备了一个顶级语音硬件配件(HAT),还包括一个立体声麦克风Voice HAT板、连接低电压组件的GPIO引脚传感器和一个专用电源连接器。同时,Voice Kit还采用了Pi 3 Model B的印刷版和MagPi 57进行了设计和测试。

Voice Kit套件可借助Google Assistant SDK和Cloud Speech API将 Pi 3转换为语音数字助理,用户在此基础上可为自己的项目添加语音交互功能。

此外,谷歌还介绍了该项目的潜在用途。比如:

更换家用电器和消费电子类产品上的物理按钮和数字显示器。

在连接的设备上通过更换智能手机app来控制设备。

在辅助机器人上添加语音识别功能,在此只需将机器人与简化的编程接口

……

目前关于谷歌的Voice Kit的定价还不清楚。不过该开源硬件将很快在美国的Barnes and Noble零售店开卖, 而英国的Asda、Sainsburys、Tesco和WH Smith也都将陆续开售。

via betanews & zdnet