Go Down

Topic: [RISOLTO] Probabile "saturazione" di risorse ram (Read 3 times) previous topic - next topic

anerDev

#30
Jan 02, 2013, 05:15 pm Last Edit: Jan 02, 2013, 05:17 pm by anerDev Reason: 1
Uso uno shield sd, quindi questa guida è valida lo stesso ? http://arduino.cc/forum/index.php/topic,37604.0.html

EDIT:

ho verificato il demo:   spi_init(); was not declared to this scope !

Uso un Mega e finiscono tutti i miei problemi ?

tuxduino

Stavo provando a compilare lo sketch che hai postato all'inizio, ma non capisco che libreria DHT hai usato.

Questa, forse ?

https://github.com/ringerc/Arduino-DHT22

(edit: volevo verificare il consumo di RAM inserendo la macro F() su tutte le stringhe...)

leo72

@anerDev:
vedo che quel thread è del 2009, sicuramente è per una versione dell'IDE vecchia per cui potrebbero esserci problemi di compatibilità.
Anch'io ho usato la PetitFs con l'IDE 002x, non l'ho mai usata con la 1.0.x

anerDev


tuxduino

pre_final3_at_sd.ino, come l'hai postato tu, mi dà:

avr-size -C sketch_jan02a.cpp.elf
AVR Memory Usage
----------------
Device: Unknown

Program:   25412 bytes
(.text + .data + .bootloader)

Data:       2391 bytes
(.data + .bss + .noinit)

anerDev

#35
Jan 02, 2013, 05:39 pm Last Edit: Jan 02, 2013, 05:42 pm by anerDev Reason: 1
@leo72

allora penso che è un binario morto questo petit ! :/

Mi consigli il Mega ?

EDIT:

@tuxduino coincide ... Usano troppa ram !

tuxduino

Hey, 'spe che secondo me ci sono margini di miglioramento :)

Ad esempio, comincia con eliminare cose come questa:

Code: [Select]
Serial.println("**************************************");

Inoltre invece di ripetere n-volte istruzioni come
Code: [Select]
Serial.print(";"); potresti creare una che include solo quell'instruzione e richiamare tale funzione invece di duplicare il codice.

Code: [Select]

void serialPrintSemicolon() {
    Serial.print(";");
}


Sto facendo un po' di questi esperimenti per vedere l'effetto di queste modifiche unitamente all'uso della macro F().

tuxduino

AVR Memory Usage
----------------
Device: Unknown

Program:   25412 bytes
(.text + .data + .bootloader)

Data:       2025 bytes
(.data + .bss + .noinit)


8)

anerDev

Ho tolto completamente il:

Code: [Select]
Serial.println("**************************************");

Ho fatto la funzione

Code: [Select]

void colonna() {
    Serial.print(";");
}


e sostituito tutti i

Code: [Select]
Serial.print(";");

con

Code: [Select]
colonna();

Ecco il risultato:

Quote
AVR Memory Usage
----------------
Device: Unknown

Program:   25322 bytes
(.text + .data + .bootloader)

Data:       2350 bytes
(.data + .bss + .noinit)


Non coincide col tuo ! O.0


tuxduino

Altra cosa... si potrebbe verificare se le dimensioni delle variabili (smsbuffer, ad esempio) che dichiari siano strettamente necessarie, o se si posa "fare con meno"...

Chiaro, con un mega tagli la testa al toro :)

tuxduino

#40
Jan 02, 2013, 05:57 pm Last Edit: Oct 13, 2014, 03:41 pm by leo72 Reason: 1
AVR Memory Usage
----------------
Device: Unknown

Program:   25346 bytes
(.text + .data + .bootloader)

Data:       2025 bytes
(.data + .bss + .noinit)


Code: [Select]

#include "Wire.h"
#include "SoftwareSerial.h"
#include "SD.h"

// Dichiarazioni modulo SD
File record;

// Dichiarazioni modulo MPL115A2
#include "Adafruit_MPL115A2.h"
Adafruit_MPL115A2 mpl115a2;

// Dichiarazioni modulo DHT
#include "DHT.h"
#define DHTPIN 5
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

// Dichiarazioni modulo GSM/GPS
#include "SIM900.h"
#include "sms.h"
#include "gps.h"

SMSGSM sms;
int numdata;
char smsbuffer[160];
char n[20];

GPSGSM gps;
char lon[15];
char lat[15];
char alt[15];
char time[20];
char vel[15];
char msg1[5];
char msg2[5];
char stat;
char inSerial[20];
int i=0;
boolean started=false;


void setup()
{
   Serial.begin(9600);

   dht.begin();

   mpl115a2.begin();

   Serial.println(F("CONTROLLO COMUNICAZIONE MODULI IN CORSO"));

   // Controllo stato modulo DHT
   if (isnan(dht.readTemperature()) || isnan(dht.readHumidity())) {
       Serial.println(F("Modulo DHT: ERRORE"));
   }
   else {
       Serial.println(F("Modulo DHT: OK "));
   }

   // Controllo stato modulo MPL115A2
   if (isnan(mpl115a2.getPressure())) {
       Serial.println(F("Modulo MPL115A2: ERRORE"));
   }
   else {
       Serial.println(F("Modulo MPL115A2: OK "));
   }

   // Controllo stato modulo GSM/GPS
   if (gsm.begin(2400)) {
       Serial.println(F("Modulo GSM/GPS: OK"));
       gsm.forceON(); //To ensure that SIM908 is not only in charge mode
       started=true;  
   }
   else {
       Serial.println(F("Modulo GSM/GPS: ERRORE"));
   }
   Serial.println(F("\tReset del GPS in corso, 60 secondi"));
   gsm.SimpleWriteln(F("AT+CGPSRST=1"));
   delay(60000);
   Serial.println(F("\tAttivazione del GPS in corso, 180 secondi"));
   gsm.SimpleWriteln(F("AT+CGPSPWR=1"));
   delay(180000);

   Serial.println();
};

void loop()
{
   record = SD.open("record.txt", FILE_WRITE);
   if (record) {

       serialhwread();
       gsm.SimpleRead();

       delay(20000); //Time for fixing

       gps.getPar(lon,lat,alt,vel,time);

       //  if (alt < 80) sms.SendSMS("333000000", lat, lon); //Invia coordinate

       record.print(lat);
       record.print(";");
       Serial.print(lat);
       Serial.print(';');

       record.print(lon);
       record.print(";");
       Serial.print(lon);
       Serial.print(';');

       record.print(alt);
       record.print(";");
       Serial.print(alt);
       Serial.print(';');

       record.print(dht.readTemperature());
       record.print(";");
       Serial.print(dht.readTemperature());
       Serial.print(';');

       record.print(dht.readHumidity());
       record.print(";");
       Serial.print(dht.readHumidity());
       Serial.print(';');

       record.print(mpl115a2.getPressure());
       record.print(";");
       Serial.print(mpl115a2.getPressure());
       Serial.print(';');

       record.println("");
       Serial.println("");

       record.close();

   }
   else {

       Serial.println(F("ERRORE scrittura record"));
   }

   delay(40000);

}

void serialhwread(){
   i=0;
   if (Serial.available() > 0){            
       while (Serial.available() > 0) {
           inSerial[i]=(Serial.read());
           delay(10);
           i++;      
       }

       inSerial[i]='\0';
       if(!strcmp(inSerial,"/END")){
           Serial.println("_");
           inSerial[0]=0x1a;
           inSerial[1]='\0';
           gsm.SimpleWriteln(inSerial);
       }
       //Send a saved AT command using serial port.
       if(!strcmp(inSerial,"TEST")){
           //      Serial.println("BATTERY TEST 1");
           //      gps.getBattInf(msg1,msg2);
           //      Serial.println(msg1);
           //      Serial.println(msg2);
           //      Serial.println("BATTERY TEST 2");
           //      gps.getBattTVol(msg1);
           //      Serial.println(msg1);
           stat=gps.getStat();
           if(stat==1)
               Serial.println(F("NOT FIXED"));
           else if(stat==0)
               Serial.println(F("GPS OFF"));
           else if(stat==2)
               Serial.println(F("2D FIXED"));
           else if(stat==3)
               Serial.println(F("3D FIXED"));
       }
       //Read last message saved.
       if(!strcmp(inSerial,"MSG")){
           Serial.println(msg1);
       }
       else{
           Serial.println(inSerial);
           gsm.SimpleWriteln(inSerial);
       }    
       inSerial[0]='\0';
   }
}

void serialswread(){
   gsm.SimpleRead();
}



La funzione printSemicolon() è una stupidaggine... evidentemente il compilatore è abbastanza "intelligente" da ottimizzare da solo questo aspetto.

PS: Uso Arduino 1.0.3 su Linux 32 bit. Scheda selezionata: Arduino 2009.

anerDev

#41
Jan 02, 2013, 05:59 pm Last Edit: Jan 02, 2013, 06:01 pm by anerDev Reason: 1
Purtroppo per le variabili avebo pensato la stessa cosa, ma provando non funziona più niente ! huahuahu

Allora dato che con il Mega risolvo il problema, opterò per quello !

Grazie 10000000 !!!

EDIT:

ho usato il tuo sketch:

Quote
VR Memory Usage
----------------
Device: Unknown

Program:   25342 bytes
(.text + .data + .bootloader)

Data:       2024 bytes
(.data + .bss + .noinit)



Niente, Mega è la soluzione !
Anche perchè dovrò aggiungere il trasmettitore !

tuxduino

Certo, anche se riuscissi a "tagliare" fino a rientrare nei 2k, poi con l'aggiunta di un altra libreria sforeresti di nuovo. Vai col mega, dunque :)

anerDev


Certo, anche se riuscissi a "tagliare" fino a rientrare nei 2k, poi con l'aggiunta di un altra libreria sforeresti di nuovo. Vai col mega, dunque :)


:smiley-mr-green: :smiley-mr-green: :smiley-mr-green:

Dimenticavo, Auguri !

tuxduino


Go Up