組員:411214204郭凱翔、411214212李鍾銘、
411214215葉仲傑、411214315謝定凱、411214323林時寬
目的:
製作出類似像aritag的定位器,可用來追蹤錢包、汽車、包包等物品。
材料:
ESP32、GPS 模組 (GY-NEO-6M) 、電容 (1000µF)、杜邦線、麵包板、18650(3000(mAh))電池與電池座。
我們有購買4G模組(Air780E) ,但是我們這學期忘記購買網路卡,又不想拔出手機的網路卡作為替代,所以本學期的網路部分採用連2.4G WIFI。下學期將購買網路卡插進4G模塊後將4G模塊加入線路中。
方法:
ESP32 晶片通電後會自動尋找並連線到程式中設定的無線網路(程式中輸入名稱與密碼)
同時晶片的第二組硬體序列埠會開始不間斷地接收來自 GPS 模組傳來的數據
晶片內的 TinyGPS 函式庫會將原始數據解碼成經緯度
程式碼中設定每 20 秒觸發一次
時間一到會立刻檢查GPS是否已經成功定位
如果尚未定位成功程式會直接跳過並在螢幕印出提示等待下一個 20 秒
如果已經定位成功程式會將最新抓到的經緯度數字拼接成標準的 Google 地圖連結
最後 ESP32 會發起一個加密的網路 POST 請求將這個地圖連結傳送到給定的Discord Webhook網址中
(Discord Webhook 是一種讓外部應用程式例如ESP32、GitHub或任何網頁伺服器單向傳送即時訊息到 Discord 頻道的方法。當ESP32 取得GPS座標後,會主動向Discord的伺服器發起一個發起一個HTTPS連線,並將資料發送過去。 )
原本打算使用TELEGRAM的機器人但是我們組員都沒有使用TELEGRAM所以改用DISCORD才發現這個功能。
程式碼:
透過硬體序列埠(UART2)不間斷讀取 GPS 模組的原始數據並進行解析,在連上指定的 Wi-Fi 後,每隔 20 秒 會自動檢查一次定位狀態。若成功取得有效的經緯度座標,便會將其組合成 Google 地圖連結,並透過 HTTP POST 請求將訊息即時發送至指定的 Discord Webhook 頻道中。
#include <WiFi.h>
#include <HTTPClient.h>
#include <TinyGPS++.h>
#include <HardwareSerial.h>
const char* ssid = "Dalampa";
const char* password = "12345666";
const char* webhook_url = "https://discord.com/api/webhooks/怕有人偷傳怪東西到我頻道所以這邊打上馬賽克拉哈哈是我啦哈哈哈1sqXpGG4-HjD2ofGWLaLkEfniHAasJQADKF761btYEre-EPI";
TinyGPSPlus gps;
HardwareSerial gpsSerial(2);
unsigned long lastPostTime = 0;
const unsigned long postInterval = 20000;
void sendToDiscord(double lat, double lng);
void setup() {
Serial.begin(115200);
gpsSerial.begin(9600, SERIAL_8N1, 16, 17);
Serial.print("正在連線 Wi-Fi: ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWi-Fi連線成功!");
Serial.print("IP位址: ");
Serial.println(WiFi.localIP());
}
void loop() {
while (gpsSerial.available() > 0) {
gps.encode(gpsSerial.read());
}
if (millis() - lastPostTime >= postInterval) {
lastPostTime = millis();
if (gps.location.isValid()) {
double currentLat = gps.location.lat();
double currentLng = gps.location.lng();
Serial.print("時間到!目前定位:");
Serial.print(currentLat, 6);
Serial.print(", ");
Serial.println(currentLng, 6);
sendToDiscord(currentLat, currentLng);
} else {
Serial.println("時間到,但目前尚未取得有效定位衛星訊號,跳過本次傳送。");
}
}
}
void sendToDiscord(double lat, double lng) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin(webhook_url);
http.addHeader("Content-Type", "application/json");
String message = "目前的GPS定位網址:https://www.google.com/maps?q=" + String(lat, 6) + "," + String(lng, 6);
String jsonPayload = "{\"content\": \"" + message + "\"}";
int httpResponseCode = http.POST(jsonPayload);
if (httpResponseCode > 0) {
Serial.print("Discord Webhook 傳送成功,回應碼: ");
Serial.println(httpResponseCode);
} else {
Serial.print("傳送失敗,錯誤碼: ");
Serial.println(http.errorToString(httpResponseCode).c_str());
}
http.end();
} else {
Serial.println("發送失敗:Wi-Fi目前處於斷線狀態。");
}
}
這是ESP32將座標轉為GOOGLE MAP的網址後回傳至DISCORD頻道的畫面
一開始測試時因為在室內怕GPS模組搜尋不到衛星所以拿到戶外,使用手機當主機看序列埠監控視窗,看是否有偵測到位置把它改為座標
螢幕顯示之內容:
機、連線 Wi-Fi、取得 GPS 定位,到最後透過 Webhook 將資料傳送到 Discord
16:51:32.450 load:0x40080400Jen:3480
16:51:32.450 entry 0x40080564
16:51:32.774 正在連接 Wi-Fi: Dalampa
16:51:35.362 Wi-Fi 連線成功!
16:51:35.362 IP 位址:10.188.233.133
16:51:52.754 時間到!目前定位:23.899806, 121.549693
16:51:54.262 Discord Webhook 傳送成功,回應碼:204
16:52:05.845000000000000000000 0000000000000000796, 121.549816
16:52:13.999 Discord Webhook 傳送成功,回應碼:204
16:52:32.753 時間到!目前定位:23.899793, 121.549846
因為本學期未使用到4G模組,所以還想不出整體的外殼大小與形狀,所以目前以單純接線與確保功能為主,下學期預計會將電池換成別的型號來減少整體體積。
未來與展望:
下學期會購入網路卡以及更換電池。將新的零件組裝好後設計外殼,會盡量縮小體積。目前使用的這款GPS模塊搜尋衛星的能力有限,即使已經放在窗戶邊她還是搜尋不到衛星,所以下學期會上網查找是否有其他更好的模組可以替代。
期中報告
期末報告