DFRobot万物互联大赛第二轮
前言
最近放在阳台的花草被啥东西给吃了,然后厨房挂在墙上的小虾米也不知道咋的被抓破吃光了(我怀疑是隔隔壁两条泰迪),所以打算做个简单的项目,教训一下偷吃贼。时间比较仓促,内容比较多,能力有比较有限,好好写是不可能好好写的,这辈子都不可能的好好写的,只能糊弄一下这样子。
【Figure 1. 远在天国的熊童子】
一、项目概览
DFRobot万物互联大赛第二轮的比赛更加开放,提供了多种不同的模块,就看每个人戴着脚铐跳舞,详细要求及介绍请看论坛帖子。
如前文所述,本项目起源自种的花草和小虾米被吃了,所以想要对植物进行自动浇水和对偷吃贼进行警戒两部分功能,microbit+Obloq负责浇水和告警驱离,树莓派配合摄像头负责拍照取证,相关传感器数据和偷吃贼的狼狈模样都可以在手机上或者网页上看到。
1.1 比赛限制
所提供的硬件列表如下:
- 模拟声音传感器
- 电容式土壤湿度传感器
- 红外热释电运动传感器
- 数字继电器模块
- 微型舵机
- 带功放喇叭模块,注意不是Buzzer
只准使用提供的传感器,相当于限制了感受器,好在效应器无限制,不过呢,Microbit Mate引出引脚有限,Analog+Digital总共只有6个引脚。编程环境限制为MakeCode,存在种种掣肘,不过也是为了公平起见。
存在问题:
- Obloq占用两个引脚
- Speaker是Analog不是Digital,标错
- 购买的舵机云台不合
官方提供模块的介绍及使用可以移步http://wiki.dfrobot.com
1.2 项目设想
我们设想两部分功能,根据microbit的特点,物尽其用。首先我们看看引脚分配,Mate板提供了3个模拟量引脚和3个数字量引脚,OBLOQ模块需要占用两个引脚(Rx-Tx),引脚2暂时还没确定,可以接高亮度LED或者震动器。
示意图如下:
F2. 注意方块指直接与Microbit相连的部分,左下角和右上角是系统最终的目标。想要用热释电阵列进行粗略定位,受限于microbit引脚数量,所以我们和舵机一起放在树莓派上。
- microbit + OBLOQ|对植物自动监测,必要时浇水遮阳,对入侵者告警驱离
- Raspberry Pi 3 + RPi Camera|入侵物种识别,取证上传
二、项目实现
以下分述各个部分的具体实现。(大标题下不加点废话看起来好难受,加了自己也好难受)
2.1 模块检测
开工之前先要测试一下各个模块,这里方便起见就用microPython for micro:bit的Read Eval Print Loop (REPL) 模式进行测试。
REPL gives you a command line that actually runs on your micro:bit. It can be
handy for trying out MicroPython commands on the micro:bit without having to go
to the trouble of writing an entire program.借助REPL,将在microbit上烧录一个“操作系统”固件,可以实时响应你的microPython命令,而不需要生成hex固件烧录,每次更改功能都需要重新烧录。
简述如下,下载安装Thonny,Tools->Manage Plugin-ins->thonny-microbit
,然后在Tools->Options->Interpreter
选择BBC microbit
即可。然后接入microbit,等待显示microbit connected之后点击烧入REPL。
测试的话就比较简单,分别模拟/数字读写各个引脚,例如:
from microbit import *
import music
display.show(Image.HAPPY)
music.play(music.NYAN)
pin0.read_analog()
pin8.write_digital(0)
诸此以上种种,更多用法参考官方BBC micro:bit MicroPython 手册。
感觉microPython代码占用的内存空间比较大,经常报内存分配错误。
2.1 植物监测灌溉系统
2.1.1 需要讨论的问题
自来水可以直接浇花吗?
一般来说答案是否,因为含有残氯,且pH为酸性。因为氯气易挥发,解决方法就是用个贮水装置在外面暴晒2-3h或者静置24h以上。
一天之中什么时候浇水合适?
- 从时间考虑,选择早晚阳光微弱、蒸发量少的时候,毕竟蒸发也会吸热
- 从季节考虑,夏季最好早晚浇水,春秋季则在上午九点和下午三点左右浇水为宜,冬天则在中午浇水为佳,不过具体大致保证气温和水温接近就好了,不用那么严苛。
植物生长适宜的温湿度和光亮度?
这个没查资料,应该不是主要影响因素。
如何尽量降低设备功耗?
水泵的摆放,如何避免克服重力做功?
借鉴新疆坎儿井,减少水浪费?
2.1.2 土壤传感器灵敏度和反应延时问题
参考wiki上的演示代码,有两种思路:
- 持续泵水,实时读取土壤湿度,到指定值停下来(官方代码采用)
- 断续短时泵水,复读土壤湿度,达到大致标准即可
两种方法主要受限于土壤湿度传感器的灵敏度和反应延时,比如多久可以感知湿度变化,最小时间间隔如何,我们看看该传感器的采用的元件,从土壤湿度传感器wiki可以下载到传感器的原理图,如下:
结构比较简单,稳压芯片非常重要,关系测量基准,定时器采用Texas Instruments TLC555CDR芯片,介绍及原理图点此下载,最后就是测量用的电容。因为本人小白,但是采用德州TI的芯片测量灵敏度和延时想必有保证,但最后还是需要时间测试一下才行。
2.1.3 硬件组装
使用前需要对土壤湿度传感器进行校准
2.1.4 程式代码
流程如下:
- 间隔12小时检测一次土壤湿度或者从RPi那里获取当前时间
- 如果湿度低于指定值,浇水
- (Optional) 读取当前温度和亮度,很高的话就不浇水,近似时间。
2.2 识别取证系统(RPi)
受限于microbit的IO数量和计算能力,将识别取证功能独立出来,树莓派和microbit之间进行通讯。
这里我们选择无线网络进行通讯,wireless增加了灵活性,同时bt有时候会跑飞。在RPi端的使用Python进行编程。
我们采用的摄像头可视角小于180°,所以设想将摄像头安装在云台上,由RPi识别出偷吃贼入侵的方向调转摄像头进行识别取证,我们这里采用PIR阵列进行定位。
2.2.1 基于红外热释电传感器的空间定位
相信很多人都看过连姆尼森的经典电影《飓风营救2》,里面就有通过投掷手雷听爆炸声时间差来判断地点的片段。另外,我们知道一个小常识来判断打雷的地方离自己有多远,就是看到闪电和听到雷声的时间差乘以340米进行估算。这里的原理类似,可是看时间差。
AM412 红外热释电传感器
普通的PIR模块具有两个可变电阻用以调节检测范围(阈值)和持续时间,我们拿到的DF模块是固定范围和时常的,比较遗憾。关于红外热释电模块的详细讲解可以看杜洋的视频课程工欲善其事 。
热释电效应
是指热释电晶体和压电陶瓷等在温度变化时产生临时电压的能力。温度变化引起这些材料在结构上出现电荷中心相对位移,极化程度发生变化,两端产生异号束缚电荷,导致在其两端产生一个电压信号。
DF的模块采用AM412传感器,可以从这里下载数据手册。需要注意:
检测人体以外的热源,或无热源温度变化及移动的情况下,可能无法进行检测。需要注意以下一般事项。请务必通过实际使用状态确认性能以及可靠性。
1)检测人体以外的热源时
(1)小动物进入检测范围时
(2)太阳光、汽车车头灯、白炽灯等的远红外线直射传感器时
(3)因冷温室设备的暖风、冷风和加湿器的水蒸气等而使检测范围的温度发生剧烈变
化时
2)难以检测热源时
(1)在传感器和检测物体之间有玻璃和丙烯基等难以透过远红外线的物质时
(2)检测范围内的热源几乎不动作,或高速移动时
另外还要注意该PIR传感器探测视角的问题,并不是前方180°:
菲涅尔透镜
菲涅尔透镜 (Fresnel lens) ,又名螺纹透镜,镜片表面一面为光面,另一面刻录了由小到大的同心圆,它的纹理是根据光的干涉及扰射以及相对灵敏度和接收角度要求来设计的。
左侧为普通透镜,右侧为菲涅尔透镜。
菲涅尔透镜作用有两个:一是聚焦作用,即将热释红外信号折射(反射)在PIR上,第二个作用是将探测区域内分为若干个明区和暗区,使进入探测区域的移动物体能以温度变化的形式在PIR上产生变化热释红外信号。
PIR模块采用具有热释电效应的感受器,将生物热红外信号转换为电信号。声音的传播速度是343.2 m/s,生物热红外信号属于红外线,是介于微波和可见光之间的电磁波,也就是约等于光速。
Kalman滤波算法
获取的信号中存在干扰,需要滤掉。【To-do】
硬件组装
- RPi Camera
- RPi 3b
- 红外热释电传感器
- 云台+舵机
云台用的DF的迷你2自由度云台,可是和舵机轮盘 不合。。。
2.2.2 基于计算机视觉的图像物种识别系统
使用Python + SimpleCV库在树莓派上实现,具体内容【Todo。。。】——楼主你咋又todo啊,不知道一般todo的都没下文了吗?
2.2.3 分步代码
a) RPi通知
通过无线mqtt激活microbit警告驱离系统
拍摄入侵者图片并上传至网络 | sm.ms API/bypy
通过微信通知我有入侵者|server酱/wxpy
import paho.mqtt.publish as publish
import requests
publish.single('topic', 'hello, world!', hostname='iot.dfrobot.com.cn',
client_id='cid',
auth= {'username':"username", 'password':"pwd"})
payload = {'text': '标题', 'desp': '内容,<64Kb,支持markdown'}
requests.get('https://sc.ftqq.com/[SCKEY(登入后可见)].send', params=payload)
详细我就不多讲了,雪球越滚越大,看看paho-mqtt的API手册,我这里单向和mb通讯,仅需要publish。
b) RPi 摄像头捕捉上传识别
拍照并上传到百度网盘,调用simpleCV进行识别,需要安装python3-picamera和bypy,参考我之前写的文章:
import picamera
from bypy import ByPy
bp=ByPy()
# camera.rotation = 180
camera.capture('image.jpg')
# 将当前目录同步至你的百度网盘/apps/bypy目录下
bp.syncup()
c) 定位转向抓拍
通过三个PIR模块将空间三等分(120°),云台将摄像头带向先捕捉到运动信号的PIR模块方向,然后抓拍。
2.2.4 综合代码
#!/usr/bin/env python3
"""
Detects invader and send alert to Wechat & microbit.
"""
__author__ = "pATAq"
__version__ = "0.1"
import paho.mqtt.publish as publish
import time, requests, picamera
import RPi.GPIO as gpio
from bypy import ByPy
gpio.setmode(gpio.BCM)
# 定义三个PIR模块引脚
gpio.setup(17, gpio.IN)
gpio.setup(27, gpio.IN)
gpio.setup(22, gpio.IN)
# 定义舵机引脚(with PWM support)
gpio.setup(12, gpio.OUT)
bp=ByPy()
current_state = 0
try:
while True:
time.sleep(0.1)
pir1 = gpio.input(17)
pir2 = gpio.input(27)
pir3 = gpio.input(22)
current_state = pir1 or pir2 or pir3
if current_state == 1:
# active microbit with 'cmd' channel, replace - with ur info
alert('-', '-', '-', '-', '-')
# 转向目标
if pir1 == 1:
pass
elif pir2 == 1:
pass
elif pir3 == 1:
pass
# SAY C-H-E-E-S-E!
camera.capture('image.jpg')
bp.syncup()
time.sleep(5)
except KeyboardInterrupt:
pass
finally:
gpio.cleanup()
def alert(topic, cid, usrname, pwd, SCKEY):
publish.single(topic, 'thief', hostname='iot.dfrobot.com.cn',
client_id=cid,
auth= {'username':usrname, 'password':pwd})
# single(topic, payload=None, qos=0, retain=False, hostname="localhost",
# port=1883, client_id="", keepalive=60, will=None, auth=None, tls=None,
# protocol=mqtt.MQTTv311, transport="tcp")
payload = {'text': '贼来了!', 'desp': ''}
requests.get('https://sc.ftqq.com/' +SCKEY+ '.send', params=payload)
云台部分参考文末链接,我的转盘不合没搞起来。。。
2.3 microbit警告驱离系统
比较简单,接收树莓派传来的告警信息,响起大喇叭,开启振动器(大号的绑个蛇效果更好),闪烁高亮LED:
这里新建一个Topic_1,用于接收控制命令。
3、总结
完整代码如下:https://makecode.microbit.org/_aaxU6JLY105L
我们选择12小时(43200000ms)检测一次。第一轮使用过的功能如利用led矩阵和手机端功能都没复述,实际上想实现比较简单。其他一些功能受限于个人原因,暂时没实现/没加入,以后会进一步完善。
进一步扩充:
- 使用额外的RTC模块附加到microbit或者RPi上,进行更精确的定时科学浇花
- 增加读取内置亮度、温度传感器,增加一个遮阳板用舵机控制开合
- 开发手机端功能,比如Blnky或支持mqtt的HOME Assistant
- 待补充
参考
farmMinder | hackster.io
Crop Defender | hackster.io
黄鑫. 热释电红外无线传感器网络人体定位系统设计与实现[D]. 中山大学, 2009.
李博雅, 李方敏, 刘新华,等. 基于P IR Sensor的单目标跟踪系统的设计与实现[J]. 传感技术学报, 2014(9):1214-1220.
文科. 基于PIR探测器的人与非人识别方法研究[D]. 重庆大学, 2013.
臧会巧. 盆栽花卉浇水应注意的几个问题[J]. 河北林业科技, 2007(1):52-52.
姚遥. 盆栽花卉浇水的原则及方法[J]. 现代种业, 2007(4):37-37.
DFRobot万物互联大赛第二轮的更多相关文章
- DFRobot万物互联大赛第一轮
前言 原创文章,转载引用务必注明链接,水平有限,如有疏漏,欢迎指正. DF搞的这个比赛还挺有趣:micro:bit × OBLOQ DF创客社区玩转物联网挑战赛,一边在写文章一边在爱奇艺上看着印度电影 ...
- Google科学家前腾讯副总裁吴军将出席第二届万物互联创新大会
当越来越多的科技产品注入互联网的基因,"万物互联"的模式悄然兴起.第二届万物互联创新大会(B12大会)将于2016-11-13日在杭州市余杭区隆重召开.Google科学家前腾讯副总 ...
- 万物互联—MQTT协议
一.简介 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输),最早是1999年由IBM开发的基于发布/订阅范式的消息协议,是一种极其简单和轻量级的消息 ...
- 【百度之星2014~初赛(第二轮)解题报告】Chess
声明 笔者近期意外的发现 笔者的个人站点http://tiankonguse.com/ 的非常多文章被其他站点转载.可是转载时未声明文章来源或參考自 http://tiankonguse.com/ 站 ...
- 2016 ASC 移动物联网安全高峰论坛 万物互联时代的安全与隐私
互联网的发展已经迈入了"万物互联"时代.移动设备作为人.物连接的主要入口,让人们享受高效.便利的"互联生活"的同时,也给用户的安全和隐私带来了前所未有的挑战.正 ...
- 腾讯Java程序员第二轮面试11个问题,你会几个?
此前,分享了阿里巴巴.网易.百度等多家名企的JAVA面试题. 这也引来了不少程序员网友们的围观. 其中,也有相当一部分网友是已经从事Java开发好多年的程序员,当他们阅读完JAVA面试题的反应是:一个 ...
- 小米Java程序员第二轮面试10个问题,你是否会被刷掉?
近日,开发者头条上分享了一篇"小米java第二轮面经",有很多的java程序员表示非常有兴趣. 下面l就和各位分享小米java第二轮面经(华为java工程师笔试面试题可以看文章某尾 ...
- 【百度之星2014~初赛(第二轮)解题报告】JZP Set
声明 笔者近期意外的发现 笔者的个人站点http://tiankonguse.com/ 的非常多文章被其他站点转载,可是转载时未声明文章来源或參考自 http://tiankonguse.com/ 站 ...
- 时序数据库(TSDB)-为万物互联插上一双翅膀
本文由 网易云发布. 时序数据库(TSDB)是一种特定类型的数据库,主要用来存储时序数据.随着5G技术的不断成熟,物联网技术将会使得万物互联.物联网时代之前只有手机.电脑可以联网,以后所有设备都会联 ...
随机推荐
- Log4j官方文档翻译(七、日志格式化)
apache log4j提供各种layout对象,然后根据自己指定的layouts对象转化日志信息.通常来说都是应用量身定制layout对象转换信息格式. 所有的layout对象从Appender对象 ...
- 习题:Dual Matrices(思路题/分治)
tyvj1764 描述一个N行M列的二维矩阵,矩阵的每个位置上是一个绝对值不超过1000的整数.你需要找到两个不相交的A*B的矩形,使得这两个矩形包含的元素之和尽量大.注:A*B的矩形指连续的A行.B ...
- BZOJ1801 [Ahoi2009]chess 中国象棋 【dp】
题目 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. 输入格式 一行包含两个整数N,M,中间用空格分开. ...
- [LVS] 用keepalived实现LVS NAT模式高可用性
默认前提是LVS已经可以正常工作了. 因为是NAT模式,RS的路由要指向LVS的接口地址,所以需要一个统一的后台浮动地址,使得RS都指向这个浮动IP.否则在切换时,会导致RS回包到DOWN掉的LVS上 ...
- 控制cxGrid 主从表的明细只展开一个
procedure TForm.ADetailDataControllerCollapsing( ADataController: TcxCustomDataController; ARecordIn ...
- Fence(codeforces 232D)
题意: 对于给定的a[1..n],定义区间[s,t]和[x,y]"匹配"当且仅当下列条件同时满足:1. t-s=y-x,即长度相同.3. t<x或s>y,即两区间没有交 ...
- 洛谷P2114起床困难综合征
从高位到低位按位枚举,贪心.如果该位填1比填0结果优且填1不会超出m限制,那就填1,否则填0 /*by SilverN*/ #include<iostream> #include<c ...
- 获取当前应用程序实例(instance:HINSTANCE)(转)
if using MFC AfxGetInstanceHandle(). For console programs, call GetConsoleWindow() to get the HWND t ...
- 详解C中volatile关键字(转)
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据.如果没有volatile关键字,则编译器可能优化读取和存储 ...
- linux多线程学习笔记六--一次性初始化和线程私有数据【转】
转自:http://blog.csdn.net/kkxgx/article/details/7513278 版权声明:本文为博主原创文章,未经博主允许不得转载. 一,一次性初始化 以保证线程在调用资源 ...