一、开发环境搭建
作为一名入门初学者,我们计划采用Arduino IDE开发工具进行初步的入门级开发,使用Arduino IDE实现程序的编译、下载程序至 ESP32 开发板等步骤。
1.1.概述
Arduino 是一款便捷灵活、方便上手的开源电子原型平台,包含硬件(各种型号的 Arduino 板)和软件(Arduino IDE)。由于Arduino的编程语言更为简单和人性化,非常适用于入门初学者做为进行嵌入式开发的首选工具。
1.2.准备工作
1.2.1.硬件
- ESP32+BC260Y+L76K物联网开发板
- USB 数据线 (Type-C 数据线)
- 电脑(Windows 10)
1.2.2.软件
准备软件安装包:
我们在开发资料包中提供的Arduino IDE版本是 2.3.2
如需要安装其它版本,可到Arduino官网去另行下载并安装。
Arduino官网地址: https://www.arduino.cc/en/software
1.3.安装
1.3.1.Arduino开发环境搭建
准备安装文件,进入开发工具
文件夹下的02开发工具
中Arduino
文件夹,运行安装程序即可。
如果安装Arduino其它版本,可以它的官网去另行下载安装。
运行Arduino安装程序
点击 我同意
开始安装
点击 下一步
,进入下一步
点击 安装
,开始安装
直到安装完成
安装完成,点击 完成
结束安装程序
双击桌面的Arduino图标进入到Arduino IDE主界面
[注意事项]
初次运行会弹出防火墙访问网络及安装驱动的窗口,直接允许和安装即可
默认界面语言为英文,可在File–>Preferences中,将Language的值设置为中文
1.3.2.配置ESP32开发板
设置开发板管理器,如下图所示,进入工具->开发板->开发板管理器
如下图所示在开发板搜索栏中输入ESP32,注意这里是选择第二项由Espressif发行的版本,选择最新版,点击安装
开始安装后,下方进度条会提示安装进度,耐心等待直到安装完成
安装完成后左侧面板中会有3.0.0已安装的提示,进入开板板管理器,可以看到ESP32 Arduino已安装,这里选择ESP32 Dev Module这个选项。
然后打开 工具->开发板->esp32,在弹出的esp32列表中选择ESP32 Dev Module模组
至此我们的开发环境已经搭建完成,接下来我们就可以开始开发应用程序了!
二、编译运行第一个示例程序
本示例执行一个打印动作,每两秒钟打印一次字符串"Hello ESP32!"到串口。
2.1.输入代码
接下来我们就可以开始编写代码了,输入以下代码
void setup() {
//初始化波特率
Serial.begin(9600);
}
void loop() {
//打印字符串
Serial.println("Hello ESP32!");
//延时2s执行
delay(2000);
}
2.2.编译并上传程序
输入完成后,初次编译需要指定程序的存放目录,并命名一个工程名称,我这里简单命名一个Hello,然后执行上传命令即可进行代码的编译并上传至开发板,点击上传
按钮开始上传
看到这样的执行结果就说明程序已经正常上传到开发板,我们打开串口监视器
可以看到程序已经正常运行。
三、点亮LED指示灯程序设计
本示例学习如何点亮开发板自带的LED指示灯,第二步实现LED灯的闪烁,开发板原理图中自带一个用于调试的LED灯,由ESP32的GPIO26号引脚进行编程控制。
3.1.点亮LED灯
打开Arduino IDE,输入以下代码
//定义引脚
int led_pin = 26;
void setup() {
//将引脚置为输出模式,注意此处是通过调节GPIO26号引脚的高低电平来向外输出,低电平导通,因此为输出模式
pinMode(led_pin, OUTPUT);
//将引脚置为低电平,电路为导通状态,LED点亮
digitalWrite(led_pin, LOW);
}
void loop() {
}
保存程序到LED目录下,然后编译并上传程序到开发板,注意编译时选择正确的开发板和端口
可以看到指示灯成功点亮。
3.2.使LED灯闪烁
打开Arduino IDE,修改3.1章节代码
//定义引脚
int led_pin = 26;
void setup() {
//将引脚置为输出模式,注意此处是通过调节GPIO26号引脚的高低电平来向外输出,低电平导通,因此为输出模式
pinMode(led_pin, OUTPUT);
//将引脚置为低电平,电路为导通状态,LED点亮
digitalWrite(led_pin, LOW);
}
void loop() {
//通过2s的延迟来控制GPIO26引脚的高低电平转换来实现灯的闪烁
digitalWrite(led_pin, LOW);
delay(2000);
digitalWrite(led_pin, HIGH);
delay(2000);
}
保存程序,并编译上传程序到开发板
可以看到指示灯每隔2s钟关闭和启动一次来实现闪烁的效果。
四、实现WiFi联网获取数据程序设计
本示例学习如何使用板卡的ESP32模组来实现连接WIFI网络,并通过HttpClient协议来获取网络数据。
通过访问由聚合数据提过的天气预报API接口来获取天气预报数据,注意需要提前注册并获取密钥,申请天气预报的API接口即可
聚合数据官网https://www.juhe.cn/
注册并申请服务成功后,可登录聚合数据后台查看天气预报的接口文档,可以看到API返回的类型是json格式,因此我们需要引第三方的类来进行返回数据解析
4.1.引入第三方库
本示例中需要用到第三方库,由于API返回的类型是json格式,我们需要使用ArduinoJson这个第三方库来解析获取到的数据。
引入方法,我们打开Arduino IDE,进入项目
->导入库
–>管理库
在左侧库管理
界面搜索栏中输入我们想要查找的库名称,我们这里输入"ArduinoJson",回车进行搜索
选择ArduinoJson的版本,这里 我选择的是7.0.4版本,点击安装开始这个库的安装,待提示完成后即可进行下一步编程。
4.2.实现WiFi联网
打开Arduino IDE,输入以下代码
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
const char * ssid = "此处为WIFI网络名称";
const char * password = "此处为WIFI密码";
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.print("正在连接WIFI");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("连接成功");
Serial.print("IP Address");
Serial.println(WiFi.localIP());
}
void loop() {
}
注意将程序中的相关WiFi参数配置,保存程序到HTTP目录下,然后编译和上传程序到板卡
打开串口监视器,此处注意波特率应设置为115200
可以看到连接WiFi成功,并打印出了当前板卡的IP地址,说明板卡已经正常接入WiFi网络连网成功。
4.3.获取并解析天气预报数据
打开Arduino IDE,修改4.2章节代码
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
const char * ssid = "此处为WIFI网络名称";
const char * password = "此处为WIFI密码";
String url = "http://apis.juhe.cn/simpleWeather/query";
String city = "石家庄";
String key = "此处为聚合数据密钥ID";
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.print("正在连接WIFI");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("连接成功");
Serial.print("IP Address");
Serial.println(WiFi.localIP());
HTTPClient http;
http.begin(url + "?city=" + city + "&key=" + key);
int http_code = http.GET();
Serial.printf("HTTP STATUS: %d\n", http_code);
String response = http.getString();
Serial.print("响应数据");
Serial.println(response);
http.end();
DynamicJsonDocument doc(1024);
deserializeJson(doc, response);
unsigned int temp = doc["result"]["realtime"]["temperature"].as<unsigned int>();
String info = doc["result"]["realtime"]["info"].as<String>();
int aqi = doc["result"]["realtime"]["aqi"].as<int>();
Serial.printf("温度: %d, 天气: %s,空气指数: %d\n", temp, info, aqi);
}
void loop() {
}
然后编译并上传程序到板卡,上传程序程序后会自动运行,打开串口监视器
可以看到联网成功并查询到天气预报数据。
五、初始化BC260Y连接入物联网
本文档学习如何使用开发板的BC260Y-CN NB-IoT模块来实现无线通讯功能,BC260Y-CN需要跟SIM卡座集成使用,通过NB-IoT物联网专用SIM卡进行网络通讯,即插即用。
BC260Y-CN NB-IoT模块串口接ESP32的GPIO16(RX)和GPIO17(TX)引脚
5.1.引入第三方库
5.2.实现上网
打开Arduino IDE,新建项目ConnectToNBIoT,输入以下代码
#include <Arduino.h>
#include <ArduinoJson.h>
HardwareSerial SerialPort(2);
#define RXD2 16
#define TXD2 17
void CommandtoNBIOT (String cmd, char *res)
{
while (1)
{
SerialPort.println(cmd);
delay(300);
while (SerialPort.available() > 0)
{
if (SerialPort.find(res))
{
Serial.println(res);
return;
}
else
{
Serial.print(cmd);
Serial.println("Return ERROR!");
return;
}
}
delay(200);
}
}
void BC260Y_init(void)//初始化MQTT连接
{
CommandtoNBIOT("AT", "OK");
//返回+CPIN:READY,说明已经可以正常识别到SIM卡
CommandtoNBIOT("AT+CPIN?", "+CPIN: READY");
//返回+CGACT: 1,说明已经注册网络成功
CommandtoNBIOT("AT+CGATT?", "+CGATT: 1");
delay(300);
}
void setup() {
//TXD接IO17
//RXD接IO16
Serial.begin(9600);
SerialPort.begin(9600, SERIAL_8N1, RXD2, TXD2);
delay(2000);
BC260Y_init();
}
void loop() {
if (Serial.available()) {
SerialPort.write((char)Serial.read());
}
if (SerialPort.available()) {
Serial.write((char)SerialPort.read());
}
}
编译并上传程序到开发板,运行程序,由于这里我们需要向开发板发送AT命令,因此这里我们不在使用Arduino IDE自带的串口监视器,改用移远的QCOM_V1.8.2工具,开发资料中会提供该文件,打开QCOM,打开串口,注意我这里本串口是COM5,会自动识别出来,注意波特率为9600
从上图可以看到返回值均正常,说明已经可以进行网络通讯了
返回值+QNBIOTEVENT: “ENTER DEEPSLEEP”,表明BC260Y模块已经进入深度睡眠状态了,由于低功耗设计,模块很快会进入深度睡眠状态。
代码说明
接下来我们可参考移远的官方文档来进行一系列AT命令来实现不同功能
-
AT命令
进入低功耗状态后,我们执行AT命令,返回以下值表明已退出深睡眠模式
+QNBIOTEVENT: “EXIT DEEPSLEEP”
退出深睡眠模式后,在次执行AT命令,返回OK值,表明模块进入接收命令状态
-
AT+QSCLK=0命令
返回值:OK
说明:启用休眠锁,防止模块进入深睡眠
备注:模块上电后默认低功耗模式,若不退出休眠,在没有AT指令访问大约5S后模块就会自动进入深度睡眠模式,若要配置就需要唤醒,若要重新进入自动休眠模式,即AT+QSCLK=1。
六、L76K实现GPS定位功能
本示例学习如何使用开发板的L76K模块来实现GPS功能,L76K模块串口接ESP32的GPIO14(RX)和GPIO4(TX)引脚
6.1.引入第三方库
6.1.1.引入TinyGPSPlus库
为了解析L76K模块输出的NMEA语句,我们需要引入第三方库来实现,这个库名称是TinyGPSPlus
引入方法,我们打开Arduino IDE,进入项目-
->导入库
–>管理库
我们搜索TinyGPSPlus这个库,点击安装,最下方会提示有安装进度,直到安装完成即可
6.1.2.引入EspSoftwareSerial库
L76K模块串口接ESP32的GPIO14(RX)和GPIO4(TX)引脚,ESP32是通过软串口来与L76K进行通讯,所以这里需要引入另一个库EspSoftwareSerial
引入方法,我们打开Arduino IDE,进入项目-
->导入库
–>管理库
我们搜索EspSoftwareSerial这个库,点击安装,最下方会提示有安装进度,直到安装完成即可
6.2.编写程序
打开Arduino IDE,新建项目GPS,输入以下代码
#include <TinyGPSPlus.h>
#include <SoftwareSerial.h>
#define RXD2 16
#define TXD2 17
#define GPSRXD 14
#define GPSTXD 4
long lat, lon;
float latitude;
float longitude;
HardwareSerial SerialPort(2);
SoftwareSerial GPSSerial(GPSTXD, GPSRXD);
TinyGPSPlus gps;
void CommandtoNBIOT (String cmd, char *res)
{
while (1)
{
SerialPort.println(cmd);
delay(300);
while (SerialPort.available() > 0)
{
if (SerialPort.find(res))
{
Serial.println(res);
return;
}
else
{
Serial.print(cmd);
Serial.println("Return ERROR!");
return;
}
}
delay(200);
}
}
void BC260Y_init(void)//初始化BC260Y
{
CommandtoNBIOT("AT", "OK");
//返回+CPIN:READY,说明已经可以正常识别到SIM卡
CommandtoNBIOT("AT+CPIN?", "+CPIN: READY");
//返回+CGACT: 1,说明已经注册网络成功
CommandtoNBIOT("AT+CGATT?", "+CGATT: 1");
delay(300);
}
void setup() {
Serial.begin(9600);
SerialPort.begin(9600, SERIAL_8N1, RXD2, TXD2);
GPSSerial.begin(9600);
BC260Y_init();
delay(2000);
}
void loop() {
while (GPSSerial.available() > 0) {
Serial.write(GPSSerial.read());
}
}
编译并上传程序到开发板,运行程序,打开串口监视器,可看到如下输出
说明已经读取到L76K模组输出的NMEA语句,注意天线要放置到室外才能解析到位置数据。
L76K模组输出的NMEA语句需要解析成我们想要的数据,比如经度、纬度、速度等信息,这里我们需要借助TinyGPSPlus这个库来进行数据解析。
参考TinyGPSPlus的示例解析出来的数据,可以看到包含的经纬度等信息。
6.4.QGNSS工具
移远提供了一款QGNSS工具用于查询验证模块的状态,初次使用时需要配置一下串口
然后点击左上角的连接按钮即可连接上串口,将天线放置到户外,将会看到模块的相关数据和位置信息。
定位跟实际位置有偏差,需要编写程序进行纠偏。