Go Down

Topic: Arduino Ethernet e valori falsificati (Read 606 times) previous topic - next topic

francescoprisco

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

Code: [Select]


#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("<br />");
         client.println("<a href=\"/?lighton\"\">Turn On Light</a>");
         client.println("<a href=\"/?lightoff\"\">Turn Off Light</a><br />");  
         client.println("<hr />");      
         client.println("<H1>Dati Micro</H1>");
         client.println(contprima);
                   client.println(contseconda);
                             client.println(contterza);
         client.println("<br />");
         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;
}

uwefed

Quote
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

PaoloP

#2
Apr 11, 2013, 10:27 am Last Edit: Apr 11, 2013, 10:29 am by PaoloP Reason: 1
L'inizializzazione della Ethernet così
Code: [Select]
Ethernet.begin(mac, ip, gateway, subnet);
è errata.

Se vuoi usare 4 parametri per l'inizializzazione, ne devi mettere comunque cinque.  :smiley-roll-blue:
Code: [Select]
Ethernet.begin(mac, ip, gateway, gateway, subnet);
perchè il 4° parametro non è la subnet ma il gateway
Code: [Select]
Ethernet.begin(mac, ip, dns, gateway);
mentre con 5 è
Code: [Select]
Ethernet.begin(mac, ip, dns, gateway, subnet);
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

pablos

#3
Apr 11, 2013, 10:45 am Last Edit: Apr 11, 2013, 11:11 am by pablos Reason: 1
Hai 27 byte sprecati  :smiley-eek-blue:, 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
no comment

PaoloP


Hai 27 byte sprecati  :smiley-eek-blue:


Veramente utilizzando la F() nei print recupera, in RAM, molto più spazio.  ;)
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

pablos

#5
Apr 11, 2013, 12:11 pm Last Edit: Apr 11, 2013, 12:31 pm by pablos Reason: 1
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.

Code: [Select]
pinMode(3, INPUT)

Code: [Select]
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
no comment

francescoprisco

Ragazzi ho sistemato lo sketch, ditemi se ora va meglio

Code: [Select]
//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("<br />");
          client.println("<a href=\"/?lighton\"\">Turn On Light</a>");
          client.println("<a href=\"/?lightoff\"\">Turn Off Light</a><br />"); 
          client.println("<hr />");     
          client.println("<H1>Dati Micro</H1>");
          client.println(contprima);
                    client.println(contseconda);
                              client.println(contterza);
          client.println("<br />");
          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;
}

PaoloP

Vedi così
Code: [Select]
#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("<br />"));
          client.println(F("<a href=\"/?lighton\"\">Turn On Light</a>"));
          client.println(F("<a href=\"/?lightoff\"\">Turn Off Light</a><br />")); 
          client.println(F("<hr />"));     
          client.println(F("<H1>Dati Micro</H1>"));
          client.println(contprima);
          client.println(contseconda);
          client.println(contterza);
          client.println(F("<br />"));
          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;
}
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

leo72


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:
Code: [Select]

int led = 13;

Compilato da 1084 byte.

Se si mette
Code: [Select]
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.

francescoprisco

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?

Go Up