Uso di troppi "IF" con ethernet shield

Ciao a tutti, questo è il mio primo post.
Ho provato a fare uno sketch per poter comandare via web l'accesione di 16 led (in realtà vorrei molte più uscite ma per adesso sto provando con 16 utilizzando lo shifting).
Non riesco a capire perchè se carico lo sketch su arduino quando ho 16 led da pilotare, non riesco più a connettermi con all'indirizzo della ethernet shield. Se cancello la parte di sketch ottenendo circa una decina di uscite allora tutto funziona.
Io ho attribuito il problema ai troppi "IF" usati nello sketch ma non ne sono sicuro. Qualcuno ha qualche idea sul problema e su come potrei risolverlo? inoltre c'è un altro modo per poter snellire lo sketch usando per esempio altre funzioni tipo "for" o "switch case" o altro e in che modo?
Allego lo sketch
Grazie in anticipo.
Ciao

sketch_web_shift.htm (24.3 KB)

Che Arduino usi?
Mi puzza di problemi di RAM.
Usa progmem() per memorizzare le stringhe nella Flash.

Anche se non sembra

client.print("<a href='/accendi0'>Accendi LED 0</a>
<a href='/spegni0'>Spegni LED 0</a>
");

ti consuma della RAM.
Ciao Uwe

Grazie per la celere risposta. Ad ogni modo uso Arduino Uno e ethernet shield.
Sono proprio alle prime armi con il mondo di arduino dato che ce l'ho da 1 settimana. Saresti così gentile da postarmi un piccolo esempio usando PROGMEM relativo al mio sketch? Mi viene molto più facile capire e imparara da degli esempi già fatti...
Altrimenti se mi puoi dare delle dritte... :slight_smile:
Grazie intanto ancora
Ciao

Ciao, usare PROGMEM per archiviare le stringhe in flash ti aiuta a risparmiare RAM, è utile se hai tante stringhe, ma per poter usare le stringhe devi recuperala dalla flash e caricarle in RAM, ad ogni modo provo a farti un piccolo esempio di come lo sto usando io, spero che il codice sia chiaro

#include <avr/pgmspace.h>
 
prog_char CIP [] PROGMEM = {"<a href='/accendi0'>Accendi LED 0</a>
<a href='/spegni0'>Spegni LED 0</a>
"};
char *buf;


void setup() {   
  Serial.begin(9200);  
}

void loop() {
  
  SendATCmdWaitRespP(CIP);
  Serial.println(buf);
  delay(2000);
  free(buf); //importante
  
}

void SendATCmdWaitRespP(prog_char *str)
{	
        buf = (char *) malloc(LenP(str)*sizeof(char));
	byte i=0; 	
        
	for (char c; (c = pgm_read_byte (str)); str++)
	      buf[i++] = c;
        
        buf[i] = '\0';	             
}

byte LenP(prog_char *str)
{	
	byte i=0;
        
        for (char c; (c = pgm_read_byte (str)); str++)
		i++;               
		
	return i;	
}

magari c'è un modo migliore :wink: e imparo anch'io.

Grazie, con più calma cercherò di capire come utilizzare questo progmem (a dir la verità non mi è molto chiaro). Mi domandavo però una cosa, se sono quelle stringhe ad occupare memoria e quindi acrearmi il problema, teoricamente potrei risolverlo scrivendo quelle stringhe su una pagina web creata e salvata in una scheda sd, confermate? Se fosse cosi quindi potrei aggiungere molte più uscite...

Invece di scrivere quelle stringhe e poi richiamarle da sd, crea proprio una pagina web su sd e inviala al client quando serve.

Infatti credo che farò come dici tu pablos...un po' alla volta poi vedremo cosa ne uscirà :stuck_out_tongue:
Ma non c'è un modo per evitare tutti quei "if" tipo no so utilizzando "for". Posto qui un esempio di concetto (lo so che è sbagliato) ma è per cercare di farmi capire:

for (int a=0; a<15; a++)
{
query.indexOf(a) > 0;
shifter.setPin(a, HIGH);
shifter.write();
}
for (int a=16; a<32; a++)
{
query.indexOf(a) > 0;
shifter.setPin(a, LOW);
shifter.write();
}

Al posto di progmem puoi usare anche la sintassi F(. Anche cosí vengono messi i string nella memoria flash.
Sintassi:
Serial.print(F("This string will be stored in flash memory"));

vedi Arduino Playground - Printf in basso sotto Using Flash Memory for string storage.

Ciao Uwe