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;
}*/