Sto lavorando a questo progetto da oltre 3 mesi, direi pure 5. Ho concluso praticamente il 95% di tutte le attività ed ho avviato la fase di test.
Il progetto prevede l'utilizzo di 3 arduino nano installati su una motocicletta di ultima generazione che hanno il compito di fare quanto segue:
-
Arduino "Windshield"
gestisce il parabrezza elettrico, lo sale e lo scende pilotando dei relè. Inoltre a questo arduino è collegato un sensore hall per il calcolo della velocità della ruota per gestire in parabrezza elettrico in funzione dalla velocità. Lavora con gli interrupts.
Questo arduino è collegato con gli altri tramite bus I2C con un cavo a bassissima impedenza e resistenze di pull-up da 2,5 KOhm. -
Arduino "Accelorometer"
gestisce il faro posteriore e lo fa lampeggiare tramite un mosfet in funzione della decelerazione calcolata tramite un accelerometro. Inoltre calcola anche l'imbarcata in caso la moto è piegata oltremodo ovvero contro le forze fisiche (non lo voglio scrivere... ma significa se fosse a terra...). E' collegato all'arduino che gestisce il GPS e l'GSM tramite I2C ma anche direttamente ed attiva gli SMS di emergenza e di frenata di emergenza. -
Arduino GSM e GPS
Ha un GPS ed un GSM collegati e gestisce tutti i parametri di setup del sistema dei tre arduino (modalità del windshield, parametri del lampeggio luce di frenata, ecc.). Il sistema è concepito in modo che tramite SMS venga inviato un comando e l'arduino interpretandolo può attivare varie procedure. In generale, se il comando è di setup del GPS o GSM gestisce tutto al suo interno e memorizza alcune info sull'EProm, se invece il comando di setup riguarda gli altri arduino allora invia le richiesta via I2C.
Purtroppo è abbastanza complicato descrivere tutti i dettaglio che il sistema fa, tuttavia spero non sia necessario ma a domanda risponderò
Chiaramente il problema è nato quando allestito tutto sulla moto. L'arduino Windshield funziona alla perfezione. L'arduino Accelorometer funziona anch'esso alla perfezione. L'unico problema si sta verificando con il GSM e GPS.
Il GSM è collegato via softserial ed utilizza la libreria Sim800l-master mentre il GPS è collegato sia Serial. Quindi non posso fare un check online con il monitor serial a meno di modificare il codice e togliere il GPS (cosa che comunque ho fatto per capire quanto vi esporrò).
Alcuni pin sono utilizzati per ricevere il comando diretto dall'accelerometer per l'invio di SMS di emergenza.
L'arduino su richiesta può inviare la posizione, i numeri di telefono memorizzati e il completo setup del sistema, oltre gli sms di emergenza.
I problemi che registro sono di due nature diverse ...credo di aver capito. Il primo importante, dopo alcuni invii di sms (mio verso il modulo) in modo random (a volte dopo 1 a volte immediatamente, a volte dopo 5.... siano essi comandi e/o richieste) il sistema non risponde più. Facendo un check credo di aver capito che la stringa che contiene il messaggio viene tagliata.
Il comando che legge il messaggio non restituisce solo il testo ma una stringa che contiene, RTC, stato del messaggio (letto, non letto), numero di telefono ed infine il messaggio stesso per ultimo. Ho visto più di una volta che il modulo non vedendo più all'interno della stringa il codice "A1234" ovviamente non può interpretare il comando dopo tale stringa per come è pensato il sistema. Ho ottimizzato il codice riducendo per quello che sono le mie competenze la memoria utilizzata SRAM ed ho visto che è migliorato tuttavia non risolto. Pertanto penso sia un problema di memoria, dopo un certo numero di sms o non so perché la memoria si satura. Ho visto che ci sono dei metodi per capire l'utilizzo della memoria ma non mi sono serviti a molto forse ho bisogno di qualche dritta in più.
L'altro problema è che inviando sms che richiedono l'invio sul bus di comandi il sistema si pianta. Anche qui assolutamente random. Funziona a dovere (sembrerebbe) con l'arduino accelerometer che è a 2 cm e non con quello a 1.5 metri che è il windshield.
Questo è meno importante però perché potrebbe sempre dipendere dal primo.....
Vi posto il codice chiedendovi come modificarlo per ottimizzare eventualmente la gestione delle variabili e quindi la memoria e poi come implementare controllare che non si saturi...