2回答

0收藏

[大赛作品提交] 【进阶七】家庭陪伴小机器人微信安防推送技能

Raspberry Pi Raspberry Pi 5722 人阅读 | 2 人回复 | 2018-01-10

本帖最后由 ky123 于 2018-1-31 14:03 编辑

感谢E络盟提供的助赛基金。

      安防技能实际上是指家里无人后,通过摄像头监测到异常后实时通知主人!实现这个功能的方法有很多,例如比较热门的运动侦测,当对比两帧不同的图片,当数据差异较大时判断为异常闯入,该方法很高大上,但难度很大,当环境光发生变化时会误判断,需要算法滤波处理!最重要的是对处理器要求很高,用树莓派实现时还需要修改swap缓存,同时占用资源过大,不仅占用CPU,实时拍摄占用硬盘空间,最后功耗也比较大!不太适合本项目中的小车这种电池供电的产品!


       因此,采用比较廉价也比较简单的人体热释电(PIR)+摄像头拍照的方案!本方案的思路是PIR检测到发热体(不受环境光变化影响)产生脉冲信号,树莓派检测到信号后启动摄像头拍照,并实时推送给主人,是不是很easy!如果主人比较关心家庭情况,也可web远程视频查看具体情况!(由于未申请到花生壳路由器暂支持),暂用微信消息控制拍照替代,本项目中的图片会不断被替换刷新,不会占据过大硬盘空间。

     
  •      信号检测:RPi.GPIO
  •      拍照:uvccapture,
  •      图片推送:python版微信wxpy
  •      编程语音:python2.7

硬件部分:
本设计中选用BOARD中的引脚8,即BCM编码中引脚14,作为PIR脉冲信号的检测口;

软件部分的程序分两大部分:拍照和推送;

首先讲推送部分

1.1 安装wxpy
项目使用的python 是3.5版本的,因此语法会和2.x版本有所区别,wxpy 支持python3.4-3.6 以及python2.7版本
在这里默认大家以及安装好了pip,我们需要安装wxpy 以及wechat_sender 两个包;
  1. sudo pip install wxpy -i "https://pypi.doubanio.com/simple/"
  2. sudo pip install wechat_sender -i "https://pypi.doubanio.com/simple/"
复制代码
以上安装过程中可能会报错,
  1. error: command 'arm-linux-gnueabihf-gcc' failed with exit status 1
复制代码

该问题的含义是指,gcc未找到<Python.h>头文件,所以需要通过依赖安装来安装该支持库。
然后是按照python应用开发包,已安装的可以跳过!
python2.x:
  1. sudo apt-get install python-dev
  2. sudo apt-get install libevent-dev
复制代码
1.2 wxpy 登陆

wxpy 使用起来非常简单,我们只需要创建一个bot 对象,程序运行后,会弹出二维码,扫描二维码后显示登陆成功。
桌面版的树莓派可以通过显示器或者远程界面,查看二维码图片并扫描登录!
有些情况下,可能不能通过终端打开图片(例如部署在服务器上时),我们可以通过参数选择在终端内显示二维码,这样代码会变为:
  1. from wxpy import *
  2. bot = Bot(console_qr=True)
复制代码

如果你认为每次都需要扫描二维码很麻烦,可以启用缓存,来保存自己的登录状态:
  1. bot = Bot(console_qr=True, cache_path=True)
复制代码
该缓存设置可以在一段时间内避免重复扫码登录,但当超时是还需再扫描二维码重新登录~
重头戏来了!首先实现微信发消息触发摄像头拍照并发送照片,关于自动处理信息的更多内容参考请见这里
  1. # -*- coding: utf-8 -*-

  2. # 这样也行
  3. # coding:utf-8

  4. from wxpy import *
  5. import picamera

  6. import  RPi.GPIO as GPIO
  7. import sys
  8. import time
  9. # import pigpio

  10. # pi = pigpio.pi()
  11. # for BCD.GPIO      
  12. # PIR_GPIO = 0
  13. # pi.set_mode(PIR_GPIO, pigpio.INPUT)

  14. #初始化GPIO
  15. GPIO.setmode(GPIO.BOARD)
  16. PIR_GPIO = 8
  17. GPIO.setup(PIR_GPIO,GPIO.IN)

  18. #初始化微信机器人,扫码登录
  19. bot = Bot(console_qr=True,cache_path=True)
  20. # 获取所有好友
  21. friends = bot.friends()

  22. # 遍历输出好友名称
  23. for friend in friends:
  24.     print(friend)

  25. my_friend = bot.friends().search('smilecat')[0]
  26. #初始化图灵机器人
  27. tuling = Tuling(api_key='b48696865a5346e79dcd466355ebabbd')
  28. # 自动回复my_friend所有文字消息
  29. @bot.register(my_friend,msg_types=TEXT)
  30. def pir_send_image():
  31.         if GPIO.input(PIR_GPIO) == True:
  32.                 my_friend.send_image('image.jpg')
  33.                 print('send image')
  34.         time.sleep(5)

  35. while True:
  36.         pir_send_image()
  37.         time.sleep(5)
  38. # 开始运行
  39. bot.join()
复制代码
以上程序依次实现了微信的登录(微信号A)、查找好友smilecat(这个是我的微信大号),当收到信号时将照片发给这个微信号smilecat!(本项目需要两个微信账号)图灵机器人是一个聊天小机器人,本项目中用来检测文本信息然后实现远程控制摄像头功能,也附带福利闲聊功能!其api_key可以在图灵官网注册!


然后讲拍照部分
安装uvccapture:
  1. sudo apt-get install uvccapture
复制代码
开始拍照:
  1. uvccapture -B120 -C100 -S100 -x640 -y480 -m -o/home/pi/car/wechar/image.jpg
复制代码
uvccapture携带的参数较多,其中,“-x,-y”为图像分辨率,“-B”为亮度(Brightness),"-C"为对比度(Contrast),“-S”为饱和度(Saturation),"-o"输出图像文件路径,"image.jpg"为保存的照片文件名,默认保存在"/home/pi"目录下,注意要与推送的图片同路径和同名称
  当水平图像分辨率(x)超过960像素时,当垂直图像分辨率(y)超过720像素时,还需要使用YUYV方式进行拍照,此时相比于上述方式,除了需要修改像素参数意外,还要额外增加一个参数“-m”。
像素标准2:1280*720

最后将拍照和推送融合
拍照是终端指令,而推送是python程序,直接在python中添加执行/home/pi/car/wechar/camera.sh会报语法错误!通过以下方式将两者融合!
首先将以上指令封装在shell脚本中camera.sh;
  1. #!/bin/bash
  2. #利用echo输出一些提示语句
  3. uvccapture -B120 -C100 -S100 -x640 -y480 -m -o/home/pi/car/wechar/image.jpg
  4. echo 拍照中.....
复制代码
然后将将脚本用os.system调用!(执行的命令,相当于在Windows的cmd窗口中输入的命令)
  1. os.system('camera.sh')
复制代码
最终的程序如下:
  1. # -*- coding: utf-8 -*-

  2. # 这样也行
  3. # coding:utf-8

  4. #引入shell指令
  5. import os  
  6. import commands  

  7. from wxpy import *
  8. # import picamera

  9. import  RPi.GPIO as GPIO
  10. import sys
  11. import time
  12. # import pigpio

  13. # pi = pigpio.pi()
  14. # for BCD.GPIO      
  15. # PIR_GPIO = 0
  16. # pi.set_mode(PIR_GPIO, pigpio.INPUT)

  17. #初始化GPIO
  18. GPIO.setmode(GPIO.BOARD)
  19. PIR_GPIO = 8
  20. GPIO.setup(PIR_GPIO,GPIO.IN)

  21. #初始化微信机器人,扫码登录
  22. bot = Bot(console_qr=True,cache_path=True)
  23. # 获取所有好友
  24. friends = bot.friends()

  25. # 遍历输出好友名称
  26. for friend in friends:
  27.     print(friend)

  28. my_friend = bot.friends().search('smilecat')[0]
  29. #初始化图灵机器人
  30. tuling = Tuling(api_key='b48696865a5346e79dcd466355ebabbd')
  31. # 自动回复my_friend所有文字消息
  32. @bot.register(my_friend,msg_types=TEXT)
  33. def pir_send_image():
  34.         if GPIO.input(PIR_GPIO) == True:
  35.         os.system('/home/pi/car/wechar/camera.sh')
  36.                 my_friend.send_image('image.jpg')
  37.                 print('send image')
  38.         time.sleep(5)

  39. while True:
  40.         pir_send_image()
  41.         time.sleep(5)
  42. # 开始运行
  43. bot.join()
复制代码
关注下面的标签,发现更多相似文章
分享到:
回复

使用道具 举报

回答|共 2 个

倒序浏览

沙发

噗噗熊

发表于 2018-1-10 15:24:53 | 只看该作者

阿莫斯v5,后面还有进阶几
板凳

阿莫斯

发表于 2018-1-11 09:19:43 | 只看该作者

噗噗熊 发表于 2018-1-10 15:24
阿莫斯v5,后面还有进阶几

今天活动截止了,开始汇总暂不进阶了!以后有优化和补充再加了!
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条