前言
现在的智能手表功能日益强大,如Apple Watch的摔倒检测功能和报警SOS功能,但是这些手环对于许多老人来说可能太智能了,用起来可能会遇到困难,而且一旦忘记充电,这些功能都将会失效。
在这篇文章里,我将使用自发电无线开关制作一个无需电池的报警手环。
手环篇
这是DFRobot出品的自发电无线开关,按动开关会带动发电线圈,发出足够的电驱动电路发射出一次信号。
但既然是手环,那就要戴在手上,我在网上找到了这一款用于华为手表的表带。
接下来是建模手环主体,用抽壳命令做出一个1mm厚的小盒子,两边做上表带的连接器,连接器上边预留一个伸出天线的小孔。
最后3D打印出成品。
剪一截漆包线,要和自发电无线开关的天线一样长,一端用小刀把漆刮干净方便焊接。把原来的天线用电烙铁拆下来,换上漆包线做的天线,最好还要测试一下这个天线能不能用。
把自发电开关装进手环外壳,天线从小孔伸出来,天线比较长,我决定把天线藏进表带里。我选用的表带是编织弹性材质,如果你用的漆包线足够细,可以用针来穿进表带里,然而我选的漆包线太粗,没办法穿过针眼,只好手工一点一点地穿。
将天线按照Z字形穿进表带中,穿好后就是这样,如果不细看很难看到天线的存在。
接着是手环的盖子,在上面留了一个按开关的凹槽,3D打印后可以用胶水粘上去,也可以用电烙铁将焊缝抹平。
手环部分就做好了。
树莓派篇
首先要实现树莓派打电话的功能。移远EC200U是一款价格实惠、功能丰富的4G通信模块,插入一张sim卡后,可以打电话、发短信、4G上网。购买时一定要注意买带音频接口的语音款,不然无法实现语音报警功能。
购买链接:
移远通信树莓派4B开发板4g模块扩展板EC200U全网通cat1核心板
我买的这款是可以直插树莓派,带一个耳机接口(TRRS,四线),所以我考虑把它和树莓派自带的3.5mm音频接口相连,在网上是可以找到相关的连接线的,一些淘宝上的店铺还可以支持定制。
这里我直接找了一根四线音频线和一根三线音频线,树莓派输出的左右声道任选一路,接到4G模块的麦克风通道,具体连线应该类似这样。
我测试过如果两根线连接反了,可能会出现没有声音的现象,只要把两根线调回来就行了,或者也可以选择像我一样买一个音频变压器(同样只需要其中一路),改善阻抗,还可以让音质好一点(树莓派原生的音频口音质比较糟糕,如果追求更好的音质可以选用独立的USB声卡)。
控制程序
4G模块通过串口和树莓派通信,在树莓派里用ttyS0表示,波特率115200。
433MHz无线开关接收端接到树莓派的GPIO28,下面的程序之所以是20,是因为用的是BCM表示的方法。
#!/usr/bin/python3
#-*- coding:utf-8 -*-
import RPi.GPIO as GPIO #导入RPi.GPIO库
import time #导入time库
import serial
from threading import Timer
from EC200U import*
import os
rec_buff = ''
APN = 'CMNET'
iphone = '10086' #改为要拨打的电话号码
class EC200UCtr:#发AT指令控制模块
def EC200U_AT(self):
while(ec200u.ATinit('ATE0\r\n','OK')==0):#判断模块是否存在
pass
while(ec200u.ATinit('AT+CIMI\r\n','460')==0):#判断卡是否存在
pass
while(ec200u.ATinit('AT+CGATT?\r\n','+CGATT: 1')==0):#判断是否注册网络成功
pass
ec200u=EC200U('/dev/ttyS0',115200)
ec200uctr=EC200UCtr()
ec200uctr.EC200U_AT()
LED = 21 #LED引脚号
KEY = 20 #按键引脚号
GPIO.setwarnings(False) #不加这句会有警告,因为该引脚已经被设置成了非默认值(也可以不加,不影响正常使用)
GPIO.setmode(GPIO.BCM) #使用BCM编码的引脚号
GPIO.setup(LED,GPIO.OUT) #配置LED引脚模式
GPIO.setup(KEY,GPIO.IN,GPIO.PUD_DOWN) #设置KEY引脚模式
def KEYInterrupt(KEY): #外部中断服务
GPIO.output(LED,GPIO.HIGH)
print("设置电话通道")
ec200u.ATSignle('AT+QAUDMOD=2\r\n','OK')#设置电话通道
print("拨号...")
ec200u.ATSignle('ATD'+iphone+';\r\n','OK')#拨打电话
while ec200u.ATresult('AT+CLCC\r\n').split(',')[2] != "0":#这个是等待电话接通
time.sleep(1)
os.system('aplay -D plughw:0,0 ../Music/alert.wav') #改为预制的报警录音
GPIO.output(LED,GPIO.LOW)
ec200u.ATSignle('AT+CHUP\r\n','OK') #挂断电话
GPIO.add_event_detect(KEY,GPIO.FALLING,KEYInterrupt,200)
#KEY:按键引脚号,GPIO.FALLING:下降沿模式,KEYInterrupt:中断服务函数,200:消抖时间(ms)
while True:
time.sleep(1)
程序不长,我们关注一下这门几个指令。
这个是用来拨打电话的指令,比如ATD10086就意味着打电话到10086。
这个指令是用来主动获取电话状态的,0代表激活状态,就是电话被接通了。
os.system('aplay -D plughw:0,0 ../Music/alert.wav') #改为预制的报警录音
linux中用于播放音频的指令,我们可以利用手机或录音笔先把报警信息录制下来,也可以通过语音生成网站生成音频文件,然后保存到树莓派中,就可以用这条指令控制播放了。
alsamixer
如果发现音量太小,也可以通过在Shell中输入这个指令打开图形化界面,来调节系统音量。
了解了以上这几个指令,就不难理解这段程序。
每当收到无线手环的信号时,程序开始拨号,等待接通后,播放预留的报警录音,播放完毕后
1.等待433无线接收端接收信号,触发外部中断
2.拨号指定的电话号码
3.等待对方接听
4.播放预留的报警录音
5.挂断电话