Home
Accesso / Registrazione
 di 

Arduino Ethernet Shield + Accensione LED

3 risposte [Ultimo post]
ritratto di openmind
Offline
Titolo: User
Utente
Ultima visita:
1 anno 23 settimane fa
Utente dal: 29/10/2012
Messaggi: 5

Salve ho un problema con il semplice circuito per l'accensione da remoto di un LED con Arduino Ethernet Shield. Il problema è che una volta acceso il LED nella pagina web del server questo rimane accesso (fin qui tutto bene) ma quando vado a riaprire la pagina web in un secondo momento per spegnerlo o semplicemente per vedere se è ancora acceso questo si spegne automaticamente, come se il circuito ripartisse da zero ogni volta che si connette un nuovo client. Come faccio a non far resettare il client?? 

Grazie in anticipo!

Questo è il codice:

 

#include <String.h>
#include <SPI.h>
#include <Ethernet.h>
 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; 
byte ip[] = { 192, 168, 1, 3 }; // indirizzo IP del server
byte gateway[] = { 192, 168, 1, 1 }; // indirizzo ip del router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
EthernetServer server(80); //server port
 
int ledPin = 2; // LED pin
String readString; //string
boolean LEDON = false; //LED status flag
 
void setup(){
Ethernet.begin(mac, ip, gateway, subnet);
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
 
void loop(){
EthernetClient client = server.available();
if (client) {
  boolean currentLineIsBlank = true;
  while (client.connected()) {
    if (client.available()) {
      char c = client.read();
        readString.concat(c); //store characters to string
      //if HTTP request has ended
      if (c == '\n' && currentLineIsBlank) {
         Serial.print(readString);
        if(readString.indexOf("L=1") > 0) {//lets check if LED should be lighted
          //led has to be turned ON
          digitalWrite(ledPin, HIGH); // set the LED on
          LEDON = true;
          }else{
          //led has to be turned OFF
          digitalWrite(ledPin, LOW); // set the LED OFF
          LEDON = false;
        }
        // now output HTML data starting with standart header
        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: text/html");
        client.println();
        client.print("<html><head><title>ARDUINO Controllo Led via WEB</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body>");
        //send first heading
        client.println("<h1>LED CONTROL by internet connection</h1>");
        client.println("<hr />");
        client.println("<h1>LED control</h1>");
        //printing LED status
        client.print("<span>LED status: </span>");
          if (LEDON) {
          client.println("<span style='color:green'>ON</span>");
            }
            else
            {
          client.println("<span style='color:grey'>OFF</span>");
          }
        client.print("<h2><a href='/?L=1'>ACCENDI</a> | <a href='/?L=0'>SPEGNI</a></h2>");
        client.println("</body></html>");
        readString="";
        client.stop();
 
        } //if c == /n 
    } // if client available
  } // while client connesso
} // if client
} //loop
 
 
ritratto di Arrigo
Online
Titolo: User+
Utente+
Ultima visita:
2 min 43 sec fa
Utente dal: 09/12/2012
Messaggi: 40
Utente PREMIUM
controllo remoto

Ho avuto il tuo stesso problema dovendo realizzare un piccolo antifurto e accensione caldaia con un Arduino2009. Ho risolto come di seguito, vedi se può essere utile, buon 2013,Arrigo
=============================================================

// Controllo remoto 05/05/2012
// poichè sono ancora ai primi passi ho usato
// a larghe mani idee e listati di altri. Ringrazio tutti loro.
// Librerie necessarie per il progetto
#include
#include
#include
#include
#include
#include "Ultrasonic.h"
//creo un array di byte per specificare il mac address
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//creo un array di byte per specificare l'indirizzo ip
byte ip[] = {192, 168, 3, 177}; //modificare questo valore in base alla propria rete

char Data_RX;
String msg = "";
int cmd = 0;

//creao un oggetto server che rimane in ascolto sulla porta specificata
Server ArduinoServer(8080);

int inPin = 2; // pulsante connesso al digital pin 2
int val1 = 0; // variabile per morizzare una misura
int alarmPin = 5; // uscita allarme su digital pin 5
int val2 = 0; // variable memorizzazione allarme
int val3 = 0 ; // variabile per il controllo del refrish
// variabili di data/ora
int hour;
int minute;
int second;
int month;
int day_of_week;
int day;
int year;

// definizione per SHT11 - temperatura interna
#define dataPin 6
#define clockPin 7
SHT1x sht1x(dataPin, clockPin);

//pin dedicati al sensore ultrasuoni
Ultrasonic ultrasonic(8,9);

void setup()
{
//inizializzo la I2C
Wire.begin();
delay(300);
//inizializza lo shield con il mac e l'ip
Ethernet.begin(mac, ip);

//inizializza l'oggetto server
ArduinoServer.begin();

//definisco il modo di pin3 e altri
pinMode(3, OUTPUT);
pinMode(inPin, INPUT);
pinMode(alarmPin, OUTPUT);
}

void loop()
{
//IMPORTANTE pulisco la variabile msg e val3
msg = "";
val3 = 0;
Client client = ArduinoServer.available();

//controllo se client è true
if (client != false)
{
//controllo continuamente che il client sia connesso
while (client.connected())
{
//Controllo se ci sono byte disponibili per la lettura
if (client.available())
{
//leggo i byte disponibili provenienti dal client
Data_RX = client.read();
//ricostruisco la stringa ricevuta concatenando i singoli byte
msg += Data_RX;
//Attendo che tutti i byte siano letti quando Data_RX contiene il carattere
//di nuova linea capisco che tutti i byte sono stati letti
if (Data_RX == '\n')
{
//cerco all'interno della stringa il parametro che mi interessa
delay(2000);
//Invio la risposta al client
//invio lo status code
client.println("HTTP/1.1 200 OK");
//imposto il data type
client.println("Content-Type: text/html");
client.println();
//invio codice html
client.print("");
client.print("");

//Piloto l'uscita e invio lo stato al browser
cmd = msg.indexOf("ON");
if (cmd > 0)
{
val3 = 1;
digitalWrite(3, HIGH);
client.print("");

}
cmd = msg.indexOf("OFF");
if (cmd > 0)
{
val3= 1;
digitalWrite(3, LOW);
client.print("");

}
cmd = msg.indexOf("BLK");
if (cmd > 0)
{
val3 = 1;
digitalWrite(3, HIGH);
client.print("");

delay(6000); // ritardo n-sec per eventuale avvio utilizzi esterni
digitalWrite(3, LOW);
client.print("");

}
cmd = msg.indexOf("DATI");
if (val3=1)
{
cmd=1;
}
if (cmd > 0)
{
// Circuito data-ora I2C metto il registro indirizzi a 0.
Wire.beginTransmission(104); // trasmetto al device #104, il DS1307
Wire.send(0x00);
Wire.endTransmission(); // fine trasmissione
Wire.requestFrom(104, 7); // richiesta di 7 byte da slave DS1307

// determino l'appartenenza del byte
second = Wire.receive();
minute = Wire.receive();
hour = Wire.receive();
day_of_week=Wire.receive();
day = Wire.receive();
month = Wire.receive();
year = Wire.receive();

// Conversione di tutti i valori in decimale
hour=hour/16 * 10 + hour % 16;
minute=minute/16 * 10 + minute % 16;
second=second/16 * 10 + second % 16;
day=day/16 * 10 + day % 16;
month=month/16 * 10 + month % 16;
year=2000 + year/16 * 10 + year % 16;
delay(500);
client.print("Scheda Arduino2009 + scheda Ethernet ");
client.println("
");
client.print("Test real time on line -- Ciao, Arrigo ");
client.println("
");
client.println("
");
// scrittura data
if (day < 10) { client.print("0"); }
client.print(day);
delay(100);
client.print("/");
if (month < 10) { client.print("0"); }
client.print(month);
delay(100);
client.print("/");
client.print(year);
delay(100);
client.print(" ---- ");

// scrittura ora
if (hour < 10) { client.print("0"); }
client.print(hour);
delay(100);
client.print(":");
if (minute < 10) { client.print("0"); }
client.print(minute);
delay(100);
client.print(":");
if (second < 10) { client.print("0"); }
client.print(second);
delay(100);
client.println("
");
client.println("
");
delay(300);
// trasmette il valore di ciascun ingresso analogico
for (int analogChannel = 0; analogChannel < 4; analogChannel++) {
client.print("analog input ");
client.print(analogChannel);
client.print(" is ");
client.print(analogRead(analogChannel));
client.println("
");
client.println("
");
}
val1 = digitalRead(3); // read the input pin
client.print(" Relay_1 ");
if (val1 > 0){client.print(" ON ");}
if (val1 < 1){client.print(" OFF ");}
client.println("
");
delay(100);
// controlla lo stato del sensore ultrasuoni
delay(200);
val2=ultrasonic.Ranging(CM);
delay(100);
if (val2<70){
digitalWrite(alarmPin, HIGH); //eccita il relè
delay(100);
client.println("
");
client.print(" Area libera cm ");
client.print(val2);
delay(100);
client.print(" -->>> ALLARME "); // trasmette l'allarme
client.println("
");
delay(2000);
}
else
{
digitalWrite(alarmPin, LOW); // relè diseccitato
client.println("
");
client.print(" Area libera cm ");
client.print(val2);
client.print(" -->> TUTTO OK "); // trasmette OK
client.println("
");
}
//legge Temperatura e Umidità del sensore SHT11
float temp_c;
int humidity;
temp_c = sht1x.readTemperatureC();
humidity = sht1x.readHumidity();
delay(300);
client.println("
");
client.print(" Temperatura interna ");
client.print((temp_c-2),1);
client.print(" gradiC");
client.println("
");
client.println("
");
client.print(" Umidita' interna ");
client.print(humidity); //Umidità
client.print("% ");
client.println("
");
client.println("
");
}
client.print("");
//aspetto 4 ms affinchè la risposta giunga al browser del client
delay(4);
//esco dal ciclo while una volta completato l'invio della risposta
break;
}
}
}
//chiudo la connessione
client.stop();
}

ritratto di openmind
Offline
Titolo: User
Utente
Ultima visita:
1 anno 23 settimane fa
Utente dal: 29/10/2012
Messaggi: 5
Grazie

Si grazie ho risolto, bastava spezzare l'if, cioè invece di fare un if-else basta fare due if così da non escludere la situazione nuovo client senza nessuna stringa nell' URL

ritratto di valisi
Offline
Ultima visita:
1 anno 20 settimane fa
Utente dal: 13/01/2013
Messaggi: 1
Ottimo! era lo stesso

Ottimo! era lo stesso problema che avevo anche io! Ho tolto l'Else e funziona perfettamente. Grazie. Carlo

 

 

Login   
 Twitter Facebook LinkedIn Youtube Google RSS

Chi è online

Ci sono attualmente 15 utenti e 96 visitatori collegati.

Ultimi Commenti