Connessione GPRS con comandi AT, senza libreria GSM.h

Salve a tutti,

sto realizzando un data logger su Arduino Uno R3, con un RTC, LCD (i2c), scheda SD e GSM shield (con Quectel M10).
Lo sketch che ho preparato non viene compilato perché troppo grande. La libreria GSM.h occupa molto spazio, sia in termini di codice che in termine di RAM. Ho provato ad eliminare alcuni file non necessari in GSM.h (voice, sms, ...) e sono riuscito a compilare ma in ogni caso i 2K di memoria non sono sufficienti e il tutto non gira.

E' possibile effettuare una connessione GPSR senza includere la libreria GSM.h? Magari usando i comandi AT (di cui però so poco)?
In questo modo riuscirei a liberare molto spazio.

Potrei facilmente passare a Mega per risolvere i problemi di spazio/memoria, ma siccome il datalogger deve funzionare con batteria e per lunghi periodi, Uno consuma molto meno di Mega (25 mA contro 60mA mi sembra di aver capito guardando in giro per la rete.)

Grazie per ogni contributo.
Antonio

Arduino Uno consuma 50 mA

Cioè, con :

Arduino Uno R3, con un RTC, LCD (i2c), scheda SD e GSM shield (con Quectel M10

... tu ti vai a preoccupare di quanto consuma la Uno rispetto alla Mega ??? E tutto quello che c'è attaccato quanto consuma ??? :astonished: :astonished: :astonished:

Guglielmo

P.S. : Anche se metti in power-down alcune cose ... voglio proprio vedere comunque il consumo minimo ... :roll_eyes:

Grazie Guglielmo e Icio,

quindi secondo voi non dovrei troppo sbattermi per riportare tutto su Uno?
I sensori, SD, GSM lavorerebbero una volta ogni ora, o anche ogni due ore, per il resto del tempo rimarrebbero spenti.
Con una batteria da moto 12V 12Ah e un convertitore DC-DC switch, quanto può durare un data logger del genere?

Grazie
Antonio

totogno:
I sensori, SD, GSM lavorerebbero una volta ogni ora, o anche ogni due ore, per il resto del tempo rimarrebbero spenti.

Spenti ... in che senso ??? Hai un sistema per togliergli fisicamente l'alimentazione ???

Guglielmo

Guglielmo,
pensavo di gestire l'alimentazione con un transistor

In tal caso , nel tuo caso, una piccola batteria da 10Wh al litio da 3v6 può farti funzionare il sistema anche per 2 mesi dipende da quanto tempo impieghi per agganciare la cella GSM quando lo accendi, di solito ci metti al massimo 30 secondi , sceglierai il miglior gestore telefonico
-Però devi togliere il regolatore da 5V e alimentare tutto a 3v6,
-Per la SD metterai un regolatore low drop da 3v3
-L'unica cosa è che devi trovare un lcd che lavori bene a 3v6
-Il MC atmega16u2 non serve , puoi disabilitarlo o toglierlo

dopo aver inviato il pacchetto dati via GPRS , ogni 2 ore, spegnerai tutte le periferiche e metterai il processore in sleep

Grazie Icio per il suggerimento!

lo sleep è molto interessante, non lo conoscevo ma cambia drasticamente la possibilità di implementare il progetto!
ma come si fa a risvegliare Arduino dopo 2ore? ho visto che il watchdog gestisce al massimo 8 secondi.
il risveglio deve avvenire quindi solo tramite interrupt? e chi può fornire il segnale di interrupt? un timer esterno? lo stesso DS1307 dell'RTC?
Grazie e ciao

Puoi svegliarlo ogni 8 secondi e controllare quanto tempo è passato in totale. Se non sono passate le 2 ore, semplicemente puoi rimettere in sleep il micro.
Puoi risvegliare il chip solo con un interrupt, che sia esterno (un segnale su un pin) o interno (un segnale di interrupt dato da una periferica tipo un timer) poco importa.

Tieni però a mente che il solo Atmega va in sleep, se usi l'Arduino nella sua interezza e con altre cose collegate, quelle resteranno attive e consumeranno.

Per Leo:
grazie tante, ho capito e sto implementando le funzioni!

Per Icio:
come si fa ad alimentare Arduino UNO R3 con 3v6?
che vuol dire mettere un regolatore low drop da 3v3 per la SD?
scusami ma non ho ancora la necessaria dimestichezza con l'argomento...

Grazie a tutti
Antonio

-come si fa ad alimentare Arduino UNO R3 con 3v6? togliere U1 e alimentare sui 5V, il consumo passa a circa 30mA.
-che vuol dire mettere un regolatore low drop da 3v3 per la SD?, E' già presente su arduino1 e si chiama U2 , consuma qualcosa ma è meglio di niente, la SD card deve essere disabilitata con un PNP
-come si fà a disabilitare U3? Mettendo a massa il pin Xt1 il consumo passa a 3v6 da 30 a 20mA circa , ma per diminuirlo fino a zero bisogna riprogrammare U3 mandandolo in sleep perennemente.

-Bisogna dire che a 3v6 è possibile che U4 non funzioni a 16mhz , la tensione minima per 16Mhz è 4V, se U4 si blocca portare la sua frequenza a 12Mhz sostituendo XTAL2
-Si può togliere il led ON visto che consuma qualche mA

Grazie Icio per i suggerimenti, mi incuriosiscono parecchio ma ahimé non riesco a starti appresso...
in effetti mi mancano forse un po' di fondamentali: non so cosa sia U1, U2, U3, U4 e via dicendo.
Mi piacerebbe approfondire la questione, ma avrei bisogno di essere guidato passo passo, e mi rendo conto che forse chiedo troppo!

In ogni caso grazie.
Avevo pensato di usare un RTC DS3234 per sfruttare l'allarme per risvegliare Uno dallo stato di sleep dopo 2 ore, anziché usare il watchdog ogni 8s.
Ciao
Antonio

Ma se ti occorre fare tutte queste ottimizzazioni e risparmi ...
... perché continui ad usare un Arduino Uno ? Prenditi solo un ATmega328P, due componenti in croce e ... ti fai uno stand-alone in cui hai il completo controllo di tutto !

Se cerchi qui sul forum o su Google per "Arduino Stand Alone" ... hai migliaia di esempi ... :wink:

Guglielmo

Edit : Guarda QUI ... :grin:

U1, U2 etc.. sono i reference designator (i nomi) riferiti allo schema di arduino uno rev3

Grazie per i contrinui suggerimenti.

Guglielmo: la questione dello StandAlone è interessante ma devo studiare ancora parecchio prima di poterla affrontare. Ma mi sa che qualche tentativo lo farò

Icio: ho trovato i riferimenti sullo schema, grazie

In ogni caso sono riuscito nell'intento del post, che poi ha preso una deriva più "energetica". Con le specifiche del Quectel M10 sono riuscito a stabilire una connessione GPRS e spedire un GET con HTTP, senza usare la libreria GSM.h che si ruba tantissima memoria. Allego il codice (che deve ancora essere molto migliorato) per chi fosse interessato.

//Serial Relay - Arduino will patch a 
//serial link between the computer and the GPRS Shield
//at 19200 bps 8-N-1
//Computer is connected to Hardware UART
//GPRS Shield is connected to the Software UART 
 
#include <SoftwareSerial.h>

 
SoftwareSerial GPRS(2,3);

unsigned char buffer[100]; // buffer array for data recieve over serial port
int count=0;     // counter for buffer array 

void setup()
{
  GPRS.begin(19200);               // the GPRS baud rate   
  Serial.begin(19200);             // the Serial port of Arduino baud rate.
  
  delay(5000);

  GPRS.println("at");
  delay(500);
  if (GPRS.available()) scriviRisposta();
  
  GPRS.println("AT+QIFGCNT=0");                        //Select a context as foregrounf context
  delay(500);
  if (GPRS.available()) scriviRisposta();            
  
  GPRS.println("AT+QIOPEN=\"TCP\",\"62.149.xxx.yyy\",\"80\"");  //Start up TCP connection
  delay(500);
  if (GPRS.available()) scriviRisposta();
  
  GPRS.println("AT+QICSGP=1,\"mobile.vodafone.it\",\"\",\"\"");  //Set GPRS as bearer for TCPIP connection, with param:APN, UserName, PSWD
  delay(500);
  if (GPRS.available()) scriviRisposta();
 
  GPRS.println("AT+QHTTPURL=53,30");                //Set URL, 53 chars long, 30s timeout
  delay(500);
  if (GPRS.available()) scriviRisposta();

  GPRS.println("http://www.xxxyyyzzz.it/prova/scrivi.asp?testo=Fabiano");
  delay(500);
  if (GPRS.available()) scriviRisposta();
  
  GPRS.println("AT+QHTTPGET=60");                  //Send HTTP GET request (60s timeout)
  delay(500);
  if (GPRS.available()) scriviRisposta();
 
  GPRS.println("AT+QHTTPREAD=30");                //Deacrivate GPRS PDP context (status->IP INITIAL)
  delay(500);
  if (GPRS.available()) scriviRisposta();

  GPRS.println("AT+IDEACT");
  delay(500);
  if (GPRS.available()) scriviRisposta();
  
 }
 
void loop()
{
  if (Serial.available())            // if data is available on hardwareserial port ==> data is comming from PC or notebook
    GPRS.write(Serial.read());       // write it to the GPRS shield
  if (GPRS.available()) scriviRisposta();              // if date is comming from softwareserial port ==> data is comming from gprs shield
}

void scriviRisposta(){
    while(GPRS.available())          // reading data into char array 
    {
      buffer[count++]=GPRS.read();     // writing data into array
      if(count == 100)break;
  }
    Serial.write(buffer,count);            // if no data transmission ends, write buffer to hardware serial port
    clearBufferArray();              // call clearBufferArray function to clear the storaged data from the array
    count = 0;                       // set counter of while loop to zero
 }

void clearBufferArray()              // function to clear buffer array
{
  for (int i=0; i<count;i++)
    { buffer[i]=NULL;}                  // clear all index of array with command NULL
}