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:
Arduino Uno
modulo Sim900a
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.
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.
Vabbè allora ditelo che siete incontentabili
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);
}
}
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ì:
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
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
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
@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...
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