使用 Arduino UNO 和 NEO-6M GPS 模块构建目的地到达提醒器
组件与供应
| Arduino UNO | ×1 |
| NEO-6M GPS 模块 | ×1 |
| LED(通用) | ×1 |
| L293D 双 H 桥驱动芯片 | ×1 |
| 振动盘电机 | ×1 |
| 可拼接实验板 | ×1 |
| 9V 电池 | ×1 |
| 9V 电池转 DC 插头 | ×1 |
| 外壳盒 | ×1 |
| 杜邦线若干 | ×1 |
所需工具
- 电烙铁
- 剥线钳
软件与在线服务
- Arduino IDE
项目介绍
问题与解决方案
交通拥堵是巨大的时间浪费,且无法准确预测到达时间。两个月前我搬到城市后,每天在路上耗费两小时以上。我想利用这段时间做些有意义的事:思考规划项目、在线学习课程,或者动手制作电子项目。
于是我利用 Arduino 和 GPS 模块制作了一个目的地到达提醒器。当接近预设目的地时,通过 LED 亮起或振动电机震动来提醒。下文提供了 LED 版和振动电机版两种电路方案。
核心逻辑:先获取目的地的经纬度,然后实时计算当前位置与目的地的距离,设定一个阈值范围,进入范围即触发提醒。
硬件连接说明
NEO-6M GPS 模块接线
模块有四个引脚:VCC、RX、TX、GND。通过软件串口与 Arduino 通信:
- VCC → Arduino VIN (5V)
- RX → Arduino 软件串口 TX 引脚 (默认 D3)
- TX → Arduino 软件串口 RX 引脚 (默认 D4)
- GND → GND
L293D 驱动振动电机
L293D 可将低电流控制信号转换为驱动电机所需的大电流。连接方式:
- 5V 接 Enable 1、Vs、Vss
- Arduino 数字引脚 (D6、D7) 接 Input 1、Input 2
- Arduino GND 接 L293D 同侧两个 GND
- Output 1、Output 2 接振动电机两极
获取目的地经纬度
上传以下代码,打开串口监视器 (9600 波特率),等待 GPS 定位成功后记录输出的经纬度值。GPS 模块上的 LED 闪烁表示已捕获卫星信号。
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;
TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);
void setup() {
Serial.begin(9600);
ss.begin(GPSBaud);
}
void loop() {
while (ss.available() > 0) {
gps.encode(ss.read());
if (gps.location.isUpdated()) {
Serial.print("Latitude= ");
Serial.print(gps.location.lat(), 6);
Serial.print(" Longitude= ");
Serial.println(gps.location.lng(), 6);
}
}
}
LED 版目的地提醒器
将获取到的目的地经纬度填入代码中的 Dest_LAT 和 Dest_LON。代码每 5 秒计算一次当前位置到目的地的距离,当距离小于设定阈值 (示例中为 50 米) 时点亮 LED (D13)。
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;
TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);
unsigned long last = 0UL;
int ledPin = 13;
void setup() {
Serial.begin(115200);
ss.begin(GPSBaud);
pinMode(ledPin, OUTPUT);
}
void loop() {
while (ss.available() > 0) gps.encode(ss.read());
if (gps.location.isUpdated()) {
Serial.print(F(" Lat="));
Serial.print(gps.location.lat(), 6);
Serial.print(F(" Long="));
Serial.println(gps.location.lng(), 6);
} else if (millis() - last > 5000) {
Serial.println();
if (gps.location.isValid()) {
static const double Dest_LAT = 18.786254, Dest_LON = 73.880798; // 修改为你的目的地坐标
double distanceToDest = TinyGPSPlus::distanceBetween(
gps.location.lat(), gps.location.lng(), Dest_LAT, Dest_LON);
Serial.print(F("Distance to Destination ="));
Serial.print(distanceToDest / 1000, 6); // 单位:公里
if (distanceToDest / 1000 < 0.050000) { // 阈值 0.05 公里 = 50 米
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
}
if (gps.charsProcessed() < 10)
Serial.println(F("WARNING: No GPS data. Check wiring."));
last = millis();
Serial.println();
}
}
振动电机版最终方案
将 LED 替换为振动电机,通过 L293D 驱动。代码逻辑相同,只是输出控制改为电机正反转(这里仅单向振动)。将整套电路装入外壳,使用 9V 电池供电,即可随身携带。
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;
TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);
unsigned long last = 0UL;
int motorpin1 = 6;
int motorpin2 = 7;
void setup() {
Serial.begin(115200);
ss.begin(GPSBaud);
pinMode(motorpin1, OUTPUT);
pinMode(motorpin2, OUTPUT);
}
void loop() {
while (ss.available() > 0) gps.encode(ss.read());
if (gps.location.isUpdated()) {
Serial.print(F(" Lat="));
Serial.print(gps.location.lat(), 6);
Serial.print(F(" Long="));
Serial.println(gps.location.lng(), 6);
} else if (millis() - last > 5000) {
Serial.println();
if (gps.location.isValid()) {
static const double Dest_LAT = 18.786254, Dest_LON = 73.880798;
double distanceToDest = TinyGPSPlus::distanceBetween(
gps.location.lat(), gps.location.lng(), Dest_LAT, Dest_LON);
Serial.print(F("Distance to Destination ="));
Serial.print(distanceToDest / 1000, 6);
if (distanceToDest / 1000 < 0.050000) {
digitalWrite(motorpin1, LOW);
digitalWrite(motorpin2, HIGH); // 启动振动
} else {
digitalWrite(motorpin1, HIGH);
digitalWrite(motorpin2, HIGH); // 停止
}
}
if (gps.charsProcessed() < 10)
Serial.println(F("WARNING: No GPS data. Check wiring."));
last = millis();
Serial.println();
}
}
代码文件
Read_Lat_Lng.ino- 读取经纬度Destination_notifier_LED.ino- LED 提醒版Destination_notifier_motor.ino- 振动电机版
原理图
提供 Fritzing 文件:read_lat_lng.fzz、destination_notifier_led.fzz、destination_notifier_motor.fzz。
制造工艺
- Arduino 数字骰子:LCD 显示随机点数的电子骰子
- JX 波形发生器 – 基于 Arduino 的 DDS 振荡器,带 OLED 显示屏
- DIY 钢铁侠人偶:Arduino 控制超声波触发音效与灯光
- Find Me:基于 Arduino 与蓝牙的智能寻物器制作指南
- 打造功能完整的 Arduino 驱动 3D 打印机械臂:分步指南
- Arduino Mega 2560 接 NEO-6M GPS 模块完整教程
- DIY Arduino 加湿器控制器:继电器安全控制高压电路
- u-blox LEA-6H GPS 模块:Arduino 与 Python 集成指南
- Arduino Nano 驱动 NeoPixel 矩阵:自制霓虹乒乓游戏
- DIY Arduino 手柄方向盘 - 游戏竞速模拟器自制指南
- Arduino + TEA5767 打造 FM 收音机:Nokia 5110 显频谱/信号强度/立体声
- Arduino 101 计步器:集成 DHT11 温湿度 + LCD 显示步数/距离/卡路里