Arduino 使用SIM900-GPRS模块打电话(仅拨通)
目录
实验效果
凌顺实验室(lingshunlab.com)这次分享通过Arduino Uno 的软串口发送AT指令对SIM900模块实现打电话,仅拨通。如果需要可以语音对话的,请选择购买包含麦克风接口的模块。
元件说明
- 支持2,3,4G手机卡(本次实验测试了移动,联通,电信,但仅试通移动)
- 尺寸:49*50 mm
- 电脑调试时可以给USB模块供电,在数据量非常大的情况下,建议电流在1A以上。待机在80MA左右,可以设置休眠状态在10MA左右低功。
- 串口电路:采用TVS和磁珠保护器件来保护板子,使板子不会受到浪涌、高电压的伤害。
- SIM卡电路:增加SMF05C静电释放芯片。
- 天线电路:保证的短且直,这样才能保证信号强度。
- PCB展示:各个接口丝印标出,方便二次开发,设计时完全遵循SIM900A硬件设计手册。
- 一路5V 供电电源接口:我们做了保护,即使接反了也不会烧板子。电脑初期调试电脑USB供电即可;长时间传输数据用电量较大我们推荐1A以上的直流。
- 一路TTL接口:支持3.3V单片机和5V单片机。也就是说支持51类的5V单片机和STM32单片机。
- 两路天线接口:SMA天线接口,IPX MINI天线接口(默认不焊接)。
- 一路232 电平接口:也就是说您可以通过一根232---USB串口线直接将模块连接到电脑上调。也可以USB--TTL连接电脑,根据个人的配件情况而定。不需要多花钱买配件这就是和是别的卖家最大的区别。
引脚说明
BOM
名称 | 数量 |
---|---|
Arduino Uno | x1 |
SIM900 GSM GPRS 无线数据传输板 | x1 |
跳线(杜邦线) | 若干 |
接线方式
提点
SIM900 AT指令文档:
熟读查看SIM900的AT指令对于使用此模块非常有用。
https://www.espruino.com/datasheets/SIM900_AT.pdf
SIM卡联网不成功,需要多尝试
凌顺实验 室(lingshunlab.com)在实际使用中,有时候会提示AT+CREG? 非返回0,1,表示手机SIM卡未能联网,需要多尝试几次,直到指令AT+CREG?返回x,1(主要看第二个数字,为1则代表联网成功,可以打电话或者发短信)。
程序代码
// by lingshunlab.com
#include <SoftwareSerial.h> //加载软串口库
// 定义一个软串口
SoftwareSerial DebugSerial(10, 11); // RX = Pin 10, TX = Pin 11
char phoneNumber[] = "***********"; //替换成需要被拨打电话的号码(只需要修改""里的内容)
// 读取软串口数据并显示在串口监视器中
void ReadBuffer() {
// 当软串口有数据时,在硬串口中显示其信息数据
while(DebugSerial.available()){
Serial.print(char(DebugSerial.read()));
}
}
void setup() {
Serial.begin(9600); // 定义硬串口的波特率
DebugSerial.begin(9600); // 定义软串口的波特率
}
void loop() {
Serial.println("\r\n---------send AT command start---------\r\n");
DebugSerial.write("AT\r\n"); // 软串口发送AT指令 ,若果软串口返回「OK」,则表示模块连接开发板正确,可以互相沟通。
delay(500); // 等待500毫秒,是为了让软串口的数据飞一会(串口有数据会保存在串口的缓存中,当读取则,当然有大小限制会溢出)
ReadBuffer(); // 读取软串口数据并显示在串口监视器中
// AT+CPIN
// 该指令用于查询 SIM 卡的状态,主要是 PIN 码,
// 如果该指令返回+CPIN:READY,则表明 SIM 卡状态正常,
// 返回其他值,则有可能是没有 SIM 卡。
DebugSerial.write("AT+CPIN?\r\n");
delay(500);
ReadBuffer();
// AT+CREG
// 该指令用于查询AT+CREG?查看GSM是否注册成功
// 0,1
// 返回 x,1,最主要后面的1,表示联网成功
DebugSerial.write("AT+CREG?\r\n");
delay(500);
ReadBuffer();
// AT+CMGF=1
// 该指令AT+CMGF=1,即可设置为文本模式。
DebugSerial.write("AT+CMGF=1\r\n");
delay(500);
ReadBuffer();
// AT+CSCS
// 该指令AT+CSCS,用于设置 TE 字符集,默认的为 GSM7 位缺省 字符集,
// 在发送纯英文短信的时候,发送: AT+CSCS=“GSM”,设置为缺省字符集即可。
// 在发送中英文短信的时候,需要发送: AT+CSCS=“UCS2”,设置为 16 位通用 8 字节倍数编码字符 集。
DebugSerial.write("AT+CSCS=\"GSM\"\r\n");
delay(500);
ReadBuffer();
// 准备开始打电话
Serial.println("Calling....");
char callCMD_buf[20] = {0};
memset(callCMD_buf, 0, 20); // 利用memset()函数的作用,把callCMD_buf里的所有元素定义为0,在这里可以想象像清空一样
strcpy(callCMD_buf, "ATD"); // 开始组合打电话的AT指令,格式为:ATD13000000000;
strcat(callCMD_buf, phoneNumber);
strcat(callCMD_buf, ";\r\n");
DebugSerial.write(callCMD_buf); // 向软串口发生callCMD_buf指令
delay(60000); // 等待60秒
ReadBuffer(); // 读取软串口返回的数据
Serial.println("Called!"); //拨打结束
while(1);
}