手机是现代人无法离开的设备。至少从现在来说,父母再不会说让我放下手机之类的话,因为对于他们来说,检查手机的频率已经接近5分钟一次。 如果能把一些监视事件直接发送到手机,会很方便使用。比如,孩子在屋里睡觉,房门紧闭的情况下如何及时听到孩子醒来时呼喊声是严重的问题。使用传统设计需要有发射端和接收端,需要考虑穿墙后的信号问题会比较麻烦。 这次我仍然使用 DFRobot出品的 SIM808模块外加 Arduino Uno来实现。 因为涉及到拨打电话,需要插入SIM卡,我选择的是淘宝购买的阿里通讯的170卡(电讯诈骗专用卡),移动制式。 拿到手之后建议先将SIM808上的开关拨到 Debug模式上,然后使用IDE进行测试。 具体方法【参考1】 1. 将SIM卡插在扩展板上,并把SIM808扩展板插上ArduinoUNO,同时接上接上外接电源(这是必须的,我用的是2节18650电池串联 8V)。 2. 拨动功能切换开关至None档,下载一个样例代码Blink来确保串口不被占用(其他不占用串口的代码也可以)。 3. 按下Boot开机键,等待SIM卡网络注册正常,既Net状态指示灯进入慢闪状态(3s一次) 4. 拨动功能切换开关至USB_DBG档,此时我们就可以通过串口助手直接与SIM808芯片进行通信。 拨打的命令是 ATD电话号码; ,特别注意最后是分号结尾,并且检查波特率115200. 测试结束后,就可以继续代码设计了。 我选择了一个口哨开关,当外界有声音时(阈值可调),会输出低电平;同时我还预留D4,未来可以接入一个按钮,即可实现按键直接拨打指定号码。 代码如下:
[mw_shl_code=c,true]#include <DFRobot_sim808.h>
#define PHONE_NUMBER "123456789011"
#define POWERONPIN 12
#define CALLINGBUTTON 4
#define SENSORBUTTON 7
DFRobot_SIM808 sim808(&Serial);
// the setup function runs once when you press reset or power the board
void setup() {
Serial.begin(115200);
pinMode(POWERONPIN, OUTPUT);
pinMode(CALLINGBUTTON, INPUT_PULLUP);
pinMode(SENSORBUTTON, INPUT_PULLUP);
digitalWrite(POWERONPIN,HIGH);
//********Initialize sim808 module*************
while(!sim808.init()) {
delay(1000);
Serial.print("Sim808 init error\r\n");
}
Serial.println("Sim808 init success");
}
// the loop function runs over and over again forever
void loop() {
if (LOW==digitalRead(CALLINGBUTTON)) {
Serial.println("Calling by button");
sim808.callUp(PHONE_NUMBER);
}
if (LOW==digitalRead(SENSORBUTTON)) {
Serial.println("Calling by Sensor A");
delay(500);
if (LOW==digitalRead(SENSORBUTTON)) {
Serial.println("Calling by Sensor B");
sim808.callUp(PHONE_NUMBER);
delay(10000);
}
}
Serial.println("Wating for event");
delay(500);
}
[/mw_shl_code]
先说说缺点: 1. 整体响应有一个延时,至少有5秒以上。如果是用来监视实时性很强的事件,比如说,核电站的朋友设计自动检查装置,一定要考虑这个问题; 2. 测试中有碰到无法接通的情况,从串口上来看命令已经下达,但是没有响应,不清楚是设备的问题,还是网络的问题,测试中我使用的是 170的号码,走的是移动的网络,并非亲妈; 说说优点: 1. 通知本身无花费,电话拨过去,看到消息直接挂掉就好,不会有费用产生; 2. 布置方便,用2节18650即可驱动整体; SIM808电话方面的功能还是非常强大的,后面还会介绍更有趣的玩法。 参考:
|