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):
#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?
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
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
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.
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:
#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");
}
@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