Go Down

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

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