Ottimizzazione del codice

So già che è un argomento complesso ma già trattato e che non si dovrebbe usare String ma, nel mio caso specifico comensi potrebbe ottimizzare il codice?

#include <pRNG.h>
#include <SPI.h>
#include <Ethernet.h>
//#include <SD.h>
#include <LiquidCrystal.h>
boolean numeri[90] = {
  true, true, true,  true, true, true,  true, true, true,  true, true, true,  true, true, true,  true, true, true,  true, true, true,  true, true, true,  true, true, true,  true, true, true,  true, true, true,  true, true, true,  true, true, true,  true, true, true,  true, true, true,  true, true, true,  true, true, true,  true, true, true,  true, true, true,  true, true, true,  true, true, true,  true, true, true,  true, true, true,  true, true, true,  true, true, true,  true, true, true,  true, true, true,  true, true, true,  true, true, true,  true, true, true
};
String frase;
String header;
bool nap = false;
LiquidCrystal lcd(9, 8, 5, 7, 3, 2);
byte mac[] = {0x90, 0xA2, 0xDA, 0x0F, 0x9D, 0x80};
IPAddress ip(192, 168, 1, 221);
EthernetServer server(80);
EthernetClient responder;
pRNG rseed;
boolean fine = false;
boolean pulsante;
const byte pinPulsante = 6;
byte tombola;
byte n = 0;
//const bool eth=true;
bool eth = true;
bool dhcp = true;
void setup() {
  //SD.begin(4);
  /*if (Ethernet.begin(mac) == 0) {
    if(Ethernet.begin(mac,ip)==0){
      eth=false;
    }
    }*/
  pinMode(pinPulsante, INPUT);
  lcd.begin(16, 2);
  const long seed = rseed.getRndLong();
  randomSeed(seed);
  lcd.print(F("    Tombola!"));
  lcd.setCursor(0, 1);
  lcd.print(F(" 01/01/16 by ET"));
  delay(500);
  if (digitalRead(pinPulsante)) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(F("Tenere premuto p"));
    lcd.setCursor(0, 1);
    lcd.print(F("er dis. Ethernet"));
    delay(1000);
    if (digitalRead(pinPulsante)) {
      eth = false;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(F("    Ethernet"));
      lcd.setCursor(0, 1);
      lcd.print(F("  disabilitato"));
      delay(500);
    }
    else {
      dhcp = false;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(F("      DHCP"));
      lcd.setCursor(0, 1);
      lcd.print(F("  disabilitato"));
      delay(500);
    }
  }
  if (eth && dhcp) {
    Ethernet.begin(mac);
  }
  if (eth && !dhcp) {
    Ethernet.begin(mac, ip);
  }
  Serial.begin(9600);
  if (eth) {
    server.begin();
    while (!digitalRead(pinPulsante)) {
      //
    }
    lcd.clear();
    delay(500);
    lcd.setCursor(0, 0);
    if (eth) {
      lcd.print(F("  Indirizzo IP"));
      lcd.setCursor(0, 1);
      IPAddress ipAddr = Ethernet.localIP();
      char buf[16];
      sprintf(buf, "%d.%d.%d.%d\0", ipAddr[0], ipAddr[1], ipAddr[2], ipAddr[3]);
      lcd.print(buf);
    }
    while (!digitalRead(pinPulsante)) {
      //
    }
    lcd.setCursor(0, 0);
    lcd.print(F("Tenere premuto"));
    lcd.setCursor(0, 1);
    lcd.print(F("per frasi napol."));
    lcd.setCursor(0, 0);
    delay(1000);
    if (digitalRead(pinPulsante)) {
      lcd.print(F("Frasi Napol."));
      nap = true;
    }
    delay(1000);
    while (!digitalRead(pinPulsante)) {
      //
    }
    lcd.setCursor(0, 0);
    lcd.clear();
  }
}
void loop() {
  pulsante = digitalRead(pinPulsante);
  if (pulsante == HIGH) {
    tombola = random(1, 91);
    byte narray = tombola - 1;
    boolean stato = numeri[narray];
    if (numeri[narray] == true) {
      numeri[narray] = false;
    }
    if (stato == true) {
      lcd.clear();
      lcd.print(tombola);
      if (responder.connect("serverseutampieri.ddns.net", 80) && eth) {
        if (nap) {
          responder.print(F("GET /numeriTombola.php?lang=nap&n="));
        }
        else {
          responder.print(F("GET /numeriTombola.php?lang=ita&n="));
        }
        responder.print(tombola);
        responder.println(F(" HTTP/1.1"));
        responder.println(F("Host: serverseutampieri.ddns.net"));
        responder.println(F("Connection: close"));
        responder.println();
      }
      Serial.println(tombola);
      delay(200);
      n++;
    }
  }
  if (responder.available()) {
    header = responder.readStringUntil('>');
    frase = responder.readStringUntil('<');
    header = "";
    if (!frase.startsWith("0", 2)) {
      lcd.setCursor(0, 1);
      lcd.print(frase);
      lcd.setCursor(0, 0);
    }
  }
  if (!responder.connected()) {
    responder.stop();
  }
  boolean blocco = false;
  boolean finito;
  for (byte i = 0; i < 90; i++) {
    boolean lettura = numeri[i];
    if (lettura) {
      finito = false;
      blocco = true;
      i = 90;
    }
  }
  if (blocco == false) {
    finito = true;
  }
  if (finito == true) {
    if (fine == false) {
      lcd.clear();
      int x;
      lcd.clear();
      lcd.print(F("By Eugenio Tampieri."));
      for (byte i = 0; i <= 4; i++) {
        lcd.scrollDisplayLeft();
        delay(150);
      }
      delay(1000);
      lcd.clear();
      lcd.print(F("Grazie alla libr"));
      delay(500);
      lcd.clear();
      lcd.print(F("eria pNRG di Leo"));
      delay(500);
      lcd.clear();
      lcd.print(F("nardo Milani (le."));
      delay(500);
      lcd.clear();
      lcd.print(F("onardomilani.com)."));
      delay(1000);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(F("Made on Arduino"));
      lcd.setCursor(0, 1);
      lcd.print(F("   arduino.cc"));
      delay(3000);
      lcd.clear();
      lcd.print(F("Visita eutampieri.altervista.org!"));
      for (byte i = 0; i <= 9; i++) {
        lcd.scrollDisplayLeft();
        delay(150);
      }
      delay(1000);
      lcd.clear();
      lcd.print(F("FINE!"));
    }
    fine = true;
  }
  if (eth) {
    EthernetClient client = server.available();
    if (client) {
      // an http request ends with a blank line
      boolean currentLineIsBlank = true;
      while (client.connected()) {
        if (client.available()) {
          char c = client.read();
          if (c == '\n' && currentLineIsBlank) {
            client.println(F("HTTP/1.1 200 OK"));
            client.println(F("Content-Type: text/html"));
            client.println(F("Connection: close"));
            client.println(F("Refresh: 10"));
            client.println();
            client.println(F("<!DOCTYPE HTML>"));
            client.println(F("<html><style> @media all and (min-width: 1600px) {\n    body {\n        font-size:4.25em;\n    }}</style>"));
            client.println(F("<meta name='viewport' content='width=device-width' />"));
            client.println(F("<h1>Tombola</h1><table border='1' style='width:100%;table-layout: fixed;'>"));
            for (byte d = 0; d < 90; d = d + 10) {
              client.println(F("<tr>"));
              for (byte u = 1; u <= 10; u++) {
                int n = d + u;
                client.print(F("<td style='overflow: hidden;width: 10%;height:9%;text-align:center;'>"));
                if (!numeri[n - 1]) {
                  client.print(n);
                }
                else {
                  client.print(F("<div style='visibility: hidden;'>0</div>"));
                }
                client.println(F("</td>"));
              }
              client.println(F("</tr>"));
            }
            client.println(F("</table></html>"));
            break;
          }
          if (c == '\n') {
            currentLineIsBlank = true;
          } else if (c != '\r') {
            currentLineIsBlank = false;
          }
        }
      }
      delay(1);
      client.stop();
      Ethernet.maintain();
    }
  }
}
boolean done = false;
/*boolean checkFine(int pulsante, int tempo){
  if(done==false){
    pinMode(pulsante,INPUT_PULLUP);
    done=true;
  }
  if(digitalRead(pulsante)==LOW){
    return false;
    Serial.println("00");
  }
  else{
    return true;
  }
  }
  extern int __bss_end;
  extern void *__brkval;
  int memoryFree()
  {
  int freeValue;

  if((int)__brkval == 0)
     freeValue = ((int)&freeValue) - ((int)&__bss_end);
  else
    freeValue = ((int)&freeValue) - ((int)__brkval);

  return freeValue;
  }*/

Perché io ho gia fatto dei tentativi e ho ottenuto questo:

Lo sketch usa 24.092 byte (74%) dello spazio disponibile per i programmi. Il massimo è 32.256 byte.
Le variabili globali usano 1.613 byte (78%) di memoria dinamica, lasciando altri 435 byte liberi per le variabili locali. Il massimo è 2.048 byte.
Poca memoria disponibile, potrebbero presentarsi problemi di stabilità
Lo sketch usa 24.076 byte (74%) dello spazio disponibile per i programmi. Il massimo è 32.256 byte.
Le variabili globali usano 1.611 byte (78%) di memoria dinamica, lasciando altri 437 byte liberi per le variabili locali. Il massimo è 2.048 byte.
Poca memoria disponibile, potrebbero presentarsi problemi di stabilità
Lo sketch usa 24.226 byte (75%) dello spazio disponibile per i programmi. Il massimo è 32.256 byte.
Le variabili globali usano 743 byte (36%) di memoria dinamica, lasciando altri 1.305 byte liberi per le variabili locali. Il massimo è 2.048 byte.

Grazie in anticipo,
Eugenio

P.S.
Non ci stava tutto in un messaggio...

Sulla mega va benissimo ... Perchè a te non funziona?

Anche a me va benissimo sulla uno r3 ma volevo cogliere l'occasione per imparare ad ottimizzare il codice e ad imparare ad usare char array in C.
È così ti sei guadagnato un estrattore di numeri per la tombola!

Ciao, credo che l'alto valore di memoria utilizzato, sia dovuto alle librerie e agli oggetti che usi per gestire i vari dispositivi "lcd ecc...", le variabili che hai dichiarato sono di tipo booleana o di tipo char, che richiedono un solo byte, e facendo i conti, tutte assieme non richiedono molta ram.
La memoria è molto limitata, e fare uso di librerie e oggetti fa si di utilizzare molta memoria, c'è poco da ottimizzare :slight_smile: bisogna scegliere una scheda adatta al nostro progetto , per memoria disponibile.