Pages: [1]   Go Down
Author Topic: Aiuto! Arduino si blocca web!  (Read 1183 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley

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

« Last Edit: September 03, 2012, 05:42:37 pm by Federico Vanzati » Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 411
Posts: 11986
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

per rendere più leggibile il codice racchiudilo tra i tag
Code:
invece di
Quote
Logged

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

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 103
Posts: 6580
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

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

Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 103
Posts: 6580
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Marche
Offline Offline
Edison Member
*
Karma: 32
Posts: 2262
azioni semplici per risultati complessi
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nel senso che arduino ha i suoi limiti di memoria e più di un certo numero di istruzioni non può eseguire?
Ciao smiley-cry
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Marche
Offline Offline
Edison Member
*
Karma: 32
Posts: 2262
azioni semplici per risultati complessi
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: [1]   Go Up
Jump to: