Go Down

Topic: [Risolto] [Wifi Shield] questo led non mi ubbidisce... (Read 1 time) previous topic - next topic

abstract

Nov 10, 2012, 11:08 am Last Edit: Nov 10, 2012, 06:01 pm by abstract Reason: 1
Uffa sono 2 giorni che non riesco a risolvere questo comportamento...

...lo sketch consiste in un web server, il quale mi mostra attraverso una pagina web il valore della fotoresistenza. E fin qui tutto bene, il valore viene visualizzato correttamente e aggiornato ogni 5 secondi.
Nello sketch però dico anche al led di accendersi quando il valore della fotoresistenza supera un certo valore, e questo non accade!  :(
Osservo invece che il led si accende e spegne ad ogni refresh della pagina, indipendentemente dal valore della fotoresistenza e non capisco perchè.

Lo sketch è il seguente (in pratica ho solo modificato il file "WifiWebServer" di esempio):
Code: [Select]

#include <SPI.h>
#include <WiFi.h>


char ssid[] = " :-P ";  //  your network SSID (name)
char pass[] = " :-pPp ";   // your network password
int keyIndex = 0;  // your network key Index number (needed only for WEP)
int sensorValue;
const int analogPin = A0;
const int ledPin = 13;
const int threshold = 600;

int status = WL_IDLE_STATUS;

WiFiServer server(80);

void setup() {
 pinMode(13, OUTPUT);

 //Initialize serial and wait for port to open:
 Serial.begin(9600);
 while (!Serial) {
   ; // wait for serial port to connect. Needed for Leonardo only
 }
 
 // check for the presence of the shield:
 if (WiFi.status() == WL_NO_SHIELD) {
   Serial.println("WiFi shield not present");
   // don't continue:
   while(true);
 }
 
 // attempt to connect to Wifi network:
 while ( status != WL_CONNECTED) {
   Serial.print("Attempting to connect to SSID: ");
   Serial.println(ssid);
   // Connect to WPA/WPA2 network. Change this line if using open or WEP network:    
   status = WiFi.begin(ssid, pass);

   // wait 10 seconds for connection:
   delay(10000);
 }
 server.begin();
 // you're connected now, so print out the status:
 printWifiStatus();
}


void loop() {
 // listen for incoming clients
 WiFiClient client = server.available();
 if (client) {
   Serial.println("new client");
   // an http request ends with a blank line
   boolean currentLineIsBlank = true;
   while (client.connected()) {
     if (client.available()) {
       char c = client.read();
       Serial.write(c);
       // if you've gotten to the end of the line (received a newline
       // character) and the line is blank, the http request has ended,
       // so you can send a reply
       if (c == '\n' && currentLineIsBlank) {
         
         sensorValue = analogRead(analogPin);
         if(sensorValue > threshold){
           digitalWrite(ledPin, HIGH);
         } else digitalWrite(ledPin, LOW);
           
         
         // send a standard http response header
         client.println("HTTP/1.1 200 OK");
         client.println("Content-Type: text/html");
         client.println("Connnection: close");
         client.println();
         client.println("<!DOCTYPE HTML>");
         client.println("<html>");
         // add a meta refresh tag, so the browser pulls again every 5 seconds:
         client.println("<meta http-equiv=\"refresh\" content=\"5\">");
         
         client.println("<p>Valore del sensore: ");
         client.print(sensorValue);
         client.print("</p>");
         client.println("</body></html>");
         break;
       }
       if (c == '\n') {
         // you're starting a new line
         currentLineIsBlank = true;
       }
       else if (c != '\r') {
         // you've gotten a character on the current line
         currentLineIsBlank = false;
       }
     }
   }
   // give the web browser time to receive the data
   delay(1);
     // close the connection:
     client.stop();
     Serial.println("client disonnected");
 }
}


void printWifiStatus() {
 // print the SSID of the network you're attached to:
 Serial.print("SSID: ");
 Serial.println(WiFi.SSID());

 // print your WiFi shield's IP address:
 IPAddress ip = WiFi.localIP();
 Serial.print("IP Address: ");
 Serial.println(ip);

 // print the received signal strength:
 long rssi = WiFi.RSSI();
 Serial.print("signal strength (RSSI):");
 Serial.print(rssi);
 Serial.println(" dBm");
}


Non capisco, il codice anche confrontandolo con ciò che ho trovato in giro su internet mi sembra ok, dov'è che sbaglio?
IDE 1.0.5 - Arduino Uno R3 - Arduino Wifi Shield - Arduino GSM Shield -  IMU Digital Combo Board 6 DOF ITG3200/ADXL345

uwefed

Quote
questo led non mi ubbidisce...

piccolo LED cattivo, molto cattivo!!  ;) ;) ;)

Il LED si accende a ogni ricarica della pagina perché hai messo il controllo nella parte di codice che viene eseguiro quando viene richiesto una pagina.

Se vuoi che il LED viene aggiornato a ogni ciclo loop() devi mettere

Code: [Select]
sensorValue = analogRead(analogPin);
          if(sensorValue > threshold){
            digitalWrite(ledPin, HIGH);
          } else digitalWrite(ledPin, LOW);


fuori da ogni condizione.

Ciao Uwe

abstract

Ciao e grazie per aver risposto!  :)

Ho messo queste righe di codice

Code: [Select]

  sensorValue = analogRead(analogPin);
  if(sensorValue > threshold){
  digitalWrite(ledPin, HIGH);
  } else digitalWrite(ledPin, LOW);


subito dopo loop() ma non va nemmeno ora. In effetti avevo già fatto questo tentativo ma adesso il led si accende e spegne velocemente...ad ogni loop sembra, perchè non fa nemmeno in tempo ad accendersi pienamente. Insomma questo if() proprio non se lo fila :(
IDE 1.0.5 - Arduino Uno R3 - Arduino Wifi Shield - Arduino GSM Shield -  IMU Digital Combo Board 6 DOF ITG3200/ADXL345

uwefed

Che segnale analogico stai leggendo?
Ciao Uwe

abstract

#4
Nov 10, 2012, 12:07 pm Last Edit: Nov 10, 2012, 12:50 pm by UweFederer Reason: 1
L'ingresso A0 è collegato ad un piedino della fotoresistenza e ottengo un valore (tra 0 e 1023) che mi viene visualizzato sula pagina web.

Aggiungo i collegamenti...
IDE 1.0.5 - Arduino Uno R3 - Arduino Wifi Shield - Arduino GSM Shield -  IMU Digital Combo Board 6 DOF ITG3200/ADXL345

uwefed

#5
Nov 10, 2012, 12:54 pm Last Edit: Nov 10, 2012, 12:58 pm by uwefed Reason: 1
Sí, lo avevi scritto ma mi ero scordato.
Scusami.

Presumo che hai collegato i 5V e la massa sulla breadboard.

Prova a farti stampare i valori letti tramite la seiale sul terminale. Cosí Ti rendi conto che numeri arrivano.
Se i valori sono abbastanza costanti, ma intorno al threshold aggiungi un isteresi:
accendi il LED a threshold+isteresi e lo spegni a threshold-isteresi dove per esempio isteresi potrebbe avere un valore da 10.

Ciao Uwe

PaoloP

Se hai collegato il led al pin 13 e usi la wifi shield, lo credo bene che va per i fatti suoi.  :smiley-mr-green: :smiley-mr-green:
Cambia pin che non sia 0,1,10,11,12 e 13.
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

abstract

Non so più che pesci pigliare  =(

Avevo letto in effetti qualcosa a riguardo di alcni pin... e ora sto usando il pin 7 ma non funziona ancora a dovere.
Adesso quando copro (faccio ombra) la fotoresistenza il led passa da spento ad acceso, ma poi si blocca tutto. La pagina web non viene più aggiornata ed il led rimane acceso anche se dovrebbe spegnersi perchè gli faccio luce.

Ri-pubblico il codice che allo stato attuale è il seguente:

Code: [Select]

#include <SPI.h>
#include <WiFi.h>


char ssid[] = "....";  //  your network SSID (name)
char pass[] = "....";   // your network password
int keyIndex = 0;  // your network key Index number (needed only for WEP)
int sensorValue;
const int analogPin = 0;
const int ledPin = 7;
const int threshold = 600;

int status = WL_IDLE_STATUS;

WiFiServer server(80);

void setup() {
  pinMode(ledPin, OUTPUT);
  //Initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
 
  // check for the presence of the shield:
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present");
    // don't continue:
    while(true);
  }
 
  // attempt to connect to Wifi network:
  while ( status != WL_CONNECTED) {
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:   
    status = WiFi.begin(ssid, pass);

    // wait 10 seconds for connection:
    delay(10000);
  }
  server.begin();
  // you're connected now, so print out the status:
  printWifiStatus();
}


void loop() {
  sensorValue = analogRead(analogPin);
  if(sensorValue >= threshold){
  digitalWrite(ledPin, HIGH);
  }
  if(sensorValue < threshold){
    digitalWrite(ledPin, LOW);
  }
 
  // listen for incoming clients
  WiFiClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
               
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connnection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // add a meta refresh tag, so the browser pulls again every 5 seconds:
          client.println("<meta http-equiv=\"refresh\" content=\"5\">");
         
          client.println("<p>Valore del sensore: ");
          client.print(sensorValue);
          client.print("</p>");
         
          client.println("</body></html>");
          break;
        }
       
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
       
      }
    }
    // give the web browser time to receive the data
    delay(1);
      // close the connection:
      client.stop();
      Serial.println("client disonnected");
  }
}


void printWifiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

IDE 1.0.5 - Arduino Uno R3 - Arduino Wifi Shield - Arduino GSM Shield -  IMU Digital Combo Board 6 DOF ITG3200/ADXL345

uwefed


Se hai collegato il led al pin 13 e usi la wifi shield, lo credo bene che va per i fatti suoi.  :smiley-mr-green: :smiley-mr-green:
Cambia pin che non sia 0,1,10,11,12 e 13.


ups, a questo non avevo pensato che il pin 13 viene usato per il SPI della Ethernet.
bravo PaoloP

@abstract hai messo una resistenza in serie al LED?

Ciao Uwe

mdpgit

Ciao,
su http://arduino.cc/en/Guide/ArduinoWiFiShield (speriamo che il link sia venuto bene ..) trovi i piedini da non usare ed il 7 e' proprio tra questi ....

abstract

@mdpgit
Sei un grande! Era proprio quello il problema, è bastato usare il pin 8 anzichè il 7 e tutto funziona come deve!
Eppure c'ero già passato nel link che mi hai postato, ma evidentemente troppo di fretta  :smiley-sweat:

Grazie a tutti x l'aiuto, a buon rendere!  ;)
IDE 1.0.5 - Arduino Uno R3 - Arduino Wifi Shield - Arduino GSM Shield -  IMU Digital Combo Board 6 DOF ITG3200/ADXL345

Go Up