This shows you the differences between two versions of the page.
|
pm:prj2025:avaduva:alexandra.bulgaru [2025/05/29 20:44] alexandra.bulgaru [Hardware 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 48: | Line 49: | ||
| 3. Conectare modul GSM-GPRS SIM800L | 3. Conectare modul GSM-GPRS SIM800L | ||
| - | - GND la GND comun (Arduino Nano + USB) | + | - GND la GND comun (Arduino Nano + OUT- al modulului DC-DC LM2596) |
| - | - VCC la +5V | + | - VCC la OUT+ modul DC-DC LM2596 |
| - TXD (ieșire SIM) la pinul digital D8 (RX SoftwareSerial) de pe Arduino Nano | - TXD (ieșire SIM) la pinul digital D8 (RX SoftwareSerial) de pe Arduino Nano | ||
| - RXD (intrare SIM) la pinul digital D9 (TX SoftwareSerial) de pe Arduino Nano, prin divizor de tensiune format din: | - RXD (intrare SIM) la pinul digital D9 (TX SoftwareSerial) de pe Arduino Nano, prin divizor de tensiune format din: | ||
| Line 58: | Line 59: | ||
| 4. Conectare modul DC-DC LM2596 | 4. Conectare modul DC-DC LM2596 | ||
| - | - IN+ la +5 V a breadboard-ului (de la pinul 5 V al Arduino Nano) | + | - IN+ la + baterie |
| - | - IN- la GND | + | - IN- la - baterie |
| - Reglat trimmer până la 4V | - Reglat trimmer până la 4V | ||
| - OUT+ la un rând liber pe breadboard (desemnat “+4V rail”) | - OUT+ la un rând liber pe breadboard (desemnat “+4V rail”) | ||
| 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 ===== | ||
| - | **Hardware:** \\ | + | {{:pm:prj2025:avaduva:gps_tracker_1.jpeg?500x500|1}} |
| - | {{:pm:prj2025:avaduva:hardware_gps_tracker_final.jpeg?500x500|Hardware}} | + | {{:pm:prj2025:avaduva:gps_tracker_2.jpeg?500x500|2}} |
| + | {{:pm:prj2025:avaduva:gps_tracker_3.jpeg?500x500|3}} | ||
| + | {{:pm:prj2025:avaduva:gps_tracker_4.jpeg?500x500|4}} | ||
| + | {{:pm:prj2025:avaduva:gps_tracker_5.jpeg?500x500|5}} | ||
| + | |||
| + | |||
| + | **Link-uri către demo:** \\ | ||
| + | https://youtube.com/shorts/pvJuHuIw36w?feature=share \\ | ||
| + | https://youtube.com/shorts/cwfy8eEM16s | ||
| ===== Concluzii ===== | ===== Concluzii ===== | ||
| Line 128: | Line 159: | ||
| ===== Download ===== | ===== Download ===== | ||
| - | {{:pm:prj2025:avaduva: gps_tracker.zip}} | + | {{:pm:prj2025:avaduva: gps_tracker_alexandra_bulgaru.zip}} |
| ===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
| Line 141: | 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]] \\ | ||