This shows you the differences between two versions of the page.
pm:prj2025:avaduva:alexandra.bulgaru [2025/05/29 21:20] alexandra.bulgaru [Download] |
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 74: | Line 75: | ||
**Descrierea codului aplicației:** \\ | **Descrierea codului aplicației:** \\ | ||
- | Proiectul este un GPS-tracker care răspunde la SMS-uri de tip „GET LOCATION”. El folosește: | + | Proiectul este un GPS-tracker care trimite la un interval de timp un SMS cu locația actuală a acestuia. El folosește: |
* UART (SoftwareSerial) pentru comunicația cu modulul GPS (NMEA) și cu SIM800L (AT-commands) | * UART (SoftwareSerial) pentru comunicația cu modulul GPS (NMEA) și cu SIM800L (AT-commands) | ||
- | * I2C pentru controlul OLED-ului SSD1306 | + | * I2C pentru controlul OLED-ului |
- | * GPIO pentru LED-ul de stare (pinul onboard D13) | + | * Timer pentru a trimite la un interval regulat de timp SMS-ul |
**Fluxul principal:** | **Fluxul principal:** | ||
- | 1. Se așteaptă sosirea unui SMS. | + | 1. La pornire (setup()): |
- | 2. La SMS cu header +CMT: se extrage numărul expeditorului. | + | - Se iniţializează interfeţele seriale: |
- | 3. Dacă textul conține GET LOCATION sau GETLOC, se apelează rutina de trimitere a SMS-ului cu locația. | + | - Serial (USB) la 9600 baud |
- | 4. Între timp, datele NMEA de la GPS sunt colectate continuu în fundal. | + | - sim (SoftwareSerial pe pini 8 și 9) la 9600 baud |
+ | - gpsSer (SoftwareSerial pe pini 10 și 11) la 9600 baud | ||
+ | - Se iniţializează I2C (Wire.begin()) și OLED-ul (oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)), apoi se golește ecranul. | ||
+ | - Se configurează SIM800L: | ||
+ | - AT (ping) | ||
+ | - ATE0 (eco off) | ||
+ | - AT+CFUN=1 (full functionality) | ||
+ | - AT+CMGF=1 (SMS text mode) | ||
+ | |||
+ | |||
+ | 2. Bucla principală (loop()): | ||
+ | - În fundal, toate datele primite de la GPS sunt transmise către gps.encode(). | ||
+ | - La fiecare 15 000 ms (PERIOD) - ales pentru testare: | ||
+ | - Se afișează pe OLED mesajul static „Te cauta la jefa”. | ||
+ | - Se verifică gps.location.isValid(): | ||
+ | - DA: se extrag latitudinea și longitudinea și se construiește un link Google Maps cu 6 zecimale. | ||
+ | - NU: se setează mesajul “GPS NO FIX”. | ||
+ | - Se trimite SMS-ul către numărul definit în dest folosind rutina de AT-commands. | ||
+ | - Se curăță ecranul OLED. | ||
**Biblioteci utilizate:** | **Biblioteci utilizate:** | ||
Line 92: | 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}} | ||
Line 149: | Line 172: | ||
* [[https://www.arduino.cc/en/Reference/SoftwareSerial|SoftwareSerial Library]] \\ | * [[https://www.arduino.cc/en/Reference/SoftwareSerial|SoftwareSerial Library]] \\ | ||
* [[https://github.com/mikalhart/TinyGPSPlus|TinyGPS-Plus]] \\ | * [[https://github.com/mikalhart/TinyGPSPlus|TinyGPS-Plus]] \\ | ||
- | * [[https://github.com/adafruit/Adafruit_SSD1306|Adafruit SSD1306]] \\ | ||
* [[https://www.elecrow.com/download/SIM800%20Series_AT%20Command%20Manual_V1.09.pdf?srsltid=AfmBOooA5WKx2D4vn5wg5PogjJX52L57QaGQ3paOEnC3nPPb7ex7dt0T|SIM800L AT Command Manual]] \\ | * [[https://www.elecrow.com/download/SIM800%20Series_AT%20Command%20Manual_V1.09.pdf?srsltid=AfmBOooA5WKx2D4vn5wg5PogjJX52L57QaGQ3paOEnC3nPPb7ex7dt0T|SIM800L AT Command Manual]] \\ | ||
* [[https://docs.arduino.cc/language-reference/en/functions/communication/wire/|Wire (I2C) Library]] \\ | * [[https://docs.arduino.cc/language-reference/en/functions/communication/wire/|Wire (I2C) Library]] \\ |