在物联网和地理定位项目中,显示设备的经纬度是一个常见的需求。今天,我们将通过一个简单的项目,使用 Arduino Uno、GT-U8 GPS 模块和 0.96 寸 OLED 显示屏(I2C)来实现这一功能。这个项目不仅适合初学者,还能为更复杂的项目提供基础。
硬件材料
- Arduino Uno:作为项目的控制核心,负责数据采集和显示控制。
- GT-U8 GPS 模块:用于获取设备的经纬度信息。
- 0.96 寸 OLED 显示屏(I2C):用于显示经纬度数据。
- 杜邦线:用于连接各个组件。
- 面包板(可选):方便进行电路搭建和测试。
硬件连接
GT-U8 GPS 模块
- VCC 连接到 Arduino Uno 的 5V 引脚。
- GND 连接到 Arduino Uno 的 GND 引脚。
- TX 连接到 Arduino Uno 的 D3 引脚。
- RX 连接到 Arduino Uno 的 D2 引脚。
0.96 寸 OLED 显示屏(I2C)
- VCC 连接到 Arduino Uno 的 5V 引脚。
- GND 连接到 Arduino Uno 的 GND 引脚。
- SCL 连接到 Arduino Uno 的 A5 引脚。
- SDA 连接到 Arduino Uno 的 A4 引脚。
软件库
确保已经安装了以下库:
- Adafruit GFX Library
- Adafruit SSD1306 Library
- TinyGPS++ Library
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SoftwareSerial.h>
#include <TinyGPS++.h>
#define SCREEN_WIDTH 128 // OLED显示屏幕的宽度,以像素计
#define SCREEN_HEIGHT 64 // OLED显示屏幕的高度,以像素计
#define OLED_RESET -1 // 重置引脚;如果不使用可以设置为 -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define GPS_RX 2
#define GPS_TX 3
SoftwareSerial ss(GPS_RX, GPS_TX); // RX, TX
TinyGPSPlus gps;
void setup() {
Serial.begin(9600);
ss.begin(9600);
// 初始化OLED显示屏
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 这里的0x3C是OLED的I2C地址,根据实际情况可能需要修改
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
// 显示屏初始化
display.clearDisplay();
display.setTextSize(1); // 设置文本大小
display.setTextColor(SSD1306_WHITE); // 设置文本颜色
display.setCursor(0, 0); // 设置文本开始的坐标
display.println(F("GPS")); // 打印文本
display.setCursor(0, 10);
display.println(F("latitude"));
display.setCursor(0, 20);
display.println(F("longitude"));
display.display(); // 显示以上图形操作
delay(2000); // 稍作延时
}
void loop() {
while (ss.available() > 0) {
char c = ss.read();
Serial.write(c); // 将接收到的数据发送到串口监视器
if (gps.encode(c)) { // 编码GPS数据
if (gps.location.isValid()) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(F("GPS"));
display.setCursor(0, 10);
display.print(F("latitude: "));
display.println(gps.location.lat(), 6);
display.setCursor(0, 20);
display.print(F("longitude: "));
display.println(gps.location.lng(), 6);
display.display();
}
}
}
}