arduino ethernet si pianta

Salve a tutti come al solito confido nella vostra bontà e volontà di aiutarmi, circa un anno e mezzo fa ho modificato uno skecht per sostituire la centralina del telecomando con un sistema per aprire il cancello da smartphone. intanto vi dico che sto usando un arduino ethernet originale, nel progetto ho creato la possibilità di aprire un cancello automatico, chiudere un cancello automatico, accendere le luci esterne, aprire il cancelletto pedonale ed infine sapere la posizione del cancello realmente. il mio problema è che ogni due o tre giorni devo riavviare arduino perchè si pianta e non posso fare più nulla, allora devo riavviarlo fisicamente. ho provato varie soluzioni lette in rete ma senza nessun risultato, ho letto di provare il watch dog 8 secondi ma non ha funzionato, poi ho letto di metter i pin 4 e 10 in high ma senza avere risultati positivi, potete aiutarmi per favore?
posto il codice e magari può essere di aiuto a qualcun’ altro… grazie a tutti

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


boolean statop1 = true;
boolean statop2 = true;
boolean statop3 = true;
boolean statop4 = true;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { 192, 168, 1, 100}; // ip in lan
byte gateway[] = { 192, 168, 1, 254}; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
EthernetServer server(80); //server port

String readString;
int  val = 0;

//////////////////////

void setup() {


  pinMode(10, OUTPUT);
  pinMode(7, OUTPUT); //apertura cancello parcheggio
  pinMode(6, OUTPUT); //chiusura cancello parcheggio
  pinMode(5, OUTPUT); //accensione luci esterne
  pinMode(4, OUTPUT); //apertura cancello pedonale
  pinMode(3, INPUT);  //posizione cancello

  digitalWrite(10, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(4, HIGH);

  readString = "";
  //start Ethernet
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
}
void loop() {

  
  // Create a client connection
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        
        //read char by char HTTP request
        if (readString.length() < 100) {

          //store characters to string
          readString += c;
          //Serial.print(c);
        }

        //if HTTP request has ended
        if (c == '\n') {

  val = digitalRead(3);
          ///////////////
          

          client.println("HTTP/1.1 200 OK"); //send new page
          client.println("Content-Type: text/html");
          client.println();

          client.println("<!DOCTYPE html><html><head><TITLE>TELECOMANDO SMARTPHONE CANCELLO </TITLE></HEAD><BODY><H1>TELECOMANDO SMARTPHONE CANCELLO</></H1><hr>
<ul><li><p align=\"left\">CANCELLO PARCHEGGIO:<a href=\"/?light1on\">APERTURA</a></li></p>

<li><p align=\"left\">CANCELLO PARCHEGGIO:<a href=\"/?light2on\">CHIUSURA</a></li></p>

<li><p align=\"left\">LUCI ESTERNE:<a href=\"/?light3on\">ACCENSIONE</a></li></p>

<li><p align=\"left\">CANCELLO PEDONALE:<a href=\"/?light4on\">APERTURA</a></li></p>

<li><p align=\"left\">POSIZIONE CANCELLO </HTML>");
          if (val == false)

            client.print("<input type=\"3\"  value=\"CHIUSO\">");

          else
            client.print("<input type=\"3\"  value=\"APERTO\">");
          delay(1);

          //stopping client
          client.stop();




          if (readString.indexOf("?light1off") > 0) //checks for on
          {
            statop1 = true;
          }
          if (readString.indexOf("?light1on") > 0) //checks for off
          {
            statop1 = false;
          }
          if (readString.indexOf("?light2off") > 0) //checks for on
          {
            statop2 = true;
          }
          if (readString.indexOf("?light2on") > 0) //checks for off
          {
            statop2 = false;
          }
          if (readString.indexOf("?light3off") > 0) //checks for on
          {
            statop3 = true;
          }
          if (readString.indexOf("?light3on") > 0) //checks for off
          {
            statop3 = false;
          }
          if (readString.indexOf("?light4off") > 0) //checks for on
          {
            statop4 = true;
          }
          if (readString.indexOf("?light4on") > 0) //checks for off
          {
            statop4 = false;
          }


          if (statop1 == true)
          {
            digitalWrite(7, HIGH);
          }
          if (statop1 == false)
          {
            digitalWrite(7, LOW);
            digitalRead(statop1 = true);
            delay(500);
            digitalWrite(7, HIGH);
          }
          if (statop2 == true)
          {
            digitalWrite(6, HIGH);
          }
          if (statop2 == false)
          {
            digitalWrite(6, LOW);
            digitalRead(statop2 = true);
            delay(500);
            digitalWrite(6, HIGH);
          }
          if (statop3 == true)
          {
            digitalWrite(5, HIGH);
          }
          if (statop3 == false)
          {
            digitalWrite(5, LOW);
            digitalRead(statop3 = true);
            delay(500);
            digitalWrite(5, HIGH);
          }
          if (statop4 == true)
          {
            digitalWrite(4, HIGH);
          }
          if (statop4 == false)
          {
            digitalWrite(4, LOW);
            digitalRead(statop4 = true);
            delay(500);
            digitalWrite(4, HIGH);
          }
          delay(1);
          client.flush();
          client.stop();
          //clearing string for next read
          readString = "";
        }
      }
    }
  }
}

Devi specificare l'hardware, arduino, ethernet, schede di comando attuatori, alimentazione, altrimenti è inutile scrivere.
I motivi possono esseri molti:

  • Hardware difettoso
  • Alimentazione scadente e o insufficiente
  • Disturbi elettromagnetici
  • software
  • connessione web che non va a buon fine

perchè usi il pin 4 che è dedicato all'apertura del dialogo SPI verso la SD?

pinMode(4, OUTPUT); //apertura cancello pedonale

ho modificato uno skecht per sostituire la centralina del telecomando

Perchè sotituirla con arduino, non potevi utilizzare semplicemente il contatto parallelo di open e close lasciando quella che c'era?
Ps. Spero che per aprire il cancello tu non abbia manomesso/bypassato dispositivi di sicurezza.

Ciao e grazie per. La risposta allora per l board è un arduino ethernet alimentato ada 12v 2ah collegato tutto tramide cavo sul router direttamente, e comando solo una piccola scheda relè per arduino, per quanto riguarda la siciurezza non ho modificato nulla è tutta in sicurezza perche ho disattivato la chiusura automatica quindi io decido quando aprire e quando chiudere. Per il pin 4 ho usato quello perche pensavo che con il fatto che dovesse stare alto potevo usarlo tranquillamente

Arduino MEGA, UNO, cosa?

pablos:
Arduino MEGA, UNO, cosa?

... mmmm ... mi sa che lui ha proprio una di QUESTE board ::slight_smile:

Guglielmo

Infatti proprio questa con la lan a bordo

ahh arduino ethernet, scusa, mi frega sempre la dicitura di questa scheda :slight_smile: :slight_smile:

Sinceramente non ho mai fatto test su questa scheda, ma a priori escluderei l'utilizzo dei pin
0-1-4-10-11-12-13 se non ti bastano puoi usare gli analog come pin digitali 0/1

E si adesso sposto solo il pin del 4 e lo metto ad otto ma nello sketch trovate qualcosa che non va. Oppure sta tutto bene? Infine vorrei mettere che ogni 10 secondi mi fa il refresh della pagina iniziale è possibile

Ciao a tutti ho modificato lo sketch sostituendo il pin 4 con il pin 8 e sono due giorni che sta funzionando vi terrò aggiornati e grazie se qualcuno può suggerirmi come aggiornare la pagina iniziale

il mio problema è che ogni due o tre giorni devo riavviare arduino perchè si pianta e non posso fare più nulla

non hai ancora superato il limite :slight_smile:

per il refresh l'avevo scritto qui non molto tempo fa post #13

Buongiorno a tutti e ancora grazie per la pazienza volevo dirvi che questa mattina si è ripiantato di nuovo e appena ho fatto il riavvio della board a ripreso a funzionare quindi escluderei un problema di router, non so piu come venirne fuori oppure devo fare un sistema che ogni 10 pre mi riavvia la board in automatico che.ne dite?

Se regge 12 ore, ti suggerirei il reset ogni 12 ore. E' più facile sapere quando si resetta nella giornata. 12 ore giuste sono all'incirca 2 volte al giorno. Ogni 10 ore dopo un pò non sai più quando si resetta.

Cortesemente potresti aiutaarmi ad inserirlo nel mio sketch..grazie

gminga78:
Cortesemente potresti aiutaarmi ad inserirlo nel mio sketch..grazie

Direi che puoi studiare QUI e QUI ... vedrai che ti sarà chiaro come fare, anche se ...
... NON sono d'accordo con tali soluzioni !

Il watchdog ed il reset della MCU, si fa per condizioni improvvise e non prevedibili per cui il programma perde il controllo (es. una scarica elettrostatica, un impulso elettromagnetico, ecc.).

In tutti gli altri casi, ci si mette li di santa pazienza e si fa debug ... è una cosa lunga, che può richiedere moltissimo tempo, ma è l'unica stada per risolvere i problemi.

In ogni caso, se ben ricordo, e qui pablos può confermare o smentire (visto che ha fatto una infinità di prove e conosce molto bene le problematiche), non sempre il reset della MCU risolve il problema della ethernet ...

Guglielmo

  • Si è inchiodato quando hai fatto l’accesso http?
  • Ti sei accorto che era inchiodato ancora prima di fare l’accesso da remoto?
  • Non lo so

praticamente quando apro la pagina dal browser praticamente non mi da niente e mi dice pagina non trovata, sia se lo faccio da rete lan quindi con l'indirizzo 192.168.1.100 e sia se provo con l'indirizzo esterno

E ... questo l'ho capito, ma se vuoi fare un analisi dell' errore devi sapere quando si inchioda, ovvero si è inchiodato durante la notte da solo? o esattamente nell'istante in cui ti sei collegato?
Queste sono prove che io ho fatto per settimane, conoscendo il software, conoscendo le azioni che eseguo, mi permettono di andare al pezzo di codice incriminato.
Ad esempio, nelle centrali antincendio, allarme, apparecchiature generiche, ecc controllate da un microprocessore o Mcontrollore c'è un led lampeggiate con scritto RUN, apro lo sportello e vedo se quel led lampeggia/ è fisso / è spento, questo mi indica immediatamente se l'anomalia è di tipo crash software quindi micro piantato o se esterna data da sensori e periferiche.

Allora oggi ho visto per la prima volta e non so se puo esserti di aiuto il led che sta sulla board lampeggiava.e quello della lan era bloccato e poi io mi accorgo che.capita sempre durante la notte