目录
前言
提示:这是大一的作业,使用的东西都会较为简单。有些元器件涉及的内容是直接将卖家的说明书截取出来使用的,然后代码中有需要优化的欢迎大家评论区留言。然后大家购买元器件时可以自发找客服拿相关说明材料
元器件检测到人后发出警报,如果是发现并希望能安静的可以按下按键来关闭,如果熟人是不想麻烦主人回来,可以按下已知的暗号,这时会向指定手机再发送一次暗号短信,主人发现是熟人就可以不回来检查。
提示:以下是本篇文章正文内容,下面案例可供参考
一、模块选型
- 主控模块:Arduino UNO
- 输出模块:1602A背光显示屏、有源蜂鸣器
- 输入模块:4*4矩阵、SR602微型人体感应模块
- 通信模块:SIM800C_MINI
二、元器件说明
1.1602A背光显示屏
~引脚说明:【接线为此案例所接引脚】
PIN引脚 | 引脚说明 | 接线 | PIN引脚 | 引脚说明 | 接线 |
VSS | 电源地 | GND | D0 | 数据 | |
VDD | 电源正级 | +5V | D1 | 数据 | |
VL | 液晶显示偏压 | 接一个10k电位器再接GND | D2 | 数据 | |
RS | 数据/命令选择 | A0 | D3 | 数据 | |
RW | 读/写选择 | GND | D4 | 数据 | A2 |
E | 使能信号 | A1 | D5 | 数据 | A3 |
A | 背光源正极 | 5V | D6 | 数据 | A4 |
K | 背光源负级 | GND | D7 | 数据 | A5 |
PS:电位器是调节阻值到使1602A显示的更为清晰的状态
实物图如下:
2.有源蜂鸣器
~引脚说明【需要它鸣叫时将其正极+拉高即可】
pin引脚 | 说明 |
+ | D13 |
- | 接GND |
3.4*4矩阵键盘
PIN引脚 | 说明 | 接线 | PIN引脚 | 说明 | 接线 |
1 | 行1 | D2 | 5 | 列1 | D6 |
2 | 行2 | D3 | 6 | 列2 | D7 |
3 | 行3 | D4 | 7 | 列3 | D8 |
4 | 行4 | D5 | 8 | 列4 | D9 |
4.SR602微型人体感应模块
~引脚说明:【out为高/1时检测到人,为低/0是没有检测到】
pin引脚 | 说明 |
+ | 接Arduino3V |
- | 接GND |
out | 数据输出/接D10 |
5.SIM800C_MINI
~引脚说明:【带颜色的为此次用到的】
PIN引脚 | 引脚说明 | PIN引脚 | 引脚说明 |
V-IN | DC5V-18V电源输入,推荐使用DC9V | VBAT | 鲤电池输入引脚DC3.5-4.5v |
EN | 电源开关使能引脚默认使能 | GND | 电源的地【可与PWM短接】 |
GND | 电源的地 | PWM | 启动引脚和GND短路可实现开机自启动 |
TXD | GSM模块的TXD引脚接其他模块的RXD | GND | 电源的地 |
RXD | GSM模块的RXD引脚接其他模块的TXD | VRTC | RTC外置电池引脚 |
DTR | 数据终端准备 | RI | 内核振铃提示引脚 |
SPKP | 内核音频输出引脚 | MICP | 内核音频输入引脚 |
SPKN | 内核音频输出引脚 | MICN | 内核音频输入引脚 |
~SIM卡底座:使用2/3/4G卡【移动/联通卡】
~模块指示灯【下图蓝色圈处的灯,观察其闪烁的间隔】
LED 指示灯状态 | SIM800C 工作状态 |
熄灭 | SIM800C 没有工作 |
60ms 亮/800ms 熄灭 | SIM800C 没有找到服务(GSM 卡无服务) |
60ms 亮/3000ms 熄灭 | SIM800C 连接到服务信号 |
60ms 亮/300ms 熄灭 | SIM800C 正在 GPRS 通讯 |
~模块使用【此案例用到的指令】
AT ,点击发送,看到 返回 AT OK 这样最基础的通讯成功了。然后可以测试其它常用指令了
AT+CMGF: 用于设置短消息模式, SIM800 支持 PDU 模式和文本 ( TEXT)模式 2 种模 式,发送: AT+CMGF=1,即可设置为文本模式。
AT+CSCS: 用于设置 TE 字符集,默认的为 GSM 7 位缺省字符集, 在发送纯英文短信的时候,发送: AT+CSCS=”GSM”,设置为缺省 字符集即可。
AT+CMGS: 用于发送短信,在“ GSM”字符集下,最大可以发送 180 个字节的英文字符。
三、使用步骤
1.初始化函数
#include <Keypad.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal.h>
#define ROWS 4 //行所用针脚数
#define COLS 4 //列所用针脚数
#define RX 12 //uno板的输入引脚接SIM800C的输出TX脚
#define TX 11 //uno板的输出引脚接SIM800C的输入RX脚
#define Buzzerpin 13 //蜂鸣器引脚
#define PIR_sensor 10 //微人体感应引脚
unsigned char buffer [64];
SoftwareSerial GPRS (RX, TX);
char keys[ROWS][COLS]={ //二维数组设置键盘
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS]={2,3,4,5}; //行所使用的针脚 connect to the row pinouts of the Keypad
byte colPins[ROWS]={6,7,8,9};
Keypad customKeypad = Keypad(makeKeymap(keys) ,rowPins ,colPins ,ROWS ,COLS ); //构造
LiquidCrystal lcd (A0,A1,A2,A3,A4,A5); //定义液晶引脚(RS,E,D4,D5,D6,D7)
byte back[8] = //定义一个自定义字符数组变量back[];字符的像素数据
{
0b00000,
0b00000,
0b11111,
0b10101,
0b11011,
0b11111,
0b00000,
0b00000
};
String number="19047082845"; //拨打或发送短信的电话号码,由按键输入//也可以改成写定
String instr="";
int someone_falg = 0;
int sms_flag=0;
int ring =0;
int i = 0;
void setup() {
Serial.begin(9600);
pinMode (PIR_sensor ,INPUT); //设置微人体感应模块为输入状态
pinMode (Buzzerpin ,OUTPUT); //设置蜂鸣器对应引脚为输出状态
GPRS.begin(9600);
lcd.createChar(1,back); //createChar(num,data);num:所创建字符的编号,data:字符的像素数据
lcd.begin(16,2); //LCD字符的行列个数
lcd.print("System Ready.."); //系统准备,初始化
delay(1000);
gsm_init();
lcd.clear();
lcd.print("Ststem Ready"); //系统准备完成
delay(1000);
}
void gsm_init() //sim800c初始配置确定
{
lcd.clear(); //清屏
lcd.print("Finding Mobile.."); //寻找信号
GPRS.println("AT"); //
Serial.println("AT"); //return OK you can using the model
delay(1000);
if(Serial.find("OK")) lcd.print("AT OK");
lcd.clear(); //清屏
GPRS.println("ATEI"); //recoming to serial
lcd.print("Finding Network..");
GPRS.println("AT+CPIN?"); //查询SIM卡状态,返回 +CPIN:READY 则状态正常
delay(1000);
lcd.setCursor(0,1);
if(Serial.find("+CPIN: READY")) lcd.print("READY");
delay(1000);
lcd.clear();
lcd.print("Network Found..");
delay(1000);
lcd.clear();
}
2.功能函数
代码如下(示例):
void Alarm() //蜂鸣器警报
{
someone_falg++;
lcd.clear();
lcd.print("END-->D");
for (int val = 0; val<10; val++)
{
char key1=customKeypad.getKey();
if(key1=='D')
{
sms();
break;
}
digitalWrite(Buzzerpin, HIGH);
delay(500);
digitalWrite(Buzzerpin ,LOW);
delay(500);
}
}
void someone()
{
if (digitalRead(PIR_sensor) ==1)
{
GPRS.println("AT+CMGF=1");
delay(500);
GPRS.println("AT+CSCS=\"GSM\""); //√开启GSM字符集
delay(500);
GPRS.println("AT+CMGS=\"19047082845\"");
delay(1000);
GPRS.print("Someone is coming");
GPRS.write(0x1A);
delay(500);
Alarm();
}
}
void sms() //函数说明:
{
lcd.clear();
lcd.print("IN SMS");
delay(1000);
GPRS.println("AT+CMGF=1"); //√AT+CMGF= 0为pdu模式 1为txt模式
delay(1000);
GPRS.println("AT+CSCS=\"GSM\""); //√开启GSM字符集
delay(1000);
lcd.clear();
lcd.print("SEND to master");
lcd.setCursor(0,1);
lcd.print("Press A");
delay(2000);
GPRS.println("AT+CMGS=\"1**********\""); //√这个要换行;测试*AT+CMGS="号码"发送短信
lcd.clear();
lcd.print("After Enter MSG");
lcd.setCursor(0,1);
lcd.print ("Write PASSWORD");
delay(2000);
lcd.clear();
lcd.setCursor(0,0);
while(1)
{
char key =customKeypad.getKey();
if(key)
{
if(key=='A')
{
lcd.clear();
lcd.print("Sending SMS...");
GPRS.write(0x1A); //√在短信结束时不用换行发送十六进制的1A
delay(5000);
lcd.clear();
lcd.print("SMS Sent to");
lcd.setCursor(0,1);
lcd.print("190****2845");
delay(2000);
lcd.clear();
break;
}
else
{
GPRS.print (key);
lcd.print(key);
}
}
}
}
3.loop函数
代码如下(示例):
void loop() {
// put your main code here, to run repeatedly:
someone();
}
四、接线图与实物图
ps:这里V0需要接一个10K电位器,但是不想改图了,凑合着看吧
总结
本文仅仅简单介绍了SIM800C的使用,而SIM800C提供了大量接收电话、短信一类的指令,感兴趣的可以了解一下。并且会有一些错误,未来应该会进行修改以及完善一些细节。