This shows you the differences between two versions of the page.
pm:prj2025:avaduva:alexandra.bulgaru [2025/05/29 21:48] alexandra.bulgaru [Software Design] |
pm:prj2025:avaduva:alexandra.bulgaru [2025/05/29 21:58] (current) alexandra.bulgaru [GPS Tracker] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== GPS Tracker ====== | ====== GPS Tracker ====== | ||
**Autor:** Alexandra Bulgaru \\ | **Autor:** Alexandra Bulgaru \\ | ||
- | **Grupa:** 331CD | + | **Grupa:** 331CD \\ |
+ | **Repo GitHub:** https://github.com/alexabulgaru/GPS-Tracker | ||
===== Introducere ===== | ===== Introducere ===== | ||
Line 110: | Line 111: | ||
**Algoritmi și structuri implementate:** | **Algoritmi și structuri implementate:** | ||
- | * Detectare SMS | + | * Citire și parsare NMEA |
- | - simSerial.readStringUntil('\n') + trim() | + | - while (gpsSer.available()) gps.encode(gpsSer.read()); |
- | - Căutare line.startsWith("+CMT:") - salvare incomingNumber | + | - TinyGPSPlus gps stochează ultima locație validă și numărul de sateliți |
- | * Parser SMS | + | * Construire mesaj SMS |
- | - Flag boolean waitingForSMSbody - următoarea linie e conținutul efectiv | + | - Dacă fix GPS: String link = "https://maps.google.com/?q=" + String(lat, 6) + "," + String(lon, 6) |
- | - Convertire msg.toUpperCase() și msg.indexOf("GET LOCATION") | + | - Altfel: String link = "GPS NO FIX" |
- | * Colectare GPS | + | * AT-commands pentru SMS |
- | - În loop(), buclă while (gpsSerial.available()) gps.encode(...) | + | - AT("AT+CMGF=1"); - modul text |
- | - TinyGPSPlus gps păstrează ultima poziție și numărul de sateliți | + | - AT+CMGS="<număr>" -> așteaptă prompt ‘>’ -> conținut -> 0x1A |
- | * Trimitere SMS cu locația | + | - Citire răspuns +CMGS pentru confirmare |
- | - Blink LED pe D13 pentru feedback vizual | + | * Control OLED |
- | - Construire mesaj în char buf[160] cu snprintf | + | - showOLED() -> afișează mesaj fix |
- | - AT+CMGS -> text -> CTRL-Z -> pauză 5s | + | - clearOLED() -> golește display-ul |
- | * Afișare pe OLED | + | |
- | - După trimitere, ștergere ecran | + | |
- | - Dacă gps.location.isValid() -> afișează „GPS FIX OK” + coordonate | + | |
- | - Altfel -> „NO GPS FIX” | + | |
**Funcții implementate:** \\ | **Funcții implementate:** \\ | ||
- | setup() | + | bool AT(const char* cmd, const char* ok = "OK", uint16_t tout = 800) |
- | configurează pinii, pornește interfețele seriale, inițializează SIM800L și OLED, și afișează mesajul de start | + | trimite un AT-command și așteaptă un răspuns până la timeout. |
| | ||
- | loop() | + | bool sendSMS(const char* num, const String& msg) |
- | ascultă SMS-urile primite și datele de la GPS, declanșează trimiterea răspunsului dacă mesajul conține comanda de locație | + | configurează modul text, inițiază AT+CMGS, trimite textul și verifică confirmarea |
- | + | ||
- | sendLocationSMS(const String &to) | + | |
- | construiește și trimite SMS-ul cu coordonate (sau mesaj de eroare), dă un blink LED-ului, apoi afișează rezultatul pe OLED | + | |
+ | void showOLED() | ||
+ | afişează pe OLED mesajul „Te cauta la jefa” | ||
+ | |||
+ | void clearOLED() | ||
+ | curăţă ecranul OLED | ||
+ | | ||
+ | void setup() | ||
+ | iniţializează toate perifericele: seriale, I2C, OLED, GSM, și curăţă ecranul | ||
+ | | ||
+ | void loop() | ||
+ | primește date GPS continuu și la interval, apelează showOLED(), construiește mesajul, apelează sendSMS(), apoi clearOLED() | ||
===== Rezultate obținute ===== | ===== Rezultate obținute ===== | ||
{{:pm:prj2025:avaduva:gps_tracker_1.jpeg?500x500|1}} | {{:pm:prj2025:avaduva:gps_tracker_1.jpeg?500x500|1}} |