(SKU: DFR0505)SIM7000C Arduino NB-IoT/LTE/GPRS 扩展板

来自DFRobot Product Wiki
跳转至: 导航搜索
SIM7000C Arduino NB-IoT/LTE/GPRS 扩展板

目录

简介

NB-IoT是指基于蜂窝的窄带物联网(Narrow Band-Internet of Things)技术。它是IoT领域的一个新兴技术分支,支持低功耗设备在广域网的蜂窝数据连接,也称作低功耗广域网(LPWAN)。NB-IoT工作于授权频谱下,可以直接部署在GSM、UMTS、LTE网络,与现有网络共存,而带宽大约只消耗180KHz。

SIM7000C Arduino NB-IoT/LTE/GPRS 扩展板是DFRobot基于SIMCom SIM7000C设计的无线通信模块,专为Arduino控制器设计,支持多频LTE-FDD,双频GPRS/EDGE,NB-IoT通信。这是国内第一款将NB-IoT技术引入到开源硬件领域的产品。无论是做原型开发,还是做小批量生产,SIM7000C Arduino NB-IoT/LTE/GPRS 扩展板都是低功耗,低延迟、中等吞吐量应用的最优解决方案。此外SIM7000C板载GNSS全球导航卫星系统(Global Navigation Satellite System),支持美国的GPS,俄罗斯的GLONASS,欧洲的Galileo,日本的QZSS以及,中国自主研发的北斗导航系统。非常适用于远程控制,移动追踪,远程抄表,共享单车等物联网应用。

SIM7000C NB-IoT/LTE/GPRS 扩展板同时支持普通SIM卡和NB-IoT专用卡,可以插接普通SIM卡进行打电话、发短信等传统GSM应用,也可以插接NB-IoT专用卡,使用NB-IoT网络进行数据传输。此外扩展板还提供了BME280环境传感器,可以作为NB-IoT项目的原型机开发,可以监测温度,湿度及气压数值。

性能描述

  • 工作电压:5V(注意:模块在连接网络瞬间会消耗大量电流,工作时,需外接电源)
  • 输入电压:7~12VDC (VIN端,极限6~20V)
  • 通信模组:SIM7000C
    • Single-Band TDD-LTE B39
    • Quad-Band FDD-LTE B1/B3/B5/B8
    • GPRS/EDGE 900/1800 MHz
      • Output power
      • GSM900: 2W
    • DCS1800: 1W
    • Control Via AT Commands
    • Operation temperature: -40℃ to +85℃
    • GNSS (GPS, GLONASS, BeiDou, Compass, Galileo, QZSS)
    • Firmware update via USB 2.0
  • 支持普通SIM卡以及NB-IoT专用卡(注意:请先确认您的SIM频段是否包含在支持频段内)
  • BME280环境传感器
    • 温度检测范围:-40℃~+85℃,分辨率0.1℃,误差±0.5℃
    • 湿度检测范围:0~100%RH,分辨率0.1%RH,误差±2%RH
    • 压力检测范围:300~1100hPa
    • 湿度测量响应时间:1s
  • 工作温度:-30℃ ~ +80℃
  • 尺寸:53.4 x 68.6mm


接口说明

DFR0505-TU-01.jpg

注意:

  1. 软硬串口切换开关:由于Arduino UNO/Mega等控制器默认D0和D1为硬件串口,与USB端相连。很多需要使用串口的扩展板,在使用时会出现串口冲突的问题,所以特别设计了一个软串口接口,用户可以使用软串口与Arduino进行通信 扩展阅读:Arduino SoftwareSerial Library
  2. 为了方便程序控制,Boot按键默认引至D12引脚,可以通过拉高D12引脚2秒实现模块的开关机。SIM7000C开机后会有2秒左右初始化时间,初始化完成后可正常使用。


使用教程(基于SIM7000库)

准备工作

  • 硬件
    • 1 x Arduino UNO控制板(可兼容LEONARDO和MEGA,请参考演示程序的注释做出相应改动)
    • 1 x SIM7000C Arduino NB-IoT/LTE/GPRS 扩展板
    • 1 x 为UNO下载程序的USB线
    • 1 x 7V~12V直流电源



硬件连接

将扩展板插在Arduino UNO控制器上

使用连线图


样例代码

  • 由于Arduino UNO 只有一个硬件串口,使用时,推荐使用软串口通信,SIM7000库文件默认使用软串口,请将软硬件串口控制开关切换至TX>D8,RX>D7
  • 程序使用SIM7000通过NB-IoT连接网站并进行HTTP报文交互。
#include <Wire.h>
#include <DFRobot_SIM7000.h>

#define PIN_TX     7
#define PIN_RX     8
SoftwareSerial     mySerial(PIN_RX,PIN_TX);
DFRobot_SIM7000    sim7000;
static char        buff[350];

void setup(){
    int signalStrength,dataNum;
    Serial.begin(115200);
    sim7000.begin(mySerial);
    sim7000.turnOFF();
    delay(5000);
    Serial.println("Turn ON SIM7000......");
    if(sim7000.turnON()){                                                                      //Turn ON SIM7000
        Serial.println("Turn ON !");
    }
    Serial.println("Set baud rate......");
    if(sim7000.setBaudRate(19200)){                                                            //Set baud rate from 115200 to 19200
        Serial.println("Set baud rate:19200");
    }else{
        Serial.println("Faile to set baud rate");
        while(1);
    }
    Serial.println("Check SIM card......");
    if(sim7000.checkSIMStatus()){                                                              //Check SIM card
        Serial.println("SIM card READY");
    }else{
        Serial.println("SIM card ERROR");
        while(1);
    }
    delay(500);
    Serial.println("Set net mod......");
    if(sim7000.setNetMode(NB)){                                                                //Set net mod NB-IOT ,Please make sure your SIM card is NB-IOT card or you should choose GPRS mode
        Serial.println("Set NB-IOT mode");
    }else{
        Serial.println("Fail to set mode");
    }
    Serial.println("Get signal quality......");
    delay(500);
    signalStrength=sim7000.checkSignalQuality();                                               //Check signal quality from (0-30)
    Serial.print("signalStrength =");
    Serial.println(signalStrength);
    delay(500);
    Serial.println("Attaching service......");
    if(sim7000.attacthService()){                                                              //Open the connection
        Serial.println("Attach service");
    }else{
        Serial.println("Fail to Attach service");
        while(1);
    }
    delay(200);
    Serial.println("Connecting......");
    if(sim7000.openNetwork(TCP,"www.taobao.com",80)){                                          //Start Up TCP or UDP Connection
        Serial.println("Connect OK");
    }else{
        Serial.println("Fail to connect");
        while(1);
    }
    sim7000.send("HEAD/HTTP/1.1\r\nHost:www.taobao.com\r\nConnection:keep-alive\r\n\r\n");     //Send Data Through TCP or UDP Connection 
    dataNum=sim7000.recv(buff,350,0);                                                          //Receive data 
    Serial.print("dataNum=");
    Serial.println(dataNum);
    Serial.println(buff);
    delay(500);
    if(sim7000.closeNetwork()){                                                                //End the connection
        Serial.println("Close connection");
    }else{
        Serial.println("Fail to close connection");
    }
    delay(2000);
    sim7000.turnOFF();                                                                         //Turn OFF SIM7000
}

void loop() {
    delay(1000);
}
  • 函数说明:
  • 设置软串口,SIM7000采用软串口控制TX为D8 RX为D7。
 begin(Stream &s_)
  • 使用软件方式开启SIM7000,开启后扩展板上的Net指示灯闪烁,SIM7000有2秒左右初始化时间,初始化成功后函数返回true。
 turnON();
  • 使用软件方式关闭SIM7000,成功后扩展板上的Net指示灯熄灭。
 turnOFF();
  • 设置软串口波特率,SIM7000串口默认波特率为115200,使用软串口控制时为避免乱码将波特率设置为19200及以下,成功设置后返回true。(其他可设置值9600,4800,2400,1200)
 setBaudRate(int rate);
  • 初始化AT指令功能,成功后返回True。
 checkSIMStatus();
  • 设置网络模式,成功后返回true。可设置模式: GPRS:GPRS模式 NB:NB-IOT模式。
 setNetMode(Net net);
  • 检测信号强度,返回值为信号强度。返回值为99时表示无法检测到信号。
 checkSignalQuality();
  • 打开连接服务,成功后返回true。
 attacthService();
  • 连接网络,选择连接协议(TCP或者UDP),所连接的域名,端口号,连接成功后返回true。
 openNetwork(Protocol ptl,const char *host, int port);
  • 数据传输,连接成功后向服务端发送信息,可指定发送信息大小,或直接输入需发送信息。
 send(const char *str);
 send(void* buf,size_t len);
  • 数据接收,接收服务端的信息并存储,可设置最大接收量,和等待时间。返回实际接收字节数。
 recv(char* buf,int maxlen,int timeout);
  • 断开连接,成功后返回true。
 closeNetwork();
  • 程序演示:
NBIOT.png

使用教程(基于串口AT指令)

准备工作

与上面的教程(基于SIM7000库)保持一致

硬件连接

与上面的教程(基于SIM7000库)保持一致

样例代码

  • SIM7000 NB-IoT Shield可使用串口发送AT指令进行控制,SIM7000 NB-IoT Shield串口默认波特率为115200,需先将波特率设置为19200避免乱码。
  • AT指令需以回车换行符结尾。代码如下:
 /*
  * File  : DFRobot_SIM7000_ATtest.ino
  * Power : SIM7000 needs 7-12V DC power supply
  * Brief : This example use the serial port to send AT command to control the SIM7000
  *         With initialization completed, we can enter AT command to SIM7000 directly
  * AT command list:
  * https://github.com/DFRobot/binaryfiles/raw/master/DFR0505/doc/SIM7000%20Series_AT%20Command%20Manual_V1.01.pdf
  * Note  : If you use Mega please connect PIN8 PIN10 and set PIN_RX = 10
  *         The AT command must end with CRLF
  */
#include <DFRobot_SIM7000.h>

#define PIN_TX     7
#define PIN_RX     8
SoftwareSerial     mySerial(PIN_RX,PIN_TX);
DFRobot_SIM7000    sim7000;

void setup() {
    Serial.begin(115200);
    sim7000.begin(mySerial);
    sim7000.turnOFF();
    delay(5000);

    Serial.println("Turn ON SIM7000......");
    if(sim7000.turnON()){                             //Turn ON SIM7000
        Serial.println("Turn ON !");
    }

    Serial.println("Set baud rate......");
    if(sim7000.setBaudRate(19200)){                   //Set baud rate from 115200 to 19200
        Serial.println("Set baud rate:19200");
    }else{
        Serial.println("Faile to set baud rate");
        while(1);
    }

    mySerial.begin(19200);
    Serial.println("For example, if you type AT\\r\\n, OK\\r\\n will be responsed!");
    Serial.println("Enter your AT command :");
}

void loop() {
    mySerial.listen();
    while(mySerial.available()){
        Serial.write(mySerial.read());
    }

    mySerial.flush();
    while(Serial.available()){
        mySerial.write(Serial.read());
    }

    delay(20);
}

运行程序后在Uno串口上输入AT指令,即可完成AT指令直接控制SIM7000。下载AT指令表

  • 常用AT指令简介:
    • AT+CNMP=?
      • 网络制式选择:AT+CNMP=2表示模块自动找网模式,AT+CNMP=13表示锁定 GSM only 使用,AT+CNMP=38 表示锁定“ CAT-M1+NBIoT ”组合使用,AT+CNMP=51 表示锁定“ GSM+CAT-M1+NBIoT ”组合使用
    • AT+CMNB=?
      • LTE网络制式选择:AT+CMNB=1 设置 CAT-M1 模式, AT+CMNB=2 设置 NBIoT 模式,AT+CMNB=3 设置 CAT-M1 和 NBIoT 组合模式
    • AT+CSQ
      • 检测信号质量,第一个值表示信号强度,为99时表示无法检测信号,此时无法模块通信。第二个值表示误码率,可能值 0-7:误码率依次增加,>6时难以通信,99:暂时无法检测,不影响通信。
    • AT+CGATT?
      • 检测网络附着状态,1:已附着,可正常通信。2:未附着,不能通信。
    • AT+CSTT
      • 开启连接任务。
    • AT+CIFSR
      • 获取本地IP。
    • AT+CIPSTART="ptl","host","port"
      • 建立连接,ptl:连接协议(TCP或UDP),host:连接域名,可输入具体域名或IP地址。port:连接端口。连接成功返回CONNECT OK
    • AT+CIPSEND="len"
      • 发送数据,len:发送数据长度,在返回的“>”后输入发送的数据。
    • AT+CIPCLOSE
      • 断开当前连接。
    • AT+CIPSHUT
      • 关闭连接,释放资源。
  • 程序演示:
NBIOTAT.png


使用教程(获取定位)

准备工作

与上面的教程(基于SIM7000库)保持一致

硬件连接

连接有源天线,并在户外使用

样例代码

#include <Wire.h>
#include <DFRobot_SIM7000.h>

DFRobot_SIM7000 sim7000;
SoftwareSerial  mySerial(8,7);                                     //Set serial

void setup(){
    int signalStrength,dataNum;
    Serial.begin(115200);
    sim7000.begin(mySerial);
    sim7000.turnOFF();
    delay(5000);
    if(sim7000.turnON()){                                          //Turn ON SIM7000
        Serial.println("Turn NO SIM7000");
    }
    if(sim7000.setBaudRate(19200)){                                //Set baud rate from 115200 to 19200
        Serial.println("Set baud rate:19200");
    }else{
        Serial.println("faile to set baud rate");
    }
    while(1){
        if(sim7000.init()){                                        //Init SIM7000
            Serial.println("AT command READY");
            break;
        }else{
            Serial.println("AT command ERROR");
            delay(500);
        }
    }
    while(1){
        if(sim7000.initPos()){
            Serial.println("Positioning function initialized");
            break;
        }else{
            Serial.println("Fail to init positioning function");
            delay(500);
        }
    }
}

void loop(){
    Serial.println("Enter anything to get positioning ");
    char loge[10];
    readSerial(loge);
    Serial.println("Getting position......");
    if(sim7000.getPosition()){                                     //Get the current position
        Serial.print("Longtude :");
        Serial.println(sim7000.getLongitude());                    //Get longitude
        Serial.print("Latitude :");
        Serial.println(sim7000.getLatitude());                     //Get latitude
    }else{
        Serial.println("Wrong data try again");
    }
}

int readSerial(char result[]){
    int i = 0;
    while(1){
        while(Serial.available() > 0){
            char inChar = Serial.read();
            if(inChar == '\n'){
                result[i] = '\0';
                Serial.flush();
                return 0;
            }
            if(inChar != '\r'){
                result[i] = inChar;
                i++;
            }
        }
    }
}
  • 函数说明:
  • 初始化获取定位功能,成功后返回true
 initPos();
  • 获取当前定位,成功后返回true
 getPosition();
  • 获取当前经度,东经为正值,西经为负值(-180,180)
 getLongitude();
  • 获取当前纬度,北纬为正值,南纬为负值(-90,90)
 getlatitude();

BME280环境数据监测

SIM7000C板载BME280环境监测传感器,默认采用IIC连接方式,使用前请下载Arduino库文件,点击下载

样例代码

/*!
 * @file basicTestI2C.ino
 * @brief DFRobot's Temperature、Pressure、Humidity and Approx altitude
 * @n [Get the module here]
 * @n This example read the Temperature、Pressure、Humidity and Altitude from BME280, and then print them
 * @n [Connection and Diagram]
 *
 * @copyright  [DFRobot](http://www.dfrobot.com), 2016
 * @copyright GNU Lesser General Public License
 *
 * @author [yangyang]
 * @version  V1.0
 * @date  2017-7-5
 */

#include <DFRobot_BME280.h>

#define SEA_LEVEL_PRESSURE  1013.25f
#define BME_CS 10

DFRobot_BME280 bme; //I2C

float temp, pa, hum, alt;

void setup() {
    Serial.begin(115200);
    
    // I2c default address is 0x76, if the need to change please modify bme.begin(Addr)
    if (!bme.begin()) {
        Serial.println("No sensor device found, check line or address!");
        while (1);
    }
    
    Serial.println("-- BME280 DEMO --");
}

void loop() { 
  temp = bme.temperatureValue();
  pa = bme.pressureValue();
  hum = bme.humidityValue();
  alt = bme.altitudeValue(SEA_LEVEL_PRESSURE);
  
  Serial.print("Temp:");
  Serial.print(temp);
  Serial.println(" C");
  
  Serial.print("Pa:");
  Serial.print(pa);
  Serial.println(" Pa");
  
  Serial.print("Hum:");
  Serial.print(hum);
  Serial.println(" %");
  
  Serial.print("Alt:");
  Serial.print(alt);
  Serial.println(" m");
  
  Serial.println("------END------");
  
  delay(1000);
}

Warning yellow.png

注:示例中DFRobot_BME280 bme; //I2C语句是初始化I2C驱动

I2C调试信息

兼容性测试

MCU 测试通过 测试失败 未测试 特别标注
Arduino Uno
Arduino Leonardo
Arduino Mega1280 短接D8和D10
Arduino Mega2560 短接D8和D10

常见问题

还没有客户对此产品有任何问题,欢迎通过qq或者论坛联系我们!


更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。


更多


DFshopping car1.png DFRobot商城购买链接

个人工具
名字空间

变换
操作
导航
工具箱