关于SIM800L

SIM800L硬件设计手册: https://ishare.iask.sina.com.cn/f/37128207.html

关于我使用的开发板LiLyGO T-CALL

这里我使用了一块开发板: LiLyGO T-CALL (SIM800L_AXP192_VERSION_20200327版本)
其github地址:https://github.com/Xinyuan-LilyGO/LilyGo-T-Call-SIM800

一. 初识LiLyGO T-CALL

根据原理图, 我们可以得到以下结论

1.SIM800L电源使能引脚接在ESP32的GPIO23引脚

2.SIM800L开关机引脚接在ESP32的GPIO4引脚

3.SIM800L复位引脚接在ESP32的GPIO5引脚

4. SIM800L的串口接在了ESP32的26, 27引脚

二. 实验1: PC端通过串口调试助手调试SIM800L

思路: 串口0收到PC的信息就转发给串口1, 串口0 收到串口1的信息就转发给PC

#include <Arduino.h>#define MODEM_RST 5       //SIM800L复位引脚接在GPIO5
#define MODEM_PWRKEY 4    //SIM800L开关机引脚接在GPIO4
#define MODEM_POWER_ON 23 //SIM800L电源引脚接在GPIO23
#define MODEM_TX 27       //SIM800L串口TX引脚接在GPIO27
#define MODEM_RX 26       //SIM800L串口RX引脚接在GPIO26#define SerialMon Serial //调试串口为UART0
#define SerialAT Serial1 //AT串口为UART1void setup()
{pinMode(MODEM_POWER_ON, OUTPUT); //电源引脚pinMode(MODEM_PWRKEY, OUTPUT);   //开关机键引脚// 先打开SIM800L的电源digitalWrite(MODEM_POWER_ON, HIGH);//根据手册要求拉下PWRKEY 1秒钟以上 可以开机digitalWrite(MODEM_PWRKEY, HIGH);delay(100);digitalWrite(MODEM_PWRKEY, LOW);delay(1000);digitalWrite(MODEM_PWRKEY, HIGH);//开启串口SerialMon.begin(115200);SerialAT.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX);
}void loop()
{while (SerialAT.available()){SerialMon.write(SerialAT.read());}while (SerialMon.available()){SerialAT.write(SerialMon.read());}
}

三. 更进一步 用tinyGSM库操作SIM800L

这里我们使用了库 tinyGSM
tinyGSM和我们之前的wifi库差不多
不过多了一个modem(猫)的概念, 就是我们要把SIM800L实例化为一个modem, 像这样:TinyGsm modem(SerialAT);

下面这个程序主要就是我们创建一个modem并操作他的过程, 顺便测试了一下2G网络连接需要多久(实测10秒左右)

关于client的内容并没有在这个例程里, 下节再探讨.

#include <Arduino.h>#define MODEM_RST 5       //SIM800L复位引脚接在GPIO5
#define MODEM_PWRKEY 4    //SIM800L开关机引脚接在GPIO4
#define MODEM_POWER_ON 23 //SIM800L电源引脚接在GPIO23
#define MODEM_TX 27       //SIM800L串口TX引脚接在GPIO27
#define MODEM_RX 26       //SIM800L串口RX引脚接在GPIO26#define SerialMon Serial //调试串口为UART0
#define SerialAT Serial1 //AT串口为UART1#define TINY_GSM_MODEM_SIM800 // Modem is SIM800//引入TinyGSM库. 在引入之前要定义好TINY_GSM_MODEM_SIM800,让它知道我们用的模块型号
#include <TinyGsmClient.h>// 创建一个关联到SerialAT的SIM800L模型
TinyGsm modem(SerialAT);//初始化SIM800L
void setupModem()
{pinMode(MODEM_POWER_ON, OUTPUT); //电源引脚pinMode(MODEM_PWRKEY, OUTPUT);   //开关机键引脚// 先打开SIM800L的电源digitalWrite(MODEM_POWER_ON, HIGH);//根据手册要求拉下PWRKEY 1秒钟以上 可以开机digitalWrite(MODEM_PWRKEY, HIGH);delay(100);digitalWrite(MODEM_PWRKEY, LOW);delay(1000);digitalWrite(MODEM_PWRKEY, HIGH);
}
void setup()
{esp_sleep_enable_timer_wakeup(20000000); //创建一个esp睡眠闹钟SerialMon.begin(115200);//初始化调试串口SerialAT.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX);//初始化AT串口setupModem(); //SIM800L物理开机SerialMon.println("Initializing modem...");modem.init(); //开机后modem初始化一下String modemInfo = modem.getModemInfo();SerialMon.print("Modem: ");SerialMon.println(modemInfo);//测试连接网络SerialMon.print("Waiting for network...");while (!modem.waitForNetwork(240000L)){SerialMon.print(".");delay(500);}SerialMon.println(" OK");//测试关闭SIM800L信号灯SerialMon.println("Turning off SIM800 Red LED...");modem.sendAT("+CNETLIGHT=0");delay(10000);//测试打开SIM800L信号灯SerialMon.println("Turning on SIM800 Red LED...");modem.sendAT("+CNETLIGHT=1");delay(10000);//去休眠吧SerialMon.println("now I wanna ESP32sleep and disable SIM800L for a while!(20sec)");delay(100);esp_deep_sleep_start();
}void loop()
{
}

四. 使用SIM800L连接2G网络并将数据上传至OneNet平台

本例程实现了以下功能:

  1. 通过SIM800L连接网络
  2. 连接OneNet平台(通过旧版MQTT协议)
  3. 调用SHT20的库采集温湿度
  4. 将温湿度信息上传至OneNet
  5. 每5分钟采集一次, 采集完成就休眠
#include <Arduino.h>
#include "PubSubClient.h"
#include "aliyun_mqtt.h"
#include "ArduinoJson.h"
#include "Ticker.h"
#include "uFire_SHT20.h"/*-------------------------------SIM800L 硬件定义----------------------------------*/
#define MODEM_RST 5       //SIM800L复位引脚接在GPIO5
#define MODEM_PWRKEY 4    //SIM800L开关机引脚接在GPIO4
#define MODEM_POWER_ON 23 //SIM800L电源引脚接在GPIO23
#define MODEM_TX 27       //SIM800L串口TX引脚接在GPIO27
#define MODEM_RX 26       //SIM800L串口RX引脚接在GPIO26
//串口定义
#define SerialMon Serial //调试串口为UART0
#define SerialAT Serial1 //AT串口为UART1/*-------------------------------其他硬件定义-------------------------------------*/
#define LED_G 13
uFire_SHT20 sht20;/*-------------------------------Modem相关定义-------------------------------------*/
#define TINY_GSM_MODEM_SIM800 // Modem is SIM800
//引入TinyGSM库. 在引入之前要定义好TINY_GSM_MODEM_SIM800,让它知道我们用的模块型号
#include <TinyGsmClient.h>
// 创建一个关联到SerialAT的SIM800L模型
TinyGsm modem(SerialAT);
// 创建一个GSM型的网络客户端
TinyGsmClient gsmclient(modem);
PubSubClient client(gsmclient);
// Your GPRS credentials (leave empty, if missing)
const char apn[] = "CMNET"; // Your APN
const char gprsUser[] = ""; // User
const char gprsPass[] = ""; // Password
const char simPIN[] = "";   // SIM card PIN code, if any/*-------------------------------云平台相关定义-------------------------------------*/
const char *mqtt_server = "183.230.40.39"; //onenet 的 IP地址
#define mqtt_devid "626108102"             //设备ID
#define mqtt_pubid "370025"                //产品ID
#define mqtt_password "test123"            //鉴权信息char msg_buf[200];                                     //发送信息缓冲区
char dataTemplate[] = "{\"TEMP\":%.2f,\"HUMI\":%.2f}"; //信息模板
char msgJson[75];                                      //要发送的json格式的数据
unsigned short json_len = 0;                           //json长度/*-------------------------------初始化SIM800L-------------------------------------*/
void setupModem()
{pinMode(MODEM_POWER_ON, OUTPUT); //电源引脚pinMode(MODEM_PWRKEY, OUTPUT);   //开关机键引脚// 先打开SIM800L的电源digitalWrite(MODEM_POWER_ON, HIGH);//根据手册要求拉下PWRKEY 1秒钟以上 可以开机digitalWrite(MODEM_PWRKEY, HIGH);delay(100);digitalWrite(MODEM_PWRKEY, LOW);delay(1000);digitalWrite(MODEM_PWRKEY, HIGH);SerialMon.println("Initializing modem...");modem.init(); //开机后modem初始化一下
}
/*-------------------------------SIM800L连接GPRS-------------------------------------*/
void modemToGPRS()
{//连接网络SerialMon.print("Waiting for network...");while (!modem.waitForNetwork(240000L)){SerialMon.print(".");delay(500);}SerialMon.println(" OK");//连接GPRS接入点SerialMon.print(F("Connecting to APN: "));SerialMon.print(apn);while (!modem.gprsConnect(apn, gprsUser, gprsPass)){SerialMon.print(".");delay(10000);}SerialMon.println(" OK");
}
/*-------------------------------向云平台发送温湿度数据-------------------------------*/
void sendTempAndHumi()
{if (client.connected()){snprintf(msgJson, 40, dataTemplate, sht20.temperature(), sht20.humidity()); //将模拟温湿度数据套入dataTemplate模板中, 生成的字符串传给msgJsonjson_len = strlen(msgJson);                                                 //msgJson的长度msg_buf[0] = char(0x03);                                                    //要发送的数据必须按照ONENET的要求发送, 根据要求,数据第一位是3msg_buf[1] = char(json_len >> 8);                                           //数据第二位是要发送的数据长度的高八位msg_buf[2] = char(json_len & 0xff);                                         //数据第三位是要发送数据的长度的低八位memcpy(msg_buf + 3, msgJson, strlen(msgJson));                              //从msg_buf的第四位开始,放入要传的数据msgJsonmsg_buf[3 + strlen(msgJson)] = 0;                                           //添加一个0作为最后一位, 这样要发送的msg_buf准备好了Serial.print("public message:");Serial.println(msgJson);client.publish("$dp", (uint8_t *)msg_buf, 3 + strlen(msgJson)); //发送数据到主题$dp}
}
/*-------------------------------向云平台断线重连-------------------------------------*/
void clientReconnect()
{if (modem.isNetworkConnected()){while (!client.connected()) //再重连客户端{Serial.println("reconnect MQTT...");if (client.connect(mqtt_devid, mqtt_pubid, mqtt_password)){Serial.println("connected");}else{Serial.println("failed");Serial.println(client.state());Serial.println("try again in 5 sec");delay(5000);}}}else{Serial.println("网络断了,不可能连上了, 把数据存在本地等待下一次联网吧");}
}void setup()
{pinMode(LED_G, OUTPUT);Wire.begin();sht20.begin();SerialMon.begin(115200);                                //初始化调试串口SerialAT.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX); //初始化AT串口setupModem();  //SIM800L物理开机modemToGPRS(); //modem连接GPRS//连接OneNet并上传数据Serial.println("connecting to ALI IOT...");client.setServer(mqtt_server, 6002);                   //设置客户端连接的服务器,连接Onenet服务器, 使用6002端口client.connect(mqtt_devid, mqtt_pubid, mqtt_password); //客户端连接到指定的产品的指定设备.同时输入鉴权信息if (client.connected())sendTempAndHumi();else //如果客户端没连接ONENET, 重新连接clientReconnect();delay(500);//进入睡眠esp_sleep_enable_timer_wakeup(300000000);Serial.println("now sleep");esp_deep_sleep_start();
}void loop()
{client.loop();
}

http://www.taodudu.cc/news/show-2193048.html

相关文章:

  • SIM800L模块发送短信
  • SIM800L上传数据到OneNET(HTTP)
  • SIM800L
  • SIM800L 模块 使用AT命令打电话
  • 体验最好的 PE 系统是什么?转~
  • 装系统比较好用的PE工具推荐
  • 使用PE安装系统
  • PEmicro GDB Launch Failure : Could not bind socket.
  • 管理linux文件的pe软件,诺达佳U盘启动盘制作工具v5.51(UD+EFI三分区linuxPE+winPE版)...
  • 服务器pe系统ghost系统安装教程,科技教程:U盘PE启动安装GHOST系统图文教程
  • HTML查看器PC,PE文件查看器(PeViewer)
  • 系统安装部署系列教程(四):制作PE系统
  • 服务器pe系统ghost系统安装教程,U盘PE启动安装GHOST系统图文教程
  • 微pe怎么装linux系统,微PE工具箱增加安装Linux系统菜单
  • win10pe命令打开计算机,win10系统制作PE启动盘的操作方法
  • pe安装uefi linux,华硕U盘装机维护系统v2017 WIN10PE UEFI ISO版
  • 服务器pe系统u盘启动不了,U盘安装系统进不了PE怎么办?U盘装系统进不去pe如何解决?...
  • 用pe做2012服务器系统教程,微软WDS网络启动PE做系统的服务器配置和PE修改教程...
  • dell服务器pe系统安装win7系统,dell戴尔pe重装win7系统
  • 计算机无法进入pe系统,u盘启动盘无法进入pe解决方法
  • linux pe ef 详解,PE工具列表(看雪學院)
  • 微pe工具箱是微软的吗_电脑装系统用一键装机好用还是微PE工具箱好用
  • 最好用的pe系统
  • 笔记:PJL的一些用法
  • AssertionError: Override list has odd length: [‘\r‘]; it must be a list of pairs
  • 编译安装freeswitch-1.4.26
  • 06)JDK1.8 新特性学习 重复注解
  • 解决hdfs dfs -mkdir input报错`mkdir`:No such file or directory
  • python wordcloud 对电影《我不是潘金莲》制作词云
  • 触屏查看大图(可以缩放)

玩转 ESP32 + Arduino (十九) SIM800L调试(基于TTGO T-CALL)相关推荐

  1. pwrkey直接接地 sim7020_玩转 ESP32 + Arduino (十九) SIM800L调试(基于TTGO T-CALL)

    关于SIM800L 关于我使用的开发板LiLyGO T-CALL 这里我使用了一块开发板: LiLyGO T-CALL (SIM800L_AXP192_VERSION_20200327版本) 其git ...

  2. python发短信sim800_玩转 ESP32 + Arduino (十八) 采用SIM800L发送短信和定位(基础知识)...

    一. 测试AT指令平台 普通的串口调试助手就可以调试 二. 有用的AT指令: 1. 查询类指令 AT命令 功能 正常返回 执行后的正常状态 异常处理 AT SIM800是否准备好,握手程序 OK 检查 ...

  3. 【Microsoft Azure 的1024种玩法】四十九.在Azure中使用Azure VirtualMachines 搭建Microsoft SharePoint 2016

    [简介] SharePoint Server 2016 的设计.开发和测试以 Microsoft 软件即服务 (SaaS) 战略为核心.SharePoint Server 2016 广泛借鉴了该经验, ...

  4. 【Microsoft Azure 的1024种玩法】五十九.基于Azure云平台快速搭建GitLab应用实现代码托管

    [简介] GitLab是由GitLab Inc.开发,一款基于Git的完全整合的软体开发平台,以 Git 作为代码管理工具并实现自托管的 Git 项目仓库,本篇文章主要介绍如何在Azure Virtu ...

  5. 【Microsoft Azure 的1024种玩法】二十九.基于Azure VM快速实现网络入侵检测 (IDS) 及网络安全监视 (NSM)

    [简介] 数据包捕获是一个重要组件,可以实施网络入侵检测系统 (IDS) 并执行网络安全监视 (NSM). 我们可以借助开源 IDS 工具来处理数据包捕获,并检查潜在网络入侵和恶意活动的签名. 使用网 ...

  6. 玩转GOOGLE的十九招秘技

    第一招        在输入多个词的时候,Google默认的是并且式的查询,如果想使用或者式的查询,使用OR,例如:java OR c++ 第二招 google是不区分大小写的,搜索Java和搜索JA ...

  7. 玩转 ESP32 + Arduino (四) 电容按键 霍尔传感器 外部中断 延时 脉冲检测

    一. 电容输入 touchRead(pin) 及电容输入中断touchAttachInterrupt(pin, TSR , threshold) ESP32专门提供了电容触摸传感器的功能, 共有T0, ...

  8. 【软件开发底层知识修炼】十九 GDB调试从入门到熟练掌握超级详细实战教程学习目录

    本文记录之前写过的5篇关于GDB快速学习的文章,从第一篇开始学习到最后一篇,保证可以从入门GDB调试到熟练掌握GDB调试的技巧. 学习交流加 个人qq: 1126137994 个人微信: liu112 ...

  9. esp32 Arduino(九)u8g2图形库 IIC驱动OLED

    一.简介: LED驱动芯片:SSD1306 开发平台: vscode+platformIO 开发板:ESP32 Divkit v1 目前Arduino平台上使用最广泛的OLED库: U8G2 gith ...

  10. 玩转 ESP32 + Arduino (八) U8G2驱动OLED

    OLED驱动芯片:SSD1306 开发平台: vscode+platformIO 开发板:ESP32 Divkit v1 目前Arduino平台上使用最广泛的OLED库: U8G2 github地址: ...

最新文章

  1. 电子学会青少年编程等级考试案例:曲奇饼干
  2. WIN8、WIN7访问Windows Server 2003服务器的数据库速度很慢、远程速度很慢的解决方法...
  3. JAVA设计模式--单例模式
  4. C++读取文件夹中所有文件的路径,包含子文件夹
  5. 关于Linux内核代码不使用typedef的讨论?
  6. a 标签中 rel=“noopener noreferrer“属性的含义和功能
  7. 深度学习之神经网络(一)
  8. 1.2 数值分析 误差的来源和分类
  9. python可不可以开发软件_python可以开发软件吗
  10. 使用pscc抠人物图像头发
  11. 英语中提醒注意安全句子
  12. java涂色_【LeetCode(Java) - 276】栅栏涂色
  13. Linux resolv.conf 简介
  14. 华为云服务器如何使用
  15. Dialogs 对话框
  16. 穷人跟懒人 富人跟勤快人
  17. Mac解决OSError : dlopen() : Library not loaded 问题
  18. 计算机房维护登记表,机房运维值班记录表.doc
  19. 未来计算机语言的发展趋势,编程语言的发展趋势及未来方向 I
  20. 微软携手云南打造软件产业高地 签约建立微软IT学院

热门文章

  1. 软件无线电实验 matlab,基于MATLAB和ModelSim的软件无线电课程实验设计
  2. 《计算机网络》学习——第3章 数据链路层
  3. 潮流能模型matlab,基于matlab的yalmip最优潮流建模的Infeasible problem
  4. paraview编译
  5. 傅里叶分析(通俗解释)
  6. 在线web魔方和在线AI象棋
  7. 数码管SR420561K SR410561K的引脚图
  8. 解决mac系统压缩文件.zip,在win解压后,出现乱码
  9. 软件设计模式概念与意义
  10. 第五部分 家庭创业奔小康6.开家畅销书专送店