Arduino non trasmette i dati su pagina php

Ciao a tutti, purtroppo sono dovuto ricorrere al forum poichè è da un mesetto che sbatto la testa sul tavolo perchè il mio arduino si blocca.

Mi spiego meglio:

ho un arduino mega con ethernet shield, ho impostato arduino per registrare dei valori da due ingressi analogici poi fa un paio di operazioni e dopo 10 minuti li invia al mio sito web tramite funzione GET per caricarli sul database di Aruba.

Il problema è che appena avviato a volte non si connette ad internet, poi riavviandolo si connette e comincia a registrare i dati, dopo 10 minuti esegue la chiamata alla pagina PHP per caricare i dati sul DB. Purtroppo però non riesco a farlo dialogare, sembrerebbe come se il tempo di attesa per la connessione sia troppo lungo. Allora ho provato a ridurre il tempo a 2 minuti e comincia a caricare sul DB. Fino a qui tutto ok (lo preferirei ogni 10 min ma non funziona… e non so il perchè), se non fosse che dopo un’ora o due ed a volte anche prima, smette di dialogare con il server. Via monitor seriale vedo che continua a caricare dati e fa la connessione al server ma non registra nulla sul DB.

Sto impazzendo. L’ho provato con Altervista ma non cambia nulla, ho provato in locale ma niente comunque. Ho provato a scopiazzare un po di codice qua e là ma agli altri funziona ed a me no. Ho provato a cambiare arduino ed ethernet shield ma non si risolve.

Qualcuno riuscirebbe a darmi una mano?

Grazie a tutti per la pazienza.

Di seguito vi riporto il codice:

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

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

char server[] = "www.dominio.com";
EthernetClient client;

int led_con_1 = 1;
int led_con_2 = 2;
float Volt = A0; //sensore di tensione
float Corrente = A5; // sensore di corrente

//variabili:
//int Pot = 0;
//int contatoreS = 0; //contatore secondi
//int contatoreMin = 0; //contatore minuti
//int CPot = 0; //contatore potenza
//int energia = 0; //contatore energia
//int energia10= 0; //contatore energia 10 minuti

void setup()
{
    Serial.begin(9600);
    Serial.println("Connessione...");
    pinMode(led_con_1, OUTPUT);
    pinMode(led_con_2, OUTPUT);
    pinMode(Volt, INPUT);
    pinMode(Corrente, INPUT);
    
    if(Ethernet.begin(mac) == 0)
    { 
      // start ethernet using mac & DHCP
      Serial.println("Failed to configure Ethernet using DHCP");
    }

delay(1000); // give the Ethernet shield a second to initialize

Serial.print("This IP address: ");
IPAddress myIPAddress = Ethernet.localIP();
Serial.println(myIPAddress);
delay(500);
Serial.print("connessione");
Serial.println(" in corso...");
delay(1500);
}

void loop()
{
  query();
}
    void query(){
      
      float V;
      float I;
      float Pot;
      float CPot;
      float X;
      int S;
      float E;
      float CE;
      float Y;
      int M;
      int N;
      int Min;
      Min = 0;
      X = 0;
      
      for (int M=1; M <= 10; M = M+1) {
      
      N=0;
      Y=0;
        for (int S=1; S <= 60; S = S+1) {
          int Volt1 = analogRead (0);
          int Corrente1 = analogRead (5);
          V = ((float)Volt1*5/22);
          Serial.print("Volt: ");
          Serial.println(V);
          I = ((float)Corrente1*5/250);
          Serial.print("Corrente: ");
          Serial.println(I);
          Pot = V * I;
          Serial.print("Potenza: ");
          Serial.println(Pot);
          X = X + Pot;
          CPot = X;
          Serial.print("Contatore potenza: ");
          Serial.println(CPot);
          N = N+1;
          Serial.print("Secondi: ");
          Serial.println(N);
          delay(1000);      
         }

        E = CPot / 60;
        Serial.print("Energia: ");
          Serial.println(E);
        CE = Y + E;
        Serial.print("Contatore energia: ");
        Serial.println(CE);
        Min = Min+1;
        Serial.print("Minuti: ");
          Serial.println(M);       
        }
   
  if (client.available()) {
    char c = client.read();
    Serial.print(c);    
  }
  
  if (!client.connected())
  {
    Serial.println();
    digitalWrite(led_con_1, HIGH);
    digitalWrite(led_con_2, LOW);
    Serial.println("Connessione in corso..."); 
    client.stop(); 
  }
  // if there's a successful connection:
  if (client.connect(server, 80)) {
    Serial.println("Connesso");
    delay (1000);  
    Serial.print("Tensione: ");
    Serial.println(V);
    Serial.println();
    Serial.print("Corrente:  ");
    Serial.println(I);
    Serial.println();
    
    //Controllo LCD
    Serial.println("Richiesta http in corso");
    // HTTP request:
    client.println();
    client.print("GET /paginaphp.php?ten=");
    client.print(V);
    client.print("&cor=");
    client.print(I);
    client.print("&Energia10=");
    client.print(CE);
    client.println(" HTTP/2.0");
    client.println("Host: dominio.com");
    client.println("User-Agent: arduino-ethernet");
    client.println("Connection: close");
    delay (1000);
    client.println();
    Serial.println("Richiesta http completata");
    delay (3000);
  }
  else {
    // if you couldn't make a connection:
    Serial.println("Connessione fallita");
    Serial.println("Disconnesso.");
    //Controllo LCD
    client.stop();
    delay(1000);
  }
}

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

Per favore, modifica il tuo post precedente e seleziona il codice e usa il pulsante </>

fatto! scusate me ne ero dimenticato :smiley:

Stai sparando richieste al server a raffica, questo non sa più cosa fare e il server ti chiude le porte in faccia, arduino non ottiene risposta, ha i buffer pieni che non sa come scaricaricare perchè nessuno lo ascolta, ma nel frattempo il loop incarica ancora il w5100 di riempire i buffer che sono già pieni ....

void loop(){
  query();
}

usa un millis() nel loop() chiama il query(); ogni 10 minuti, piano vai piano con le connessioni TCP/IP perchè hanno bisogno dei loro tempi, basta un char mancante o di troppo che si schianta tutto.
Questi programmi necessitano di un sofisticato controllo errori onde evitare il blocco in caso di timeout, mancate risposte e pacchetti errati, il protocollo già lo fa, ma dagli tempo.