Dimensione del file binario dello sketch - arduino impazzito

La mia configurazione e' arduino uno rev 3 , IDE 1.0.1

Dimensione del file binario dello sketch: 20.758 bytes (su un massimo di 32.256 bytes )

compilando il mio sketch ho ottenuto il risultato sopra riportato ed una volta compilato senza errori e caricato su arduino, questi non funziona più!
Ho letto qualche post , purtroppo in inglese ( che non e' il mio forte ) riguardo un bag sulle dimensioni e sul bootloader.
Infatti togliendo delle librerie ed un sensore con relative istruzioni nello sketch sono sceso sotto la soglia dei 20500 byte circa, e tutto e' tornato a funzionare.

Mi potreste dare qualche suggerimento?

Grazie

Ti consiglio intanto la lettura di questa guida:
http://www.leonardomiliani.com/?p=572

E poi ti chiedo se nel tuo sketch usi molte variabili di tipo string, ad esempio per stampare su seriale o su LCD.

leo72:
Ti consiglio intanto la lettura di questa guida:
Come sapere l’occupazione di RAM del proprio sketch – Leonardo Miliani

E poi ti chiedo se nel tuo sketch usi molte variabili di tipo string, ad esempio per stampare su seriale o su LCD.

Ho eseguito la procedura e questo e' il risultato della memoria
" AVR Memory Usage

Device: Unknown

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

Data: 1916 bytes
(.data + .bss + .noinit) "

Ma non uso molto il comando per stampare essendo un controllo per la domotica
non uso il monitor seriale ne il display LCD.......

:cold_sweat:

Volevo aggiungere che anche epurando lo sketch....20480 byte caricati....il sistema e' instabile!!!!!!

L' arduino UNO ha 2kByte percui 2048 byte di RAM.

se hai usato avr-size.exe C:\DOCUME~1\User\IMPOST~1\Temp\build3857425205743446753.tmp\nome_del_vostro_sketch.cpp.elf -C
Per sapere l' ocupazione della RAM é un valore statico che non considera il consumo di RAM per una stampa su un display o la seriale. 120 Byte liberi sono pochissimi.

Il problema che hai é che stai usando piú RAm di quella disponibile.

Ciao Uwe

uwefed:
L' arduino UNO ha 2kByte percui 2048 byte di RAM.

se hai usato avr-size.exe C:\DOCUME~1\User\IMPOST~1\Temp\build3857425205743446753.tmp\nome_del_vostro_sketch.cpp.elf -C
Per sapere l' ocupazione della RAM é un valore statico che non considera il consumo di RAM per una stampa su un display o la seriale. 120 Byte liberi sono pochissimi.

Il problema che hai é che stai usando piú RAm di quella disponibile.

Ciao Uwe

Ero convinto di avere 30k disponibili.....!!! :fearful:

30 kByte di memoria FLASH non di RAM.
Ha 32kByte FLASH (di cui ocupata 0,5 kByte dal Bootloader), 2 kByte RAM e 1 kByte di EEProm che non sono usati da Arduino.
Se ci dai il Sketch possiamo verdere di risparmiare RAM.

Ciao Uwe

uwefed:
30 kByte di memoria FLASH non di RAM.
Ha 32kByte FLASH (di cui ocupata 0,5 kByte dal Bootloader), 2 kByte RAM e 1 kByte di EEProm che non sono usati da Arduino.

@lolo:
E' l'architettura Harvard, in cui la memoria del programma e la memoria che contiene le variabili sono separate. Siccome la RAM che contiene le variabili è di piccole dimensioni, saturarla è molto più facile di quel che non si creda.

uwefed:
30 kByte di memoria FLASH non di RAM.
Ha 32kByte FLASH (di cui ocupata 0,5 kByte dal Bootloader), 2 kByte RAM e 1 kByte di EEProm che non sono usati da Arduino.
Se ci dai il Sketch possiamo verdere di risparmiare RAM.

Ciao Uwe

:smiley: vi ringrazio molto questa sera posto lo sketch!!!
Grazie Mille!!

/*****

  • COMPILARE CON ARDUINO 1.0 o successive
    ******/

#include <String.h>
#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into pin 2 on the Arduino
#define ONE_WIRE_BUS 6

// Setup a oneWire instance to communicate with any OneWire devices
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

///////////////////////////////////////////////////////////////////

byte mac[] = {
0x00, 0xAA, 0xBB, 0xCC, 0xDA, 0x02 }; // mac address
byte ip[] = {
192,168,1,7 }; // ip arduino internet in
byte gateway[] = {
192,168,1,1 }; // internet access via router
byte subnet[] = {
255, 255, 255, 0 }; //subnet mask

EthernetServer server(80); //server port

//definizione attuatori
int outPin = 2; // pin attuatore cancello
int outPin2 = 3; // pin attuatore tenda su
int outPin3 = 4; // pin attuatore tenda giu
int outPin4 = 5; // pin attuatore tenda metà
int outPin5 = 7; // pin controllo canale
int C = 5; // Variabile canale
int X = 3;
int Z=0;

String readString; // legge int e assegna l'uscita

void setup()
{
Ethernet.begin(mac, ip, gateway, subnet);
pinMode(outPin, OUTPUT); //definisce che il pin e' un uscita
pinMode(outPin2, OUTPUT);
pinMode(outPin3, OUTPUT);
pinMode(outPin4, OUTPUT);
pinMode(outPin5, OUTPUT);
//Serial.begin(9600);

// start serial port
//Serial.begin(9600);
//Serial.println("Dallas Temperature IC Control Library Demo");

// Start up the library
sensors.begin();
}

void rele_ch()
{ digitalWrite(7,HIGH);
delay(500);
}
void rele_cd()
{ digitalWrite(7,LOW);
delay(500);
}

void loop()
{
Z=0;

// call sensors.requestTemperatures() to issue a global temperature
// request to all devices on the bus
//Serial.print(" Requesting temperatures...");
sensors.requestTemperatures(); // Send the command to get temperatures
//Serial.println("DONE");

//Serial.print("Temperature for Device 1 is: ");
sensors.getTempCByIndex(0); // Why "byIndex"?
// You can have more than one IC on the same bus.
// 0 refers to the first IC on the wire

/inizio client/

EthernetClient client = server.available();

if (client) {

boolean currentLineIsBlank = true;

while (client.connected()) {

if (client.available()) {
char c = client.read();
readString.concat(c); //store characters to string
//if HTTP request has ended

if (c == '\n' && currentLineIsBlank) {

if(readString.indexOf("D=1") > 0)
{
C=1; // CONTROLLO CANALE
}
if(readString.indexOf("S=1") > 0)
{
C=2; // CONTROLLO CANALE
}
if(readString.indexOf("E=1") > 0)
{
C=6; // CONTROLLO CANALE
}

if(C==1) // Cambio del canale
{
rele_ch();
rele_cd();
rele_ch();
rele_cd();
C=7;
X=1;
Z=1;
}

if(C==2)
{
rele_ch();
rele_cd();
rele_ch();
rele_cd();
rele_ch();
rele_cd();
C=8;
X=2;
Z=1;
}

if(C==6)
{
if(X==1)
{
rele_ch();
rele_cd();
rele_ch();
rele_cd();
rele_ch();
rele_cd();
rele_ch();
rele_cd();
rele_ch();
rele_cd();
C=9;
X=3;
Z=1;
}
else
{
rele_ch();
rele_cd();
rele_ch();
rele_cd();
rele_ch();
rele_cd();
rele_ch();
rele_cd();
C=9;
X=3;
Z=1;
}
}

if(readString.indexOf("L=1") > 0)
{
digitalWrite(outPin, HIGH); // CONTROLLO CANCELLO
//Serial.println(outPin);
delay(1000);
digitalWrite(outPin, LOW);
Z=1;
}

if(readString.indexOf("A=2") > 0)
{ // CONTROLLO TENDE COMANDO INTERMEDIO
digitalWrite(outPin2, HIGH); // Attivo il rele di salita
delay(500);
digitalWrite(outPin2, LOW);

delay(40000); // Imposto il tempo di salita

digitalWrite(outPin3, HIGH); // Disattivo il rele di discesa
delay(500);
digitalWrite(outPin3, LOW);

delay(16000); // Imposto il tempo perche' la tenda arrivi nel mezzo

digitalWrite(outPin4, HIGH); // Attivo il relo di Stop
delay(500); //
digitalWrite(outPin4, LOW); // ----------------------
Z=1;
}

// COSTRUZIONE PAGINA HTML

client.println("HTTP/1.1 200 OK.....");

client.println("Content-Type: text/html");

client.println();

// inizializzo pagina (da togliere se uso ajax)

client.println("DomusGate");

//inizai il body

client.println("

"); //risoluzione per nokia 5800 640x360

client.println("

DomusGate

");

client.println("

Temperatura interna = ");
client.print(sensors.getTempCByIndex(0));
client.println(" C

");

client.println("
");

client.println("


");

client.println("
");

client.println("

APRICANCELLO

");

//client.print("

APRI

");
client.print("

<input type="button" style="width:240px ;background-color:#E4E4E4; color:#000000; height:60px" value="Cancello" onclick =" location.href='/?L=1'">

");

client.println("
");

client.println("


");

client.println("


");

client.println("

CONTROLLO TENDE

");

//client.print("

SU

");
client.print("

<input type="button" style="width:240px ;background-color:#7FFF00; color:#000000; height:60px" value="tenda su" onclick =" location.href='/?A=1'">

");

//client.print("

STOP

");
client.print("

<input type="button" style="width:240px ;background-color:#FF0000; color:#000000; height:60px" value="stop" onclick =" location.href='/?H=4'">

");

//client.print("

GIU

");
client.print("

<input type="button" style="width:240px ;background-color:#008800; color:#000000; height:60px" value="tenda giu'" onclick =" location.href='/?A=3'">

");

//client.print("

INTERMEDIO

");
client.print("

<input type="button" style="width:240px ;background-color:#FFD700; color:#000000; height:60px" value="tenda mezzo" onclick =" location.href='/?A=2'">

");

client.println("
");

client.println("


");

client.println("


");

if (X==3)
{ client.print("

DESTRA

");

client.print("

SINISTRA

");
}

if (X==2)
{
client.print("

ENTRAMBE

");
}

if (X==1)
{
client.print("

ENTRAMBE

");
}

//client.print("<input type="button" style="width:120px ;background-color:#c00; color:#fff; height:80px" value="Aggiorna" onclick =" location.href='/'">");

// chiudo il div

client.println("

");

client.println("");

if (Z==1)
{ //client.print ("<meta http-equiv="refresh" content="5">");
client.println("<META HTTP-EQUIV=REFRESH CONTENT=2;url=http://mioip/>");
}
else
{ Z=0;
}

// pulisco la stringa per la successiva lettura

readString="";

//fermo il client

client.stop();

} //if c == /n

} // if client available

} // while client connesso

} // FINE if client

} // fine loop

Prova di inserire in tutti i client.println la funzione F() che prende il testo dalla Flash.

client.println("HTTP/1.1 200 OK.....");

diventa

client.println(F("HTTP/1.1 200 OK....."));

ecc.
Vedi Arduino Playground - Printf

Ciao Uwe

@OP due consigli per migliorare la leggibilità del codice che posti (per il forum):

  • CTRL+T nell'IDE per migliorare l'indentazione
  • usa i code tags (tasto # qui sopra)
  • oppure allega il file .ino al post (additional options sotto la finestra messaggio)

A proposito di F()... mi chiedevo se si può usare anche in casi come:

readString.indexOf("D=1")

Sono andato a leggere String.h e non ho trovato alcuna versione di indexOf() né del costruttore che accetti __FlashStringHelper*.
In effetti questa riga non compila (1.0.2):

readString.indexOf(F("D=1"))

Un'altra carenza di String ? :wink: