Arduino 使用SIM900-GPRS模块打电话(仅拨通)

实验效果

凌顺实验室(lingshunlab.com)这次分享通过Arduino Uno 的软串口发送AT指令对SIM900模块实现打电话,仅拨通。如果需要可以语音对话的,请选择购买包含麦克风接口的模块。

arduino-use-sim900-only-call

元件说明

arduino-sim900-product

  • 支持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连接电脑,根据个人的配件情况而定。不需要多花钱买配件这就是和是别的卖家最大的区别。

引脚说明

arduino-sim900-pin-description_xn

BOM

名称 数量
Arduino Uno x1
SIM900 GSM GPRS 无线数据传输板 x1
跳线(杜邦线) 若干

接线方式

arduino-sim900-wiring_xn

提点

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);
}