Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
Sistemi integrati - problema conservare dato variabile
Forum - Sistemi integrati - problema conservare dato variabile

Avatar
alex1995 (Normal User)
Expert


Messaggi: 278
Iscritto: 27/01/2011

Segnala al moderatore
Postato alle 13:52
Martedì, 24/02/2015
salve, devo conservare dei dati e purtroppo non posso farlo sulla scheda sd o sull eeprom quindi devo conservarli in una variabile il codice è questo:
Codice sorgente - presumibilmente C#

  1. #include <SPI.h>
  2. #include <Ethernet.h>
  3. #include <WString.h>
  4.  
  5. byte mac[] = {
  6.   0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
  7. };
  8.  
  9. String stato = "on";
  10.  
  11. IPAddress ip(192, 168, 1, 177);
  12.  
  13. EthernetServer server(90);
  14.  
  15. void setup()
  16. {
  17.   Serial.begin(9600);
  18.   Ethernet.begin(mac, ip);
  19.   server.begin();
  20.   Serial.println("server is at ");
  21.   Serial.println(Ethernet.localIP());
  22.   pinMode(2, OUTPUT);
  23.   pinMode(3, OUTPUT);
  24.   pinMode(4, OUTPUT);
  25.   pinMode(5, OUTPUT);
  26.   pinMode(6, OUTPUT);
  27.   pinMode(7, OUTPUT);
  28.   pinMode(9, OUTPUT);
  29.   pinMode(8, OUTPUT);
  30.   pinMode(11, OUTPUT);
  31.   SD.begin(4);
  32.   String stato = "on";
  33. }
  34.  
  35. void rispondiClient(String risposta, EthernetClient ethclient)
  36. {
  37.   ethclient.println("HTTP/1.1 200 OK");
  38.   ethclient.println("Content-Type: text/html");
  39.   ethclient.println("Connection: close");// the connection will be closed after completion of the response
  40.   ethclient.println("Refresh: 5");// refresh the page automatically every 5 sec
  41.   ethclient.println();
  42.   ethclient.println("<!DOCTYPE HTML>");
  43.   ethclient.println("<html><body>");
  44.   ethclient.println(risposta);
  45.   ethclient.println("</body></html>");
  46. }
  47.  
  48. void loop()
  49. {
  50.   Serial.println(stato);
  51.   String getRequest = String();
  52.   char requestChar;
  53.  
  54.   EthernetClient HTTPClient = server.available();
  55.   if (HTTPClient)
  56.   {
  57.     Serial.println("new client");
  58.     boolean currentLineIsBlank = true;
  59.     boolean sentHeader = false;
  60.     while (HTTPClient.connected())
  61.     {
  62.       if (HTTPClient.available())
  63.       {
  64.         while (HTTPClient.available())
  65.         {
  66.           char requestChar = HTTPClient.read();
  67.           getRequest += requestChar;
  68.           if (requestChar == '\n')
  69.           {
  70.             while (HTTPClient.available())
  71.             {
  72.               char requestChar = HTTPClient.read();
  73.               getRequest += requestChar;
  74.               if (requestChar == '\n')
  75.               {
  76.                 break;
  77.               }
  78.             }
  79.             break;
  80.           }
  81.         }
  82.  
  83.         if (getRequest.indexOf("on") != -1)
  84.         {
  85.           String stato = "on";
  86.           digitalWrite(8, HIGH);
  87.           rispondiClient(stato, HTTPClient);
  88.         }
  89.         if (getRequest.indexOf("off") != -1)
  90.         {
  91.           String stato = "off";
  92.           digitalWrite(8, LOW);
  93.           rispondiClient(stato, HTTPClient);
  94.         }
  95.       }
  96.  
  97.       break;
  98.  
  99.     }
  100.  
  101.   }
  102.  
  103.   if(stato = "on")
  104.   {
  105.     digitalWrite(8, HIGH);
  106.   }
  107.  
  108.   if(stato = "off")
  109.   {
  110.     digitalWrite(8, LOW);
  111.   }
  112.  
  113. }
  114.  
  115.   HTTPClient.stop();
  116.   delay(100);
  117.   Serial.println("client disconnected");
  118.  
  119.  
  120. }



la variabile cambia stato quando invio la richiesta ma poi torna al valore che ha nel setup, come mai?

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6117
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 14:08
Martedì, 24/02/2015
Quante volte dichiari la variabile stato?

Va fatto solo una volta all'inizio

String stato = "on";

Nel resto del codice devi solo cambiarne il valore con

stato = "on";

oppure

stato = "off";

NON devi usare nuovamente String stato ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 17:41
Martedì, 24/02/2015
Mi permetto di sottolineare un altro problema di carattere meno tecnico
Codice sorgente - presumibilmente Sistemi integrati

  1. if (getRequest.indexOf("on") != -1)


Questo, no! Non puoi adoperarlo in questo caso, il tuo marcatore è composto da 2 caratteri, se provi a stampare la request che arriva ad Arduino ti accorgi subito del perché. La request è composta da più di un centinaio di caratteri (come minimo), la percentuale di falsi positivi è troppo alta, a parer tuo quanto è probabile trovare in un testo di 100char casuali almeno una ricorrenza di "on"? Non è facilissimo, ma nemmeno cosi improbabile da poterlo tralasciare.
Sfrutta il fatto che la request HTTP inizia con una riga contenente
Codice sorgente - presumibilmente Sistemi integrati

  1. GET /paginarichiesta HTTP/1.1


(Di solito il POST su Arduino non si usa)

PS perché non passi ad Ajax?

Ultima modifica effettuata da Roby94 il 24/02/2015 alle 17:46
PM Quote
Avatar
alex1995 (Normal User)
Expert


Messaggi: 278
Iscritto: 27/01/2011

Segnala al moderatore
Postato alle 20:47
Mercoledì, 04/03/2015
lo so è questione di casualità se lui funziona correttamente, hai una soluzione per questo?
perche passare ad ajax?

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 21:46
Mercoledì, 04/03/2015
Te l'ho scritto
Codice sorgente - presumibilmente Sistemi integrati

  1. if (getRequest.indexOf("GET /on HTTP/1.1") != -1)



Su Arduino si preferisce usare AJAX in quanto bisogna aggiornare spesso i valori e ricaricare la pagina completa con un alta frequenza è impossibile.

PM Quote
Avatar
alex1995 (Normal User)
Expert


Messaggi: 278
Iscritto: 27/01/2011

Segnala al moderatore
Postato alle 11:37
Sabato, 07/03/2015
ah grazie scrivere la richiesta completa, in effetti ho usato uno script in js che dopo aver scritto la risposta sui file con php aggiorna la pagina, non conosco il js però ora che mi ci fai pensare sarebbe meglio far leggere il file con le informazioni di continuo a js senza aggiornare la pagina con un redirect alla pagina stessa. grazie 1000 :)

PM Quote