Arduino + GPS 模块 - 目的地通知器
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
必要的工具和机器
| ||||
|
应用和在线服务
|
关于这个项目
简介:问题与解决方案
每个人都知道交通拥堵会浪费大量时间。而且无法预测从出发地到目的地需要多长时间。
两个月前我来到一个城市时,交通堵塞的问题影响了我。每天我都要花两个多小时陷入困境。我觉得我为什么不能利用这段时间做点什么?
注意:我使用公共交通工具。 :-)
堵车时还有很多其他事情可以做!
下面的一些不仅有趣,而且还富有成效:
- 利用时间为当前和未来的项目思考和计划。
- 利用时间自学,观看教学视频或参加 Udemy、Coursera 等在线学习课程。
当然制作 电子产品总是激励着我。所以我使用 Arduino 和 GPS 模块构建了一个目的地通知程序。所以它的作用是每当您靠近目的地时,它都会通过发光的 LED 或通过振动(通过使用微型振动电机)通知您。我提供了LED和振动电机的电路。
为此,首先您需要找到纬度和经度来定义位置。找到您的位置后,您可以使用纬度和经度值来查找到该位置的距离,并通过保持一个范围来打开通知程序。逻辑很简单吧?!
那么让我们开始吧......
零件和工具:
要开始使用目的地通知程序,以下是必需的部分:
- Arduino UNO
- NEO-6M GPS 模块
全球定位系统 代表全球定位系统,可用于在旅行时确定位置、时间和速度。
- 该模块具有外置天线和内置 EEPROM。
- 接口:RS232 TTL
- 电源:3V 至 5V
- 默认波特率:9600 bps
- 适用于标准的 NMEA 句子
NEO-6M GPS 模块有四个引脚:VCC、RX、TX 和 GND。该模块使用 TX 和 RX 引脚通过串行通信与 Arduino 通信,因此接线非常简单:
NEO-6M GPS 模块接线到 Arduino UNO
VCC VIN
软件串口中定义的RX TX引脚
TX RX 引脚定义在软件串口
地 地
L293D 集成电路
L293D是一款16针电机驱动IC,可同时控制任意方向的两个直流电机。
为什么要使用L293D?
电机驱动IC或电机驱动器的输入是一个低电流信号。该电路的作用是将低电流信号转换为高电流信号,然后将这个高电流信号提供给电机。
TinyGPS++ 库 :
TinyGPS++ 库使以有用且易于理解的格式获取位置信息变得简单。
TinyGPS++ 库可以让你获得更多的信息,而不仅仅是位置,而且很简单,除了位置,你还可以获得:
>>日期
>>时间
>>速度
>>课程
>>海拔
>>卫星
>>高清
捕获纬度和经度:
我建议下载项目结束时给出的 fritzing 文件,以便更好地阐明连接,或者如果您有任何疑问,请随时在评论中提问。
用于位置捕获的 Arduino 代码:
#include
#include
static const int RXPin =4, TXPin =3;
static const uint32_t GPSBaud =9600;
// TinyGPS++ 对象
TinyGPSPlus gps;
// 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);
}
}
}
注意:您必须安装 TinyGPS++ 库
按照电路图连接并上传上面的代码,以9600的波特率打开串口监视器,您将看到以下输出
注意: 获取纬度和经度可能需要一些时间。因为接收器需要捕获信号。每当它开始收到信号时,GPS 模块上的 LED 就会闪烁。
通过 LED 的目的地通知:
所以为了确保我的想法可行,我制作了一个使用 LED 通知目的地的原型。所以我所做的是,我从以前的代码(Read_Lat_Lng.ino)中添加了目的地的纬度和经度值,并找到了从当前位置到目的地的距离。并用于设置LED必须点亮的范围。
代码:
#include
#include
static const int RXPin =4, TXPin =3;
static const uint32_t GPSBaud =9600;
// TinyGPS++ 对象
TinyGPSPlus gps;
// 与 GPS 设备的串行连接
SoftwareSerial ss(RXPin, TXPin);
// 对于统计数据每 5 秒发生一次
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())
{
串行。 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())
{
// 替换 'Dest_LAT' 和 'Dest_LON' 值 bas edon 你的位置
// 你可以从 Read_Lat_Lng.ino 中找到纬度和经度
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("距离到目的地 ="));
Serial.print(distanceToDest/1000, 6); // *打印到目的地的距离
if(distanceToDest/1000 <0.050000) //这里当 distanceToDest/1000 小于 0.050000 时 LED 亮起。因此,根据您的要求更改*到目的地的距离。
{
digitalWrite(ledPin, HIGH);
}
else
{
digitalWrite(ledPin, LOW);
}
}
if (gps.charsProcessed() <10)
Serial.println(F("警告:没有 GPS 数据。检查接线。"));
last =millis();
Serial.println();
}
}
上传代码,你会在串口监视器上看到以下内容。
所以到目的地的距离可以用来定义输出操作(通知)必须执行的范围。
最后一个!
好的,我的原型工作正常。现在我想把我的项目装进一个盒子里,盒子里可以装一个Arduino、GPS模块、带驱动IC的电机和9V电源。
连接到 L293D IC
- 连接 5V 以启用 L293D 上的 1、Vs 和 Vss
- 将数字输出引脚(我们使用 6 和 7)连接到 L293D 上的输入 1 和输入 2。
- 将 Arduino 的 GND 连接到 L293D 同一侧的两个 GND 引脚
- 最后将 L293D 的输出 1 和输出 2 连接到您的电机引脚。
代码:
#include
#include
static const int RXPin =4, TXPin =3;
static const uint32_t GPSBaud =9600;
// TinyGPS++ 对象
TinyGPSPlus gps;
// 与 GPS 设备的串行连接
SoftwareSerial ss(RXPin, TXPin);
// 对于统计数据每 5 秒发生一次
unsigned long last =0UL;
int motorpin1=6;
int motorpin2=7;
void setup()
{
串行.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())
{
// 根据您的位置替换 'Dest_LAT' 和 'Dest_LON' 值
// 您可以从 Read_Lat_Lng.ino 中找到纬度和经度
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("到目的地的距离="));
Serial.print(distanceToDest/1000, 6); // *打印到目的地的距离
if(distanceToDest/1000 <0.050000) //这里当 distanceToDest/1000 小于 0.050000 时 LED 亮起。因此,根据您的要求更改*到目的地的距离。
{
digitalWrite(motorpin1,LOW);
digitalWrite(motorpin2,HIGH);
}
else
{
digitalWrite(motorpin1, HIGH);
digitalWrite(motorpin2,HIGH);
}
}
if (gps.charsProcessed() <10)
Serial.println(F("警告:没有 GPS 数据。检查接线。"));
last =millis();
Serial.println();
}
}
制作愉快!
代码
- Read_Lat_Lng.ino
- Destination_notifier_LED.ino
- Destination_notifier_motor.ino
Read_Lat_Lng.inoArduino
#include#include static const int RXPin =4, TXPin =3;static const uint32_t GPSBaud =9600;// The TinyGPS++ objectTinyGPSPlus gps;// GPS的串行连接deviceSoftwareSerial ss(RXPin, TXPin);void setup(){Serial.begin(9600); ss.begin(GPSBaud);}void loop(){ // 每次正确编码新句子时,此草图都会显示信息。而 (ss.available()> 0){ gps.encode(ss.read()); if (gps.location.isUpdated()){ Serial.print("Latitude="); Serial.print(gps.location.lat(), 6); Serial.print(" 经度 ="); Serial.println(gps.location.lng(), 6); } }}
Destination_notifier_LED.inoArduino
#include#include static const int RXPin =4, TXPin =3;static const uint32_t GPSBaud =9600;// The TinyGPS++ objectTinyGPSPlus gps;// GPS的串行连接deviceSoftwareSerial ss(RXPin, TXPin);// 对于每 5 秒发生一次的统计信息unsigned long last =0UL;int ledPin =13;void setup(){ Serial.begin(115200); ss.begin(GPSBaud);pinMode(ledPin, OUTPUT);}void loop(){ // 当 (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()) { // 根据您的位置替换 'Dest_LAT' 和 'Dest_LON' 值 // 您可以从 Read_Lat_Lng.ino 中找到纬度和经度 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("到目的地的距离=")); Serial.print(distanceToDest/1000, 6); // *打印到目的地的距离 if(distanceToDest/1000 <0.050000) //这里当 distanceToDest/1000 小于 0.050000 时 LED 亮起。因此,根据您的要求更改*到目的地的距离。 { 数字写入(ledPin,高); } else { digitalWrite(ledPin, LOW); if (gps.charsProcessed() <10) Serial.println(F("警告:没有 GPS 数据。检查接线。"));最后=毫秒(); Serial.println(); }}
Destination_notifier_motor.inoArduino
#include#include static const int RXPin =4, TXPin =3;static const uint32_t GPSBaud =9600;// The TinyGPS++ objectTinyGPSPlus gps;// GPS的串行连接deviceSoftwareSerial ss(RXPin, TXPin);// 对于每 5 秒发生一次的统计信息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(){ // 当 (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()) { // 根据您的位置替换 'Dest_LAT' 和 'Dest_LON' 值 // 您可以从 Read_Lat_Lng.ino 中找到纬度和经度 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("到目的地的距离=")); Serial.print(distanceToDest/1000, 6); // *打印到目的地的距离 if(distanceToDest/1000 <0.050000) //这里当 distanceToDest/1000 小于 0.050000 时 LED 亮起。因此,根据您的要求更改*到目的地的距离。 { digitalWrite(motorpin1,LOW);数字写入(motorpin2,高); } else { digitalWrite(motorpin1,HIGH);数字写入(motorpin2,高); if (gps.charsProcessed() <10) Serial.println(F("警告:没有 GPS 数据。检查接线。"));最后=毫秒(); Serial.println(); }}
示意图
read_lat_lng_l3VSL54w0k.fzz destination_notifier_led_c7qaqTImXg.fzz destination_notifier_motor_fGc8OV6Y0w.fzz制造工艺