Sistema per controllo da remoto di relè, temperatura e luce

Salve a tutti e complimenti per questo stupendo forum, è da un mesetto che smanetto con arduino, dopo aver letto una miriade di post e guide sono riuscito ad implementare uno sketch che mi permette di controllare da remoto 3 relè, mi legge la temperatura della stanza e la quantità di luce (in quest’ultimo caso in caso di buio mi attiva un’altro relè), ora volevo chiedere a voi utenti del forum se qualcuno mi può aiutare a ottimizzare il codice, a rendere più carina la parte grafica (inoltre vorrei scrivere sulla stessa pagina “stanza illuminata” o “stanza al buio” in base ai valori di luce)… per il momento rinnovo i saluti ed i complimenti.

#define WEBDUINO_AUTH_REALM "Prova Autenticazione"

#include "SPI.h"
#include "Ethernet.h"
#include "WebServer.h"


byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; 
byte ip[] = { 192, 168, 1, 239 };
byte gateway[] = { 192, 168, 1, 1 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask

#define PREFIX ""
WebServer webserver(PREFIX, 272);

boolean Rele1 = false;
boolean Rele2 = false;
boolean Rele3 = false;

//variabili globali per misurare la temperatura
int val_Adc = 0; // pin analogico IN TMP36
float temp=0;
float tempreg = 25.0; // temperatura di controllo in celsius

//variabili globali per misurare la luce
int light; // variabile da calcolare
int ledPinlux = 2; // pin led fotoresistenza
int photoresistor = 1; // pin analogico IN fotoresistore
/*end fotoresistore*/

void defaultCmd(WebServer &server, WebServer::ConnectionType type,char *url_param, bool param_complete)
                     
{
  server.httpSuccess();
  if (type != WebServer::HEAD)
 {
    String s = "";
 
     if (param_complete == true)
    {
      s = url_param;
 
      if ( s == "R1=ON")
      {
        Rele1 = true;
        digitalWrite(3, HIGH);
      }
      else if ( s == "R1=OFF")
      {
        Rele1 = false;
        digitalWrite(3, LOW);
      }
 
      if ( s == "R2=ON")
      {
        Rele2 = true;
        digitalWrite(5, HIGH);
      }
      else if ( s == "R2=OFF")
      {
        Rele2 = false;
        digitalWrite(5, LOW);
      }
 
      if ( s == "R3=ON")
      {
        Rele3 = true;
        digitalWrite(6, HIGH);
      }
      else if ( s == "R3=OFF")
      {
        Rele3 = false;
        digitalWrite(6, LOW);
      }
    }
 
P(helloMsg) = "<h1>Progetto Domotico Antonio</h1><a href=\"private.html\">Accesso</a>";

    server.printP(helloMsg);
     server.print("<h2>User = admin   Password = anno di nascita Antonio</h2>");  
  }
}

void privateCmd(WebServer &server, WebServer::ConnectionType type,
         char *url_param, bool param_complete)
               
 {
    String s = "";
 
     if (param_complete == true)
    {
      s = url_param;
 
      if ( s == "R1=ON")
      {
        Rele1 = true;
        digitalWrite(3, HIGH);
      }
      else if ( s == "R1=OFF")
      {
        Rele1 = false;
        digitalWrite(3, LOW);
      }
 
      if ( s == "R2=ON")
      {
        Rele2 = true;
        digitalWrite(5, HIGH);
      }
      else if ( s == "R2=OFF")
      {
        Rele2 = false;
        digitalWrite(5, LOW);
      }
 
      if ( s == "R3=ON")
      {
        Rele3 = true;
        digitalWrite(6, HIGH);
      }
      else if ( s == "R3=OFF")
      {
        Rele3 = false;
        digitalWrite(6, LOW);
      }
    }        
                   
{ 
 if (server.checkCredentials("YWRtaW46MTk4Mw=="))
  {
    server.httpSuccess();
    if (type != WebServer::HEAD)
    {
      P(helloMsg) = "<h1>Benvenuto</h1>";
        
      server.print("<table border=\"1\">");
    server.print("<tr><td>Stato Rele</td><td>Comandi</td></tr>");
 
    if(Rele1 == true)
      server.print("<tr><td style=\"color: red;\">RELE 1 ON</td><td>");
    else
      server.print("<tr><td style=\"color: black;\">RELE 1 OFF</td><td>");
 
    if(Rele1 == false)
 
    server.print("<input type= button value='Accendi'onclick=\"location.href='private.html?R1=ON'\">");
    else
  
   server.print("<input type= button value='Spegni'onclick=\"location.href='private.html?R1=OFF'\">");
 
    server.print("</td></tr>");
 
    if(Rele2 == true)
      server.print("<tr><td style=\"color: red;\">RELE 2 ON</td><td>");
    else
      server.print("<tr><td style=\"color: black;\">RELE 2 OFF</td><td>");
 
    if(Rele2 == false)
   
      server.print("<input type= button value='Accendi'onclick=\"location.href='private.html?R2=ON'\">");
    else
    server.print("<input type= button value='Spegni'onclick=\"location.href='private.html?R2=OFF'\">");
 
    server.print("</td></tr>");
 
    if(Rele3 == true)
   
      server.print("<tr><td style=\"color: red;\">RELE 3 ON</td><td>");
    else
      server.print("<tr><td style=\"color: black;\">RELE 3 OFF</td><td>");
 
    if(Rele3 == false)
 
    server.print("<input type= button value='Accendi'onclick=\"location.href='private.html?R3=ON'\">");
    else
  
    server.print("<input type= button value='Spegni'onclick=\"location.href='private.html?R3=OFF'\">");
 
    server.print("</td></tr>");
    
    server.printP(helloMsg);
    
 
    
  
    server.println("<p>Temperatura Salotto = ");
    server.print(temp);
    server.println(" °C 
</p>");
    
    
    server.println("<p>Illuminazione = ");
    server.print(analogRead(light));
    server.println("
</p>");
     {
  if (temp < tempreg) {
        // scrive sul web freddo se il valore del termistore è basso
        server.print("<p><strong>FREDDO</strong></p>");
        }
      else {
        // scrive sul web caldo se il valore del termistore è alto
        server.print(" <p><strong>CALDO</strong></p>");
       }   
    }   
   server.print("</td></tr>");     
    }
  }    
  else {
    /* send a 401 error back causing the web browser to prompt the user for credentials */
    server.httpUnauthorized();
  }
}
}
void setup()
{
  Ethernet.begin(mac, ip);
  webserver.setDefaultCommand(&defaultCmd);
  webserver.addCommand("index.html", &defaultCmd);
  webserver.addCommand("private.html", &privateCmd);
  webserver.begin();
  
  delay(100);
  
   //definisci i pin 2 3 4 in uscita
  pinMode(3, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(ledPinlux, OUTPUT);
 
  //inizializza i le uscite
  digitalWrite(3, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
 
}

void loop()
{
  char buff[64];
  int len = 64;

    /* process incoming connections one at a time forever */
  webserver.processConnection(buff, &len);
  //calcolo temperatura 
   val_Adc = analogRead(0);
  //converto il segnale acquisito in un valore
  //espresso in gradi centigradi
  temp = ((val_Adc * 0.00488) - 0.5) / 0.01;
  delay(500);
    
  //calcolo illuminazione
  light = analogRead(photoresistor);
  light = constrain(light, 0, 1023); // limiti dei valori tra 0 e 100
  light = map(light, 0, 150, 255, 0);
  /*fine luce*/  
    if (light < 150) { // accende o spengo un led se la c'è luce
          digitalWrite(ledPinlux, LOW); // accendo
          
        }
        else {
          digitalWrite(ledPinlux, HIGH); //spengo
       
        } 
}

Buona sera a tutti, visto che non ho ricevuto nessuna risposta, faccio io un paio di domande, come posso inserire immagini prelevate da un sito (png, gif), ho acquistato un modulo RTC DS1302 ma nn sono riuscito in nessun modo a configurarlo, qualcuno mi può dare qualche dritta? inoltre vedevo in un post che un utente consigliava di usare la macro F() nelle stampe di testo per risparmiare RAM, posso utilizzarla anche io per ottimizzare il codice?

Grazie e Buona Serata

Ciao, mmm ... tra Sabato e Domenica ... non è che ci sia molta gente a rispondere su queste cose ... :grin:

Comunque, molto rapidamente ...

  1. le immagini le alleghi facendo click, quando sei in Edit, sulla scritta rossa, in basso a sinistra "Additional Option"

  2. per il DS1302 ... guarda QUI e ... se comunque fai una ricerca con Google per "Arduino DS1302" ... te ne esce di roba ... ]:D

  3. la macro F si sua solo con le funzioni di print() o println() e permette di non copiare il RAM le stringhe FISSE (es. i testi dei messaggi) risparmiando così memoria preziosa. Esempio :

Serial.print(F("Questo me un testo fisso davanti a una variabile : "));
Serial.println(pippo);

Guglielmo

Grazie mille Guglielmo, per la risposta, gentilissimo, per quanto riguarda la macro F sei stato chiarissimo e pomeriggio effettuerò le prove, ci siamo fraintesi con le immagini, io intendevo inserire immagini prelevate da un server nello sketch di arduino, inoltre inserendo l'RTC, posso vedere l'ora nella pagina html?

Grazie

Benvenuto. :slight_smile:
Ti invitiamo a presentarti qui: http://forum.arduino.cc/index.php?topic=113640.0
e a leggere il regolamento: http://forum.arduino.cc/index.php?topic=149082.0
Viene anche spiegato come postare le informazioni e il codice.

lupen1983: ci siamo fraintesi con le immagini, io intendevo inserire immagini prelevate da un server nello sketch di arduino, inoltre inserendo l'RTC, posso vedere l'ora nella pagina html?

Ahhhh ... ok ... :grin:

Per le immagini, prima di tutto le devi memorizzare da qualche parte (... e, date le dimensioni, ritengo solo in SD) e poi ... ... come per la temperatura, con la quale creerai una stringa leggibile, devi integrarle nel HTML (rispettandone la sintassi) che trasmetterai con le varie server.print().

Oh ... comunque ... NON stai su un server Apache eh ... stai su una piccolissima MCU che ha 2KB di SRAM ... con tutti i limiti del caso ... :roll_eyes:

Guglielmo

Sto pensando anch'io di usare Arduino per controllare da remoto dei relè. Quindi chiedo che shield utilizzi ? Hai testato il funzionamento con un utilizzo prolungato? Problemi riscontrati ?

alfonso12:
Sto pensando anch’io di usare Arduino per controllare da remoto dei relè. Quindi chiedo che shield utilizzi ?
Hai testato il funzionamento con un utilizzo prolungato? Problemi riscontrati ?

Ciao alfonso12, utilizzo la shiel ethernet e la scheda relè che comunemente si trova in giro, la scheda relè l’alimento in modo autonomo senza prelevare l’alimentazione dall’arduino, per quanto riguarda la stabilità per il momento va benissimo…

Per le immagini, prima di tutto le devi memorizzare da qualche parte (… e, date le dimensioni, ritengo solo in SD) e poi …
… come per la temperatura, con la quale creerai una stringa leggibile, devi integrarle nel HTML (rispettandone la sintassi) che trasmetterai con le varie server.print().

Prfetto, sul fatto che le devo memorizzare sulla sd ci sono, ma qual’è l’istruzione che mi serve per richiamare la stessa dalla sd quando vado a fare il server.print()?
Grazie

lupen1983: Perfetto, sul fatto che le devo memorizzare sulla sd ci sono, ma qual'è l'istruzione che mi serve per richiamare la stessa dalla sd quando vado a fare il server.print()?

Devi usare le funzioni della libreria SD ... sia per scrivere che per leggere ... ;)

Guglielmo

Salve ragazzi, ho un quesito, mi interesserebbe modificare questo sketch in modo che quando si preme il pulsante, il rele si attivi per un secondo e poi torni nella posizione di riposo. Sto sbattendo la testa ma non ci riesco, potete aiutarmi ? Grazie.

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni e a leggere il regolamento: Regolamento - qui una serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections - qui le pinout delle varie schede by xxxPighi: Pinout - qui una serie di link [u]generali[/u] utili: Link Utili