使用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;
}
热门推荐
7年时间!动车时速再提升50公里
气动化工球阀品牌竞争分析
什么是诉讼申请材料?详解种类、撰写要求及注意事项
2024年三季度合肥房地产市场形势报告
中日学生身高对比:中国大部分地区学生身高高于日本,提出"概念身高"新概念
治疗腰椎间盘突出的药物有哪些?
“老杜”与“李白”:称号背后的文化意蕴
高频功能大盘点!交管12123"网上办"快快用起来 | 便民服务
2025五台山春节元宵节交通管制全攻略:预约、限行与游览指南
睡醒后脸肿手肿麻木怎么办?医生给出专业解答
肝内稍高回声结节怎么回事
声色狗马成语接龙
大器晚成的十大历史人物,是命运的捉弄还是奇迹的诞生?
谈个案概念化在心理咨询中的作用
燕子鱼是什么鱼?
国际硕士学历落户北上广政策全解析:2025最新指南
LLM推理优化笔记:vLLM原理与PagedAttention详解
不婚主义是什么?从定义到影响的全面解析
38个、3744公里高速公路项目(路段)在建 大道兴川新期待
杏花的颜色、形状与香味:从含苞到盛开的美丽蜕变
Midjourney使用指南:从入门到精通,生成惊艳的艺术作品
螺蛳粉的功效作用与食用禁忌
合同条款通常包含哪些内容
核阅合同:确保合同准确无误的关键步骤
健身党必备!这4类零食越吃越瘦,饱腹感爆棚
高端装修公司收纳系统的隐藏式设计要点?
提康德罗加级巡洋舰:2027财年将全部退役,以后美海军再无巡洋舰
美军花费18亿美元升级巡洋舰 钱花了巡洋舰退役了
癌症到底有没有先兆?身体发生这6个变化早就提醒你了
幼犬和狗体内的蛔虫:病因、治疗和预防