Arduino Ethernet e valori falsificati

Salve a tutti,
Ho creato questo semplice codice per la connessione di arduino a internet con l'ethernet shield, controllo di un led e controllo di sei micro con incremento e decremento,tre incremento - tre decremento di tre variabili.Faccio la stampa tramite interfaccia browser e ogni volte che la pagina si aggiorna mi mostre le tre variabili incrementate anche senza aver premuto i pulsanti.Sto facendo una prova così senza pull-down e senza connessione del micro alla GND.E' per questo motivo che esse si incrementano?Intanto il codice è questo

#include <SPI.h>
#include <Ethernet.h>
 

 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { 192, 168, 1, 5 }; // ip in lan
byte gateway[] = { 192, 168, 1, 1 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
EthernetServer server(80); //server port
 
String readString;
 const short int ButtonPinuno = 3;        //pin pulsante incremento 
const short int ButtonPindue = 5;    //pin pulsante decremento 
int CurrentStateuno;                  //variabile per lo stato uno corrente 
int LastStateuno = 0;                //variabile per l'ultimo stato uno 
int CurrentStatedue;                  //variabile per lo stato due corrente 
int LastStatedue = 0;            //variabile per l'ultimo stato due 
int short contprima = 0;          //Holds number of button presses. 
const short int ButtonPintre = 6;        //pin pulsante incremento 
const short int ButtonPinquattro = 7; //pin pulsante decremento 
int CurrentStatetre;                  //variabile per lo stato uno corrente 
int LastStatetre = 0;                //variabile per l'ultimo stato uno 
int CurrentStatequattro;              //variabile per lo stato due corrente 
int LastStatequattro = 0;            //variabile per l'ultimo stato due 
int short contseconda = 0;          //Holds number of button presses 
const short int ButtonPincinque =8 ;        //pin pulsante incremento 
const short int ButtonPinsei  = 9; //pin pulsante decremento 
int CurrentStatecinque;              //variabile per lo stato uno corrente 
int LastStatecinque = 0;              //variabile per l'ultimo stato uno 
int CurrentStatesei;                  //variabile per lo stato due corrente 
int LastStatesei = 0;                //variabile per l'ultimo stato due 
int short contterza = 0;            //Holds number of button presses 
//////////////////////
 
void setup(){
 

  //start Ethernet
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();

  Serial.begin(9600);
  Serial.println("server LED test 1.0"); // so I can keep track of what is loaded
}
 
void loop(){
  CheckButton();
  // Create a client connection
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
 
        //read char by char HTTP request
        if (readString.length() < 100) {
 
          //store characters to string
          readString += c;
          //Serial.print(c);
        }
 
        //if HTTP request has ended
        if (c == '\n') {
 
          ///////////////
          Serial.println(readString); //print to serial monitor for debuging
 
          client.println("HTTP/1.1 200 OK"); //send new page
          client.println("Content-Type: text/html");
          client.println();
 
          client.println("<HTML>");
          client.println("<HEAD>");
          client.println("<meta name='apple-mobile-web-app-capable' content='yes' />");
          client.println("<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' />");
          client.print("<meta http-equiv=\"refresh\" content=\"2\">");
          client.println("<link rel='stylesheet' type='text/css' href='http://homeautocss.net84.net/a.css' />");
          client.println("<TITLE>Home Automation</TITLE>");
          client.println("</HEAD>");
          client.println("<BODY>");
          client.println("<H1>Home Automation</H1>");
          client.println("<hr />");
          client.println("
");
          client.println("<a href=\"/?lighton\"\">Turn On Light</a>");
          client.println("<a href=\"/?lightoff\"\">Turn Off Light</a>
");  
          client.println("<hr />");      
          client.println("<H1>Dati Micro</H1>");
          client.println(contprima);
                    client.println(contseconda);
                              client.println(contterza);
          client.println("
");
          client.println("<hr />");
                    client.println("<H1>Questa pagina si aggiorna ogni 2 secondi</H1>");
          client.println("</BODY>");
          client.println("</HTML>");
 
          delay(1);
          //stopping client
          client.stop();
 
          ///////////////////// control arduino pin
          if(readString.indexOf("?lighton") >0)//checks for on
          {
            digitalWrite(6, HIGH);    // set pin 4 high
            Serial.println("Led On");
          }
          else{
          if(readString.indexOf("?lightoff") >0)//checks for off
          {
            digitalWrite(6, LOW);    // set pin 4 low
            Serial.println("Led Off");
          }
          }
          //clearing string for next read
          readString="";
 
        }
      }
    }
  }
}
void CheckButton(void){ 
 CurrentStateuno = digitalRead(ButtonPinuno);           
 CurrentStatedue = digitalRead(ButtonPindue);         
 CurrentStatetre = digitalRead(ButtonPintre);           
 CurrentStatequattro = digitalRead(ButtonPinquattro);     
 CurrentStatecinque = digitalRead(ButtonPincinque);   
 CurrentStatesei = digitalRead(ButtonPinsei); 
 delay(10);  // debounce                                                 

 if(CurrentStateuno != LastStateuno) 
 { 
   if(CurrentStateuno == LOW) 
   { 
     contprima++; 
   } 
 } 
 LastStateuno = CurrentStateuno; 

 if(CurrentStatedue != LastStatedue) 
 { 
   if(CurrentStatedue == LOW) 
   { 
     contprima--; 
   } 
 } 
 LastStatedue = CurrentStatedue; 

 if(CurrentStatetre != LastStatetre) 
 { 
   if(CurrentStatetre == LOW) 
   { 
     contseconda++; 
   } 
 } 
 LastStatetre = CurrentStatetre; 

 if(CurrentStatequattro != LastStatequattro) 
 { 
   if(CurrentStatequattro == LOW) 
   { 
     contseconda--; 
   } 
 } 
 LastStatequattro = CurrentStatequattro; 

 if(CurrentStatecinque != LastStatecinque) 
 { 
   if(CurrentStatecinque == LOW) 
   { 
     contterza++; 
   } 
 } 
 LastStatecinque = CurrentStatecinque; 

 if(CurrentStatesei != LastStatesei) 
 { 
   if(CurrentStatesei == LOW) 
   { 
     contterza--; 
   } 
 } 
 LastStatesei = CurrentStatesei; 
}

Sto facendo una prova così senza pull-down e senza connessione del micro alla GND.

Non so cosa sono per Te dei "micro".
Entrate non collegate a niente sentono i disturbi elettromegnetici e legono cose in modo casuale a seconda del grado di inquinamento elettrico.
Usa F() per il client.pint
Ciao Uwe

L'inizializzazione della Ethernet così

Ethernet.begin(mac, ip, gateway, subnet);

è errata.

Se vuoi usare 4 parametri per l'inizializzazione, ne devi mettere comunque cinque. :roll_eyes:

Ethernet.begin(mac, ip, gateway, gateway, subnet);

perchè il 4° parametro non è la subnet ma il gateway

Ethernet.begin(mac, ip, dns, gateway);

mentre con 5 è

Ethernet.begin(mac, ip, dns, gateway, subnet);

Hai 27 byte sprecati :fearful:, cambia quegli int in byte se alla fine devi solo indicare i numeri dei pin e memorizzare lo stao 0/1
Inoltre hai 6 pulsanti pin 3-5-6-7-8-9... come fa a funzionare senza aver messo nel setup i pinmode in input?

ciao

pablos:
Hai 27 byte sprecati :fearful:

Veramente utilizzando la F() nei print recupera, in RAM, molto più spazio. :wink:

Io mi riferivo alla ram occupata in modo permanente, le variabili pin possono essere messe nel setup e risparmia 12 byte, le altre 15 var dichiarate come int le potrebbe modificare in byte recuperando altri 15 byte.

pinMode(3, INPUT)
CurrentStateuno = digitalRead(ButtonPinuno);  
in
CurrentStateuno = digitalRead(3);

Purtroppo negli esempi c'è il brutto vizio di mettere tutti i pin in integer e non solo ... pure pubblici, per poi usarli una volta sola nel setup e basta, secondo me è un brutto esempio per chi non conosce un po' di programmazione, specie se si ha a che fare con un micro mooolto limitato.

ciao

Ragazzi ho sistemato lo sketch, ditemi se ora va meglio

//simple button GET server code to control servo and arduino pin 5
//for use with IDE 1.0
//open serial monitor to see what the arduino receives
//use the \ slash to escape the " in the html
//for use with W5100 based ethernet shields
//Powering a servo from the arduino usually DOES NOT WORK.
//note that the below bug fix may be required
// http://code.google.com/p/arduino/issues/detail?id=605
 
#include <SPI.h>
#include <Ethernet.h>
 

 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { 192, 168, 1, 5 }; // ip in lan
byte gateway[] = { 192, 168, 1, 1 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
EthernetServer server(80); //server port
 
String readString;
byte ButtonPinuno = 3;        //pin pulsante incremento 
byte ButtonPindue = 5;    //pin pulsante decremento 
byte CurrentStateuno;                  //variabile per lo stato uno corrente 
byte LastStateuno = 0;                //variabile per l'ultimo stato uno 
byte CurrentStatedue;                  //variabile per lo stato due corrente 
byte LastStatedue = 0;            //variabile per l'ultimo stato due  
byte ButtonPintre = 6;        //pin pulsante incremento 
byte ButtonPinquattro = 7; //pin pulsante decremento 
byte CurrentStatetre;                  //variabile per lo stato uno corrente 
byte LastStatetre = 0;                //variabile per l'ultimo stato uno 
byte CurrentStatequattro;              //variabile per lo stato due corrente 
byte LastStatequattro = 0;            //variabile per l'ultimo stato due        //Holds number of button presses 
byte ButtonPincinque =8 ;        //pin pulsante incremento 
byte ButtonPinsei  = 9; //pin pulsante decremento 
byte CurrentStatecinque;              //variabile per lo stato uno corrente 
byte LastStatecinque = 0;              //variabile per l'ultimo stato uno 
byte CurrentStatesei;                  //variabile per lo stato due corrente 
byte LastStatesei = 0;                //variabile per l'ultimo stato due 
int contprima = 0;          //Holds number of button presses.
int contseconda = 0;   //Holds number of button presses
int short contterza = 0;            //Holds number of button presses 
//////////////////////
 
void setup(){
 
pinMode(ButtonPinuno,INPUT);    
 pinMode(ButtonPindue,INPUT);    
 pinMode(ButtonPintre,INPUT);     
 pinMode(ButtonPinquattro,INPUT);     
 pinMode(ButtonPincinque,INPUT);     
 pinMode(ButtonPinsei,INPUT);     

  //start Ethernet
  Ethernet.begin(mac, ip, dns, gateway, subnet);
  server.begin();
  //the pin for the servo co
  //enable serial data print
  Serial.begin(9600);
  Serial.println("server LED test 1.0"); // so I can keep track of what is loaded
}
 
void loop(){
  CheckButton();
  // Create a client connection
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
 
        //read char by char HTTP request
        if (readString.length() < 100) {
 
          //store characters to string
          readString += c;
          //Serial.print(c);
        }
 
        //if HTTP request has ended
        if (c == '\n') {
 
          ///////////////
          Serial.println(readString); //print to serial monitor for debuging
 
          client.println("HTTP/1.1 200 OK"); //send new page
          client.println("Content-Type: text/html");
          client.println();
 
          client.println("<HTML>");
          client.println("<HEAD>");
          client.println("<meta name='apple-mobile-web-app-capable' content='yes' />");
          client.println("<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' />");
          client.print("<meta http-equiv=\"refresh\" content=\"2\">");
          client.println("<link rel='stylesheet' type='text/css' href='http://homeautocss.net84.net/a.css' />");
          client.println("<TITLE>Home Automation</TITLE>");
          client.println("</HEAD>");
          client.println("<BODY>");
          client.println("<H1>Home Automation</H1>");
          client.println("<hr />");
          client.println("
");
          client.println("<a href=\"/?lighton\"\">Turn On Light</a>");
          client.println("<a href=\"/?lightoff\"\">Turn Off Light</a>
");  
          client.println("<hr />");      
          client.println("<H1>Dati Micro</H1>");
          client.println(contprima);
                    client.println(contseconda);
                              client.println(contterza);
          client.println("
");
          client.println("<hr />");
                    client.println("<H1>Questa pagina si aggiorna ogni 2 secondi</H1>");
          client.println("</BODY>");
          client.println("</HTML>");
 
          delay(1);
          //stopping client
          client.stop();
 
          ///////////////////// control arduino pin
          if(readString.indexOf("?lighton") >0)//checks for on
          {
            digitalWrite(6, HIGH);    // set pin 4 high
            Serial.println("Led On");
          }
          else{
          if(readString.indexOf("?lightoff") >0)//checks for off
          {
            digitalWrite(6, LOW);    // set pin 4 low
            Serial.println("Led Off");
          }
          }
          //clearing string for next read
          readString="";
 
        }
      }
    }
  }
}
void CheckButton(void){ 
 CurrentStateuno = digitalRead(ButtonPinuno);           
 CurrentStatedue = digitalRead(ButtonPindue);         
 CurrentStatetre = digitalRead(ButtonPintre);           
 CurrentStatequattro = digitalRead(ButtonPinquattro);     
 CurrentStatecinque = digitalRead(ButtonPincinque);   
 CurrentStatesei = digitalRead(ButtonPinsei); 
 delay(10);  // debounce                                                 

 if(CurrentStateuno != LastStateuno) 
 { 
   if(CurrentStateuno == LOW) 
   { 
     contprima++; 
   } 
 } 
 LastStateuno = CurrentStateuno; 

 if(CurrentStatedue != LastStatedue) 
 { 
   if(CurrentStatedue == LOW) 
   { 
     contprima--; 
   } 
 } 
 LastStatedue = CurrentStatedue; 

 if(CurrentStatetre != LastStatetre) 
 { 
   if(CurrentStatetre == LOW) 
   { 
     contseconda++; 
   } 
 } 
 LastStatetre = CurrentStatetre; 

 if(CurrentStatequattro != LastStatequattro) 
 { 
   if(CurrentStatequattro == LOW) 
   { 
     contseconda--; 
   } 
 } 
 LastStatequattro = CurrentStatequattro; 

 if(CurrentStatecinque != LastStatecinque) 
 { 
   if(CurrentStatecinque == LOW) 
   { 
     contterza++; 
   } 
 } 
 LastStatecinque = CurrentStatecinque; 

 if(CurrentStatesei != LastStatesei) 
 { 
   if(CurrentStatesei == LOW) 
   { 
     contterza--; 
   } 
 } 
 LastStatesei = CurrentStatesei; 
}

Vedi così

#include <SPI.h>
#include <Ethernet.h>

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

String readString;
const byte ButtonPinuno = 3;        //pin pulsante incremento 
const byte ButtonPindue = 5;    //pin pulsante decremento 
byte CurrentStateuno;                  //variabile per lo stato uno corrente 
byte LastStateuno = 0;                //variabile per l'ultimo stato uno 
byte CurrentStatedue;                  //variabile per lo stato due corrente 
byte LastStatedue = 0;            //variabile per l'ultimo stato due  
const byte ButtonPintre = 6;        //pin pulsante incremento 
const byte ButtonPinquattro = 7; //pin pulsante decremento 
byte CurrentStatetre;                  //variabile per lo stato uno corrente 
byte LastStatetre = 0;                //variabile per l'ultimo stato uno 
byte CurrentStatequattro;              //variabile per lo stato due corrente 
byte LastStatequattro = 0;            //variabile per l'ultimo stato due        //Holds number of button presses 
const byte ButtonPincinque =8 ;        //pin pulsante incremento 
const byte ButtonPinsei  = 9; //pin pulsante decremento 
byte CurrentStatecinque;              //variabile per lo stato uno corrente 
byte LastStatecinque = 0;              //variabile per l'ultimo stato uno 
byte CurrentStatesei;                  //variabile per lo stato due corrente 
byte LastStatesei = 0;                //variabile per l'ultimo stato due 
int contprima = 0;          //Holds number of button presses.
int contseconda = 0;   //Holds number of button presses
int short contterza = 0;            //Holds number of button presses 
//////////////////////

void setup(){

  pinMode(ButtonPinuno,INPUT);    
  pinMode(ButtonPindue,INPUT);    
  pinMode(ButtonPintre,INPUT);     
  pinMode(ButtonPinquattro,INPUT);     
  pinMode(ButtonPincinque,INPUT);     
  pinMode(ButtonPinsei,INPUT);     

  //start Ethernet
  Ethernet.begin(mac, ip, gateway, gateway, subnet);
  server.begin();

  //enable serial data print
  Serial.begin(9600);
  Serial.println(F("server LED test 1.0")); // so I can keep track of what is loaded
}

void loop(){
  CheckButton();

  // Create a client connection
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        //read char by char HTTP request
        if (readString.length() < 100) {

          //store characters to string
          readString += c;
          //Serial.print(c);
        }

        //if HTTP request has ended
        if (c == '\n') {

          ///////////////
          Serial.println(readString); //print to serial monitor for debuging

            client.println(F("HTTP/1.1 200 OK")); //send new page
          client.println(F("Content-Type: text/html"));
          client.println();
          client.println(F("<HTML>"));
          client.println(F("<HEAD>"));
          client.println(F("<meta name='apple-mobile-web-app-capable' content='yes' />"));
          client.println(F("<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' />"));
          client.print(F("<meta http-equiv=\"refresh\" content=\"2\">"));
          client.println(F("<link rel='stylesheet' type='text/css' href='http://homeautocss.net84.net/a.css' />"));
          client.println(F("<TITLE>Home Automation</TITLE>"));
          client.println(F("</HEAD>"));
          client.println(F("<BODY>"));
          client.println(F("<H1>Home Automation</H1>"));
          client.println(F("<hr />"));
          client.println(F("
"));
          client.println(F("<a href=\"/?lighton\"\">Turn On Light</a>"));
          client.println(F("<a href=\"/?lightoff\"\">Turn Off Light</a>
"));  
          client.println(F("<hr />"));      
          client.println(F("<H1>Dati Micro</H1>"));
          client.println(contprima);
          client.println(contseconda);
          client.println(contterza);
          client.println(F("
"));
          client.println(F("<hr />"));
          client.println(F("<H1>Questa pagina si aggiorna ogni 2 secondi</H1>"));
          client.println(F("</BODY>"));
          client.println(F("</HTML>"));

          delay(1);
          //stopping client
          client.stop();

          ///////////////////// control arduino pin
          if(readString.indexOf("?lighton") >0)//checks for on
          {
            digitalWrite(6, HIGH);    // set pin 4 high
            Serial.println(F("Led On"));
          }
          else{
            if(readString.indexOf("?lightoff") >0)//checks for off
            {
              digitalWrite(6, LOW);    // set pin 4 low
              Serial.println(F("Led Off"));
            }
          }
          //clearing string for next read
          readString="";

        }
      }
    }
  }
}

void CheckButton(void){ 
  CurrentStateuno = digitalRead(ButtonPinuno);           
  CurrentStatedue = digitalRead(ButtonPindue);         
  CurrentStatetre = digitalRead(ButtonPintre);           
  CurrentStatequattro = digitalRead(ButtonPinquattro);     
  CurrentStatecinque = digitalRead(ButtonPincinque);   
  CurrentStatesei = digitalRead(ButtonPinsei); 
  delay(10);  // debounce                                                 

  if(CurrentStateuno != LastStateuno) 
  { 
    if(CurrentStateuno == LOW) 
    { 
      contprima++; 
    } 
  } 
  LastStateuno = CurrentStateuno; 

  if(CurrentStatedue != LastStatedue) 
  { 
    if(CurrentStatedue == LOW) 
    { 
      contprima--; 
    } 
  } 
  LastStatedue = CurrentStatedue; 

  if(CurrentStatetre != LastStatetre) 
  { 
    if(CurrentStatetre == LOW) 
    { 
      contseconda++; 
    } 
  } 
  LastStatetre = CurrentStatetre; 

  if(CurrentStatequattro != LastStatequattro) 
  { 
    if(CurrentStatequattro == LOW) 
    { 
      contseconda--; 
    } 
  } 
  LastStatequattro = CurrentStatequattro; 

  if(CurrentStatecinque != LastStatecinque) 
  { 
    if(CurrentStatecinque == LOW) 
    { 
      contterza++; 
    } 
  } 
  LastStatecinque = CurrentStatecinque; 

  if(CurrentStatesei != LastStatesei) 
  { 
    if(CurrentStatesei == LOW) 
    { 
      contterza--; 
    } 
  } 
  LastStatesei = CurrentStatesei; 
}

pablos:
Purtroppo negli esempi c'è il brutto vizio di mettere tutti i pin in integer e non solo ... pure pubblici, per poi usarli una volta sola nel setup e basta, secondo me è un brutto esempio per chi non conosce un po' di programmazione, specie se si ha a che fare con un micro mooolto limitato.

Questo è vero, in diversi esempi allegati all'IDE c'è un uso un po' alla leggera dei tipi dei dati. Così però si passa il messaggio che sia il "modo giusto" mentre in realtà andrebbe fatto vedere fin da subito il "giusto modo".
Il classicissimo esempio "Blink" esordisce con:

int led = 13;

Compilato da 1084 byte.

Se si mette

const byte led = 13;

Compilato si ottiene un valore di 1076 byte, ben 8 byte di Flash risparmiata per 1 semplice pin, senza parlare della RAM.

Ho imparato la lezione.D oggi utilizzerò meglio gli int e i byte.Ragazzi devo fare un altra domanda:Apro un altro post o posto qui sempre?