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

Ecco la lista delle librerie:

DHT: https://github.com/adafruit/DHT-sensor-library
MPL115A2: https://github.com/adafruit/Adafruit_MPL115A2
GPS/GSM: http://code.google.com/p/gsm-shield-arduino/downloads/list

8)

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