Far accende dei led da una pagina web

Salve a tutti ho un problema, sto facendo un progetto dove con arduino due sto cercando di far accendere 8 led da una pagina web e qui tutto ok, solo ora voglio aggiungere un pulsante sulla pagina dove mi accende e mi spegne tutti i led contemporaneamente, e lo fa ma il problema sorge poi quando voglio accendere o spegnere singolarmente i led perche non lo fa più. vi metto il programma che ho fatto e se potete darmi una mano. grazie in anticipo per l'aiuto.

prova_con_5_statop.ino (6.88 KB)

Non mi sembra di vedere sull' html un tasto che accende tutto e spegne tutto, nemmeno un indexOf che attende il comando da GET

ps:manca ?light9off, ma con quel programma da web non vedi gli stati dei pin se sono on/off

Come mai hai scelto Arduino DUE?

scusate ecco il programma ke ho fatto. si lo so che non si vede se sono accesi o spenti verifico con i led io dalla pagina web spengo e accendo i led. il problema e sorto quando ho messo un tasto per spegnere e accendere tutto perche singolarmente non mi accendeva ne spegneva piu nulla. come posso modificare il programma?

prova_con_5_statop.ino (7.91 KB)

pablos:
Come mai hai scelto Arduino DUE?

Forse sarà l'orario...ma coma hai capito che usa Arduino2?

se usa Ardu2 sarei curioso di "vedere" come pilota i led :slight_smile:

Volevo chiederlo prima :grin: , spero che usi un driver...

Non accendi più nulla perchè hai quei boolean statopn impostati a FALSE.

il loop() passa da questi IF e li vede tutti FALSE

if(statop1 == true)
          {
            digitalWrite(2, LOW);            
          }
          if(statop1 == false)
          {
            digitalWrite(2, HIGH);            
          }
          if(statop2 == true)
          {
            digitalWrite(3, LOW);            
          }
          if(statop2 == false)
          {
            digitalWrite(3, HIGH);            
          }
          if(statop3 == true)
          {
            digitalWrite(4, LOW);            
          }
          if(statop3 == false)
          {
            digitalWrite(4, HIGH);            
          }
          if(statop4 == true)
          {
            digitalWrite(5, LOW);            
          }
          if(statop4 == false)
          {
            digitalWrite(5, HIGH);            
          }
          if(statop5 == true)
          {
            digitalWrite(6, LOW);
          }
          if(statop5 == false)
          { 
            digitalWrite(6, HIGH);
          }
             if(statop6 == true)
          {
            digitalWrite(7, LOW);            
          }
          if(statop6 == false)
          {
            digitalWrite(7, HIGH);            
          }
          if(statop7 == true)
          {
            digitalWrite(8, LOW);            
          }
          if(statop7 == false)
          {
            digitalWrite(8, HIGH);            
          }
          if(statop8 == true)
          {
            digitalWrite(9, LOW);            
          }
          if(statop8 == false)
          {
            digitalWrite(9, HIGH);            
          }

l'ultima volta che hai spento il pin hai messo la variab a FALSE
poi decidi che se il server legge ?light9on deve eseguire questo

digitalWrite(2, HIGH);  
            digitalWrite(3, HIGH);
            digitalWrite(4, HIGH);
            digitalWrite(5, HIGH);
            digitalWrite(6, HIGH);
            digitalWrite(7, HIGH);
            digitalWrite(8, HIGH);
            digitalWrite(9, HIGH);

al loop() sucessivo te li spegne tutti, ma è talmente veloce che non lo noti

Se posso permettermi cerca altri esempi, ce ne sono molti, se sei alle prime armi puoi imparare molti trucchi per semplificare l'esecuzione, non so dove hai preso quel programma, ma è veramente inguardabile :slight_smile:

ciao

ok grazie mille. si è capito che sto alle prime armi :smiley: avete qualche esempio che fa al caso mio?

prova questo modifica i parametri di rete, il numero dei pin, prendi uno spunto, qui vedi anche lo stato dei pin .... strutturato per 5 pin

#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;
String nome_1 = "LUCE A  >>  ";
String nome_2 = "LUCE B  >>  ";
String nome_3 = "LUCE C  >>  ";
String nome_4 = "LUCE D  >>  ";
String nome_5 = "LUCE E  >>  ";
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 += c;   
        if (c == '\n' && currentLineIsBlank) {
          //Serial.print(readString);
               
        if(readString.indexOf("on_1") > 0) digitalWrite(out_1, 1);        
        if(readString.indexOf("off_1") > 0) digitalWrite(out_1, 0);          
        if(readString.indexOf("on_2") > 0) digitalWrite(out_2, 1);        
        if(readString.indexOf("off_2") > 0) digitalWrite(out_2, 0);          
        if(readString.indexOf("on_3") > 0) digitalWrite(out_3, 1);        
        if(readString.indexOf("off_3") > 0) digitalWrite(out_3, 0); 
        if(readString.indexOf("on_4") > 0) digitalWrite(out_4, 1);        
        if(readString.indexOf("off_4") > 0) digitalWrite(out_4, 0);
        if(readString.indexOf("on_5") > 0) digitalWrite(out_5, 1);        
        if(readString.indexOf("off_5") > 0) digitalWrite(out_5, 0);
         
        //  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  " + nome_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.println("<hr/>
");
        
        client.print("<span>STATO  " + nome_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.println("<hr/>
");
        
        client.print("<span>STATO  " + nome_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.println("<hr/>
");
        
        client.print("<span>STATO  " + nome_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.println("<hr/>
");
        
        client.print("<span>STATO  " + nome_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("<hr/>
</body></html>");
         
        //client.println("</body></html>");

        readString="";
        
        delay(1);
        client.flush();
        client.stop(); 
        }
    } }
  }
}

semplificato e ottimizzato per 7 pin

#include <SPI.h>
#include <Ethernet.h> 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 2, 177 };
EthernetServer server(80);
String nome[] = {"LUCE A ", "LUCE B ", "LUCE C ", "LUCE D ", "LUCE E ", "LUCE F ", "LUCE G "};
byte out[] = { 40, 41, 42, 43, 44, 45, 46 };

void setup(){ 
  Ethernet.begin(mac, ip);
  for (byte i=0; i <= 6; i++) pinMode(out[i], OUTPUT);           
}
 
void loop(){
  
 EthernetClient  client = server.available();  
  if (client) {    
    boolean currentLineIsBlank = true;
    String readString;
    while (client.connected()) {
      if (client.available()) { 
        char c = client.read();
        readString += c;
        if (c == '\n' && currentLineIsBlank) {
        
        for (byte i=0; i <= 6; i++){  
          if(readString.indexOf("on_"  + String(i)) > 0) digitalWrite(out[i], 1);        
          if(readString.indexOf("off_" + String(i)) > 0) digitalWrite(out[i], 0); 
        }
                  
        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("
");
       
       for (byte i=0; i <= 6; i++){
        client.print("<span>STATO  " + nome[i] + "</span>");
        if (digitalRead(out[i])== true) client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"7\" value=\"ON\" STYLE=\"background-color:#00FF00\"/>");  
        else client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"7\" value=\"OFF\" STYLE=\"background-color:#C0C0C0\"/>");
        client.print("<p><p/>");   
        client.print("<input type=\"button\" style=\"width:100px; height:40px\" value=\"ON\" onclick =\" location.href='/?on_" + String(i) + "'\">");
        client.print("<input type=\"button\" style=\"width:100px; height:40px\" value=\"OFF\" onclick =\" location.href='/?off_" + String(i) + "'\">");             
        client.println("<hr/>");
       } 
              
        client.println("</body></html>");      
         readString="";
        delay(1);        
        client.stop(); 
        }
    } }
  }
}

Grazie mille, si uso un arduino 2 collegato con una scheda di rete e a sua volta con una scheda relè.

ciao ho provato il programma a 7 led solo non mi fa la verifica i led sono accesi e lo stato resta sempre su off non cambia mai

Si, hai ragione
L'avevo fatto per la MEGA un po' di anni fa e sono certo che funziona, ora l'ho caricato sulla DUE ed effettivamente sembra non scrivere i bit sui registri che il DigitalRead va a leggere, ma a te i led si accendono e spengono con i relativi buttons da web?

devo ripassare un secondo la manipolazione dei registri sulla DUE, non mi ricordo più niente.

ciao

si i led funzionano si accendono e si spengono solo non funziona il controllo dello stato. grazie ancora

Sulla DUE il digitaRead non è come sugli AVR, ci sono un po' di registri da impostare.
PIO_OER per abilitare il pin in OUTPUT (Out/Enable/Register)
PIO_PER per attivarli (Pio/Enable/Register)

se mi dai l'elenco dei pin che usi vado a vedere a quali PIO appartengono e te li imposto, però se non te lo studi bene Il SAM avrai difficoltà ad usarlo.

mandami i pin ... sta sera ci guardo

ciao

Ecco qui il file. grazie mille per la disponibilità.
visto che sono alle prime armi mi consigli cosa studiare bene e dove reperirli. grazie

prova_con_7_led.ino (2.19 KB)

Comunque non riesco nemmeno a far spegnere e accendere tutti i led il problema ke ti ho detto ieri.

finalmente sono riuscito a far spegnere e accendere tutti i led ora ti metto il programma! :smiley:
ora manca solo la verifica del led

prova_con_7_led.ino (2.63 KB)

L'hai pasticciato di nuovo il programma :cry:

for (byte i=0; i <= 7; i++){  
          if(readString.indexOf("on_"  + String(i)) > 0) digitalWrite(out[i], 1);        
          if(readString.indexOf("off_" + String(i)) > 0) digitalWrite(out[i], 0); 
          //delay(10); perchè un delay? questo assolutamente non ci va, deve essere il più veloce possibile 
        }
// questo pezzo è sbagliato e fa perdere tempo inutilmente al ciclo 
        // leggi 8 volte se una stringa è presente .... basta 1 volta
        /*for (byte i=0; i <= 8; i++){
          
              if(readString.indexOf("off_" + String(8)) > 0) digitalWrite(out[i], 0);
               if(readString.indexOf("on_" + String(8)) > 0) digitalWrite(out[i], 1);    
        }
        */
        if(readString.indexOf("off_8") > 0) 
           for (byte i=0; i <= 8; i++) digitalWrite(out[i], 0); 
           
        if(readString.indexOf("on_8") > 0) 
           for (byte i=0; i <= 8; i++) digitalWrite(out[i], 1);
//delay(1000); 1 secondo per chiudere il client è troppo sono attese inutili che possono creare
 //problemi con la connessione,  poi per un secondo non puoi dare comandi a che serve?
         delay(1);       
        client.stop();

usi anche il pin 4 ... esso è riservato allo slot SD, non inserire nessuna SD o il programma smetterà di funzionare

Ok grazie mille! Invece per il controllo?

non ci ho ancora guardato, nel reply 12 ho scritto qualcosa, intanto incomincia col cercare nel forum, datasheet e google, tira giù qualcosa poi lo rivediamo.

Ora avviene una lettura corretta dei pin, ho dovuto cambiare i tuoi pin cosichè si trovino tutti sullo stesso registro, saltare da un registro all'altro complicava il programma
I pin sono tutti sul registro PIOC rispettivamente 44.45.46.47.48.49.50

Non l'ho provato con i leds, ma dovrebbero funzionare, un primo test l'ho fatto con il pin 13 che ha il led sulla board e funzionava

#include <SPI.h>
#include <Ethernet.h> 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 2, 177 };
EthernetServer server(80);
String nome[] = {"LUCE A ", "LUCE B ", "LUCE C ", "LUCE D ", "LUCE E ", "LUCE F ", "LUCE G "};
byte out[] = { 19, 18, 17, 16, 15, 14, 13 };  // C19_44 C18_45 C17_46 C16_47 C15_48 C14_49 C13_50 

void setup(){ 
    pinMode(10,INPUT_PULLUP);    // Eth 
    pinMode(77,INPUT_PULLUP);    // Eth 
  
  for (byte i=0; i <= 6; i++){  
    PIOC->PIO_OER=(1<<out[i]);
    PIOC->PIO_PER=(1<<out[i]);
  }
  
  SPI.setClockDivider(10, 4);  
  Ethernet.begin(mac, ip);
}
 
void loop(){

 EthernetClient  client = server.available();  
  if (client) {    
    boolean currentLineIsBlank = true;
    String readString;
    while (client.connected()) {
      if (client.available()) { 
        char c = client.read();
        readString += c;
        if (c == '\n' && currentLineIsBlank) {
        
        for (byte i=0; i <= 6; i++){  
          if(readString.indexOf("on_"  + String(i)) > 0) PIOC->PIO_SODR=(1<<out[i]);        
          if(readString.indexOf("off_" + String(i)) > 0) PIOC->PIO_CODR=(1<<out[i]); 
        }
                  
        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("
");
       
       for (byte i=0; i <= 6; i++){
        client.print("<span>STATO  " + nome[i] + "</span>");        
        if (bitRead(PIOC->PIO_ODSR,out[i]) == 1) client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"7\" value=\"ON\" STYLE=\"background-color:#00FF00\"/>"); 
        else client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"7\" value=\"OFF\" STYLE=\"background-color:#C0C0C0\"/>");
        client.print("<p><p/>");   
        client.print("<input type=\"button\" style=\"width:100px; height:40px\" value=\"ON\" onclick =\" location.href='/?on_" + String(i) + "'\">");
        client.print("<input type=\"button\" style=\"width:100px; height:40px\" value=\"OFF\" onclick =\" location.href='/?off_" + String(i) + "'\">");             
        client.println("<hr/>");
       } 
              
        client.println("</body></html>");      
         readString="";
        delay(1);        
        client.stop(); 
        }
    } }
  }
}

ciao