Arduino: baby you can light my fire

Il mio Arduino è raggiungibile via web e adesso ti permette di accendere o spegnere la luce del mio comodino. Al pomeriggio batte il sole e quindi potresti non accorgerti della differenza.

Il codice  funziona ma non ancora bene, sospetto qualche problema di logica: se accedo dal PC accende e subito spegne; se accedo da telefono ci vogliono due clic per spegnere. Cosa sarà?

Dopo il salto, metto il codice che terrò aggiornato all’ultima versione. Se sei capace e hai qualche suggerimento da darmi, te ne sarò immensamente grato.

Versione 0.6 del 22/01/2012: la luce si accende solo se la stanza è al buio.

Versione 0.61 del 30/01/2012: lo stato della luce viene inizializzato correttamente.

/*
  Web Server Temp Light Relais
 
 Turn on/off an electrical appliance via web 
 
 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 * Analog inputs attached to pins A0 and A5 (optional)
 * Digital output attached to pin 9
 * Relay board
 
 created 18 Dec 2009
 by David A. Mellis
 modified 4 Sep 2010
 by Tom Igoe
 modified 30 jan 2012
 by Gaspar Torriero
 tip hat to Gianni Favilli www.giannifavilli.it
 
 */
#include <String.h>
#include <SPI.h>
#include <Ethernet.h>

int pagine = 0;
int tPin = 0; // Temperature sensor pin
int lPin = 5; // Light sensor pin
int outPin = 9; // relais pin 
float temp = 0.0; // Temperature in C°
int luce = 0; // light in Lux
boolean oldLEDON; // previous relay status
boolean LEDON; // new relay status
String readString; //string

// Enter a MAC address and IP address for your controller below.
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,XXX, XXX); // change according to your IP settings

// Initialize the Ethernet server library
// with the IP address and port you want to use 
// (port 80 is default for HTTP):
EthernetServer server(80);

void setup()
{
  // start the Ethernet connection and the server:
  pinMode(outPin, OUTPUT);
  Ethernet.begin(mac, ip);
  server.begin();
  // initialise light status
  if (luce < 201) {
    oldLEDON = false
  }
  else {
    oldLEDON = true
  }
}

void loop()
{
  temp = ( 5.0 * analogRead(tPin) * 100.0) / 1024.0; // Conversione voltaggio sensore in temperatura
  luce = (analogRead(lPin) * 10000.0) / 1024.0; //Conversione voltaggio sensore in Lux
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        readString.concat(c); //store characters to string

        if (c == '\n' && currentLineIsBlank) {

          // take the request from the web
          if(readString.indexOf("L=1") > 0) { // lettura del valore se il LED si deve accendere
            LEDON = true;
          }
          else {
            LEDON = false;
          }
          while(LEDON != oldLEDON) { //if status has changed
            if(LEDON==true&&luce<201) { //and there is no other light
              digitalWrite(outPin, HIGH); // turn on the light
            }
            else if(LEDON==false) {
              digitalWrite(outPin, LOW); //turn off the light
            }
            oldLEDON = LEDON; // save changed status into previous status
          }

          // Build the HTML page
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          client.print("<html><head><title>Gasparduino Web Server Ver. 0.3</title><meta http-equiv='Content-Type' content='text/html; charset=utf-8' ></head><body>");

          // output the value of analog input pins
          client.print("<h1>Gaspar Torriero gone Arduino</h1><hr />");
          client.println("<br />");
          client.print("Temperatura corrente: ");
          client.print(temp);
          client.print("°C");
          client.println("<br />");
          client.print("Nella stanza ");
          if (luce > 200) {
            client.print("c'è luce.");
          }
          else {
            client.print("è buio.");
          }
          client.println("<br />");
          client.print(luce);
          client.print(" Lux");
          client.println("<br />");
          client.print("Visite dall'ultimo riavvio: ");
          client.print(pagine);
          pagine=pagine+1;
          client.println("<br />");
          client.print("<h2><a href='/?L=1'>ACCENDI</a> | <a href='/?L=0'>SPEGNI</a></h2>");
          break;
        } // if(currentline is blank)
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }

        delay(1); // give the web browser time to receive the data

      } // if(client.available)

    } // while(client.connected)
    client.println("</body></html>");
    readString=""; // pulisco la stringa per la successiva lettura

  } // if client

  client.stop(); // close the connection:// void loop

6 risposte a “Arduino: baby you can light my fire”

  1. Ma la temperatura dove la misura? Perché dice che sul comodino hai 4° 😀

    1. stavo sostituendo i connettori rigidi con cavetti flessibili, probabilmente ti sei connesso in un momento in cui il sensore della temperatura era staccato 🙂

    1. Quello di Favilli non è un progetto parallelo, è quello da dove ho scopiazzato grossi pezzi di codice 🙂 e infatti hai visto che l’ho messo nei credits assieme a David Mellis e Tom Igoe?

I commenti sono chiusi