【开源】ESP32怎样连接NEO6M模块接收GPS数据并显示在oled小屏幕上并可上传数据至Onenet云平台

这篇具有很好参考价值的文章主要介绍了【开源】ESP32怎样连接NEO6M模块接收GPS数据并显示在oled小屏幕上并可上传数据至Onenet云平台。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

esp32连接neo6m在oled上显示定位数据

第一部分 ESP32怎样连接NEO6M模块接收GPS数据并显示在oled小屏幕上并可上传数据至Onenet云平台

esp32开源,单片机,linux,嵌入式硬件

一.软件部分

  • 安装Arduino

    我们可以直接去官网上进行下载 https://www.arduino.cc/en/software

esp32开源,单片机,linux,嵌入式硬件
选择第一个
esp32开源,单片机,linux,嵌入式硬件
即可开始下载

  • 将Arduino设置为中文,选择File–打开Preferences–language–中文简体
    esp32开源,单片机,linux,嵌入式硬件

  • 需要安装ESP32库,选择文件–首选项–在其他管理器开发地址写入https://dl.espressif.com/dl/package_esp32_index.json
    https://github.com/adafruit/Adafruit_SSD1306 一个是控制esp32,一个是oled屏幕的,输入完成点击确认
    esp32开源,单片机,linux,嵌入式硬件

  • 选择工具–开发板–开发板管理器

esp32开源,单片机,linux,嵌入式硬件

  • 输入esp32

esp32开源,单片机,linux,嵌入式硬件

  • 点击安装即可
  • 需安装TinyGPSPlus库,
  • https://github.com/mikalhart/TinyGPSPlus/releases
  • arduino可以通过【项目】-【加载库】-【添加.zip库】-装指定离线库压缩包


2.相关代码

#include <PubSubClient.h>
#include "WiFi.h"
#include <Arduino.h>
#include "Ticker.h"

#include <splash.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <TinyGPS++.h>


#define SCREEN_WIDTH 128 // oled显示屏宽高
#define SCREEN_HEIGHT 64 

//On ESP32: GPIO-21(SDA), GPIO-22(SCL)
#define OLED_RESET -1 //Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C //See datasheet for Address
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define RXD2 16
#define TXD2 17
HardwareSerial neogps(1);

TinyGPSPlus gps;//gps函数




const char *ssid = "honor";                 //wifi名
const char *password = "qq123456";         //wifi密码
const char *mqtt_server = "xxx.xxx.xx.xx"; //onenet 的 IP地址
 
#define mqtt_devid "十位数"  //设备ID
#define mqtt_pubid "六位"     //产品ID
#define mqtt_password "自己设置的密码" //鉴权信息
 
WiFiClient espClient;           //创建一个WIFI连接客户端
PubSubClient client(espClient); // 创建一个PubSub客户端, 传入创建的WIFI客户端
 
char msg_buf[200];                                //发送信息缓冲区
char dataTemplate[] = "{\"lng\":%.6f,\"lat\":%.6f}"; //信息模板

char msgJson[75];                                 //要发送的json格式的数据
unsigned short json_len = 0;                      //json长度
Ticker tim1;                                      //定时器,用来循环上传数据


void setup() {
  Serial.begin(115200);
  //开始串行通信 Arduino IDE (串行监视器)

  //开始串行通讯 Neo6mGPS
  neogps.begin(9600, SERIAL_8N1, RXD2, TXD2);
  
  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }

  display.clearDisplay();
  display.display();
  delay(2000);



   //这个延时是为了让我打开串口助手
  setupWifi();                                           //调用函数连接WIFI
  client.setServer(mqtt_server, 6002);                   //设置客户端连接的服务器,连接Onenet服务器, 使用6002端口
  client.connect(mqtt_devid, mqtt_pubid, mqtt_password); //客户端连接到指定的产品的指定设备.同时输入鉴权信息
  client.setCallback(callback);                          //设置好客户端收到信息是的回调
  tim1.attach(1, sendgps);                      //定时每20秒调用一次发送数据函数sendgps
}

void loop() {
    
  boolean newData = false;
  for (unsigned long start = millis(); millis() - start < 1000;)
  {
    while (neogps.available())
    {
      if (gps.encode(neogps.read()))
      {
        newData = true;
      }
    }
  }

  //If newData is true
  if(newData == true)
  {
    newData = false;
    Serial.println(gps.satellites.value());
    print_speed();
  }
  else
  {
    display.clearDisplay();
    display.setTextColor(SSD1306_WHITE);
    display.setCursor(0, 0);
    display.setTextSize(3);
    display.print("No Data");
    display.display();
  }  
  
if (!WiFi.isConnected()) //先看WIFI是否还在连接
  {
    setupWifi();
  }
if (!client.connected()) //如果客户端没连接ONENET, 重新连接
  {
    clientReconnect();
  }
  client.loop(); //客户端循环检测  
}

void print_speed()
{
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
       
  if (gps.location.isValid() == 1)
  {
   //String gps_speed = String(gps.speed.kmph());
    display.setTextSize(1);
    
    display.setCursor(25, 5);
    display.print("Lat: ");
    display.setCursor(50, 5);
    display.print(gps.location.lat(),6);

    display.setCursor(25, 20);
    display.print("Lng: ");
    display.setCursor(50, 20);
    display.print(gps.location.lng(),6);

    display.setCursor(25, 35);
    display.print("Speed: ");
    display.setCursor(65, 35);
    display.print(gps.speed.kmph());
    
    display.setTextSize(1);
    display.setCursor(0, 50);
    display.print("SAT:");
    display.setCursor(25, 50);
    display.print(gps.satellites.value());

    display.setTextSize(1);
    display.setCursor(70, 50);
    display.print("ALT:");
    display.setCursor(95, 50);
    display.print(gps.altitude.meters(), 0);

    display.display();
    
  }
  else
  {
    display.clearDisplay();
    display.setTextColor(SSD1306_WHITE);
    display.setCursor(0, 0);
    display.setTextSize(3);
    display.print("No Data");
    display.display();
  }  

}


 
//连接WIFI相关函数
void setupWifi()
{
  delay(10);
  Serial.println("连接WIFI");
  WiFi.begin(ssid, password);
  while (!WiFi.isConnected())
  {
    Serial.print(".");
    delay(500);
  }
  Serial.println("OK");
  Serial.println("Wifi连接成功");
}
 
//收到主题下发的回调, 注意这个回调要实现三个形参 1:topic 主题, 2: payload: 传递过来的信息 3: length: 长度
void callback(char *topic, byte *payload, unsigned int length)
{
  Serial.println("message rev:");
  Serial.println(topic);
  for (size_t i = 0; i < length; i++)
  {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}
 
//向主题发送模拟的温湿度数据
void sendgps()
{
  if (client.connected())
  {
    snprintf(msgJson, 40, dataTemplate, gps.location.lng(), gps.location.lat()); //将模拟温湿度数据套入dataTemplate模板中, 生成的字符串传给msgJson
    json_len = strlen(msgJson);                   //msgJson的长度
    msg_buf[0] = char(0x03);                       //要发送的数据必须按照ONENET的要求发送, 根据要求,数据第一位是3
    msg_buf[1] = char(json_len >> 8);              //数据第二位是要发送的数据长度的高八位
    msg_buf[2] = char(json_len & 0xff);            //数据第三位是要发送数据的长度的低八位
    memcpy(msg_buf + 3, msgJson, strlen(msgJson)); //从msg_buf的第四位开始,放入要传的数据msgJson
    msg_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()
{
  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);
    }
  }
}

2.硬件连接

esp32开源,单片机,linux,嵌入式硬件文章来源地址https://www.toymoban.com/news/detail-756362.html

到了这里,关于【开源】ESP32怎样连接NEO6M模块接收GPS数据并显示在oled小屏幕上并可上传数据至Onenet云平台的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Arduino 合宙 ESP32 S3 + OV2640 实现低成本SD存储卡相机(ESP32连接SD模块引脚)

    合宙ESP32 S3 板载16M flash,8m psram和一个FPC相机接口,价格却不到30元,无疑比价格将近50元的第三方ESP32 S3和将近30的ESP32 Cam更具性价比。 但是虽然板载FPC,由于接口冲突,导致相机与psram不能同时开启,作为ESP32 Cam的替代品来看,还缺少了板载SD卡,而且作为一块发布不久的开发

    2024年02月04日
    浏览(52)
  • ESP8266+STM32+MQTT发送数据到阿里云服务器(三、配置ESP8266模块并测试连接)

    1、固件烧录器 2、固件 3、串口工具 4、ESP866模块 5、USB转TTL模块 (以上软件工具文末分享的链接有,硬件请淘宝自行购买) 硬件如下图: 1、按照下面对照关系进行接线 USB转TTL ESP8266 3.3V 3V3 GND GND RX TX TX RX IO0 GND 2、打开固件烧录工具图标 3、点击“ OK ” 4、在出现的界面中,

    2024年03月23日
    浏览(52)
  • STM32通过串口2使用ESP8266WIFI模块连接新大陆云平台

    目录 使用硬件: 分步骤:配置TCP连接,连接WIFI 1.使用ESP8266的复位引脚进行复位 2.发送基本AT指令 3.连接新大陆 4.新大陆云平台显示在线及上传数据测试成功 5.串口显示 5.涉及的函数 发生AT检测WIFI模块错误,如图,代码运行停留在了.AT,在while中一直循环,没有往下跑了,这种

    2024年04月24日
    浏览(58)
  • HC06蓝牙2.0模块连接不稳定 和 STM32串口不传输数据(串口接收中断)的一些问题

    最近,在一个项目中使用到蓝牙,但是调试过程出现了很多问题。 刚开始使用的是HC06蓝牙,刚开始使用较为正常,可以实现蓝牙模块和电脑设备直接连接,而且数据接收正常。 在接下来的设计中,考虑到适配问题,就设计了配套的蓝牙接收模块,同样是HC06贴片模块。但问题

    2024年02月14日
    浏览(52)
  • STM32使用ESP8266模块AT指令连接心知天气API获取天气信息

    由于之前使用STM32单片机来开发一些物联网的小项目,接触到了WIFI模块ESP8266,所以写下来记录一下。 本文主要介绍的是STM32通过发送AT指令集来控制ESP8266 WIFI模块连接WiFi并与心知天气API建立TCP连接获取天气信息。 ESP8266我使用的是正点原子的ATK-ESP8266,已经提前烧录好AT指令集

    2023年04月08日
    浏览(72)
  • STM32F103C8T6+ESP8266WIFI+DHT11模块连接巴法云

    1.MCU:STM32F103C8T6 2.ESP8266:正点原子WIFI模块 3.串口模块:正点原子串口模块 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: ESP8266固件刷写 我用的是安信可的固件,可以在官网上下载。正点

    2023年04月27日
    浏览(69)
  • STM32系列(HAL库)——使用ESP8266-01S物联网模块连接Onenet云平台上报DHT11温湿度

    本篇主要讲解如何使用ESP8266-01S物联网模块连接Onenet云平台,并上报DHT11模块的温湿度数据。本文单片机主控采用STM32F405RGT6,使用其他主控的话基本要求有2个串口,一个串口用于调试使用,另一个用于ESP模块通讯。 1.软件 CubeMX Keil5 串口调试助手 Onenet云平台账户 2.硬件 STM32开

    2024年02月02日
    浏览(79)
  • 新手小白必看——基于STM32+ESP8266模块连接阿里云平台读取传感器数据(从0到1,包教包会)

    目录 前言             本次我们学习一下STM32F103驱动ESP8266去连接阿里云的实操过程,在次过程中我会详细讲解开发过程中遇到的问题以及面对问题的解决,希望大家在这篇博客里面也有所收获。 一、ESP8266WIFI模块的固件库刷新(MQTT) 1.固件库刷新 1.1 固件库烧录下载 1.2 固

    2024年04月26日
    浏览(43)
  • 基于STM32+ESP8266+FreeRTOS+安卓App上位机+MQTT连接OneNET的智能家居项目(软件开源篇附百度网盘链接)

      本篇文章主要是分享智能家居项目中的下位机STM32+FreeRTOS的代码部分。以下是项目最终的效果 stm32 esp8266 语音控制智能家居_哔哩哔哩_bilibili   另外附上main函数中的部分代码,完整代码会在文章末尾放上百度网盘链接,可以自行下载。 链接:https://pan.baidu.com/s/1IS-OMLy2_pyWyM

    2024年02月08日
    浏览(46)
  • ESP32播放网络音乐与麦克风接收

    需要用到esp32开发板、 MAX98357模块、喇叭、连接线 库安装 1,首先到GITHUB下载「ESP32-audioI2S」         https://github.com/schreibfaul1/ESP32-audioI2S/ 2,解压。 3,把解压的文件放进Arduino IDE的libraries文件夹 接线  MAX98357与单片机接线如下: VIN ---------- 5V GND----------GND DIN------------25

    2024年04月10日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包