GET e stringa variabile

Buonasera a tutti. Ultimamente stavo creando questo programmino per gestire una futura illuminazione tramite un’app creata tramite app inventor (tramite LAN). Una volta creato il programma e l’app, entusiasta dell’ ottimo funzionamento, mi accingevo all’ultimo passo, ovvero richiedere ad arduino lo stato del pin appena si apre l’app, una tragedia!! Non riesco ad ottenere lo stato senza che il pin vada a 0, o comunque venga pilotata l’uscita in modo anomalo, ovvero quando invio il numero 300 sulla stringa.

#include <Ethernet.h>



byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 200 }; // indirizzo IP della shield
EthernetServer server(80);
int led;
int val;
int ledPin = 3; // LED pin

void setup(){

Ethernet.begin(mac, ip);
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}

void loop(){
String readString;


EthernetClient client = server.available();
if (client) {
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
readString.concat(c);
String luce = readString;
String luce2 = luce.substring(5, 8);
int val = luce2.toInt();




if (c == '\n' && currentLineIsBlank) {

Serial.print (led);

if(val == 254) {
analogWrite(ledPin, 254);
client.print("HTTP/1.1 200 OK");         
client.println();

}
if(val == 1) {
analogWrite(ledPin, 0);
client.print("HTTP/1.1 200 OK off");
client.println();

}
 
if ((val<=253)&&(val>1));{
led = val;
analogWrite (ledPin, led);
client.print(led);
client.println();

}
if (val==300);{

client.print(led);
client.println();


}
readString="";
client.stop();

}
}
}
}
}

Vorrei capire questo, se la variabile “led” in questo if è ad esempio 130…perchè se invio la stringa “300”, la variabile “led” diventa 300? Non dovrebbe essere 130 visto che la variabile viene modificata teoricamente solo in questa condizione? :

if ((val<=253)&&(val>1));{
led = val;
analogWrite (ledPin, led);
client.print(led);
client.println();

In attesa di aiuto, continuo a fare prove e documentarmi…grazie!!

Perché nell’if() assegni il valore della variabile val a led, per cui cambi valore a led e lo porti a 300.

Leggi i commenti

if ((val<=253)&&(val>1));{ // val vale 300
led = val; // adesso dici led è uguale a 300, da qui in poi led vale 300
analogWrite (ledPin, led);
client.print(led);
client.println();

Frassica:
Buonasera a tutti. Ultimamente stavo creando questo programmino per gestire una futura illuminazione

La mia prima risposta è una sola parola (in realtà erano due ma la seconda me la auto-censuro;) ).

INDENTA! :slight_smile:

Eppure non è difficile, graffa aperta = aggiungi un livello, grafffa chiusa = torni indietro. Se non lo fai, non solo ti impicci tu stesso, ma rendi difficile anche a NOI capire cosa diamine faccia quel codice e quindi darti risposte giuste.

Ora per mettere a posto quel codice apri l’IDE e premi sto cacchio di Ctrl-T e te lo indenta correttamente lui, poi ri-postalo. E vedrai che la soluzione si trova.

torn24:
Perché nell’if() assegni il valore della variabile val a led, per cui cambi valore a led e lo porti a 300.

Non è quello il problema (anche perché nel corpo della if entrerebbe solo se val<=253 non a 300).

Ma se indenta decentemente come gli ho chiesto, si vede subito dov’è il problema…

docdoc: Ma se indenta decentemente come gli ho chiesto, si vede subito dov'è il problema...

Giusto, giustissimo voler il codice correttamente indentato (per questo non do la risposta ;) ) ma qui il problema si vede anche senza indentare ;D

fabpolli:
ma qui il problema si vede anche senza indentare ;D

Certo, ma quando indenta secondo me se ne accorge da solo… :wink: Spero. :smiley:

Va bene ragazzi, ho formattato il testo…

#include <Ethernet.h>



byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 200 }; // indirizzo IP della shield
EthernetServer server(80);
int led;
int val;
int ledPin = 3; // LED pin

void setup() {

 Ethernet.begin(mac, ip);
 pinMode(ledPin, OUTPUT);
 Serial.begin(9600);
}

void loop() {
 String readString;


 EthernetClient client = server.available();
 if (client) {
   boolean currentLineIsBlank = true;
   while (client.connected()) {
     if (client.available()) {
       char c = client.read();
       readString.concat(c);
       String luce = readString;
       String luce2 = luce.substring(5, 8 );
       val = luce2.toInt();




       if (c == '\n' && currentLineIsBlank)

       {

         Serial.print (led);

         if (val == 254) {
           analogWrite(ledPin, 253);
           client.print("HTTP/1.1 200 OK");
           client.println();

         }
         if (val == 1) {
           analogWrite(ledPin, 0);
           client.print("HTTP/1.1 200 OK off");
           client.println();

         }

         if ((val <= 253) && (val > 1)); {
           led = val;
           analogWrite (ledPin, led);
           client.print(val);
           client.println();

         }

         if (val == 300); {

           client.print(led);
           client.println();

         }


         readString = "";
         client.stop();

       }
     }
   }
 }
}

E hai anche fatto uno sforzo minimo per cercare l’errore? Scusa ma direi di no, ti fornisco un; indizio

Ma che problemi avete? Si ho provato eccome a cercare l'errore. Cosa è, un quiz? Lasciamo stare, mi arrangio da solo e prima o poi spero che risolverò da solo...non capisco veramente questo modo di fare saccente che avete.

:sweat_smile: Che problemi abbiamo noi non lo so... tu invece hai problemi con i ; che hi messo nel posto sbagliato E, sperando di non sembrare troppo saccente, ti posso già anticipare che il tuo programma quando girerà per un po' di tempo andrà quasi certamente incontro a blocchi improvvisi e/o malfunzionamenti vari, specie se stai usando una UNO o similare (se usi qualcosa con più memoria semplicemnete si bloccherà dopo più ore di funzionamento). Questo perché stai usando la classe String che, se cerchi sul forum, vedrai essere sconsigliata a più riprese per tutta una serie di motivazioni che potrai leggere nei vari post.

Frassica: Ma che problemi avete? Si ho provato eccome a cercare l'errore.

Evidentemente non hai controllato con attenzione ... ti è stato detto, in modo anche abbastanza chiaro, che hai un ' ; ' di troppo ... guardati i vari IF e vedrai che ti accorgi di dove sta l'errore ...

Qui purtroppo NON diamo la "pappa fatta" ... come ben spiegato nel REGOLAMENTO, al punto 16.13, ma pretendiamo che, una volta che gli si danno le indicazioni, l'utente ci metta del suo ... ed impari qualche cosa ... :)

Guglielmo

Frassica:
Ma che problemi avete? Si ho provato eccome a cercare l’errore. Cosa è, un quiz?

Caro Frassica (parente?), come ti ha spiegato anche Guglielmo (che se non lo hai capito è uno dei moderatori del forum…) non ti facciamo dei “quiz” ma vogliamo aiutarti a CAPIRE l’errore o gli errori del tuo programma, evitando di dare “pappa pronta” che uno copia/incolla e poi via, fino ad arrivare là dove nessun uomo… Ehm… Ok.

Quindi vedi nelle if() dove c’è un punto e virgola di troppo. Aiutino: ti ricordo che se dopo una if hai una sola istruzione, va dopo la if e terminata con punto e virgola, mentre se la if deve eseguire più istruzioni queste vanno racchiuse tra graffe e non serve punto e virgola.
Vedi qualche if() il cui corpo non c’è perché hai un punto e virgola di troppo? Ecco, quello.

Poi altre cosette, come ad esempio la variabile “currentLineIsBlank” che viene inizializzata a true, poi non cambia mai valore…

Per finire due consigli “stilistici” che però aiutano te (e noi) ad avere più facilmente sott’occhio il flusso del tuo programma:

  1. a che servono tutte quelle righe vuote se non a rendere il codice troppo (inutilmente) “alto”? Toglile, lascia UNA riga vuota se ci sono blocchi di codice che vuoi “visivamente” raggruppare.

  2. Commenta. Commenta. Commenta. I commenti servono a te per ricordarti cosa fa ogni blocco di codice ed a noi capire meglio cosa intendi fare, e quindi eventualmente consigliarti sucosa cambiare, senza costringerci ad “interpretare” le istruzioni.
    Inoltre è spesso utilissimo iniziare un programma scrivendo anche SOLO i commenti, spiegando in italiano quello che dovrebbe fare (ovviamente quando hai un ciclo o una condizione, anche i commenti li indenterai): in questo modo una volta che ti convince la versione “parlata”, ti basta “tradurre” ogni commento nelle istruzioni che realizzano quanto scritto.

Insomma, vedi questa versione del tuo codice, oltre a togliere le righe vuote (non è più leggibile così?) ti ho iniziato a mettere qualche commento (ma rivedili e prosegui tu), e NON ho corretto ancora l’errore della if:

#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 200 }; // indirizzo IP della shield
EthernetServer server(80);
int led;
int val;
int ledPin = 3; // LED pin

void setup() 
{
 Ethernet.begin(mac, ip);
 pinMode(ledPin, OUTPUT);
 Serial.begin(9600);
}

void loop() 
{
 String readString;

 // Verifico se ho una connessione
 EthernetClient client = server.available();
 if (client) 
 { // E' arrivata una connessione!
   boolean currentLineIsBlank = true;
   while (client.connected()) 
   { // Leggo i dati inviati dal client
     if (client.available()) 
     {
       char c = client.read();
       // Accumulo il carattere nel buffer
       readString.concat(c);
       String luce = readString;
       // Leggo il valore ricevuto
       String luce2 = luce.substring(5, 8 );
       val = luce2.toInt();
       // Se ho ricevuto un Newline, eseguo
       if (c == '\n' && currentLineIsBlank)
       {
         Serial.print (led);
         // Se è 254 mando il valore 253 al led e rispondo OK
         if (val == 254) {
           analogWrite(ledPin, 253);
           client.print("HTTP/1.1 200 OK");
           client.println();
         }
         // Se è 1 spengo il led e rispondo OK
         if (val == 1) {
           analogWrite(ledPin, 0);
           client.print("HTTP/1.1 200 OK off");
           client.println();
         }
         // Se è tra 1 e 253... (e cosa rispondi??)
         if ((val <= 253) && (val > 1)); {
           led = val;
           analogWrite (ledPin, led);
           client.print(val);
           client.println();
         }
         // Se è 300 ... (???) (e cosa rispondi??)
         if (val == 300); {
           client.print(led);
           client.println();
         }
         // Fine operazioni
         readString = "";
         client.stop();
       }
     }
   }
 }
}

Ciao a tutti! Quel punto e virgola non l'avevo notato, eppure ho guardato i vari codici dei vari post :) Non voglio attirarmi le antipatie di nessuno "ognuno ragiona con la sua testa", ma secondo me era proprio il caso di dirlo subito e spiegarglielo, non c'è niente da riflettere o da imparare in questo caso :) ;)

torn24: ... Quel punto e virgola non l'avevo notato, eppure ho guardato i vari codici dei vari post ...

... giustissimo, NON è un tuo problema e ti sei limitato a "guardare" ... se fosse stato il TUO problema, scommettiamo che avresti fatto molto di più che "guardare"? E avresti sicuramente visto l'errore come abbiamo fatto tutti noi che abbiamo esaminato il codice con attenzione ? ;)

Guglielmo

Mi hai corretto un errore grammaticale!? "ho", grazie :) ma purtroppo, ai me, ne faccio di peggiori :) :) :)

torn24: purtroppo, ai me,

"ahimè"

:D :D :D

:)

torn24: Mi hai corretto un errore grammaticale!?

:o :o :o ... pensa che non l'ho manco visto ... non ho corretto nulla (... non sto qui a fare il prof di grammatica, anche perché sono il primo che spesso scrive strafalcioni), ho spiegato perché non hai visto il problema ;)

Guglielmo