Arduino + Ethernet Shild

Buongiorno a tutti,
Cerco di muovere i primi passi per gestire il mio progetto in modo immediato via "web" (in realtà solo dalla mia rete).

Ho "scritto" (riadattato) un piccolo codice che funziona bene e male a singhiozzo.
Bene, io non mi spiego come una cosa possa funzionare 3 volte su 4 perchè di norma, o va o non va!

Non credo il problema sia software però lo spero, altrimenti la scheda....
Testato con Arduino Uno / Mega, ide 1.0.3
Mac Firefox, Ihone/Ipad Safari
Pc vari, cellulari vari...

#include <SPI.h>
#include <Ethernet.h> 

byte mac[] = { 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF };
byte ip[] = { 10, 77, 114, 50 };                                        // Adeguare alla vs. rete
EthernetServer server(80);
String leggidalweb;
byte t=3;
byte ur=3;

void setup()
{ 
  Ethernet.begin(mac, ip);
  Serial.begin(9600);           
  
}
 
 
 
void loop()
{
   EthernetClient  client = server.available();
 
  if (client) {
    boolean currentLineIsBlank = true;
   
    while (client.connected()) {
      if (client.available()) { 
        char c = client.read();
        leggidalweb.concat(c);   
        if (c == '\n' && currentLineIsBlank) {
          //Serial.print(readString);
               
        if(leggidalweb.indexOf("on_1") > 0)    {Serial.println("out_1, on");   t=1;}     
        if(leggidalweb.indexOf("off_1") > 0)   {Serial.println("out_1, off");  t=2;}
        if(leggidalweb.indexOf("auto_1") > 0) {Serial.println("out_1, Auto"); t=3;}      
      
        if(leggidalweb.indexOf("on_2") > 0)     {Serial.println("out_2, on");   ur=1;}     
        if(leggidalweb.indexOf("off_2") > 0)    {Serial.println("out_2, off");  ur=2;}
        if(leggidalweb.indexOf("auto_2") > 0) {Serial.println("out_2, Auto"); ur=3;}        
  
        
        
         
        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: text/html");
        client.println();
        client.print("<html><head><title>ARDUINO Controllo WEB</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body>");
        client.print("

");
       
     client.print("<span> Attuatore 1 </span>");
        if (t==1) client.print("<input disabled=\"disabled\" maxLength=\"30\" size=\"9\" value=\"Acceso\" STYLE=\"background-color:#2EFE2E\"/>");  
        if (t==2) client.print("<input disabled=\"disabled\" maxLength=\"30\" size=\"9\" value=\"Spento\" STYLE=\"background-color:#FE2E2E\"/>");
        if (t==3) client.print("<input disabled=\"disabled\" maxLength=\"30\" size=\"9\" value=\"Auto\" STYLE=\"background-color:#00BFFF\"/>");
      
        client.print("<p><p/>");   
        client.print("<input type=\"button\" style=\"width:60px; height:40px\" value=\"On\" onclick =\" location.href='/?on_1'\">");
        client.print("<input type=\"button\" style=\"width:60px; height:40px\" value=\"Off\" onclick =\" location.href='/?off_1'\">");       
        client.print("<input type=\"button\" style=\"width:60px; height:40px\" value=\"Auto\" onclick =\" location.href='/?auto_1'\">");    
        client.println("<hr \"color:#00FF00\" size=\"1\">"); // Linea Orizzontale
        client.print("<p><p/>");
       
     client.print("<span> Attuatore 2 </span>");
        if (ur==1) client.print("<input disabled=\"disabled\" maxLength=\"30\" size=\"9\" value=\"Acceso\" STYLE=\"background-color:#2EFE2E\"/>");  
        if (ur==2) client.print("<input disabled=\"disabled\" maxLength=\"30\" size=\"9\" value=\"Spento\" STYLE=\"background-color:#FE2E2E\"/>");
        if (ur==3) client.print("<input disabled=\"disabled\" maxLength=\"30\" size=\"9\" value=\"Auto\" STYLE=\"background-color:#00BFFF\"/>");
      
        client.print("<p><p/>");   
        client.print("<input type=\"button\" style=\"width:60px; height:40px\" value=\"On\" onclick =\" location.href='/?on_2'\">");
        client.print("<input type=\"button\" style=\"width:60px; height:40px\" value=\"Off\" onclick =\" location.href='/?off_2'\">");       
        client.print("<input type=\"button\" style=\"width:60px; height:40px\" value=\"Auto\" onclick =\" location.href='/?auto_2'\">");    
        client.println("<hr \"color:#00FF00\" size=\"1\">"); // Linea Orizzontale
        client.print("<p><p/>");
       

       
       
        client.println("</body></html>");
         
        leggidalweb="";
        
        delay(1);
        client.flush();
        client.stop(); 
        }
      }
    }
  }
}

funziona.tiff (13.2 KB)

nonfunziona.tiff (26.6 KB)

aggiorna all'ide 1.0.4, che c'è un problema con la malloc e le String

in oltre le stringhe lettile in f(), così non occupano RAM (altro possibilissimo problema)

Sto provando io con la 1.0.4 ...

Premendo velocemente sui pulsanti (nel browser) la Ethernet Shield va in palla e non funziona piu'.

puoi mettere un pò di serial print per debuggare dove si blocca, sempre se si blocca sempre nello stesso punto?

La maggior parte dei problemi che si hanno con la ethernet shield sono causati dal fatto che la stessa scheda condivide l' ICSP dia per la comunicazione verso la rete che verso la SD
Il pin della SD è il 4
il pin della ETH è il 10
Il 4 il 10 e il 53 (per la mega) nel tuo sketch sono flottanti creando grossi problemi, in pratica i segnali non sanno da che parte andare!!
Questa è una delle cause (non l'unica) che porta al freeze lo shield, questi pin vanno sempre dichiarati e fissati quando si monta lo shield anche se la SD non la usiamo

metti questo e non avrai più problemi

#include <SD.h>

void setup()
{ 
 delay(1000);
  pinMode(SS_PIN, OUTPUT);
  digitalWrite(SS_PIN, 1);
  pinMode(10, OUTPUT); 	
  digitalWrite(10, 1);
  pinMode(4, OUTPUT);  
  digitalWrite(4, 1);
 
  Ethernet.begin(mac, ip);
  Serial.begin(9600);           
}

pablos:
Il 4 il 10 e il 53 (per la mega) nel tuo sketch sono flottanti creando grossi problemi, in pratica i segnali non sanno da che parte andare!!
Questa è una delle cause (non l'unica) che porta al freeze lo shield, questi pin vanno sempre dichiarati e fissati quando si monta lo shield anche se la SD non la usiamo

Scusa ma... capisco i pin 4 e 10... ma il "pinMode(SS_PIN, OUTPUT);" a che serve ?

Ho aggiunto ...

  pinMode(10, OUTPUT); 	
  digitalWrite(10, 1);
  pinMode(4, OUTPUT);  
  digitalWrite(4, 1);

... nel codice e funziona alla grande.
Ho provato a stressarlo con continue accensioni/spegnimenti ma non sono riuscito a bloccarlo !!!

Non ho messo ...#include <SD.h> ...perche' se lo faccio, non funge, ovvero il file html viene creato storto...

Sono corrispondenze basta leggere i datasheet
NO mega mega 2560
slave reset: 10: 53
MOSI: 11: 51
MISO: 12: 50
SCK: 13: 52

Ma invece di rispondere con un altra domanda..... funziona o no con la modifica? sarebbe corretto che tu dessi un opinione sul risultato.... senza offese ovviamente :grin:

ho visto ora la nuova risposta....
Diciamo che mettere la SD.h è una predisposizione per ovviare a problemi successivi durante esperimenti vari
La gestione del pin SS_PIN si trova dentro la lib SD

Stavo riflettendo su: "A cosa serve bloccare il PIN 4 come dice Pablo.... se non ho inserito nessuna MicroSD ??"
...
Ieri sera stavo facendo varie prove con la mia Ethernet Shield e vi ho messo dentro una MicroSD.
Non avendo "bloccato" il PIN 4, ovviamente la MicroSD andava a rompere alla Ethernet !!!

Chiedo umilmente venia...

Comunque non mi spiego perche' includendo la libreria SD.h, lo sketch non funziona piu'.

Ho provato ad aggiungere la libreria SD.h nello sketch di esempio "WebServer" e non da nessun problema.....

Mah. Chi mi spiega l' arcano ???

pablos:
metti questo e non avrai più problemi
....

Da quello che vedo, la libreria Ethernet di per se' mette subito in OUTPUT il PIN del ETH CS. E lo tira subito su. Quindi in questo caso, non serve. Almeno con la IDE 1.0.4, con le altre non so.

Stesso vale al contrario: Nello sketch di esempio "CardInfo" c'e' scritto:
// On the Ethernet Shield, CS is pin 4. It's set as an output by default.

Morale della favola:
Se usi la Ethernet, bisogna bloccare il PIN della SD.
Se usi SD, bisogna bloccare il pin della ETH.

Sarebbe stato bello che lo avessero scritto nello sketch di esempio Webserver... cosi' se qualcuno come me, una sera mette il cervello in sleep :-D....

Perchè continui a parlare di "bloccare" i pin 4 e 10 sono enable-disable, se voglio parlare con la SD metto il 4 a 0 e il 10 a 1 se voglio parlare con la ethernet metto il pin 4 a 1 e il 10 a 0

riassumendo
0 = enable
1 = disable
è scritto nelle librerie non l'ho inventato io

digitalWrite(10, 1); disabilito la eth allo start nel setup
digitalWrite(4, 1); disabilito la SD allo start nel setup
isoliamo entrambi i device tanto per restare sicuri :slight_smile:

saranno poi le librerie a decidere chi parla dei 2, l'importante è che non siano flottanti (in uno stato di indecisione)

Se rileggi il mio messaggio, vedrai che ho scritto la stessa cosa.

acik:
Se rileggi il mio messaggio, vedrai che ho scritto la stessa cosa.

può darsi .... facciamo che l'ho ripetuto senza leggere il tuo post :smiley: