Go Down

Topic: Aiuto! Arduino si blocca web! (Read 1 time) previous topic - next topic

Bmwpower

Sep 03, 2012, 07:54 pm Last Edit: Sep 04, 2012, 12:42 am by Federico Vanzati Reason: 1
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 :)

Code: [Select]

#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();
             }}}}}} :~


Michele Menniti

per rendere più leggibile il codice racchiudilo tra i tag
Code: [Select]
invece di
Quote
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

PaoloP

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à.

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Bmwpower

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

PaoloP


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.
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Bmwpower

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?

pelletta

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

Bmwpower

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

Bmwpower

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?

pelletta

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

Bmwpower

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?

Bmwpower

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

Bmwpower

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

Go Up