使用ESP8266+GPS模块+OLED屏幕DIY一块GPS定位器
创作时间:
作者:
@小白创作中心
使用ESP8266+GPS模块+OLED屏幕DIY一块GPS定位器
引用
CSDN
1.
https://blog.csdn.net/a654540233/article/details/142500249
本文将介绍如何使用ESP8266开发板、GPS模块和OLED屏幕制作一个GPS定位器。通过本教程,读者可以学习到硬件连接、程序编写以及数据处理等实用技能。
1. 材料准备
ESP8266开发板(建议购买带有CH340或CP2102驱动的NodeMCU)
GPS模块(支持NMEA协议)
0.96寸OLED屏幕(支持I²C协议)
若干杜邦线(母对母)
2. 接线说明
OLED屏幕接线
NODEMCU开发板 | OLED屏幕 | 备注 |
---|---|---|
G | GND | NodeMCU中有多个地线引脚,选择一个即可 |
3V | VCC | NodeMCU中有多个3V供电引脚,选择一个即可 |
D1 (GPIO 5) | SCL | SCL代表"Serial Clock Line",即串行时钟线 |
D2 (GPIO 4) | SDA | SDA代表"Serial Data Line",即串行数据线 |
GPS模块接线
NODEMCU开发板 | GPS模块 | 备注 |
---|---|---|
D5 (GPIO 14) | RXD | GPS的RX接模拟串口的TX引脚定义 |
D6 (GPIO 12) | TXD | GPS的TX接模拟串口的RX引脚定义 |
G | GND | NodeMCU中有多个地线引脚,选择一个即可 |
3V | VDD | NodeMCU中有多个3V供电引脚,选择一个即可 |
3. 烧录程序
打开Arduino IDE,选择开发板为NodeMCU 1.0 (ESP-12E Module)。使用以下代码,直接上传即可。如果本地没有相关库,需要手动安装TinyGPSPlus、Adafruit_GFX和Adafruit_SSD1306这三个库。
4. 上电效果
由于是在室内环境,GPS可能无法搜到卫星信号,因此可能没有数据输出。当GPS成功搜星后,会自动获取时间和经纬度信息。需要注意的是,这里的经纬度是WGS84坐标系,无法直接使用。如需转换为其他坐标系(如火星坐标系或百度坐标系),可以参考相关转换方法。
5. 完整代码
#include <TinyGPSPlus.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SoftwareSerial.h>
#include "ESP8266WiFi.h"
// I2C款接线说明
// NodeMCU开发板 0.96寸OLED 引脚连接对应关系
// GND GND
// 3V3 VCC
// SCL D1 (GPIO 5)
// SDA D2 (GPIO 4)
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET 13 // 重置引脚
#define SCREEN_ADDRESS 0x3C // OLED 显示屏的地址,固化在芯片上
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // 创建实例
// gps模块引脚定义
#define RXPin 12 // GPIO 12 对应nodemcu D6
#define TXPin 14 // GPIO 14 对应nodemcu D5
// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);
// The TinyGPSPlus object
TinyGPSPlus gps;
// 一些需要使用的变量
int Year, Month, Date, Hour, Minute, Second, Yea, Mon, Dat, Hou;
double Lat, Lng;
String sMonth, sDate, sHour, sMinute, sSecond;
void setup() {
Serial.begin(9600);
WiFi.mode(WIFI_OFF); //关闭WIFI模块省电
WiFi.forceSleepBegin();
ss.begin(9600); //GPS模块虚拟串口
// 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.setTextColor(WHITE); // 设置字体颜色为白色
display.display(); // 显示
//OLED屏初始化代码
}
void loop() {
boolean newData = false;
for (unsigned long start = millis(); millis() - start < 300;) {
while (ss.available()) {
if (gps.encode(ss.read())) {
newData = true;
}
}
} //上面是GPS数据接收的固定代码,不能删除
Yea = gps.date.year(); //年
Mon = gps.date.month(); //月
Dat = gps.date.day(); //日
Hou = gps.time.hour(); //时
Minute = gps.time.minute(); //分
Second = gps.time.second(); //秒
Lng = gps.location.lng(); //经度
Lat = gps.location.lat(); //纬度
// 创建一个字符串来存储所有变量
// String origin = String(Yea) + "-" + String(Mon) + "-" + String(Dat) + " " + String(Hou) + ":" + String(Minute) + ":" + String(Second) + " (" + String(Lng, 8) + "," + String(Lat, 8) + ")";
// 输出整个字符串
// Serial.println(origin);
//年月日时转换部分,将UTC时间转换为北京时间,并消除错误
Hour = Hou + 8; //修正时区
if (Hour >= 24) {
Hour = Hour - 24; //修正小时超程
}
if (Hou + 8 >= 24) {
Date = Dat + 1;
if ((Mon == 1 || Mon == 3 || Mon == 5 || Mon == 7 || Mon == 8 || Mon == 10 || Mon == 12) && (Date > 31)) {
Date = Date - 30;
Month = Mon + 1; //大月进位
} else {
Month = Mon;
Year = Yea;
}
if ((Mon == 4 || Mon == 6 || Mon == 9 || Mon == 11) && (Date > 30)) {
Date = Date - 29;
Month = Mon + 1; //小月进位
} else {
Month = Mon;
Year = Yea;
}
if ((Yea % 4 == 0) && (Date > 29)) {
Date = Date - 28;
Month = Mon + 1; //闰月判定并进位
} else {
Month = Mon;
Year = Yea;
}
if ((Yea % 4 != 0) && (Date > 28)) {
Date = Date - 27;
Month = Mon + 1; //非闰月判定并进位
} else {
Month = Mon;
Year = Yea;
}
if (Month > 12) {
Month = Month - 12;
Year = Yea + 1; //年超程进位
}
} else {
Date = Dat;
Month = Mon;
Year = Yea;
}
//结果显示部分
display.setTextColor(SSD1306_WHITE);
display.setCursor(38, 0);
display.setTextSize(1);
display.print(Year);
display.setCursor(63, 0);
display.setTextSize(1);
display.print("-");
display.setTextSize(1);
display.setCursor(71, 0);
sMonth = formatNumber(Month, 2);
display.print(sMonth);
display.setCursor(83, 0);
display.setTextSize(1);
display.print("-");
display.setTextSize(1);
display.setCursor(91, 0);
sDate = formatNumber(Date, 2);
display.print(sDate);
display.setTextSize(2);
display.setCursor(26, 13);
sHour = formatNumber(Hour, 2);
display.print(sHour);
display.setCursor(46, 13);
display.setTextSize(2);
display.print(":");
display.setTextSize(2);
display.setCursor(56, 13);
sMinute = formatNumber(Minute, 2);
display.print(sMinute);
display.setCursor(76, 13);
display.setTextSize(2);
display.print(":");
display.setTextSize(2);
display.setCursor(86, 13);
sSecond = formatNumber(Second, 2);
display.print(sSecond);
display.setTextSize(1);
display.setCursor(35, 33);
display.print(gps.location.lng(), 8);
display.setTextSize(1);
display.setCursor(35, 43);
display.print(gps.location.lat(), 8);
// 创建一个字符串来存储所有变量
// String message = String(Year) + "-" + String(sMonth) + "-" + String(sDate) + " "+ String(sHour) + ":" + String(sMinute) + ":" + String(sSecond) + " (" + String(Lng, 8) + "," + String(Lat, 8) + ")";
// 输出整个字符串
// Serial.println(message);
display.setCursor(105, 53);
display.setTextSize(1);
display.print("m");
display.setCursor(50, 53);
display.setTextSize(1);
display.print("km/h");
display.setTextSize(1);
display.setCursor(80, 53);
display.print(gps.speed.mps());
display.setTextSize(1);
display.setCursor(25, 53);
display.print(gps.speed.kmph());
display.display();
delay(500);
display.clearDisplay();
}
// 格式化数字的函数
String formatNumber(int number, int digits) {
String formatted = "";
if (number < pow(10, digits - 1)) {
formatted = String(number, DEC);
while (formatted.length() < digits) {
formatted = "0" + formatted;
}
} else {
formatted = String(number, DEC);
}
return formatted;
}
热门推荐
麻鸭和一般鸭子的区别,外观特征不同
“粤车南下”新进展!拟首阶段不入市区
大模型日报|9 篇必读的大模型论文
减脂过程中,最有效的十大减肥运动!
学英语时,选择美音还是英音?一篇文章帮你理清思路
新房装修是先做防水还是先铺地暖
合同签名鉴定:如何确定签名真实性和法律效力?
凯雷为“非洲的切·格瓦拉”设计,布基纳法索托马斯·桑卡拉纪念建筑群
如何在展厅设计中提供互动体验和参与感?
血糖高能吃羊角蜜吗?医生的专业建议来了
渐冻症的高发人群有哪些?
如何优化签字流程管理规定以提高效率?
成都医生应用DeepSeek!AI辅助高难度手术
格力空调E3故障处理指南:原因分析与解决方案详解
工程监控摄像头安装应该注意的事项
公司的一般账户与基本账户有什么区别
融资租赁每年租金计算公式的法律解析与应用
为什么很多老人到了七十岁,过不了几年就去世了?原因主要是三点
成都网约车市场调查:40多名司机讲述行业困境与出路
A股市场:现状剖析、影响因素及投资指南
物料堆放高度国家标准规范最新要求是什么?
2024文旅营销洞察报告:内容与特色良性循环,个性化崛起
二战时期,德国“恩尼格玛”密码机被破解,每月被截获近万条情报
为什么说近视600度是一个分水岭?
人防车位租赁合同:法律性质、效力及实务操作指南
如何签订租赁土地合同
康乃馨盆栽养护全攻略:从光照到修剪,让花朵年年绽放
医学专家列出对身体最有害的酒精饮料
这届年轻人都爱在网上看啥?《高等数学》赢麻了!
扑翼无人机——设计的灵感汲取自创造