Errore nello skect di arduino (leggere dati dalla scheda di rete)

Buongiorno, ho sviluppato un piccolo sketch che mi permetterà di comandare una scheda Relè che si eccitano a 5V. Il tutto comandabile da smarpthpone

Il giro funziona nel senso che tramite smartphone riesco a far arrivare i comandi ad arduino, ma ho due problemi ci deve essere qualcosa che sbaglio.

I led quando ARDUINO parte sono tutti attivi (i pin da 1 a 9), quindi quando avvio arduino accenderà tutto.

Per chiamare arduin faccio una semplice get così 192.168.110.177/ON-1 aprendo il monitor seriale stampa i messaggi luce accesa 3 volte. Invece dovrebbe accendere la luce una volta e fermarsi.

#include <String.h>
#include <SPI.h>
#include <Ethernet.h>
#include <dht11.h>
#include "EmonLib.h"                   // Include Emon Library
EnergyMonitor emon1;                   // Create an instance

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; 
byte ip[] = { 192, 168, 110, 177 }; // indirizzo IP della shield
byte gateway[] = { 192, 168, 110, 1 }; // indirizzo ip del router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
EthernetServer server(80); 

int pin1 = 1; // LED pin
int pin2 = 2; // LED pin
int pin3 = 3; // LED pin
int pin4 = 4; // LED pin
int pin5 = 5; // LED pin
int pin6 = 6; // LED pin
int pin7 = 7; // LED pin
int pin8 = 8; // LED pin
int pin9 = 9; // LED pin
int pin10 = 10; // LED pin
int pin11 = 11; // LED pin
int pin12 = 12; // LED pin
int pin13 = 13; // LED pin
String readString; 
boolean LEDON = false; 

/*-----( Declare objects )-----*/
dht11 DHT11;

/*-----( Declare Constants, Pin Numbers )-----*/
#define DHT11PIN 4

  void setup(){
    Ethernet.begin(mac, ip, gateway, subnet);
    pinMode(pin1, OUTPUT);
    pinMode(pin2, OUTPUT);
    pinMode(pin3, OUTPUT);
    pinMode(pin4, OUTPUT);
    pinMode(pin5, OUTPUT);
    pinMode(pin6, OUTPUT);
    pinMode(pin7, OUTPUT);
    pinMode(pin8, OUTPUT);
    pinMode(pin9, OUTPUT);
    Serial.begin(9600);
    emon1.current(1, 11.8);             // Current: input pin, calibration.
  }
  
  void loop(){

    digitalWrite(pin1, LOW); 
    digitalWrite(pin2, LOW); 
    digitalWrite(pin3, LOW); 
    digitalWrite(pin4, LOW); 
    digitalWrite(pin5, LOW); 
    digitalWrite(pin6, LOW); 
    digitalWrite(pin7, LOW); 
    digitalWrite(pin8, LOW); 
    digitalWrite(pin9, LOW); 
    
    EthernetClient client = server.available();
    if (client) {
     boolean currentLineIsBlank = true;
     while (client.connected()) {
       if (client.available()) {
         char c = client.read();
         readString.concat(c); 
         //Serial.print(c);
         if (c == '\n' && currentLineIsBlank) {
         
          // Serial.print(readString);
          //a questo punto avrò la stringa completa di GET comando da eseguire HTTP 
          //devo eliminare il get e http e interpretare il comando
          readString = getValue(readString, ' ', 1);
          //Serial.print(readString);
           if(readString.indexOf("ON") > 0) {
             //in questo caso devo leggere in pin ed accendere la luce
             String prova = readString.substring(4);
             int pinOn = prova.toInt();
             digitalWrite(pinOn, HIGH); 
             LEDON = true;
             Serial.println("LUCE ACCESA fin");
             Serial.println(pinOn);
           }else if (readString.indexOf("OFF")>0){
             //in questo caso devo leggere in pin e spegnere la luce
             //Serial.println("pippo ");
             String prova = readString.substring(5);
             int pinOn = prova.toInt();
             digitalWrite(pinOn, LOW); 
             Serial.println(pinOn);
             LEDON = false;
             Serial.println("LUCE SPENTA ");
           }else if (readString.indexOf("RELE")>0){
             //RECUPERO LA CORRENTE PASSATA DAL PIN
             String prova = readString.substring(6);
             int pinOn = prova.toInt();
             digitalWrite(pinOn, HIGH); 
             Serial.println("RELE ACCESA ");
             LEDON = true;
             //ATTENDO DUE SECONDI, POI SPENGO IL PIN
             delay(2000);   
             digitalWrite(pinOn, LOW); 
             Serial.println("RELE SPENTA ");
             Serial.println(pinOn);
           }
           
           readString="";
           client.stop();
          
        }//FINE IF DI LETTURA 
      }//FINE IF CLIENT 
    }//FINE WHILE 
   }//FINE IF PRINCIPALE 
  }//FINE LOOP

Prima domanda: se decommenti la riga:
// Serial.print(readString);
cosa leggi sul monitor? Per capire cosa ricevi e quante volte…

Seconda: il client.stop() lo devi mettere fuori dal ciclo “while (client.connected())”, tu l’hai messo addirittura nella if()!

Terza: a cosa serve mettere nel loop() le digitalWrite a LOW? Lasciale solo nel setup(), altrimenti quando dai il comando ON si accendono per un millisecondo e poi tornano tutti a LOW!

Quarta: tu usi il pin 1 che fa parte della seriale, questa cosa fa a cazzotti con il tuo sketch per attivare i led! Parti dal 2, se non hai requisiti particolari.

Quinta: solo per ottimizzazione, a che ti serve dichiarare tutte quelle variabili se poi i pin vanno da 1 a 13? Togli tutti i “int pin1 = 1; // LED pin” e poi nel setup() basta fare:

   for (int i=2; i<=13; i++) {
     pinMode(i, OUTPUT);
     digitalWrite(i, LOW);
   }

(PS: nel setup() consiglio di mettere sempre per prime le inizializzazioni di base, a partire dalla Serial, che può servire per debug, e poi le altre in ordine crescente di complessità/importanza)

Allora ho modificato il metodo setup e loop in questi

 void setup(){
    Ethernet.begin(mac, ip, gateway, subnet);
    // inizializzo i pin dal 2 al 9 e li setto a off
    for (int i=2; i<=9; i++) {
     pinMode(i, OUTPUT);
     digitalWrite(i, LOW);
    }    
    Serial.begin(9600);
    emon1.current(1, 11.8);             // Current: input pin, calibration.
  }
  
  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);
          //a questo punto avrò la stringa completa di GET comando da eseguire HTTP 
          //devo eliminare il get e http e interpretare il comando
          readString = getValue(readString, ' ', 1);
          Serial.println("read string "+readString);
           if(readString.indexOf("ON") > 0) {
             //in questo caso devo leggere in pin ed accendere la luce
             String prova = readString.substring(4);
             int pinOn = prova.toInt();
             digitalWrite(pinOn, HIGH); 
             LEDON = true;
             Serial.print("LUCE ACCESA PIN");
             Serial.println(pinOn);
           }else if (readString.indexOf("OFF")>0){
             //in questo caso devo leggere in pin e spegnere la luce
             //Serial.println("pippo ");
             String prova = readString.substring(5);
             int pinOn = prova.toInt();
             digitalWrite(pinOn, LOW); 
             Serial.println(pinOn);
             LEDON = false;
             Serial.print("LUCE SPENTA ");
             Serial.println(pinOn);
           }else if (readString.indexOf("TEMP")>0){
             float temperatura = getTemperatura();
             float umidita = getUmidita();
             sendResponseJson(client,temperatura,umidita,0);
           }else if (readString.indexOf("CURRENT")>0){
             //RECUPERO LA CORRENTE PASSATA DAL PIN
             String prova = readString.substring(9);
             int pinOn = prova.toInt();
             Serial.println(pinOn);
             double corrente = getCorrenteAlternata(pinOn);
             sendResponseJson(client,0,0,corrente);
           }else if (readString.indexOf("RELE")>0){
             //RECUPERO LA CORRENTE PASSATA DAL PIN
             String prova = readString.substring(6);
             int pinOn = prova.toInt();
             digitalWrite(pinOn, HIGH); 
             Serial.print("RELE ACCESA ");
             Serial.print(pinOn);
             LEDON = true;
             //ATTENDO DUE SECONDI, POI SPENGO IL PIN
             delay(2000);   
             digitalWrite(pinOn, LOW); 
             Serial.print("RELE SPENTO ");
             Serial.print(pinOn);
           }
           
         /*  if (LEDON) {
             client.println("LUCE-ACCESA");
             scriviTemperatura();
           }
           else
           {
             client.println("LUCE-SPENTA");
             scriviTemperatura();
           }*/
           readString="";
        }//FINE IF DI LETTURA 
      }//FINE IF CLIENT 
    }//FINE WHILE 
   }//FINE IF PRINCIPALE 
      client.stop();
  }//FINE LOOP

come vedi ho spostato alla fine il client.stop(),

ho decommentato il codice Serial.println("read string "+readString); ed entra almeno 10 volte, il problema è che non legge più i parametri che metto prima usciva

read string ON-1

ora solo read string

Prova allora a modificarlo così e dimmi che succede:

  ...
         //a questo punto avrò la stringa completa di GET comando da eseguire HTTP 
         //devo eliminare il get e http e interpretare il comando
         //readString = getValue(readString, ' ', 1);
         Serial.println("read string "+readString);
         int pos = readString.indexOf("ON-");
         if( pos > 0) {
            //in questo caso devo leggere in pin ed accendere la luce
            String prova = readString.substring(pos+3);
            int pinOn = prova.toInt();
  ...