用Arduino Nano 与 SIM800C 通讯
简单就是硬道理
用简单的设备完成复杂的事情是我们的追求。SIM800C是GSM/GPRS等数据通讯的选择,在中国价格很低,大众化的产品,实现上网服务。根据任务选择一款适合自己应用的MCU也是对一个项目或者产品成败的关键。在这里我们需要一个MCU完成上网通讯等服务,比如是完成一个考勤机的服务,我们选择一个Arduino Nano产品来实现。下面介绍实现SIM800C通讯的硬件连接和软件编程。
SIM800C GSM/GPRS通讯卡
GPRS上网卡简介
SIM800C是一个四频GSM/GPRS模块,主要技术参数和技术特点如下:
-
四频 850/900/1800/1900 MHz
-
GPRS multi-slot class 12/10
-
满足GSM 2/2+ 标准
– Class 4 (2 W @850/900 MHz)
– Class 1 (1 W @1800/1900MHz) -
尺寸: 17.615.72.3mm
-
重量: 1.3g
-
通过AT命令控制(3GPP TS 27.007, 27.005和SIMCOM 增强AT命令集)
-
电压范围: 3.4 ~4.4V
-
操作温度范围: -40 ~+85 ℃
信息交互
从某种意义上来说,SIM800C卡是一个服务器,MCU像一个客户机,发送AT命令给SIM800C,SIM800C回复信息给MCU。关于AT命令的详细情况这里就不一一赘述,先知道2个重要的命令:
- AT 这个作为打招呼的命令
- AT+GSV 这个作为获取产品厂家信息的命令
MCU设备 Arduino Nano
Arduino Nano产品在前面介绍了很多了,不在这里介绍了,前面的博客文章介绍的比较详细了。
设备连接
设备连接包括2个部分:
- Arduino Nano接线
- SIM800C接线
Arduino Nano接线
SIM800C可以与5V的单片机连接也可以和3.3V的单片机连接,我们选择的Arduino产品是一个5V的产品。电源连接如下:
电源连接到5V和GNG。通讯线可以看到D10和D11作为Rx和Tx的线用来连接SIM800C。
SIM800C 接线
如果是使用的5V的MCU,可以用MCU的电源为SIM800C供电。但这里要注意的是SIM800C的电源是有要求的。一般的是要求在5V电源情况下能够达到500 mA,甚至有时会超过500 mA。用一般的USB 5V供电不能保证电源是否满足要求。接线端子
5V:外接5V电源
V_TTL: MCU电源
GND: 接地
TXD: 连接MCU的接收端,SIM800C串行通讯的发射端,在这里是连接MCU的端子10,是MCU的Rx。
RXD: 连接MCU的发射端,SIM800C串行通讯的接收端,在这里是连接MCU的端子11,MCU的Tx。
这里要注意的是与MCU的端口要互换,TXD <-> Rx, RXD <-> Tx.
软件编制
软件采用Arduino IDE 编程软件。像前面说的,这个软件有2种形式:
- 网上在线形式的IDE
- 现在安装的IDE
这两种形式的IDE都可以,保持经常更新。这个生态系统还是非常强大的,但中国的弟兄们没有在网上,主要是英文的,汉化不行,不然会更强大。
现在来实现我们的软件:
#include <SoftwareSerial.h> // 采用软件的串口
SoftwareSerial SIM800C(10, 11); // Serial RX, TX
boolean bState, bOldState;
int incomingByte = 0; // for incoming serial data
void setup() {
// put your setup code here, to run once:
// Open serial communications and wait for port to open
pinMode(13, OUTPUT);
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.println("Good Morning, my old friend!");
SIM800C.begin(9600);
SIM800C.println("AT+CMGF=1");
}
void loop() {
// put your main code here, to run repeatedly:
if (SIM800C.available()) {
Serial.write(SIM800C.read());
digitalWrite(13, HIGH);
}
if (Serial.available()) {
SIM800C.write(Serial.read());
// incomingByte = Serial.read();
// Serial.print("I received: ");
// Serial.println(incomingByte, DEC);
// digitalWrite(13, !digitalRead(13));
}
}
程序编制就完成了。
总结
现在来看一下我们的成果。
在这里我们发送了一个AT命令,SIM800C返回一个Ok。再发送一个AT+GSV,返回:
13:33:20.943 -> SIMCOM_Ltd
13:33:20.943 -> SIMCOM_SIM800C
13:33:20.979 -> Revision:1418B06SIM800C24
通讯成功。任务初步完成。