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
Hai 27 byte sprecati , 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?
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.
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;
}
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.