Info pilotaggio relè da remoto

Buona sera a tutti!

sono ancora alle prese con un progetto in cui devo pilotare 16 relè da remoto. La mia è una domanda molto semplice: è possibile scrivere tutta la parte html direttamente dentro l'atmel oppure urge il supporto della sd ??? Sono diversi giorni che cerco di capire questa cosa, e noto che quando "sovraccarico" la memoria con + relè da pilotare dopo qualche pilotaggio riuscito il sistema si blocca e non riparte fin quando non stacco fisicamente l'alimentazione dall'arduino e la rimetto (non basta neanche il semplice tasto reset).

Vi ringrazio anticipatamente per la disponibilità !!!

è possibile scrivere tutta la parte html direttamente dentro l'atmel oppure urge il supporto della sd

Certo che e' possibile, ma data la scarsa Ram di Arduino ci si possono permettere pochi fronzoli

quando "sovraccarico" la memoria con + relè da pilotare dopo qualche pilotaggio riuscito il sistema si blocca e non riparte

Probabilmente il problema e' duplice, poca ram e poca corrente a disposizione

Quindi mi consigli di scrivere una pagina html da caricare sulla sd e pilotare ttt da li? Inoltre tenevo a specificare k x ora i test li sto facenso su 16 led, quindi al momento il problema "energia elettrica" non sussiste

Parlo da "principiante" quindi prendilo con le "pinze", dipende dalla estensione del tuo codice e dalla giusta implementazione delle variabili in RAM, se sai giostrare correttamente, penso che potresti anche farcela, ma non conoscendo cosa stai facendo, onestamente non saprei dirti di più.

Per il fatto che si blocchi, questo è strano, ma non impossibile, anche a mè mi è capitato di bloccare la UNO dove nemmeno il reset sortiva effetto, se non ricordo male, aveva a che fare con la seriale, ovvero, se tentavo di spedire al PC una mole di dati che in realtà, nel mio caso, bloccava l'IDE e anche la UNO, solo un riavvio dell'IDE e un riavvio della UNO normalizzava la cosa, da premettere che potrebbe essere anche un problema del mio PC, non so.

Perchè non posti lo sketch, così gli utenti più esperti ti potranno dare consigli più utili.

Sulla potenza della UNO, io posso dirti che ci sto facendo una "centralina Gestione Motore" e fino ad ora, se la sta cavando benissimo (mediante l'uso degli interrupt e dei timers più lo sfruttamento di codice C puro in alcune funzioni "critiche" per ottimizzare il corretto funzionamento, fino ad ora sono a buon punto), peccato che la EEPROM è troppo piccola per contenere tutte le mappe necessarie, e quindi presto farò un porting verso un micro più capiente (Atmega1284p) e forse in futuro, quando avrò perfezzionato il tutto, verso un bel 32 bit (sempre atmel, ma non la DUE, troppo grosso e poco "Automotive")...

In verità pensavo che scrivere un file html da caricare sulla sd e gestire il piccolo server direttamente da lì potesse aiutare ad alleggerire la cosa, ma i miglioramenti non sono stati così evidenti ed il caricamento della pagina ad ogni click è veramente lentissimo :S

ho provato anche diversi codici postati da vari utenti in cui c’è la gestione di 5 / 8 uscite con l’html scritto totalmente nello sketch dell’arduino, ma il mio dopo pochi tentativi va in tilt ed associavo questa cosa alla scarsa memoria ram disponibile :S :S :S

copio ed incollo un codice trovato qui in rete che ho usato per fare questo tipo di prove e che a me dopo due o tre click al massimo manda in tilt il server:

#include <SPI.h>
#include <Ethernet.h> 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 2, 177 };
EthernetServer server(80);
String readString;

byte out_1 = 40;
byte out_2 = 41;
byte out_3 = 42;
byte out_4 = 43;
byte out_5 = 44;

void setup()
{ 
  Ethernet.begin(mac, ip);
  pinMode(out_1, OUTPUT);
  pinMode(out_2, OUTPUT);
  pinMode(out_3, OUTPUT); 
  pinMode(out_4, OUTPUT);
  pinMode(out_5, 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);   
        if (c == '\n' && currentLineIsBlank) {
          //Serial.print(readString);
               
        if(readString.indexOf("on_1") > 0) digitalWrite(out_1, HIGH);        
        if(readString.indexOf("off_1") > 0) digitalWrite(out_1, LOW);          
        if(readString.indexOf("on_2") > 0) digitalWrite(out_2, HIGH);        
        if(readString.indexOf("off_2") > 0) digitalWrite(out_2, LOW);          
        if(readString.indexOf("on_3") > 0) digitalWrite(out_3, HIGH);        
        if(readString.indexOf("off_3") > 0) digitalWrite(out_3, LOW); 
        if(readString.indexOf("on_4") > 0) digitalWrite(out_4, HIGH);        
        if(readString.indexOf("off_4") > 0) digitalWrite(out_4, LOW);
        if(readString.indexOf("on_5") > 0) digitalWrite(out_5, HIGH);        
        if(readString.indexOf("off_5") > 0) digitalWrite(out_5, LOW);
         
        //  PAGINA HTML      
        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: text/html");
        client.println();
        client.print("<html><head><title>ARDUINO Controllo WEB</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body>");
        client.print("

");
       
        client.print("<span>STATO LUCE 1 </span>");
        if (digitalRead(out_1)== true) client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"ON\" STYLE=\"background-color:#00FF00\"/>");  
        else client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"OFF\" STYLE=\"background-color:#C0C0C0\"/>");
        client.print("<p><p/>");   
        client.print("<input type=\"button\" style=\"width:120px; height:80px\" value=\"On\" onclick =\" location.href='/?on_1'\">");
        client.print("<input type=\"button\" style=\"width:120px; height:80px\" value=\"Off\" onclick =\" location.href='/?off_1'\">");                   
        client.print("<p><p/>");
        
        client.print("<span>STATO LUCE 2 </span>");       
        if (digitalRead(out_2)== true) client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"ON\" STYLE=\"background-color:#00FF00\"/>");  
        else client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"OFF\" STYLE=\"background-color:#C0C0C0\"/>");       
        client.print("<p><p/>"); 
        client.print("<input type=\"button\" style=\"width:120px; height:80px\" value=\"On\" onclick =\" location.href='/?on_2'\">");
        client.print("<input type=\"button\" style=\"width:120px; height:80px\" value=\"Off\" onclick =\" location.href='/?off_2'\">");
        client.print("<p><p/>");
        
        client.print("<span>STATO LUCE 3 </span>");
        if (digitalRead(out_3)== true) client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"ON\" STYLE=\"background-color:#00FF00\"/>");  
        else client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"OFF\" STYLE=\"background-color:#C0C0C0\"/>");
        client.print("<p><p/>");
        client.print("<input type=\"button\" style=\"width:120px; height:80px\" value=\"On\" onclick =\" location.href='/?on_3'\">");
        client.print("<input type=\"button\" style=\"width:120px; height:80px\" value=\"Off\" onclick =\" location.href='/?off_3'\">");        
        client.print("<p><p/>");
        
        client.print("<span>STATO LUCE 4 </span>");
        if (digitalRead(out_4)== true) client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"ON\" STYLE=\"background-color:#00FF00\"/>");  
        else client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"OFF\" STYLE=\"background-color:#C0C0C0\"/>");
        client.print("<p><p/>");
        client.print("<input type=\"button\" style=\"width:120px; height:80px\" value=\"On\" onclick =\" location.href='/?on_4'\">");
        client.print("<input type=\"button\" style=\"width:120px; height:80px\" value=\"Off\" onclick =\" location.href='/?off_4'\">");        
        client.print("<p><p/>");
        
        client.print("<span>STATO LUCE 5 </span>");
        if (digitalRead(out_5)== true) client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"ON\" STYLE=\"background-color:#00FF00\"/>");  
        else client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"OFF\" STYLE=\"background-color:#C0C0C0\"/>");
        client.print("<p><p/>");
        client.print("<input type=\"button\" style=\"width:120px; height:80px\" value=\"On\" onclick =\" location.href='/?on_5'\">");
        client.print("<input type=\"button\" style=\"width:120px; height:80px\" value=\"Off\" onclick =\" location.href='/?off_5'\">");
        client.println("</body></html>");
         
        readString="";
        
        delay(1);
        client.flush();
        client.stop(); 
        }
      }
    }
  }
}

magari qualcuno puo caricarlo e controllare se è un problema dell’arduino o se in particolare è la mia scheda ad avere qualche problema =( =( =(

P.S. sto usando un arduino MEGA 2560 perchè mi servivano più pin dato che devo poter pilotare i relè sia attraverso dei pulsanti che attraverso remoto

Se non fosse che l’ho fatto io 2-3 anni fa quello scketch ti direi … ma chi ha fatto quel pasticcio :))
Comunque le cose sono un po’ cambiate da allora, c’era poco e niente sull’argomento webserver e avevo 0 exp sugli AVR

  1. Puoi ridurre il peso della pagina da come è adesso a 1/5 mantenendola identica.
  2. Inoltre l’analisi del pacchetto di ritorno indexof lo puoi fare con una riga sola.
  3. togli quei byte di pin e mettili direttamente nel setup, non serve a nulla tenerli in ram
  4. ti manda in tilt tutto perchè ne setup mancano i pin di controllo ethernet
  5. è lento perchè non hai ottimizzato il core della MEGA

come vedi ha molte linee ripetute e sempre uguali e quelle puoi salvarle con un progmem e richiamarle quando servono e sarebbe una sola linea

58: if (digitalRead(out_1)== true) client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"ON\" STYLE=\"background-color:#00FF00\"/>");
 66: if (digitalRead(out_2)== true) client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"ON\" STYLE=\"background-color:#00FF00\"/>");
 74: if (digitalRead(out_3)== true) client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"ON\" STYLE=\"background-color:#00FF00\"/>");
 82: if (digitalRead(out_4)== true) client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"ON\" STYLE=\"background-color:#00FF00\"/>");
 90: if (digitalRead(out_5)== true) client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"ON\" STYLE=\"background-color:#00FF00\"/>");

anche queste sono tutte uguali fanne una riga sola e richiamala quando scrivi al client

 59: else client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"OFF\" STYLE=\"background-color:#C0C0C0\"/>");
 67: else client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"OFF\" STYLE=\"background-color:#C0C0C0\"/>");
 75: else client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"OFF\" STYLE=\"background-color:#C0C0C0\"/>");
 83: else client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"OFF\" STYLE=\"background-color:#C0C0C0\"/>");
 91: else client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"OFF\" STYLE=\"background-color:#C0C0C0\"/>");

queste mettile insieme alla linea di sopra e fanne un unico char array

 60: client.print("<p><p/>");
 63: client.print("<p><p/>");
 68: client.print("<p><p/>");
 71: client.print("<p><p/>");
 76: client.print("<p><p/>");
 79: client.print("<p><p/>");
 84: client.print("<p><p/>");
 87: client.print("<p><p/>");
 92: client.print("<p><p/>");

altrimenti ti costruisci un for di 5 cicli e cambi solo le variabili che ti servono, potresti avere anche una pagina web con 200 pin da controllare con sole 4 righe

questo … basta solo un digitalwrite e un solo index of analizzando e costruendo la stringa, il dato da mandare al digitalwrite lo possiedi già alla prima risposta quindi spezza le stringhe e cabia dato, poi con atoi()
invece di mandare off_1 … on_1 , manda 070 e 071 … 140 e 141 … 441 e 440 per pin 44 … 400 e 401 per pin 40
poi prendi il numero 07=pin, il 1 = on …14=pin e 1 =on … (441) = pin 44 a 1 … (440)=pin 44 a 0
quindi tradotto sarebbe digitalWrite(x,y);

dString.indexOf("on_1") > 0) digitalWrite(out_1, HIGH);        
        if(readString.indexOf("off_1") > 0) digitalWrite(out_1, LOW);          
        if(readString.indexOf("on_2") > 0) digitalWrite(out_2, HIGH);        
        if(readString.indexOf("off_2") > 0) digitalWrite(out_2, LOW);          
        if(readString.indexOf("on_3") > 0) digitalWrite(out_3, HIGH);        
        if(readString.indexOf("off_3") > 0) digitalWrite(out_3, LOW); 
        if(readString.indexOf("on_4") > 0) digitalWrite(out_4, HIGH);        
        if(readString.indexOf("off_4") > 0) digitalWrite(out_4, LOW);
        if(readString.indexOf("on_5") > 0) digitalWrite(out_5, HIGH);        
        if(readString.indexOf("off_5") > 0) digitalWrite(out_5, LOW);

10 righe e fai tutta la parte clientprint

Se i pin non sono consecutivi e quindi usando un for ti viene scomodo usi una array dei pin da usare
byte pin= {7,14,44,40,13,8,9…}; da usare nel for

o meglio ancora impara a usare la manipolazione delle porte PORTA PORTB PORTC ecc ecc

ciao

Ti conviene scrivere una pagina html separata incorporata nella sd della shield ethernet almeno io così ho fatto per pilotare 4 utenze da 220 v attaccate. A 4 relè e il tutto ha funzionato benissimo se vuoi ti passo codice arduino e pagina html :)

Ciao Daniele sarebbe molto gentile da parte tua almeno così avrei materiale da studiare e testare.

Grazie dei preziosissimi consigli Pablo, entro stasera vedrò di metterli in pratica così se avrò problemi in qualche passaggio nel codice e potrai aiutarmi ti chiederò qualche consiglio!!!!

:) :) :) ;) ;) ;) ;) :D :D :D :D

Ti conviene scrivere una pagina html separata incorporata nella sd della shield ethernet

non ottimizzi lo stesso le performance della scheda, più codice html devi caricare più tempo ci metti a elaborare. In entrambi i casi il peso va rivisto.

Grazie delle info Pablo!

sto cercando di ottimizzare lo sketch, e la prima difficoltà è il progmem :roll_eyes:

non l’ho mai usato e sto cercando di documentarmi in rete, e da quello che ho capito è che esiste una libreria apposta (#include <avr/pgmspace.h>) ma non riesco a capire se è una libreria già presente nel software di arduino o la devo scaricare da qualche parte, xkè in questo secondo caso non riesco a capire da dove scaricarla :S :S :S

sapresti indirizzarmi al riguardo???

Inoltre io ho una ethernet shiled… sicuro che devo definire i pin ??? io pensavo che essendo la shield compatibile anche con l’arduino mega non c’era bisogno di questo passaggio, anche xkè ripeto, fino a 3 pin (in html) fila tutto liscio, quando inizio a scrivere di + in html iniziano i problemi !!!

Inoltre io ho una ethernet shiled… sicuro che devo definire i pin ???

certo altrimenti è instabile, è già compreso nello sketch sotto (non hai letto abbastanza sull’argomento instabilità della ethernet)

ho usato la flash qui, studiati il progmem se vuoi imparare a usarlo, ma in questo caso cambierebbe poco

sketch per visualizzare 9 pin su html

#include <SPI.h>
#include <Ethernet.h> 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 2, 177 };
EthernetServer server(80);

void setup(){   
  for (byte i = 40; i < 47; i++) pinMode(i, OUTPUT);  
  pinMode(10, OUTPUT); digitalWrite(10, 1);  // ethernet
  pinMode(4, OUTPUT); digitalWrite(4, 1);  // SD dello shield anche se non si usa
  Ethernet.begin(mac, ip);  
}
 
void loop(){
 
 EthernetClient  client = server.available();
 
  if (client) {
    String readString;
    boolean currentLineIsBlank = true;
   
    while (client.connected()) {
      if (client.available()) {                
         int8_t c = client.read();
         readString += (char)c;                   
            if (c == '\n' && currentLineIsBlank) {
               
        //----------------questo pezzo rallenta molto va rivisto (risponde solo a 5 pin) --------------------
        if(readString.indexOf("on_1") > 0) digitalWrite(40, 1);        
        if(readString.indexOf("off_1") > 0) digitalWrite(40, 0);          
        if(readString.indexOf("on_2") > 0) digitalWrite(41, 1);        
        if(readString.indexOf("off_2") > 0) digitalWrite(41, 0);          
        if(readString.indexOf("on_3") > 0) digitalWrite(42, 1);        
        if(readString.indexOf("off_3") > 0) digitalWrite(42, 0); 
        if(readString.indexOf("on_4") > 0) digitalWrite(43, 1);        
        if(readString.indexOf("off_4") > 0) digitalWrite(43, 0);
        if(readString.indexOf("on_5") > 0) digitalWrite(44, 1);        
        if(readString.indexOf("off_5") > 0) digitalWrite(44, 0);
        //----------------------------------------------------------------
        //  PAGINA HTML      
        client.println(F("HTTP/1.1 200 OK\n Content-Type: text/html\n"));       
        client.print(F("<html><head><title>ARDUINO Controllo WEB</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body>"));       
       
        for (byte i = 1; i < 10; i++){ // numero di pin da visualizzare             
          client.print("<table border=\"1\" style=\"width:450px\"><tr><td>LUCE "+ String(i));       
          if (digitalRead(39+i)) client.print(F("</td> <td><input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"ON\" STYLE=\"background-color:#00FF00\"/></td>"));  
          else client.print(F("</td> <td><input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"OFF\" STYLE=\"background-color:#C0C0C0\"/></td>"));              
          client.print("<td><input type=\"button\" style=\"width:100px; height:50px\" value=\"On\" onclick =\" location.href='/?on_"+String(i)+"'\"></td>");
          client.print("<td><input type=\"button\" style=\"width:100px; height:50px\" value=\"Off\" onclick =\" location.href='/?off_"+String(i)+"'\"></td></tr></table>");         
        }
        
        client.println(F("</body></html>"));         
        readString="";
        
        delay(1);
        client.flush();
        client.stop(); 
        }
      }
    }
  }
}

secondo te la parte di codice che dicevi che rallenta molto scritta così potrebbe giovare???

for (byte i = 22; i < 38; i++){
        if(readString.indexOf("on_"+String(i)) > 0) digitalWrite(i, 1);        
        if(readString.indexOf("off_"+String(i)) > 0) digitalWrite(i, 0);          
        
        
        //  PAGINA HTML      
        client.println(F("HTTP/1.1 200 OK\n Content-Type: text/html\n"));       
        client.print(F("<html><head><title>Web Led FC POWER </title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body>"));       
                
          client.print("<table border=\"1\" style=\"width:450px\"><tr><td>PIN "+ String(i));       
          if (digitalRead(39+i)) client.print(F("</td> <td><input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"ON\" STYLE=\"background-color:#00FF00\"/></td>"));  
          else client.print(F("</td> <td><input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"OFF\" STYLE=\"background-color:#C0C0C0\"/></td>"));              
          client.print("<td><input type=\"button\" style=\"width:100px; height:50px\" value=\"On\" onclick =\" location.href='/?on_"+String(i)+"'\"></td>");
          client.print("<td><input type=\"button\" style=\"width:100px; height:50px\" value=\"Off\" onclick =\" location.href='/?off_"+String(i)+"'\"></td></tr></table>");         
        }

Pablos, grazie a te con questo codice riesco a gestire 16 ingressi :wink:

#include <SPI.h>
#include <Ethernet.h> 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 0, 220 };
EthernetServer server(80);

void setup(){   
  for (byte i = 22; i < 38; i++) pinMode(i, OUTPUT);  
  pinMode(10, OUTPUT); digitalWrite(10, 1);  // ethernet
  pinMode(4, OUTPUT); digitalWrite(4, 1);  // SD dello shield anche se non si usa
  Ethernet.begin(mac, ip);  
}
 
void loop(){
 
 EthernetClient  client = server.available();
 
  if (client) {
    String readString;
    boolean currentLineIsBlank = true;
   
    while (client.connected()) {
      if (client.available()) {                
         int8_t c = client.read();
         readString += (char)c;                   
            if (c == '\n' && currentLineIsBlank) {
        
                      //  PAGINA HTML      
        client.println(F("HTTP/1.1 200 OK\n Content-Type: text/html\n"));       
        client.print(F("<html><head><title>ARDUINO Controllo WEB</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body>"));   
        
        for (byte i = 22; i < 38; i++){
        if(readString.indexOf("on_"+String(i)) > 0) digitalWrite(i, 1);        
        if(readString.indexOf("off_"+String(i)) > 0) digitalWrite(i, 0);            
       
          client.print("<table border=\"0\" style=\"width:450px\"><tr><td>LUCE "+ String(i));       
          if (digitalRead(i)) client.print(F("</td> <td><input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"ON\" STYLE=\"background-color:#00FF00\"/></td>"));  
          else client.print(F("</td> <td><input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"OFF\" STYLE=\"background-color:#C0C0C0\"/></td>"));              
          client.print("<td><input type=\"button\" style=\"width:100px; height:50px\" value=\"On\" onclick =\" location.href='/?on_"+String(i)+"'\"></td>");
          client.print("<td><input type=\"button\" style=\"width:100px; height:50px\" value=\"Off\" onclick =\" location.href='/?off_"+String(i)+"'\"></td></tr></table>");         
        }
        
        client.println(F("</body></html>"));         
        readString="";
        
        delay(1);
        client.flush();
        client.stop(); 
        }
      }
    }
  }
}

Ora mi tocca integrarlo con questo qui che ho scritto un mese fa per permettere di accendere i led sia attraverso il web che in maniera “analogica”

#define DOUT2 2
#define DOUT3 3

int const rele = 16;
int x;
int An[rele] = {A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15};
int D[rele] = {22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37};
int statoLed[rele];

void setup () {

  Serial.begin(57600);
  Serial.println("Web FC Power");
  
  pinMode( DOUT2, INPUT );
  pinMode( DOUT3, INPUT );
 
  for (x = 0; x < rele; x++){
    pinMode( An[x], INPUT );
    pinMode( D[x], OUTPUT );
    digitalWrite( D[x], statoLed[x] );
  }
}
  
void loop() {

for(x = 0; x < rele; x++) {

  if (analogRead(An[x]) > 1000){

    if (statoLed[x] == LOW) {
     statoLed[x] = HIGH;
     Serial.print("Received pin ");
     Serial.print(D[x]);
     Serial.println(" ON command");
   }
 
   else {
     statoLed[x] = LOW;
     Serial.print("Received pin ");
     Serial.print(D[x]);
     Serial.println(" OFF command");
  }
 
   digitalWrite(D[x], statoLed[x]);
   delay(500);
  }
}

///////////////////////////////////
  
 if ( digitalRead(DOUT3) > 0 ){

    statoLed[0] = HIGH;
    statoLed[1] = HIGH;
    statoLed[2] = HIGH;
    statoLed[3] = HIGH;
    statoLed[4] = HIGH;
    statoLed[5] = HIGH;
    statoLed[6] = HIGH;
    statoLed[7] = HIGH;
    statoLed[8] = HIGH;
    statoLed[9] = HIGH;
    statoLed[10] = HIGH;
    statoLed[11] = HIGH;
    statoLed[12] = HIGH;
    statoLed[13] = HIGH;
    statoLed[14] = HIGH;
    statoLed[15] = HIGH;
            
    digitalWrite(D[0], statoLed[0]);
    digitalWrite(D[1], statoLed[1]);
    digitalWrite(D[2], statoLed[2]);
    digitalWrite(D[3], statoLed[3]);
    digitalWrite(D[4], statoLed[4]);
    digitalWrite(D[5], statoLed[5]);
    digitalWrite(D[6], statoLed[6]);
    digitalWrite(D[7], statoLed[7]);
    digitalWrite(D[8], statoLed[8]);
    digitalWrite(D[9], statoLed[9]);
    digitalWrite(D[10], statoLed[10]);
    digitalWrite(D[11], statoLed[11]);
    digitalWrite(D[12], statoLed[12]);
    digitalWrite(D[13], statoLed[13]);
    digitalWrite(D[14], statoLed[14]);
    digitalWrite(D[15], statoLed[15]);
    Serial.println("Received all pin ON command");
    delay(500);
      }
      
    if ( digitalRead(DOUT2) > 0 ) {
     
    statoLed[0] = LOW;
    statoLed[1] = LOW;
    statoLed[2] = LOW;
    statoLed[3] = LOW;
    statoLed[4] = LOW;
    statoLed[5] = LOW;
    statoLed[6] = LOW;
    statoLed[7] = LOW;
    statoLed[8] = LOW;
    statoLed[9] = LOW;
    statoLed[10] = LOW;
    statoLed[11] = LOW;
    statoLed[12] = LOW;
    statoLed[13] = LOW;
    statoLed[14] = LOW;
    statoLed[15] = LOW;
     
    digitalWrite(D[0], statoLed[0]);
    digitalWrite(D[1], statoLed[1]);
    digitalWrite(D[2], statoLed[2]);
    digitalWrite(D[3], statoLed[3]);
    digitalWrite(D[4], statoLed[4]);
    digitalWrite(D[5], statoLed[5]);
    digitalWrite(D[6], statoLed[6]);
    digitalWrite(D[7], statoLed[7]);
    digitalWrite(D[8], statoLed[8]);
    digitalWrite(D[9], statoLed[9]);
    digitalWrite(D[10], statoLed[10]);
    digitalWrite(D[11], statoLed[11]);
    digitalWrite(D[12], statoLed[12]);
    digitalWrite(D[13], statoLed[13]);
    digitalWrite(D[14], statoLed[14]);
    digitalWrite(D[15], statoLed[15]);
    Serial.println("Received all pin OFF command");
    delay(500);
    }
}

Spero di riuscirci presto ^^

E questo è quello che ne è venuto fuori:

#include <SPI.h>
#include <Ethernet.h> 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 0, 220 };
EthernetServer server(80);

#define DOUT2 2
#define DOUT3 3

int An[16] = {A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15};
int D[16] = {22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37};
int statoLed[16];

void setup(){   
/////////////////////=====================================================
  
  Serial.begin(9600);
  Serial.println("Web FC Power");
  
  pinMode( DOUT2, INPUT );
  pinMode( DOUT3, INPUT );
 
  for (byte i = 0; i < 16 ; i++){
    pinMode( An[i], INPUT );
    pinMode( D[i], OUTPUT );
    digitalWrite( D[i], statoLed[i] );
  }
  
  pinMode(10, OUTPUT); digitalWrite(10, 1);  // ethernet
  pinMode(4, OUTPUT); digitalWrite(4, 1);  // SD dello shield anche se non si usa
  Ethernet.begin(mac, ip);  
}
 
void loop(){

  for(byte i = 0; i < 16; i++) {

  if (analogRead(An[i]) > 1000){

    if (statoLed[i] == LOW) {
     statoLed[i] = HIGH;
     Serial.print("Received pin ");
     Serial.print(D[i]);
     Serial.println(" ON command");
   }
 
   else {
     statoLed[i] = LOW;
     Serial.print("Received pin ");
     Serial.print(D[i]);
     Serial.println(" OFF command");
  }
 
   digitalWrite(D[i], statoLed[i]);
   delay(500);
  }
}
  
 if ( digitalRead(DOUT3) > 0 ){

    statoLed[0] = HIGH;
    statoLed[1] = HIGH;
    statoLed[2] = HIGH;
    statoLed[3] = HIGH;
    statoLed[4] = HIGH;
    statoLed[5] = HIGH;
    statoLed[6] = HIGH;
    statoLed[7] = HIGH;
    statoLed[8] = HIGH;
    statoLed[9] = HIGH;
    statoLed[10] = HIGH;
    statoLed[11] = HIGH;
    statoLed[12] = HIGH;
    statoLed[13] = HIGH;
    statoLed[14] = HIGH;
    statoLed[15] = HIGH;
            
    digitalWrite(D[0], statoLed[0]);
    digitalWrite(D[1], statoLed[1]);
    digitalWrite(D[2], statoLed[2]);
    digitalWrite(D[3], statoLed[3]);
    digitalWrite(D[4], statoLed[4]);
    digitalWrite(D[5], statoLed[5]);
    digitalWrite(D[6], statoLed[6]);
    digitalWrite(D[7], statoLed[7]);
    digitalWrite(D[8], statoLed[8]);
    digitalWrite(D[9], statoLed[9]);
    digitalWrite(D[10], statoLed[10]);
    digitalWrite(D[11], statoLed[11]);
    digitalWrite(D[12], statoLed[12]);
    digitalWrite(D[13], statoLed[13]);
    digitalWrite(D[14], statoLed[14]);
    digitalWrite(D[15], statoLed[15]);
    Serial.println("Received all pin ON command");
    delay(500);
      }
      
    if ( digitalRead(DOUT2) > 0 ) {
     
    statoLed[0] = LOW;
    statoLed[1] = LOW;
    statoLed[2] = LOW;
    statoLed[3] = LOW;
    statoLed[4] = LOW;
    statoLed[5] = LOW;
    statoLed[6] = LOW;
    statoLed[7] = LOW;
    statoLed[8] = LOW;
    statoLed[9] = LOW;
    statoLed[10] = LOW;
    statoLed[11] = LOW;
    statoLed[12] = LOW;
    statoLed[13] = LOW;
    statoLed[14] = LOW;
    statoLed[15] = LOW;
     
    digitalWrite(D[0], statoLed[0]);
    digitalWrite(D[1], statoLed[1]);
    digitalWrite(D[2], statoLed[2]);
    digitalWrite(D[3], statoLed[3]);
    digitalWrite(D[4], statoLed[4]);
    digitalWrite(D[5], statoLed[5]);
    digitalWrite(D[6], statoLed[6]);
    digitalWrite(D[7], statoLed[7]);
    digitalWrite(D[8], statoLed[8]);
    digitalWrite(D[9], statoLed[9]);
    digitalWrite(D[10], statoLed[10]);
    digitalWrite(D[11], statoLed[11]);
    digitalWrite(D[12], statoLed[12]);
    digitalWrite(D[13], statoLed[13]);
    digitalWrite(D[14], statoLed[14]);
    digitalWrite(D[15], statoLed[15]);
    Serial.println("Received all pin OFF command");
    delay(500);
    }
//=============================================================================================================

 EthernetClient  client = server.available();
 
  if (client) {
    String readString;
    boolean currentLineIsBlank = true;
   
    while (client.connected()) {
      if (client.available()) {                
         int8_t c = client.read();
         readString += (char)c;                   
            if (c == '\n' && currentLineIsBlank) {
   
        client.println(F("HTTP/1.1 200 OK\n Content-Type: text/html\n"));       
        client.print(F("<html><head><title>Web Led FC POWER</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body>"));   
        client.print("<h1><strong> Web Led FC POWER</strong></h1>");
        
        for (byte i = 0; i < 16; i++){
        if(readString.indexOf("on_"+String(D[i])) > 0){ 
        (statoLed[i] = HIGH);
        Serial.print("Received pin ");
        Serial.print(D[i]);
        Serial.println(" ON command");}
        
        if(readString.indexOf("off_"+String(D[i])) > 0){ 
        (statoLed[i] = LOW);
        Serial.print("Received pin ");
        Serial.print(D[i]);
        Serial.println(" OFF command");}   
        
        digitalWrite (D[i], statoLed[i]);
        
          client.print("<table border=\"0\" style=\"width:250px\"><tr><td> RELE "+ String(D[i]));       
          if (digitalRead(D[i])) client.print(F("</td> <td><input disabled=\"disabled\" maxLength=\"20\" size=\"2\" value=\"ON\" STYLE=\"background-color:#00FF00\"/></td>"));  
          else client.print(F("</td> <td><input disabled=\"disabled\" maxLength=\"20\" size=\"2\" value=\"OFF\" STYLE=\"background-color:#DC143C\"/></td>"));              
          client.print("<td><input type=\"button\" style=\"width:35px; height:35px\" value=\"On\" onclick =\" location.href='/?on_"+String(D[i])+"'\"></td>");
          client.print("<td><input type=\"button\" style=\"width:35px; height:35px\" value=\"Off\" onclick =\" location.href='/?off_"+String(D[i])+"'\"></td></tr></table>");         
        }
        
        client.println(F("</body></html>"));        
        readString="";
        
        delay(1);
        client.flush();
        client.stop(); 
        }
      }
    }
  }
}

sembra che funzioni tutto, ovviamente xo devo migliorarlo molto sia sotto il punto di vista grafico (volevo inserire degli input image al posto dei bottoni ad esempio, anche se non so quanto convenga dal punto di vista della pesantezza e della velocità web) che quello tecnico.

Puoi darmi qualche consiglio sulla scrittura del software e sai in che modo posso ovviare a problemi tecnici quali:

  • possibilità di accendere più di un pin contemporanemente attraverso i bottoni;
  • il fatto che dopo aver inviato il segnale via web non debba aspettare troppo tempo prima di poter interagire con i bottoni;
  • se c’è la possibilità di fare un refresh della pagina iniziale ogni tot. tempo senza dover io ogni volta digitare l’indirizzo per controllare lo stato dei pin dopo averli manipolati con i bottoni.

Grazie mille Pablos, buona parte della riuscita di questo mio piccolo progetto è merito tuo :wink:

allora devi usare questo metodo o similare se vuoi tutte quelle cose, caricamento da SD o misto, aggiornamento automatico tramite script js/ajax, bisogna vedere quali conoscenze hai, altrimenti dovrai studiare un po' http://www.webweavertech.com/ovidiu/weblog/archives/000484.html

usa la flash altrimenti dai fondo alla ram subito.

client.print("<h1><strong> Web Led FC POWER</strong></h1>");

diventa

client.print(F("<h1><strong> Web Led FC POWER</strong></h1>"));

stessa cosa per i serial.print

Serial.println(F(" ON command"));

tutti i xxxx.print che non contengono variabili da inviare o stampare.
questo no … Serial.print(D*); contiene una variabile e non può essere messo su flash*
questi sono byte
* *int D[16] = {22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37}; int statoLed[16];* *
se non superi il valore numerico di 255 usa il byte
* *byte D[16] = {22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37}; byte statoLed[16];* *

qui hai risparmiato 32byte di ram e non sono pochi
poi per accenderli e spegnerli tutti insieme http://www.arduino.cc/en/Reference/PortManipulation
PORTA = 255; // ON (bit 7-0) pin 29-28-27-26-25-24-23-22
PORTC = 255; // ON (bit 7-0) pin 30-31-32-33-34-35-36-37
PORTA = 0; // OFF pin 29-28-27-26-25-24-23-22
PORTC = 0; // OFF pin 30-31-32-33-34-35-36-37

Per ora sarei contento di impostare una password per l’accesso, ma pare che l’unico modo sia riscrivere tutto con webduino -.-"

a meno che non riesco a dare un “nome” alla pagina nella barra degli indirizzi (ad esempio se voglio entrare nella pagina dei relè l’indirizzo è “192.168.0.220/nomepassword” e creare una pagina iniziale con il seguente tag:

Inserisci password:

o comunque qualcosa del genere! esiste un modo x dare il nome alla pagina??? xkè sto impazzendo @.@

P.S. ho letto solo ora il tuo ultimo messaggio!!! grazie mille dei preziosissimi consigli, veramente gentilissimo!!!

pare che l'unico modo sia riscrivere tutto con webduino

provala, non l'ho mai usata solo guardata, comunque e una revisione del link che ti ho passato prima

se ti dicessi che sostituendo client.println(F("HTTP/1.1 200 OK\n Content-Type: text/html\n")); con

client.print("HTTP/1.1 401 Authorization Required\r\n");
client.print("WWW-Authenticate: Basic realm=\"mio login\"\r\n");

e mi diventi matto? :) :) ... sono un po' arrugginito su questo sistema.... comunque ti basta leggere nella risposta la stringa in base64 dell'user-passw codificati confrontarla e dare l'OK se esatta (non ti aspettare una sicurezza esagerata da questo login) è lo stesso metodo che usa la webduino, i classici router, apparati home vari che non dispongono di un SO

ciao

e ci divento matti sì perchè sono diverse ore che non riesco ad impostare la password nel codice =( =( =(

volendo provare con admin admin che viene in base64 YWRtaW5hZG1pbg==

e ora a volercelo piazzare nel codice ci sto perdendo la testa :S :S :S

[...]

         int8_t c = client.read();
         readString += (char)c;
      
            if (c == '\n' //) {

        client.print(F("HTTP/1.1 401 Authorization Required\r\n"));
        client.print("WWW-Authenticate: Basic realm=\"Inserisci nome utente e password\"\r\n"); 

       if (c == 'YWRtaW5hZG1pbg=='{ // ??????????????????????????????????devo usare una if ma come gli dico le stringhe da leggere???
        client.println(F("HTTP/1.1 200 OK\n Content-Type: text/html\n"));       
        client.print(F("<html><head><title>Web Led FC POWER</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body>"));   
        client.print(F("<h1><strong> Web Led FC POWER</strong></h1>"));

[...]

ma come???

prima per trovare nella risposta del client on_1 fai

if(readString.indexOf("on_1") >0){

e adesso mi fai

if (c == 'YWRtaW5hZG1pbg=='{

c arriva da client.read();

readString += (char)c;

legge un carattere alla volta non puoi trovarlo in un colpo solo sulla variabile "char c"

semai sarà

if(readString.indexOf("YWRtaW5hZG1pbg==") >0){