Progetto gps tracker

Dopo un bel po di tempo e vari progetti realizzati torno a chiedere un vostro parere su un problema che mi sta bloccando da un po di tempo.
Ho iniziato a realizzare un Gpstracker da utilizzare sulla mia auto così composto temporaneamente:

  1. Arduino Uno
  2. modulo Sim900a
  3. modulo gps M8n

Dopo aver affrontato e risolto i problemi con il modulo gsm che non voleva saperne di inviare sms (risolto flashando un aggiornamento del firmware) ho collegato lo stesso ai pin 2,3 della uno. Infatti sto usando la libreria GSM.h che utilizza questi due pin. Ho preparato la prima parte del codice relativa al modulo gsm , grazie agli esempi e consultando progetti simili in rete, e funziona benissimo.
Poi ho aggiunto il modulo GPS collegandolo inizialmente ai pin 0,1 per utilizzare la seriale hardware di arduino uno. Anche per il modulo gps ho preparato il codice per estrarre i dati di interesse (libreria TinygpsPlus) e anche in questo caso tutto bene.
Il problema è sorto quando ho unito le due parti di codice infatti il modulo gsm continua a funzionare mentre per il gps la uno non riceve i dati (tante file di zero).
Ho provato anche utilizzando la libreria AltSoftSerial collegando il gps ai pin 8,9 utilizzati da questa libreria e niente da fare.
Ho letto in giro sia che la uno non supporta più di una connessione seriale sia che molti hanno risolto il problema utilizzando la libreria AltSoftSerial ma nel mio caso continua a non funzionare.
Volevo quindi chiedere un vostro consiglio.
E' possibile risolvere via software il problema o conviene passare ad una board diversa ?
Non volendo utilizzare la Mega (dimensioni troppo generose) quale board mi consigliate di usare?
Preciso che non ho postato il codice solo per non inserire un post chilometrico ma se serve provvedo subito.
Come sempre vi ringrazio in anticipo per i consigli che vorrete darmi.

Io direi che prima cosa da fare è "spulciare" per bene il programma attuale

Se le due parti funzionavano prima di essere messe insieme il problema è per forza nella "giunzione" delle due

Certo è che se il programma non è visibile non è nemmeno "controllabile" da noi

Spero che almeno sia ben commentato, ben indentato e ben organizzato

1 Like

Giusto

"Mostrare codice per vedere soluzione"

Mah ... secondo me siamo al solito problema ...
... le librerie GPS vogliono che si legga in continuazione o non riescono a fare il parser delle sentenze.

Ora, a 9600 bps (velocità tipica a cui trasmettono i GPS), 1 bit dura 0.104 msec ed un carattere (8N1) richiede circa 1.04 msec e, dato che il buffer della seriale è di 64 caratteri, se non vado errato, si ha un tempo di 66 msec dopo di che ... il buffer si riempie e si perdono i caratteri.

Se il ciclo loop() tra una chiamata alla lettura del GPS e la successiva fa altre cose (utilizzo del GSM, ecc.) per cui perde più di quei 66 msec ... per come sono fatte le librerie, non si avrà mai una lettura valida.

Guglielmo

Vabbè allora ditelo che siete incontentabili :grinning:
Scherzo naturalmente...

Ho notato che il problema sembra sorgere proprio dalla coesistenza con il gsm.
Mi sembra molto strano che collegando su una seriale software il gsm, i dati gps non vengano rilevati nemmeno sulla seriale hardware o che differenziando due seriali software richiamate singolarmente con seriale.listen() si presenti sempre lo stesso problema di lettura solo dal gps (vedi prove effettuate) o che anche utilizzando AltSoftSerial.h il problema nasca solo e sempre con i dati del gps
Naturalmente ho fatto varie prove e nell'ultima ho inserito il primo accesso alla lettura dei dati provenienti dal GPS all'inizio del ciclo di setup ma anche così niente da fare.
Sono arrivato alla convinzione che o il problema nasce da un mio errore, magari banalissimo per gli esperti ma non per me che sono agli inizi o c'e' proprio la necessità di utilizzare una board diversa, infatti girando sulla rete per documentarmi leggendo i progetti di altri ho notato che per utilizzazioni simili vengono usate la mega, la nano, delle shield specifiche o board che integrano a bordo sia il gsm che il gps.

Posto di seguito il codice delle mie ultime prove ( precisando che è ancora incompleto) e ancora un grazie per la vostra collaborazione.

#include "SIM900.h"
#include <SoftwareSerial.h> 
#include "sms.h"            
#include <TinyGPS++.h>
SMSGSM sms;

#define GPS_BAUDRATE 9600
#define GPS_RX 9
#define GPS_TX 8
SoftwareSerial ss(GPS_TX, GPS_RX);
TinyGPSPlus gps; 
boolean avvio=false;
char smsbuffer[160];
char Numero[20];

void setup() 
{
  Serial.begin(9600);
  ss.begin(GPS_BAUDRATE);
 if (ss.available()>0){  
    gps.encode(ss.read()); 
   if (gps.location.isUpdated()) {  
      Serial.print("Latitudine:");
     Serial.print(gps.location.lat(), 6);
     Serial.print("            ");
     Serial.print("Longitudine:");
     Serial.print(gps.location.lng(), 6);
     Serial.println();
     delay(1000); 
     }  
    } else 
    Serial.println("Modulo GPS = NON PRONTO");
   
  if ( gsm.begin(9600) )
  {
     Serial.println("Modulo GSM = OK");
       avvio=true;
  }
  else 
     Serial.println(" Modulo GSM = NON PRONTO");
};

void loop() 
{
       
  char inSerial[50];
  char mex;
  if (avvio)
  {
    // Lettura mex su sim
    
    mex = sms.IsSMSPresent(SMS_ALL); 
    if (mex) 
    {
      // mex letto
      sms.GetSMS(mex, Numero, smsbuffer, 160);
      Serial.print("Messaggio Ricevuto [tel. "+String(Numero)+String("]: ") + String(smsbuffer));
      if (strcmp(smsbuffer,"loc")==0)
      {
         Serial.println("Preparo SMS con posizione");
         sms.SendSMS("+39xxxxxxxx", "Io sono qui: https://www.google.com.ph/maps/place/"); // Da inserire le coordinate
         Serial.println(" SMS Inviato al numero di riferimento");
         
      }
           else
         Serial.println("Richiesta non valida il messaggio verra cancellato");
      sms.DeleteSMS(position); 
    }
    delay(1000);
  }
}

Non mi è chiaro cosa hai fatto

Che non vada è ovvio:

Hai inizializzato la software serial coi piedini invertiti

Eventualmente leggi un solo carattere dalla software serial, e solo nel setup

Ne consegue che il gps certamente non va

Ti direi di mettere un programma più completo, magari quello che citavi al tuo primo post

Ho sbagliato solo a scrivere, il collegamento con il gps è effettuato nel modo giusto. Non funziona perchè la parte relativa al GPS è inserita nel ciclo setup() ma era solo una prova per verificare. Infatti se isolo la parte interessata e la porto su un nuovo sketch nel ciclo loop() funziona ma così:
Visualizzazione sul monitor seriale:

Se invece sostituisco l'if con il while ed elimino l'else cioè così:

#include "SIM900.h"
#include <SoftwareSerial.h> 
#include "sms.h"           
#include <TinyGPS++.h>
SMSGSM sms;
#define GPS_BAUDRATE 9600
#define GPS_RX 9
#define GPS_TX 8
SoftwareSerial ss(GPS_TX, GPS_RX);
TinyGPSPlus gps; 
void setup() 
{
  Serial.begin(9600);
  ss.begin(GPS_BAUDRATE);
 
  }
     void loop() 
{
  while (ss.available()>0){  
    gps.encode(ss.read()); 
   if (gps.location.isUpdated()) {  
      Serial.print("Latitudine:");
     Serial.print(gps.location.lat(), 6);
     Serial.print("            ");
     Serial.print("Longitudine:");
     Serial.print(gps.location.lng(), 6);
     Serial.println();
     delay(1000); 
   }  
   } 
  }

Allora ottengo questo:

Se questa stessa parte di codice la inserisco all'inizio del ciclo loop() del prog che ho inviato ottengo questo:

e le coordinate non compaiono mai.
In pratica mi è parso di capire che poichè la seriale gsm resta in ascolto per verificare l'arrivo di nuovi messaggi, la seriale del gps non riesce a ricevere i dati. E' giusta questa mia ipotesi ?

Questa è la parte di codice che al momento ho realizzato, mi sono fermato perchè non sono riuscito a risolvere questa cosa ma dovrò inserire un sensore di movimento, il controllo del numero che invia il comando, dei controlli di posizione etc.. Le varie prove che ho fatto sono state relative solo al funzionamento dei due moduli

E fin qui ci siamo

Tu leggi un carattere per volta
Ad ogni carattere testi se hai completato la lettura di una sentenza
ad un carattere per volta per un lungo periodo la sentenza non sarà mica completata...
Ecco quindi la lunga serie di moduli non pronti

Evidentemente la sequenza del ricevitore dura un secondo
Infatti in capo ad un secondo hai una lettura valida
Quindi questa parte va, anche se mi sembra che a te non sembra
Adesso passo al resto del tuo messaggio

Infatti
Circa una lettura al secondo

Sembra che ne sia saltata una...

Come vedi i conti tornano (rispetto al mio precedente post)

Mostralo il programma finale

Che a furia di spiegazioni di cosa hai spostato e dove non si capisce nulla...

Io invece temo che fino a quando sarà

boolean avvio=false;

La loop non andrà mai bene...

Chiedo scusa...di seguito il codice

#include "SIM900.h"
#include <SoftwareSerial.h> 
#include "sms.h"            
#include <TinyGPS++.h>
SMSGSM sms;

#define GPS_BAUDRATE 9600
#define GPS_RX 9
#define GPS_TX 8
SoftwareSerial ss(GPS_TX, GPS_RX);
TinyGPSPlus gps; 
boolean avvio=false;
char smsbuffer[160];
char Numero[20];

void setup() 
{
  Serial.begin(9600);
  ss.begin(GPS_BAUDRATE);
   if ( gsm.begin(9600) )
  {
     Serial.println("Modulo GSM = OK");
       avvio=true;
  }
  else 
     Serial.println(" Modulo GSM = NON PRONTO");
};

void loop() 
{
  if (ss.available()>0){  
    gps.encode(ss.read()); 
   if (gps.location.isUpdated()) {  
      Serial.print("Latitudine:");
     Serial.print(gps.location.lat(), 6);
     Serial.print("            ");
     Serial.print("Longitudine:");
     Serial.print(gps.location.lng(), 6);
     Serial.println();
     delay(1000); 
     }  
    } else 
    Serial.println("Modulo GPS = NON PRONTO");
     
  char inSerial[50];
  char mex;
  if (avvio)
  {
    // Lettura mex su sim
    
    mex = sms.IsSMSPresent(SMS_ALL); 
    if (mex) 
    {
      // mex letto
      sms.GetSMS(mex, Numero, smsbuffer, 160);
      Serial.print("Messaggio Ricevuto [tel. "+String(Numero)+String("]: ") + String(smsbuffer));
      if (strcmp(smsbuffer,"loc")==0)
      {
         Serial.println("Preparo SMS con posizione");
         sms.SendSMS("+39xxxxxxxx", "Io sono qui: https://www.google.com.ph/maps/place/"); // Da inserire le coordinate
         Serial.println(" SMS Inviato al numero di riferimento");
         
      }
           else
         Serial.println("Richiesta non valida il messaggio verra cancellato");
      sms.DeleteSMS(position); 
    }
    delay(1000);
  }
}

Chiedo scusa ma "avvio" viene richiamato solo nella parte del loop relativa al gsm che peraltro risponde regolarmente, ho provato a ragionarci su ma proprio non riesco a comprendere perchè sarebbe questo il problema. Potresti essere così gentile da darmi qualche chiarimento ?

Dal pezzo di programma che vedo (o meglio: vedevo quando ho scritto la precedente risposta) se avvio è falso non c'è nulla che venga eseguito

Come ti è gia stato richiesto spiega bene come è il programma attuale

Sarebbe per me "sparare sulla croce rossa" se ti facessi notare che hai lamentato due mslfunzionamenti che ad una analisi della poca roba che hai pubblicato sono invece corretti?

Un piccolo aggiornamento...
Nel frattempo ricevevo risposte, ho provato ad utilizzare la mega per vedere se almeno li girava e invece:
la libreria del GSM preparata per lavorare con la mega dava errore percui ho provato a gestirla come una uno visto che utilizzo un modulo e non una shield ( ho letto un vecchio post di Guglielmo) ma anche qui niente da fare, peraltro ho provato a verificare le porzioni di codice separate del gps e del gsm con il risultato che il gps funge e la gsm no (esattamente il contrario della uno). Neanche utilizzando le seriali Hardware sono riuscito a risolvere (gps funzionante e gsm no)

Non contento ho provato a traslare il tutto per un modulo esp32 wroom v.1 e per una Wemos Lolin esp32 lite ma siccome la softwareserial non è compatibile ho provato a gestire il tutto con le hardware risultato monitor seriale bianco e nessun segno di vita. Ho persino cercato di far girare un esempio ex novo trovato in rete e niente da fare. la porzione separata di codice gps però funge il gsm non sono riuscito ancora a provarlo. Mai una faccina è stata più azzeccata di questa :sob: :sob:

Se non metti il codice non mi interessa sapere di altre disavventure

@luxed
Purtroppo sul gsm non ti posso aiutare, mi spiace

@Standardoil
Più che sulla croce rossa stai sparando su di me, dato che tutto il lavoro di interpretazione dei malfunzionamenti e di scoperta che la parte gps andava lo ho fatto io
Non che mi piaccia vedere che qualcuno se ne impossessa...

O forse ho capito male?

Io ho già spiegato il problema ma ...
... non c'è peggior sordo di chi non vuol sentire

Guglielmo

Era solo uno sfogo rispetto alle prove fatte con altre board... che magari non interessa te ma magari interessa qualcuno che ha un atteggiamento più amichevole di te. Grazie per il tuo tempo

Si e ho letto con attenzione ciò che hai scritto ma magari fornire qualche indizio in più su come risolvere il problema potrebbe aiutare chi è agli inizi a comprendere la strada da seguire. Avete sempre questo atteggiamento scrivendo due righe di commento e senza nessun ulteriore seguito. Chi si sta cimentando con argomenti nuovi con due righe potrebbe non avere gli elementi necessari a correggere un codice. E con questo non intendo dire che si vuole la soluzione bella e pronta ma solo magari essere indirizzati a comprendere quale strada seguire per risolvere. Anche nel post che citavo prima, chiedevi all'utente di studiarsi la libreria , ma forse non ti ha sfiorato il dubbio che quell' utente non aveva un background formativo tale da riuscire a interpretare tutte quelle righe di codice. Insomma se questo forum è solo per utenti avanzati, scrivetelo così evitiamo di importunarvi con i nostri post. Bando alle polemiche che sono fuori proprio dal mio costume, grazie anche a te per il tuo tempo e scusa se ti ho messo in condizione di scrivere ben 11 righe di puro testo