Problema controllo uscite on/off di Arduino comandate tramite Ethernet Shield

Salve a tutti. :slight_smile:
Sto creando un progetto che consiste nell’ attivazione di più uscite di Arduino uno, le quali poi andranno a pilotare dei relè 5V per attivare dei carichi; il tutto viene comandato dall’ Ethernet Shield via http. Finora sono riuscito a creare il programma per un’ uscita, la quale funziona perfettamente; ma quando cerco di programmare la seconda uscita, purtroppo quella creata in precedenza non funziona più come dovrebbe; se premo il pulsante “Accendi” dall’ interfaccia web della prima uscita, questa si attiva, dopo di che il programma si blocca e sono costretto a resettare Arduino.
Vorrei chiedere aiuto a qualcuno di voi più esperto di me in programmazione.
Siccome il programma è piuttosto lungo, lascio un file .txt con tutto il programma per intero.

Ringrazio in anticipo chiunque provi ad aiutarmi.

Buona giornata
Simone

Controllo Arduino Ethernet (problema).txt (4.52 KB)

Simone, benvenuto. :) 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 - qui una serie di schede by xxxPighi per i collegamenti elettronici vari: http://forum.arduino.cc/index.php?topic=146152.0 - qui le pinout delle varie schede by xxxPighi: http://forum.arduino.cc/index.php?topic=151646.0 - qui una serie di link utili: http://forum.arduino.cc/index.php?topic=126861.0

nid69ita: Simone, benvenuto. :) 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 - qui una serie di schede by xxxPighi per i collegamenti elettronici vari: http://forum.arduino.cc/index.php?topic=146152.0 - qui le pinout delle varie schede by xxxPighi: http://forum.arduino.cc/index.php?topic=151646.0 - qui una serie di link utili: http://forum.arduino.cc/index.php?topic=126861.0

Grazie mille per le dritte, presentazione fatta :)

Ho messo in evidenza le graffe, portandole dopo l'if; Di base questo tuo pezzo ragiona sui comandi, ma dopo il primo if, mi sembra non fai un altro if, apri una graffa per cosa?

          if (readString.indexOf("L=1") > 0) // lettura del valore se il LED si deve accendere
          { // il led sarà acceso
            digitalWrite(outPin, HIGH); // accendo il led
            LEDON = true;
            Serial.print("ON pin "); Serial.println(outPin);
          }
//************  E QUI COSA MANCA ?  *********************************
          {
            //il led sarà spento
            digitalWrite(outPin, LOW); //sengo il led
            LEDON = false;
            Serial.print("OFF pin "); Serial.println(outPin);
            Serial.print(readString);
            if (readString.indexOf("L=2") > 0)   // lettura del valore se il LED si deve accendere
            {  // il led sarà acceso
              digitalWrite(outPin2, HIGH); // accendo il led
              LEDON2 = true;
              Serial.print("ON pin "); Serial.println(outPin2);
            }
            else
            { //il led sarà spento
              digitalWrite(outPin2, LOW); //sengo il led
              LEDON2 = false;
              Serial.print("OFF pin "); Serial.println(outPin2);
            }

Ciao Igor Grazie per la tua risposta così celere. In questi giorni sono stato molto preso dalla scuola, comuque: Probabilmente nel processo di copia sul blocco note mi è scappato l' "else" che ci va tra le due graffe, infatti nella seconda parte più sotto l' ho riportato. Purtroppo però nemmeno mettendolo e mettendo in evidenza le graffe riportandole dopo l' if il problema si risolve :(

Grazie per la tua risposta Simone

nid69ita: Ho messo in evidenza le graffe, portandole dopo l'if; Di base questo tuo pezzo ragiona sui comandi, ma dopo il primo if, mi sembra non fai un altro if, apri una graffa per cosa?

          if (readString.indexOf("L=1") > 0) // lettura del valore se il LED si deve accendere
          { // il led sarà acceso
            digitalWrite(outPin, HIGH); // accendo il led
            LEDON = true;
            Serial.print("ON pin "); Serial.println(outPin);
          }
//************  E QUI COSA MANCA ?  *********************************
          {
            //il led sarà spento
            digitalWrite(outPin, LOW); //sengo il led
            LEDON = false;
            Serial.print("OFF pin "); Serial.println(outPin);
            Serial.print(readString);
            if (readString.indexOf("L=2") > 0)   // lettura del valore se il LED si deve accendere
            {  // il led sarà acceso
              digitalWrite(outPin2, HIGH); // accendo il led
              LEDON2 = true;
              Serial.print("ON pin "); Serial.println(outPin2);
            }
            else
            { //il led sarà spento
              digitalWrite(outPin2, LOW); //sengo il led
              LEDON2 = false;
              Serial.print("OFF pin "); Serial.println(outPin2);
            }

Io avrei trovato il tuo problema

ecco il tuo sketch corretto, confrontalo con il tuo e poi dimmi se hai trovato le differenze

#include <String.h>
#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // mac address
byte ip[] = { 
  192, 168, 1, 123 }; // ip arduino internet in
byte gateway[] = { 
  192, 168, 1, 1 }; // internet access via router
byte subnet[] = { 
  255, 255, 255, 0 }; //subnet mask
EthernetServer server(80); //server port

int outPin = 9; // pin attuatore
String readString; //string
boolean LEDON = false; // flag status attuatore

int outPin2 = 7; // pin attuatore2
boolean LEDON2 = false; // flag status attuatore


void setup(){
  Ethernet.begin(mac, ip, gateway, subnet);
  pinMode(outPin, OUTPUT);
  pinMode (outPin2, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  /*inizio client*/
  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) 
          {
            // il led sarà acceso
            digitalWrite(outPin, HIGH); // accendo il led
            LEDON = true;
            Serial.print("ON pin ");
            Serial.println(outPin);
          }
          if(readString.indexOf("L=0") > 0)
          {
            //il led sarà spento
            digitalWrite(outPin, LOW); //sengo il led
            LEDON = false;
            Serial.print("OFF pin ");
            Serial.println(outPin);
            Serial.print(readString);
          }  
          if(readString.indexOf("L=2") > 0) 
          {
            // il led sarà acceso
            digitalWrite(outPin2, HIGH); // accendo il led
            LEDON2 = true;
            Serial.print("ON pin ");
            Serial.println(outPin2);
          }
          if(readString.indexOf("L=3") > 0)
          {
            //il led sarà spento
            digitalWrite(outPin2, LOW); //sengo il led
            LEDON2 = false;
            Serial.print("OFF pin ");
            Serial.println(outPin2);
          }
          // COSTRUZIONE PAGINA HTML
          client.println("HTTP/1.1 200 OK.....");
          client.println("Content-Type: text/html");
          client.println();
          // inizializzo pagina (da togliere se uso ajax)
          client.print("<html><head><title>ARDUINO Controllo Led via WEB</title></head><body>");
          //inizai il body
          client.println("<div style='width:720px; height:1280px;'>"); //risoluzione

          client.println("<h1>CONTROLLO ATTUATORI via internet</h1>");
          client.println("<hr />");
          client.print("<h1>PIN control n. ");
          client.print(outPin);
          client.println("</h1>");
          client.println("
");
          //scrivo il LED status
          client.print("<font size='7'>PIN status: ");
          if (LEDON)
          {
            client.println("<span style='color:green; font-weight:bold;'>ON</span></font>");
          }
          else
          {
            client.println("<span style='color:grey; font-weight:bold;'>OFF</span></font>");
          }
          client.print("<h2><a href='/?L=1'>ACCENDI</a> | <a href='/?L=0'>SPEGNI</a></h2>");
          client.println("<hr />");
          client.print("<h1>PIN control n. ");
          client.print(outPin2);
          client.println("</h1>");
          client.println("
");
          //scrivo il LED status
          client.print("<font size='7'>PIN status: ");
          if (LEDON2)
          {
            client.println("<span style='color:green; font-weight:bold;'>ON</span></font>");
          }
          else
          {
            client.println("<span style='color:grey; font-weight:bold;'>OFF</span></font>");
          }
          client.print("<h2><a href='/?L=2'>ACCENDI</a> | <a href='/?L=3'>SPEGNI</a></h2>");
          client.println("<hr />");
          client.print("<h4>Created by: <a href='Simone' target='_blank' />Simone</a></h4>");
          client.println("<hr />");
          // chiudo il div
          client.println("</div>");
          // chiudo pagina da togliere se uso ajax
          client.println("</body></html>");
          // pulisco la stringa per la successiva lettura
          readString="";
          //fermo il client
          client.stop();
        } //if c == /n
      } // if client available
    } // while client connesso
  } // if client
} // fine loop

funziona che è una bellezza :slight_smile:
ciao

Per diminuire lo spazio RAM occupato, ricorda di usare F() prima:

client.println("HTTP/1.1 200 OK.....");

dopo:

client.println(F("HTTP/1.1 200 OK....."));

Ciao killrob.
Grazie infinite per il tempo che hai dedicato, ho stampato entrambi gli sketch e mettendoli a confronto ho trovato l’ errore, ho messo un “else” mentre ci andava un “if (readstring.index ecc…)” ti ringrazio davvero!
Buona giornata

Simone

killrob:
Io avrei trovato il tuo problema

ecco il tuo sketch corretto, confrontalo con il tuo e poi dimmi se hai trovato le differenze

#include <String.h>

#include <SPI.h>
#include <Ethernet.h>

byte mac = {
 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // mac address
byte ip = {
 192, 168, 1, 123 }; // ip arduino internet in
byte gateway = {
 192, 168, 1, 1 }; // internet access via router
byte subnet = {
 255, 255, 255, 0 }; //subnet mask
EthernetServer server(80); //server port

int outPin = 9; // pin attuatore
String readString; //string
boolean LEDON = false; // flag status attuatore

int outPin2 = 7; // pin attuatore2
boolean LEDON2 = false; // flag status attuatore

void setup(){
 Ethernet.begin(mac, ip, gateway, subnet);
 pinMode(outPin, OUTPUT);
 pinMode (outPin2, OUTPUT);
 Serial.begin(9600);
}

void loop()
{
 /inizio client/
 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)
         {
           // il led sarà acceso
           digitalWrite(outPin, HIGH); // accendo il led
           LEDON = true;
           Serial.print("ON pin ");
           Serial.println(outPin);
         }
         if(readString.indexOf(“L=0”) > 0)
         {
           //il led sarà spento
           digitalWrite(outPin, LOW); //sengo il led
           LEDON = false;
           Serial.print("OFF pin ");
           Serial.println(outPin);
           Serial.print(readString);
         }  
         if(readString.indexOf(“L=2”) > 0)
         {
           // il led sarà acceso
           digitalWrite(outPin2, HIGH); // accendo il led
           LEDON2 = true;
           Serial.print("ON pin ");
           Serial.println(outPin2);
         }
         if(readString.indexOf(“L=3”) > 0)
         {
           //il led sarà spento
           digitalWrite(outPin2, LOW); //sengo il led
           LEDON2 = false;
           Serial.print(“OFF pin “);
           Serial.println(outPin2);
         }
         // COSTRUZIONE PAGINA HTML
         client.println(“HTTP/1.1 200 OK…”);
         client.println(“Content-Type: text/html”);
         client.println();
         // inizializzo pagina (da togliere se uso ajax)
         client.print(“ARDUINO Controllo Led via WEB”);
         //inizai il body
         client.println(”

”); //risoluzione

client.println(“

CONTROLLO ATTUATORI via internet

”);
         client.println("
");
         client.print(“

PIN control n. “);
         client.print(outPin);
         client.println(”

”);
         client.println("
“);
         //scrivo il LED status
         client.print(“PIN status: “);
         if (LEDON)
         {
           client.println(“ON
”);
         }
         else
         {
           client.println(“OFF”);
         }
         client.print(“

ACCENDI | SPEGNI

”);
         client.println(”
”);
         client.print(“

PIN control n. “);
         client.print(outPin2);
         client.println(”

”);
         client.println(”
“);
         //scrivo il LED status
         client.print(“PIN status: “);
         if (LEDON2)
         {
           client.println(“ON
”);
         }
         else
         {
           client.println(“OFF”);
         }
         client.print(“

ACCENDI | SPEGNI

”);
         client.println(”
”);
         client.print(“

Created by: Simone

”);
         client.println(”
");
         // chiudo il div
         client.println("
");
         // chiudo pagina da togliere se uso ajax
         client.println("");
         // pulisco la stringa per la successiva lettura
         readString="";
         //fermo il client
         client.stop();
       } //if c == /n
     } // if client available
   } // while client connesso
 } // if client
} // fine loop




funziona che è una bellezza :)
ciao

Ciao Igor.
Questi codici alla fine di tutto lo sketch giusto?
Ora non ho ancora finito tutto il programma, devo inserire ancora due sonde; alla fine di tutto inserirò questi.
Grazie mille

Buona giornata
Simone

nid69ita:
Per diminuire lo spazio RAM occupato, ricorda di usare F()
prima:

client.println("HTTP/1.1 200 OK.....");

dopo:

client.println(F("HTTP/1.1 200 OK....."));

Prego di nulla ;) siamo qui per aiutare quando possibile :)

p.s.: il client.println(F(...........); lo devi mettere su tutti i comandi "client.println"

simone95: Ciao Igor. Questi codici alla fine di tutto lo sketch giusto? Ora non ho ancora finito tutto il programma, devo inserire ancora due sonde; alla fine di tutto inserirò questi. Grazie mille

??? Io dico in generale. Quando passi una frase alla client.print() o client.println() è meglio se racchiudi la frase dentro F(). Nel mio post facevo un esempio di senza F() e con. In questo modo le frasi rimangono in memoria programma e non in memoria SRAM (con troppe frasi esaurisci la memoria SRAM).

Banalmente per risparmiare un pochino di memoria le variabili che indicano i pin possono essere costanti byte:

const byte outPin = 9; // pin attuatore

Ciao Igor.
Grazie mille, ora ho capito il loro scopo.

Grazie mille tutti, siete stati davvero molto gentili XD
Nel caso avessi ancora problemi in futuro mi rivolgerò sicuramente a voi. :wink:

Buona giornata
Simone

nid69ita:

simone95:
Ciao Igor.
Questi codici alla fine di tutto lo sketch giusto?
Ora non ho ancora finito tutto il programma, devo inserire ancora due sonde; alla fine di tutto inserirò questi.
Grazie mille

??? Io dico in generale. Quando passi una frase alla client.print() o client.println() è meglio se racchiudi la frase dentro F(). Nel mio post facevo un esempio di senza F() e con. In questo modo le rimangono in memoria programma e non in memoria SRAM (con troppe frasi esaurisci la memoria SRAM).

Banalmente per risparmiare un pochino di memoria le variabili che indicano i pin possono essere costanti byte:

const byte outPin = 9; // pin attuatore

ciao a tutti , in questa sketch e possibile inserire un comando tutto off o tutto on??

si