Aiuto! Arduino si blocca web!

Ciao a tutti mi chiamo Fabrizio e ho iniziato a programmare con Arduino da pochi mesi collegando 4 relè per aprire il cancello e altri apparecchi ma recentemente collegando anche il led ir per accendere la televisione da web e cliccando 4 o 5 volte sulla pagina web arduino si blocca inspiegabilmente ed escono molte scritte strane perdendo così la connessione!
Sarei molto grato se qualcuno sarebbe così gentile da controllarmi il codice se è formalmente corretto

Vi ringrazio :slight_smile:

#include <IRremote.h>
#include <IRremoteInt.h>
#include <String.h>
#include <SPI.h>
#include <Ethernet.h>
#include <Tone.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // mac address
byte ip[] = { 192, 168, 1, 9 }; // ip arduino internet in
byte gateway[] = { 192, 168, 1, 1 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
Server server(80);

IRsend irsend;

unsigned int Samsung[68] ={4550,4450,600,1600,650,1650,600,1600,650,500,600,500,650,500,600,500,650,500,600,1650,600,1600,650,1600,650,500,600,500,650,500,600,500,650,500,600,500,650,1600,600,500,650,500,600,500,650,500,600,500,650,500,600,1600,650,500,600,1650,600,1650,600,1650,600,1650,600,1650,600,1650,600};
unsigned int dream[70] ={260,700,240,2560,260,700,240,2720,240,1240,260,1240,240,840,240,2040,260,12700,260,700,240,840,240,700,260,700,240,700,260,2700,260,700,240,700,260,15424,260,700,240,2560,260,700,240,2720,240,1240,260,1240,240,840,240,2040,260,12700,260,700,
240,1920,240,1760,260,700,240,700,260,2700,260,700,240,700};
  unsigned int box[72] ={260,15424,260,700,240,2560,240,720,240,2720,240,1240,240,1260,240,840,240,2040,260,12700,240,720,240,1900,260,1760,240,720,240,700,240,2720,240,720,240,700,240,11960,260,700,240,2560,260,700,240,2720,240,1240,260,1240,240,840,2040,260,12700,240,720,240,1760,260,1900,240,720,240,700,240,2720,260,700,240,700,260};
  
  



 int sensorPin = 0;
  int led3 = 3;                       
int led5 = 5;
int led6 = 6;
int led7 = 7;
int led8 = 8;
int led9 = 9; // pin attuatore
boolean LEDON = false; // flag status attuatore
boolean LEDONn = false; // flag status attuatore
boolean LEDN = false; // flag status attuatore




String readString; //string
void setup(){
Ethernet.begin(mac, ip, gateway, subnet);
pinMode(led9, OUTPUT);
pinMode(led8, OUTPUT);     
pinMode(led7, OUTPUT);     
pinMode(led6, OUTPUT);
pinMode(led5, OUTPUT);

}
 
void loop(){
 int reading = analogRead(sensorPin);  
 int voltage = reading * 6.5;
 voltage /= 1024.0; 
 
  {
//temperatura
 int temperatureC = (voltage - 0.5) * 10 ;  //converting from 10 mv per degree wit 500 mV offset

 
/*inizio client*/
  // listen for incoming clients
  Client client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        readString.concat(c); //store characters to string
                  if (c == '\n' && currentLineIsBlank) {
       
          if(readString.indexOf("L=1") > 0) {//apricancello
             
            
            
          digitalWrite(led9, HIGH);
           delay(1000);
          digitalWrite(led9, LOW); 
                }
          
          if(readString.indexOf("L=2") > 0) {//rele ON
            
            
             
       
           digitalWrite(led8, HIGH);
                   LEDON = true;

           //accende il led  
          }
          if(readString.indexOf("L=3") > 0) {//rele OFF
            
          
                      digitalWrite(led8, LOW);
           
           
                LEDON = false;

          }
           if(readString.indexOf("L=4") > 0) {//rele ON
             
          
           digitalWrite(led7, HIGH); 
                       LEDONn = true;

          }
          if(readString.indexOf("L=5") > 0) {//rele OFF
            
           
         
           
           
         digitalWrite(led7, LOW); 
                      LEDONn = false;

          } 
      if(readString.indexOf("L=6") > 0) {//rele ON
        
           digitalWrite(led6, HIGH); 
                                 LEDN = true;

          }
          if(readString.indexOf("L=7") > 0) {//rele OFF
            
                       
         digitalWrite(led6, LOW); 
                            LEDN = false;

          }
          
          if(readString.indexOf("L=8") > 0) {  //rele tutti OFF
            
          delay(10);tone1.play(850,140);

            
         digitalWrite(led6, LOW);  
           delay(250);
         digitalWrite(led7, LOW); 
           delay(250);
         digitalWrite(led8, LOW); 
          LEDN = false;
          LEDONn = false;
          LEDON = false;
          }
          
          if(readString.indexOf("L=9") > 0) { //accendi solo tv

                       irsend.sendRaw(Samsung,68,38);
                                          digitalWrite(led3, LOW); 
                        delay(1000);
                         irsend.sendNEC(0xA55A38C7,32);
                         irsend.sendNEC(0xA55A38C7,32);
                                            digitalWrite(led3, LOW); 

                      irsend.sendRaw(dream,70,38);
                      irsend.sendRaw(box,72,38);
           }
          
          if(readString.indexOf("L=10") > 0) {//accendi tv + ampli + cancello
                       digitalWrite(led9, HIGH);
                       delay(1000);
                       digitalWrite(led9, LOW); 
                      irsend.sendRaw(dream,70,38);
                      irsend.sendRaw(box,72,38);
                   irsend.sendRaw(Samsung,68,38);
                        delay(1000);
                         irsend.sendNEC(0xA55A38C7,32);
                         irsend.sendNEC(0xA55A38C7,32);

                         
                         
                         
                         
          }
        // COSTRUZIONE PAGINA HTML
 
        // inizializzo pagina (da togliere se uso ajax)
         // COSTRUZIONE PAGINA HTML
 
        // inizializzo pagina (da togliere se uso ajax)
       client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          client.println("<html>");
           client.print("<head>");
           
           client.print(" <title>FabryTerry Server Domotica</title> ");
         client.println(" <meta name='viewport' content='width=device-width, user-scrollbar=no'>");
          client.print("</head>");
           client.println(" <body>"); //inizio pagina
           
            client.println("<p>Temperatura  ");
        client.print(temperatureC);
        client.println(" C</p>");
        
                   client.println("<hr >");
          client.println("<h3>Apertura</h3>"); //apricancello
          client.println(" <h3><a href='/?L=1'>   APRI   </a> </h3>");

          client.println("<h3>Rele'  n. 8</h3>");
          client.println("<a href='/?L=2'>Accendi</a> | <a href='/?L=3'>Spegni</a></h2>"); //primo rele
          if (LEDON) {
              client.println("<span style='color:green; font-weight:bold;'>ON</span></font>");
            }
            else
            {
             
             
              client.println("<span style='color:grey; font-weight:bold;'>OFF</span></font>");
          }
          client.println("<hr >");

          client.println("<h3>Rele'  n. 7</h3>");
          client.println("<a href='/?L=4'>Accendi</a> | <a href='/?L=5'>Spegni</a>");//secondo rele
           if (LEDONn) {
              client.println("<span style='color:green; font-weight:bold;'>ON</span></font>");
            }
            else
            {
              client.println("<span style='color:grey; font-weight:bold;'>OFF</span></font>");
          }
          client.println("<hr >");

           client.println("<h3>Rele'  n. 6</h2>");
           client.println("<a href='/?L=6'>Accendi</a> | <a href='/?L=7'>Spegni</a>"); //terzo rele
          if (LEDN) {
              client.println("<span style='color:green; font-weight:bold;'>ON</span></font>");
            }
            else
            {
              client.println("<span style='color:grey; font-weight:bold;'>OFF</span></font>");
          }
          client.println("<hr >");

           client.println("<a href='/?L=10'>Accendi + cancello</a> "); // apricancello piu televisione e ampli
           
           client.println("<a href='/?L=9'>Accendi</a> ");//solo accendi tv
                      client.println("<h3>ALL OFF<h3><a href='/?L=8'>Spegni Tutto</a> "); //spegni tutti i rele
                                 client.println(" </body>");
          client.println("</html>");

        readString="";
        //fermo il client
client.stop();
              }}}}}} :~

per rendere più leggibile il codice racchiudilo tra i tag `` invece di

Allora, con l'IDE 1.0.1 non mi compila perché credo che lo schetck sia scritto per la 023 o 022.
Per compilarlo con la nuova versione ho rinominato Server in EthernetServer e Client in EthernetClient, ma non avendo le librerie IR mi segna errore.
Comunque manca in Setup() almeno un Serial.begin(9600) e c'è una parentesi graffa di troppo.
Poi ti consigli di suddividere il codice con delle funzioni per aumentarne la leggibilità.

Si esatto è compilato per l'ide 022 perchè le librerie con l'ide più recente non le prendeva!Perfetto grazie proverò! Quindi il comando serial 9600 è fondamentale per arduino e il suo funzionamento?
l'errore che mi genera dopo vari tentativi di on off di relè è la pagina web che viene con le parole disposte in modo casuale e disordinato e arduino va come in crash perchè perde la connessione!
Grazie

Bmwpower:
Quindi il comando serial 9600 è fondamentale per arduino e il suo funzionamento?

No. Serve solo se usi la seriale con il comando Serial.print o Serial.write. Visto che la usi allora è necessario.
Se non usassi quei comandi potresti tralasciarlo.

Mentre riguardo al problema che si verifica
, dopo svariati on off di rele si inchioda ,
credi ci sia una soluzione?
Secondo te il programma e' scritto correttamente?

A me successe una cosa identica, il problema era che occupavo molta ram durante la creazione della pagina web (più dati hai da trasmettere con client.print più ram occupi).
In questo caso hai anche gli array dei codici del telecomando che fanno la loro parte.
Per vedere se ho ragione prova ad alleggerire lo sketch, tipo usa solo un tasto del telecomando e un solo relè
Ciao

Nel senso che arduino ha i suoi limiti di memoria e più di un certo numero di istruzioni non può eseguire?
Ciao =(

Scusate mi e' venuto un dubbio... Ma se implementassi tiny web server? Potrei risolvere alleggerendo lo sketch della pagina HTML sulla sd! No? Che ne pensate?

In un certo senso è così; in fase di programmazione l'ide non sa quanta ram richiede il tuo sketch e ti permette comunque il caricamento nella memoria flash. Se saturi la memoria ram hai dei comportamenti anomali sull'esecuzione delle istruzioni.
Leggi qua

Questo punto per alleggerire lo sketch, si potrebbe andare per metodi alternativi che sono:
-tiny web server con la pagina caricata su sd

  • sito web che legge e invia i comandi da arduino tramite get o post
  • creare un applicazione che permetta di interagire tramite iPhone dandoli i comandi necessari
    Sbaglio?

Ho aggiunto nello sketch l'inizializzazione della seriale come diceva PaoloP e sembra funzionare a dovere!
Grazie mille PaoloP e grazie a tutti!!!
:grin:
Fabrizio Bianchi

Ho effettuato altre prove il problema era il led IR collegato senza corretta resistenza, lo dico per chi dovrebbe incorrere nello stesso problema
Ciao