乐鑫ESP32+BC260Y+L76K物联网开发板编程入门(基础篇)

一、开发环境搭建

作为一名入门初学者,我们计划采用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安装程序

image-20240605162109208

点击 我同意开始安装

image-20240605162156847

点击 下一步,进入下一步

image-20240605162235479

点击 安装,开始安装

image-20240605162311330

直到安装完成

image-20240605162451890

安装完成,点击 完成 结束安装程序

双击桌面的Arduino图标进入到Arduino IDE主界面

image-20240605162910825

[注意事项]

初次运行会弹出防火墙访问网络及安装驱动的窗口,直接允许和安装即可

默认界面语言为英文,可在File–>Preferences中,将Language的值设置为中文

1.3.2.配置ESP32开发板

设置开发板管理器,如下图所示,进入工具->开发板->开发板管理器

image-20240605163848961

如下图所示在开发板搜索栏中输入ESP32,注意这里是选择第二项由Espressif发行的版本,选择最新版,点击安装

image-20240605164226909

开始安装后,下方进度条会提示安装进度,耐心等待直到安装完成

image-20240605164300072

安装完成后左侧面板中会有3.0.0已安装的提示,进入开板板管理器,可以看到ESP32 Arduino已安装,这里选择ESP32 Dev Module这个选项。

然后打开 工具->开发板->esp32,在弹出的esp32列表中选择ESP32 Dev Module模组

image-20240605170950882

至此我们的开发环境已经搭建完成,接下来我们就可以开始开发应用程序了!

二、编译运行第一个示例程序

本示例执行一个打印动作,每两秒钟打印一次字符串"Hello ESP32!"到串口。

2.1.输入代码

接下来我们就可以开始编写代码了,输入以下代码

void setup() {
  //初始化波特率
  Serial.begin(9600);
}

void loop() {
  //打印字符串
  Serial.println("Hello ESP32!");
  //延时2s执行
  delay(2000);
}

2.2.编译并上传程序

输入完成后,初次编译需要指定程序的存放目录,并命名一个工程名称,我这里简单命名一个Hello,然后执行上传命令即可进行代码的编译并上传至开发板,点击上传按钮开始上传

image-20240610113721070

看到这样的执行结果就说明程序已经正常上传到开发板,我们打开串口监视器

image-20240610113629691

可以看到程序已经正常运行。

三、点亮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目录下,然后编译并上传程序到开发板,注意编译时选择正确的开发板和端口

image-20240711144821452

可以看到指示灯成功点亮。

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

保存程序,并编译上传程序到开发板

image-20240711145047127

可以看到指示灯每隔2s钟关闭和启动一次来实现闪烁的效果。

四、实现WiFi联网获取数据程序设计

本示例学习如何使用板卡的ESP32模组来实现连接WIFI网络,并通过HttpClient协议来获取网络数据。

通过访问由聚合数据提过的天气预报API接口来获取天气预报数据,注意需要提前注册并获取密钥,申请天气预报的API接口即可

聚合数据官网https://www.juhe.cn/

注册并申请服务成功后,可登录聚合数据后台查看天气预报的接口文档,可以看到API返回的类型是json格式,因此我们需要引第三方的类来进行返回数据解析

image-20240213114046044

4.1.引入第三方库

本示例中需要用到第三方库,由于API返回的类型是json格式,我们需要使用ArduinoJson这个第三方库来解析获取到的数据。

引入方法,我们打开Arduino IDE,进入项目->导入库–>管理库

在左侧库管理界面搜索栏中输入我们想要查找的库名称,我们这里输入"ArduinoJson",回车进行搜索

image-20240610133742181

选择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目录下,然后编译和上传程序到板卡

image-20240610134058057

打开串口监视器,此处注意波特率应设置为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() {

}

然后编译并上传程序到板卡,上传程序程序后会自动运行,打开串口监视器

image-20240610135138482

可以看到联网成功并查询到天气预报数据。

五、初始化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

image-20240213135322590

从上图可以看到返回值均正常,说明已经可以进行网络通讯了

返回值+QNBIOTEVENT: “ENTER DEEPSLEEP”,表明BC260Y模块已经进入深度睡眠状态了,由于低功耗设计,模块很快会进入深度睡眠状态。

代码说明

接下来我们可参考移远的官方文档来进行一系列AT命令来实现不同功能

  1. AT命令

    进入低功耗状态后,我们执行AT命令,返回以下值表明已退出深睡眠模式

    +QNBIOTEVENT: “EXIT DEEPSLEEP”

    退出深睡眠模式后,在次执行AT命令,返回OK值,表明模块进入接收命令状态

  2. 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,进入项目-->导入库–>管理库

image-20240711151454984

我们搜索TinyGPSPlus这个库,点击安装,最下方会提示有安装进度,直到安装完成即可

6.1.2.引入EspSoftwareSerial库

L76K模块串口接ESP32的GPIO14(RX)和GPIO4(TX)引脚,ESP32是通过软串口来与L76K进行通讯,所以这里需要引入另一个库EspSoftwareSerial

引入方法,我们打开Arduino IDE,进入项目-->导入库–>管理库

image-20240711151812446

我们搜索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());
  }
}

编译并上传程序到开发板,运行程序,打开串口监视器,可看到如下输出

image-20240711152206202

说明已经读取到L76K模组输出的NMEA语句,注意天线要放置到室外才能解析到位置数据。

L76K模组输出的NMEA语句需要解析成我们想要的数据,比如经度、纬度、速度等信息,这里我们需要借助TinyGPSPlus这个库来进行数据解析。

参考TinyGPSPlus的示例解析出来的数据,可以看到包含的经纬度等信息。

GPS_20240711154204

6.4.QGNSS工具

移远提供了一款QGNSS工具用于查询验证模块的状态,初次使用时需要配置一下串口

image-20240218133006852

然后点击左上角的连接按钮即可连接上串口,将天线放置到户外,将会看到模块的相关数据和位置信息。

image-20240218131559442

image-20240218131836318

image-20240218131937980

image-20240218132017352

定位跟实际位置有偏差,需要编写程序进行纠偏。

  • 11
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值