qualcuno sa dirmi perchè...

uno sketch di partenza funzionante, caricato su arduino funziona bene...
poi carico un altri sketch di prova per fare delle modifiche al programma...
ricarico lo sketch iniziale e boomm non funziona più nulla.

scusa te lo sfogo ma non è la prima volta che succede e soprattutto non riesco a capire il perchè..

pensavo fosse una questione di interferenza elettromagnetica per via della vicinanza di arduino ai relè, l'ho spostato, ma il problema rimane...

Grazie mille a tutti

Luigi

Ti invitiamo a presentarti qui: Re: Presentazioni nuovi iscritti, fatevi conoscere da tutti! (Part 1) - Generale - Arduino Forum
e a leggere il regolamento: http://forum.arduino.cc/index.php?topic=149082.0

@Luigi, senza nessuna ulteriori info che possiamo dire? Nulla. :smiley:

si potrebbe sempre dire:
Le interferenze elettromagnetiche son proprio delle brutte bestie

ma in questo caso, poverine, non penso c'entrino qualcosa ( forse !!! )

nid69ita:
@Luigi, senza nessuna ulteriori info che possiamo dire? Nulla. :smiley:

Hai perfettamente ragione, me ne scuso ma in questi giorni sono stato un po' impegnato, prometto che da domani potrò dare più informazioni :smiley:

Comunque inizio a girarvi il codice:

#include <String.h>
#include <SPI.h>
#include <WiFi.h>
 
char ssid[] = "XXX";     //  your network SSID (name) 
char pass[] = "xxx";   // your network password
int keyIndex = 0;            // your network key Index number (needed only for WEP)

int status = WL_IDLE_STATUS;

WiFiServer server(80);
//WiFiClient client; 
int outPin = 8;
String testo; //string

void setup(){
  pinMode(outPin, OUTPUT);
  Serial.begin(9600);
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WIFI SHIELD NON PRESENTE");
    while(true);
  }
  while (status != WL_CONNECTED) {
    Serial.print("IN ATTESA DI ESSERE CONNESSI ALLA SSID: ");
    Serial.println (ssid);
    status = WiFi.begin(ssid, pass);
    delay (10000);
  }
  server.begin();
}


void loop()
{
  // listen for incoming clients
  WiFiClient client = server.available();
  if (client) {
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    String buffer = "";  //  Declare the buffer variable

    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.print(c);  //  Send every character read to serial port 
        buffer+=c;        //  Assign to the buffer

        // 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();

          if (digitalRead(8)){  //  1<-- Display LED status
            client.print(" LED is ON");
          }else{
            client.print(" LED is OFF");
          }
          client.println("
");
          
  
          client.print("<FORM action=\"http://192.168.0.122/\" >");
          client.print("<P> <INPUT type=\"radio\" name=\"status\" value=\"1\">ON");
          client.print("<P> <INPUT type=\"radio\" name=\"status\" value=\"0\">OFF");
          client.print("<P> <INPUT type=\"submit\" value=\"Submit\"> </FORM>");
            
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
          buffer="";       //  Clear the buffer at end of line
        } else if (c == '\r') {            
          if(buffer.indexOf("GET /?status=1")>=0)
            digitalWrite(8,HIGH);  // Catch ON status and set LED
          
          if(buffer.indexOf("GET /?status=0")>=0)
            digitalWrite(8,LOW);  // Catch OFF status and set LED
        }
        else {
          // 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();
  }
}

Questo codice l'ho prodotto facendo un po' di taglia e cuci, l'ho fatto girare su Arduino Uno + Wifi shield. Questi sono collegati ad una scheda relè che comanda una elettrovalvola 220V. Il tutto era assemblato in un piccolo case, ora la scheda relè è in un'altra scatola, distante circa un metro da Arduino. Avevo fatto questo spostamento perchè credevo a disturbi elettromagnetici dovuti al relè.. ma a quanto pare non è questo il problema.

Avevo provato il codice accendendo il led sul pin 13 e tutto funzionava alla grande. Attacco poi il tutto alla scheda relè. Tutto funziona.
Però poi mi sono accorto di riuscire ad accendere/spegnere il led solo da dentro la lan, e quindi ho pensato di modificare:

  client.print("<FORM action=\"http://192.168.0.122/\" >");

in questo:

 client.print("<FORM action=\"/\" >");

faccio per ricaricare lo sketch su arduino con la modifica e voilà, non accedo più alla pagina web. Ricarico il codice originale, niente da fare, non accedo manco più con il codice che prima funzionava!!

Com'è possibile?

Secondo me hai problemi di RAM esaurita. Usi troppo spesso print senza la macro F() e le stringhe.
Ciao Uwe

uwefed:
Secondo me hai problemi di RAM esaurita.

Perdona la mia ignoranza, ma se la RAM fosse esaurita, lo dovrebbe esser sempre. Perché invece ha funzionato?

Usi troppo spesso print senza la macro F() e le stringhe.

qui invece mi fermo (..sto imparando :)). Devo documentarmi e chiederti aiuto. Puoi spiegarmi meglio cosa dovrei fare? Grazie mille!

Il tutto era assemblato in un piccolo case

ora la scheda relè è in un'altra scatola, distante perchè credevo a disturbi elettromagnetici dovuti al relè

ma a quanto pare non è questo il problema.

Avevo provato il codice accendendo il led sul pin 13 e tutto funzionava alla grande.

Attacco poi il tutto alla scheda relè. Tutto funziona.

Fai chiarezza ... funzionava o non funzionava sta cosa?
perchè prima dici che non funzionava nemmeno distanziandolo, poi ci metti il led e funziona, poi ci metti il relè e funziona

Non potresti caricare un esempio wifi che hai nell'ide per verificare se accedi alla scheda?

è questo lo shield? http://arduino.cc/en/Main/ArduinoWiFiShield

pablos:
Non potresti caricare un esempio wifi che hai nell'ide per verificare se accedi alla scheda?

è questo lo shield? http://arduino.cc/en/Main/ArduinoWiFiShield

già fatto, e funziona. Accedo alla scheda.
Il problema è che lo sketch è ok, ha funzionato. Ora non funziona più senza aver cambiato niente a livello hardware.
E comunque anche quando non riesco a visualizzare la pagina web, arduino risponde sempre al ping..

Si la shield è quella

c'è per caso una SD inserita nello slot?

la pagina html dovrebbe essere formattata correttamente
tipo

client.print("<html><head><title>");
  client.print(title);
  client.println("</title><body>");

vedo che ci sono dei pin utilizzati non dichiarati nel setup devo andare a vedere lo schema della shield e la libreria

pablos:
c'è per caso una SD inserita nello slot?

la pagina html dovrebbe essere formattata correttamente
tipo

client.print("<html><head><title>");

client.print(title);
  client.println("");




vedo che ci sono dei pin utilizzati non dichiarati nel setup devo andare a vedere lo schema della shield e la libreria

no nessuna scheda SD inserita.

Non vorrei essere noioso e scortese nel ripete che lo sketch ha funzionato e io vedevo correttamente la pagina web.

si lo so ma ho il sospetto che hai lo stesso difetto della shield ethernet wiznet

prova ad aggiungere nel setup()

pinMode(10, OUTPUT); 	// Set the CS pin as an output
  digitalWrite(10, HIGH); // Turn off the chip! (wait for configuration)
  pinMode(4, OUTPUT);       // Set the SDcard CS pin as an output
  digitalWrite(4, HIGH); 	// Turn off the SD card! (wait for configuration)

ricorda di non usare i pin
10-11-12-13-4-7

pablos:
si lo so ma ho il sospetto che hai lo stesso difetto della shield ethernet wiznet

prova ad aggiungere nel setup()

pinMode(10, OUTPUT); 	// Set the CS pin as an output

digitalWrite(10, HIGH); // Turn off the chip! (wait for configuration)
 pinMode(4, OUTPUT);       // Set the SDcard CS pin as an output
 digitalWrite(4, HIGH); // Turn off the SD card! (wait for configuration)

ti ringrazio, domani pomeriggio provo ad inserire quel pezzo nel setup.

ricorda di non usare i pin
10-11-12-13-4-7

come vedi uso solo il pin 8

Però ribadisco, perchè ha funzionato? Se fosse un bug, non avrebbe dovuto funzionare neanche prima! Lo dico solo per logica!!!! Oppure datemi una spiegazione :smiley:

Grazie mille per ora!!

non fare il quote ogni volta se no ci vogliono 18 pagine :slight_smile:
Il perchè è semplice, non tutte le librerie sono immacolate e senza difetti, oltre a errori di sketch che uno può commettere

Tu fa questa prova, se funziona poi ti spiego il perchè :slight_smile:

ciao

@Pablos
ho fatto la prova e non è cambiato nulla.

Secondo quello che dici, una libreria e un sketch che funzionano (e funzionano perchè ho potuto azionare il relè dalla pagina web) potrebbero non funzionare il giorno dopo perchè difettate? Non ha senso. Se fosse come dici, non avrebbe mai funzionato niente. Dove sbaglio nel ragionare così? :frowning:

@Uwefed
Per quanto riguarda la RAM, non vale lo stesso discorso?

POTREBBE ESSERE LA SCHEDA RELE' CHE FA IMPAZZIRE IN QUALCHE MODO ARDUINO? La scheda è questa:

Oggi provo a caricare lo sketch con scheda relè scollegata.. che ne dite?

Grazie!!!

g4non:
Per quanto riguarda la RAM, non vale lo stesso discorso?
[/url]
Se hai anche variabili create a runtime (di tipo dinamico) l'esaurimento di RAM può anche non presentarsi sempre, dipende se variano le condizioni di funzionamento.

La scheda è questa:
KMtronic Ltd: Two RELAY BOARD ready for your PIC, AVR project - 5V

Siccome ha le R sulle basi dei transistor di pilotaggio integrate, stando al datasheet, perché non fai un semplice test per vedere se la scheda è giusta? Basta collegare un ingresso ai 5V (con anche la massa in comune all'alimentazione che usi) e dovresti vedere il relé scattare.

Oggi provo a caricare lo sketch con scheda relè scollegata.. che ne dite?

Prova che secondo me non serve, dato che se i collegamenti sono corretti la scheda non può dar noia all'Arduino in fase di programmazione, a meno che tu non abbia collegato la scheda sui pin 0 e 1, che sono quelli della seriale.

@leo72
le condizioni di funzionamento? Sempre le stesse, accendi/spegni. Le variabili le puoi vedere nel listato che ho postato prima, ma non mi sembra di avere granchè...
La scheda relè funziona! EHEHE un anno fa durante un caricamento di un sketch avevo messo un relè sulla porta 0. ttrrtaetrrtrtrrtrartartartr !!! :smiley:
Non è il mio caso adesso però, è sul pin 8.

Scusate se insisto nel ripetere che il sistema così com'è nel suo insieme hw e sw ha funzionato con il listato che ho postato
Funzionava tutto!
Quando però mi accorsi di un malfunzionamento negli accessi da fuori casa (cioè potevo solo visualizzare la pagina web ma non azionare il relè), provai a modificare una stringa del listato. Provai quindi a caricarlo modificato, e niente, non funzionava, non visualizzavo la pagina web (però arduino ha sempre pingato).

Provai allora a rimettere il listato funzionante e.... sorpresa, non funzionava neppure più quello.
Ora, potrebbe essere la RAM, ma non credo di essere così bravo nel capire se il problema è quello. Cosa modifichereste al listato?

Partiamo dal software.
Il tuo sketch compilato mi da un uso di 701 byte di SRAM su 2048, però parliamo di variabili statiche non dinamiche. Inoltre come ti ha detto Uwe usi tante stringhe senza la macro F() che serve a far sì che quelle stringhe siano lasciate in Flash. Devi sapere che ogni stringa, prima di essere usata, viene copiata in RAM.
Quindi prendi il tuo sketch e cambia tutte le stampe di stringhe da così (esempio):

client.println("HTTP/1.1 200 OK");

a così:

client.println(F("HTTP/1.1 200 OK"));

Sul lato hardware, è possibile che ci sia stato anche un problema, ossia che si sia guastato qualcosa. Per "qualcosa" anche qualche canale della scheda che è saltata . E che possa anche aver danneggiato l'Arduino, non si può escludere. L'Arduino da solo funziona? Cioè, i pin che usi per pilotare i relé funzionano correttamente?

Grazie mille Leo,
oggi pomeriggio proverò a cambiare le stringhe come mi hai detto e ti farò sapere

Per quanto riguarda Arduino posso dirti che funziona, i pin funzionano correttamente. Avendo altre schede Arduino Uno, avevo provato anche a sostituirla, ma il problema rimane.