Inviare dati ad una pagina web e ricevere dati da una pagina web

Salve a tutti, ho questo problema: ho realizzato un sito internet in php per controllare una piccola casa domotica. Ho messo vari sensori nelle stanze, collegati ad Arduino. Arduino legge i valori dei sensori e ogni minuto invia questi dati ad una pagina php residente nel server online che li prende e li memorizza in una tabella di un database. Io poi utilizzo questi dati per monitorare le varie zone della casa. Fin qui tutto bene, ora il problema è il seguente: vorrei aggiungere a questo progetto una pagina web con degli interruttori da premere che servano per accendere per esempio un ventilatore, oppure dei led per l'illuminazione. Come posso far convivere nello stesso sketch le due cose? E poi è possibile controllare via internet Arduino o devo essere connesso alla stessa rete dove è collegato Arduino? Vi ringrazio per i consigli che vorrete darmi.

Per quanto riguarda la parte web non so risponderti personalmente sul da farsi , ma è sicuramente possibile , per far eseguire comandi od operazioni via internet e non all'interno della stessa lan occorre ...

1) Ip pubblico ( un indirizzo ip assegnato al tuo router dal fornitore di servizi e che non cambia in caso di sconnessione e riconnessione all'adsl o riavvio del router)

2) Nel caso l'indirizzo ip non fosse statico occorrerebbe una registrazione a un servizio ddns che ti fornisce un indirizzo fisso es"arduino.dyndns.com" che punta al tuo indirizzo ip variabile , Ovviamente il servizio ddns va gestito da un software o un router che si preoccupa di comunicare al server dns il cambio ip , Quasi tutti i router hanno questo tipo di servizio incorporato

3) Programmazione dell' indirizzamento della porta sul router , se il tuo arduino è sulla es classe 192.168.1.10 porta 3737 bisogna istruire il router perché invii a questo indirizzo interno tutto il traffico pubblico indirizzato alla porta 3737

4) Altrimenti una vpn , uno dei due punti che devono comunicare deve disporre di uno dei due punti precedenti (1/2) occorre avere due router di tipo avanzato che collegano i due punti , poi si lavora come se si fosse in una lan

5) Utilizzi un cloud/messaggistica , invii i comandi a un servizio cloud/Messaggistica es telegram un bot attivato su arduino ,e i comandi inviati al bot arrivano direttamente su arduino che eseguirà quello che è stato programmato a fare

Modello dell' arduino e la libreria che stai usando.

Veramente per rispondere a Guglielmo, non mi sembra proprio la stessa domanda. Questo è un problema più specifico. Comunque ieri sera avevo cercato di ritrovare il mio post precedente e non ero riuscito a trovarlo. Comunque scusa se ho sbagliato, per quanto riguarda la domanda di ExperimenUno, uso Arduino 1 con Shield della Aukru, Arduino 1.8.0

A no ? :smiling_imp: ... "Inviare dati ad una pagina web e ricevere dati da una pagina web" non è fare sia il client che il server ? Non vuoi accendere un LED con un comando ed anche inviare dati ad un server ?

Cerchiamo di ottimizzare l'uso delle sezioni e non apriamo thread a destra e a manca per argomenti simili ...

Guglielmo

Va bene ho capito che non sono il benvenuto. Scusate il disturbo.

lmaselli: Va bene ho capito che non sono il benvenuto. Scusate il disturbo.

Tutti sono i benvenuti, ma ci sono sempre delle regole da rispettare, quindi non è questione del disturbo di cui parli :)

lmaselli: Va bene ho capito che non sono il benvenuto. Scusate il disturbo.

:o :o :o :o ... solo perché ti si chiede di rispettare alcune regole e di ottimizzare l'uso del forum ? ? ? Mah ...

Guglielmo

Ok, va bene cerchiamo di non fare i ragazzini. Scusa Guglielmo non sono pratico di forum. Posso riprendere la mia conversazione?

lmaselli:
Posso riprendere la mia conversazione?

Ovvio che SI :slight_smile:

Guglielmo

Grazie.
Ho realizzato uno sketch in cui vado a leggere dei valori su pin digitali di Arduino e poi li invio ad un web server e li memorizzo su database. E fin qui tutto bene. Ora sul sito ho creato una pagina con la quale vorrei accendere un led su un pin digitale. Quando invio la richiesta da pagina web in php con l’istruzione
echo “ACCENDI LA CALDAIA”; il led si accende ma poi la pagina si blocca e mi dice che il server è occupato. Quale può essere il problema?

Forse è meglio vedere lo sketch completo.

posso metterlo nel post?

Sì, però se è oltre i 9 Kbytes, meglio lo alleghi ;)

Ovvio che sì, però usa i tag code :wink: Il bottone con il simbolo </>

Spero di aver capito, per oggi ne ho già combinate troppe.

#include <SPI.h>
#include <Ethernet.h>
/*#include <String.h>*/

#define TIME_MISURA 3000 // Tempo che deve trascorrere tra una misurazione e la successiva, nello sketch tempo di attesa tra un loop() ed il successivo

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEB, 0xDA, 0xED };  // Contiene il Mac Address della scheda Ethernet Shield
byte ip[] = {192, 168, 1, 199}; // 


EthernetServer server(80); //server port
EthernetClient client; // Inizializzazione del client ethernet necessario a creare la connessione ed inviare i dati di arduino alla pagina web

char myserver[] = "www.ipsiando.it"; // Indirizzo del sito sul server
char buffer[150];


String readString;

int sensoreTempTerra = 0; 
int sensoreTempPrimo = 0; 
int sensoreUmidTerra = 0; 
int sensoreUmidPrimo = 0;
int sensoreLumGiardino = 0; 

int interruttoreCaldaia = 0; 
int interruttoreCondizionatore = 0;  
int interruttoreLuciGiardino = 0;  


void setup()
{
 Ethernet.begin(mac, ip);
 pinMode(3, OUTPUT); 
 pinMode(4, OUTPUT); 
 pinMode(5, OUTPUT);


 server.begin();

 delay(TIME_MISURA);

 Serial.begin(9600);
}



void loop()
{
 EthernetClient client = server.available();

 int scelta = 0; // Variabile che contiene il pulsante premuto (1 = CALDA) - (1 = CALDS) - (2 = CONDA) - (2 = CONDS) - (3 = LUCIA) - (3 = LUCIS)

 if (client)
 {
   boolean currentLineIsBlank = true;
   while (client.connected())
   {
     if (client.available())
     {
       char c = client.read();
       readString.concat(c);
       if (c == '\n' && currentLineIsBlank)
       {
          if (readString.indexOf("CALDA") > 0)
         {
           digitalWrite(3, HIGH);
           scelta = 1;
          }
         if (readString.indexOf("CALDS") > 0)
         {
           digitalWrite(3, LOW);
           scelta = 1;
         }
         if (readString.indexOf("CONDA") > 0)
         {
           digitalWrite(4, HIGH);
           scelta = 2;
         }
         if (readString.indexOf("CONDS") > 0)
         {
           digitalWrite(4, LOW);
           scelta = 2;
         }
         if (readString.indexOf("LUCIA") > 0)
         {
           digitalWrite(5, HIGH);
           scelta = 3;
         }
         if (readString.indexOf("LUCIS") > 0)
         {
           digitalWrite(5, LOW);
           scelta = 3;
         }

         readString = "";

         delay(TIME_MISURA);
         client.stop();
      }
     }
  }
 }

 interruttoreCaldaia = digitalRead(3);
 interruttoreCondizionatore = digitalRead(4);
 interruttoreLuciGiardino = digitalRead(5);

 sensoreTempTerra = analogRead(A0); 
 sensoreTempTerra = sensoreTempTerra * 50.0 / 1023.0; 

 sensoreTempPrimo = analogRead(A1); 
 sensoreTempPrimo = sensoreTempPrimo * 50.0 / 1023.0; 

 sensoreUmidTerra = analogRead(A2); 
 sensoreUmidTerra = sensoreUmidTerra * 100.0 / 1023.0; 

 sensoreUmidPrimo = analogRead(A3); 
 sensoreUmidPrimo = sensoreUmidPrimo * 100.0 / 1023.0; 

 sensoreLumGiardino = analogRead(A4); 
 sensoreLumGiardino = sensoreLumGiardino * 100.0 / 1023.0;

 Serial.println("Connessione in corso...");
 
 if (scelta > 0) 
 {
   if (client.connect(myserver, 80)) 
   {
     Serial.println("Connesso");

     if (scelta == 1)
     {

       sprintf(buffer, "%s%s%s/%s", “GET http://", myserver, "/arduino/progetti/casa_domotica/comandoCaldaia.php\n", "HTTP/1.1");
       Serial.println(buffer);
       client.println(buffer); 
       scelta = 0;
      }
     else if (scelta == 2)
     {
       sprintf(buffer, "%s%s%s/%s", "GET http://", myserver, "/arduino/progetti/casa_domotica/comandoCondizionatore.php\n", "HTTP/1.1");
       Serial.println(buffer);
       client.println(buffer); 
       scelta = 0;
     }
     else if (scelta == 3)
     {
       sprintf(buffer, "%s%s%s/%s", "GET http://", myserver, "/arduino/progetti/casa_domotica/comandoLuciGiardino.php\n", "HTTP/1.1");
       Serial.println(buffer);
       client.println(buffer); 
       scelta = 0;
     }

     while (client.available()) // Gestisce il ritorno proveniente dalla connessione al server
      {
       char c = client.read();
       Serial.println(c);
     }

     client.stop();
     delay(TIME_MISURA); // Attendo 3 secondi prima di proseguire
  }
 }
 if (client.connect(myserver, 80)) 
 {
   Serial.println("Connesso");
    sprintf(buffer, "%s%s%s/%d/%d/%d/%d/%d/%s", "GET http://", myserver, "/arduino/progetti/casa_domotica/salvaDati.php", sensoreTempTerra, sensoreTempPrimo, sensoreUmidTerra, sensoreUmidPrimo, sensoreLumGiardino, "HTTP/1.1");
   Serial.println(buffer);
   client.println(buffer); 

   while (client.available()) 
    {
     char c = client.read();
     Serial.print(c);
   }

   client.stop();

   delay(TIME_MISURA); 
 }

 if (client.connect(myserver, 80)) 
 {
   Serial.println("Connesso");

    sprintf(buffer, "%s%s%s/%d/%d/%d/%s", "GET http://", myserver, "/arduino/progetti/casa_domotica/salvaInterruttori.php", interruttoreCaldaia, interruttoreCondizionatore, interruttoreLuciGiardino, "HTTP/1.1");
   Serial.println(buffer);
   client.println(buffer); 
   delay(TIME_MISURA); 

   while (client.available()) 
   {
     char c = client.read();
     Serial.print(c);
   }

   client.stop();
   delay(TIME_MISURA); // Attendo 3 secondi prima di proseguire
 }

}

… no, NON hai capito :grin: , devi usare il BOTTONE che ha il simbolo </> e che inserisce i tag [ CODE] !

Date le precedenti “bastonate”, per questa volta sono buono … e correggo io il post, ma ricordatene per il futuro :wink:

Guglielmo

Ecco lo sapevo, oggi non ne combino una giusta.

lmaselli: Ecco lo sapevo, oggi non ne combino una giusta.

Guarda ci scommetto quello che vuoi che dopo questa trafila di msg qualcuno ti risponda sull'argomento richiesto.

Prova a metterci un refresh della pagina html in modo che si aggiorni ad esempio:

int refreshPage = 15

ora il problema è il seguente: vorrei aggiungere a questo progetto una pagina web con degli interruttori da premere che servano per accendere per esempio un ventilatore, oppure dei led per l'illuminazione. Come posso far convivere nello stesso sketch le due cose?

Sto lavorando anche io all'implementazione del mio sketch di Domotica. MI piacerebbe inserire tutto nello stesso ma occuperebbe alla fine molta memoria. Perciò valutavo la possibilità di inserire in html o in libreria la programmazione aggiunta in modo da gestire il tutto in sd. Se hai nel frattempo trovato qualcosa mi aggiorni ? Fammi sapere se il refresh funziona .. in altri casi per me è stato un toccasana.

Frank

La risposta è sempre la stessa, Impossibile aprire la pagina, 192.168.1.199/CALDA perché il server ha inaspettatamente interrotto la connessione. Deve essere un problema di qualche cosa che deve essere messa da qualche parte nello sketch, perché il led che simula la caldaia si accende, ma poi nello schetch ci sarebbe l'istruzione POST http://www.ipsiando.it/arduino/progetti/casa_domotica/comandoCaldaia.php/HTTP/1.1 che dovrebbe mandare al server su internet il ricaricamento della pagina PHP aggiornata, ma non la fa, perché non finisce l'istruzione che ho messo all'inizio. Questo è quello che ho capito io, se c'è qualcuno che mi sa aiutare...