Riceve e Trasmette sempre

Ho cercato ma NON ho trovato nulla,
o forse NON ciò capito nulla.

Voglio un sempre programmino che non usando il client in locale funzioni da invio e ricevi.
Pagina PHP o ASP, invia la stringa e arduino la legge, diciamo in background, senza avere HTML CLIENT aperto,
e arduino invia una stringa alla pagina ASP o PHP e basta..
ho questo script dov'è che sbaglio (allego)
Grazie

InviaEricevi.ino (2.14 KB)

Il primo è un errore di concetto, una pagina PHP non può prendere un iniziativa, se questa non viene richiesta al server il codice in essa contenuta rimane un testo, niente più. Puoi fare il contrario, Arduino può inviare una richiesta alla pagina PHP che in risposta invia dei dati ad Arduino. Ma finché non spieghi meglio dove ti areni e che necessità hai non possiamo aiutarti.

grazie della risposta.
La pagina ASP creata da me elabora dei concetti in relazione a ciò che è "scritto" nel mysql
quindi la pagina esiste lo fatta, ma NON riesco a fare client e server in uno unico programma di arduino, NON risco a farlo andare, sembra che il server in ingresso "dorme" sempreeeeeeeeeeeeeeeeeeeeeeeee.

io sto cercando un programmino che
arduino riceve una stringa dalla pagina ASP
arduino invia alla pagina php.

l'aspetto ASP o PHP li so gestire alla grande, quello che non riesco a fare:

pagina asp invio un comando, questo comando lo elabora arduino, (accende luce ecc.), dopo di che invii la conferma.

mi areno perchè non riesco a fare un programma (sketch) che non vada in conflitto o che faccia entrambi le cose, contemporaneamente.

Anche se si presenterà lento, arduino NON fa altro che eseguire out sul pin e "sentire" (input) di un pin, il tutto inviare o ricevere da una pagina asp che ho fatto io.
come potete vedere all'inizio post, c'è lo " InviaEricevi.ino "

Spero di esser stato chiaro. grazie

Ok, ora si capisce un filo di più, quindi alla richiesta della pagina da parte di un client esterno l'interprete esegue una richiesta sincrona mediante (immagino) curl al secondo server(Arduino) questo riceve dei dati e restituisce al primo server altri dati, che l'interprete fornirà al client. Ho capito bene?
Se è cosi Arduino svolge solo funzione di server. Aspetta la connessione in ingresso con parametri gli elabora e fornisce in risposta una respose http con i dati elaborati, a questo punto la palla passa all'interprete. Puoi basare il tuo codice sull'esempio webClient presente nella sotto sezione Ethernet del IDE.

capito bene
il mio programma di arduino non va.... per come deve andare e per quello che stiamo dicendo
magari riguarda bene lo sketch allegato, mi sa che ho modificato qualcosa e quindi NON va.
grazie

InviaEricevi.ino (1.66 KB)

Nessuno sa dirmi dove sbaglio ... allegato inviaericevi.ino. Grazie

Te l'ho spiegato come fare, basati su questo esempio

/*
  Web Server

 A simple web server that shows the value of the analog input pins.
 using an Arduino Wiznet Ethernet shield.

 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 * Analog inputs attached to pins A0 through A5 (optional)

 created 18 Dec 2009
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe

 */

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

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 1, 177);

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // 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("Connection: close");  // the connection will be closed after completion of the response
          client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // output the value of each analog input pin
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            int sensorReading = analogRead(analogChannel);
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(sensorReading);
            client.println("
");
          }
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // 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();
    Serial.println("client disconnected");
  }
}

Nel tuo non avvi nemmeno il server e attendi dati da un client che non è inizializzato.

questa pagina lo usata tempo fa.

Devo fare cosi:

  1. Con browser aperto (pagina http://ip), invio e ricevo comandi e qui ci siamo.
    pero..........
  2. Senza avere il browser aperto, Premo pulsante per accendere la luce, Arduino deve invia una stringa ad una pagina specifica sul we www.ilmiodominio.it/arrivo?codice=........ eccc....

nn ci riesco a farlo funzionare nella seconda 2) condizione.

Ok, allora vedi che non avevo capito bene.
Ti devi rifare all'esempio WebClient. Spiego in breve.
Ti connetti ad un server con connect di EthernetClient passi come parametri il dns del server e la porta di connessione, per le richieste http di default la 80.
Invii i dati con una httprequest mediante post o get. Ti metti in attesa di risposta con available sempre della classe EthernetClient. Con read leggi la risposta del server.
Semplice, no? Dubbi? Perplessità?

Roberto Hai letto Messaggio Personale?

o capito dov'è il problema ma nn so risolverlo

      strURL = "GET /ARDUINO.asp?";
       strURL += "Azione=";
       strURL += (Azione); <----------------qui
       strURL += "&Evento=";
       strURL += (Evento);
       strURL += "  HTTP/1.1";
      client.println(strURL);
      client.println("Host: www.ilmiodominio.it");
      client.println("Connection: close");
      client.println();
      client.stop();

in questo pezzo di programma se AZIONE contiene lettere e numeri tipo "PULSANTE43", va in errore, non trasmette la stringa all HOST

Quindi come posso fare?
Ho necessita di mettere la dicitura Nome e numero

Si ho visto il tuo messaggio, e mi dispiace, non lo faccio per essere cattivo ma questo è un forum, e i problemi vanno analizzati in pubblico e non via MP. Per primo perché cosi si crea un precedente documentato che può servire a qualcuno in futuro e per secondo perché cosi si da la possibilità a chiunque di aiutare. Io stanotte lavoro, posso scrivere qualche post ma non ho tempo per mettermi li a risolvere il tuo problema in solitaria. Ripeto non voglio essere cattivo, ma questo sul forum non è il mio lavoro, per risolvere problemi informatici vengo pagano, qui faccio come tutti, supporto chi per passione si diletta nello sviluppo di dispositivi embedded.

Con questo non dico che non ti aiuterò, ma lo farò solo attraverso il forum.
Detto questo possiamo tornare al problema.
Non posterò il tuo codice perché è una tua creazione e solo tu ne puoi gestire la pubblicazione, ma ti darò qualche dritta per risolvere e ottimizzare il codice, quindi spero mi concederai qualche frammento di codice.

-Uso ed organizzazione della memoria.
Dichiari una "marea" di variabili, questo è veramente poco comodo e sopratutto usi i tipi a sproposito, un int utilizza due byte di memoria, non ha senso dichiarare una variabile a due stati come tale, usa il tipo bool, o se vuoi buttarti in un ottimizzazione piu spinta raggruppa gli ingressi e le uscite a gruppi di 8 e usa un byte per contenere gli 8 stati delle porte, esattamente come fa il microcontrollore per le sue porte. Dichiari una variabile per ogni pin, usa invece le definizioni del preprocessore cosi da impiegare meno memoria o raggruppa tutto in degli array cosi da avere una gestione delle variabili più intelligente, oppure ancora potresti creare un enumeratone.

-Operazioni logiche ridondanti

if(Rele22) {digitalWrite(USCITA22,HIGH);}   
  if(!Rele22) {digitalWrite(USCITA22,LOW);}

Questo è uno spreco di capacità computazionale, esegui una verifica su una variabile e poi la riesegui sul suo coniugato.

digitalWrite(USCITA22, Rele22);

Questo è piu che sufficiente e fa la stessa identica operazione.

-Spregiudicato uso del core
Ok, di questo non te ne posso assolutamente fare una colpa, chi usa Arduino sa che per dichiarare un pin in uscita o in entrata è necessario usare la funzione pinMode, nel tuo caso i pin da configurare sono uno sproposito e per ognuno usi una variabile che ne contenga il numero. E se ti dicessi che questo

pinMode(22, OUTPUT);
pinMode(23, OUTPUT);
pinMode(24, OUTPUT);
pinMode(25, OUTPUT);
pinMode(26, OUTPUT);
pinMode(27, OUTPUT);
pinMode(28, OUTPUT);
pinMode(29, OUTPUT);

Si può riscrivere con un solo

DDRA=0xFF;

Va beh queste sono ottimizzazioni che si rifanno all'architettura del AVR bypassando il core Arduino, non sono un priorità ma a progetto finito non farebbero male essere implementate.

-Protocollo di comunicazione
Arriviamo al tasto dolente, il protocollo di comunicazione (se mi dessero un euro ogni volta che scrivo un post su questo argomento ora sarei piu ricco di almeno una cinquantina d'euro XD)
Io e te usiamo per comunicare un protocollo di alto livello, molto articolato pieno di ridondanza e fronzoli, una macchina non ha bisogno di 50 parole per dire neve, basta l'informazione minima contenuta nella parola, se tu scrivi "PULSANTE11" la macchina si troverà ad analizzare dei dati che per lei sono inutili un semplice "p=11" passato come parametro GET è già grasso che cola. Evita di usare un linguaggio umano se non strettamente necessario, questo quasi.. anzi tolgo il quasi, sempre rallenterà la macchina e qualche volta creerà dei problemi che potevano essere evitati adottando un linguaggio piu consono. In questa situazione tu ti trovi gia limitato, non puoi adoperare informazione direttamente binaria, ti devi rifare sui char, ma con un po di codice scritto come si deve potresti implementare un tuo protocollo che preso in analisi un singolo paramento GET questo possa contenere tutte le informazioni necessarie per una corretta comunicazione tra Arduino e server. "?h=ab4ds" potrebbe gia contenere molte piu informazioni di quante ne contenga il tuo "?azione=###&Evento=###"

Per lo specifico problema che hai segnalato, non mi viene in mente nulla di immediato, andrebbero svolti dei test su cosa contiene Azione al verificarsi dell'errore perché cosi non ci dovrebbero essere problemi, rimuovi in ogni caso le parentesi che con le stringhe non vanno molto bene.

Edit:
Non esegui i debounce degli ingressi, questo ti creerà non pochi problemi!

miz.........
grazie dell'interessamento..
cmq non lo postato in pubblico per NON cambiare molti parametri personali, quando sarà funzionante posterò il tutto, con i vari problemi che ho avuto e come li ho o li risolvero.
Da quello che hai scritto credo proprio che NON siamo agli stessi livelli. io sono un principiante.
:slight_smile:
ok vedro cmq di sistemare il tutto

Partiamo tutti da zero.
Facci sapere come procede il lavoro e non esitare a chiedere.

PS. Sistema quel debounce!

Spiego una cosa che sarà un'espiazione del programma...

premendo un pulsante su arduino, quindi senza browser aperto, quindi da arduino direttamente,
dopo i vari bla bla, invia i dati a una pagina chiamata NASCOSTA1.ASP
questa pagina dovo i vari controlli e scrittura su mysql, alla fine della pagina c'è una redirect di pagina
con un comando di reinvio per arduino, del tipo

http://ip:porta/?pin=14,comando=ON?attivo=secondocomando

dopo di che arriva ad arduino e arduino fai i suoi bla bla bla dopo di che arduino invia il suo GET
a una seconda pagina chiamata NASCOTA2.asp, a sua volta questa pagina nascosta2, scrive su mysql
i valori che ha ricevuto.

tutto questo per avere un comando da un arduino e inviandolo al secondo e terzo arduino, visto che il sistema che faccio, arduino fungerà solo da da INPUT e OUT, senza logica di controllo, le logiche li faranno le pagine ASP.

come mai non funziona.... in modo grossolano allego lo stekch.

il programma senza le modifiche che sto cercando di fare, funziona alla grande, senza intoppi, senza ritardi senza danni.

PROGRAMMA.ino (17.1 KB)

Scusami, ma quindi è un sistema con molti Arduino? Quando il primo contatta il server la "risposta" deve arrivare allo stesso Arduino o ad un altro?
Dove si blocca il tutto?
Hai letto e compreso tutto il mio precedente post? XD

diciamo che il tuo precedente post, lo compreso poco poco,
cmq sono 6 arduini, ma non tutti e se necessariamente ricevo, anzi lo fatto massimo per 3 ricezioni.

da uno di loro pigio il pulsante e magari allo stesso arriva l'out oppure ad un'altro arduino, o addirittura ad altri 2

quindi per farti capire faccio un esempio semplice
ammettiamo che in mysql sia impostato cosi:

PulsantePIN= 42 ----- ArduinoIP=192.168.1.201

UscitaPIN=25 -------- ArduinoIP=192.168.1.201
UscitaPIN=21 -------- ArduinoIP=192.168.1.202
UscitaPIN=33 -------- ArduinoIP=192.168.1.203 <--------- vedi ip differenti per arduini differenti
........................................................................questo e un caso estremo di 1 pulsata con 3 OUT.

ARDUINO1 , premo il pulsante, dopo di che parte un GET che va alla pagina ASP1, la pagina ASP1 leggendo le impostazioni su mysql e elaborandole, e invia un link ad arduino 192.168.1.201, dopo di che questo arduino invia un GET alla ASP2 ...e cosi facendo

al fine di evitare loop, l'invio iniziale che è dato dal pulsante a un parametro che uso per comodita CAROTA0, ad ogni passaggio di invio e ricevi CAROTA1... CAROTA2,

la difficolta la riscontro solo usando il pulsante, perchè se comando da web con browser, non c'è, visto che quando clicco si aprono tre POPUP inviano a chi devo inviare e poi si richiudono da sole.

Il sistema è molto complesso, il tutto fatto in modo che arduino faccia solo da IN e OUT le decisioni li rende la pagina ASP ricavando impostazioni da mysql, che naturalmente le imposto a priori, o li cambio a necessita

Cosi ad ogni arduino carico lo stesso programma per tutti.

Di certo quando finiro il tutto, sia apprezzato dagli amici del form e della rete,

IL MIO INTOPPO E CHE ARDUINO1 NON INVIA ALLA PAGINA ASP2 LA SUA INFORMAZIONI,
INSOMMA PULSANTE-PARTE GET-ASP1 E POI SEMBRA MORTO TUTTO, PERCHE ARDUINO CHE RICEVE NON RITRASMETTE

PS: SCUSA SE SCRIVO QUALCHE PAROLA ERRATA O VERBI FUORI TEMPO, MA E LA FRETTA DI SCRIVERE.

Allora per primo mi sento di dire che un database non ha senso adoperato in quella maniera, ma va beh, possiamo anche passare oltre a questo.

L'errore piu grave che fai è obbligare il client a eseguire i redirect delle informazioni!
A1(Arduino 1) invia la richiesta al server, il server restituisce pagina vuota ad A1 ma fa partire una richiesta asincrona ad AX (Arduino X). Tu invece chiedi ad A1 di occuparsi lui della richiesta, ma senza spiegarli come. Come esegui il redirect? posta il codice ASP.

ecco postato il programma,
in mysql e usato in quel modo per NON dovere magari staccare arduino e collegalo al pc se nel caso decido di modificare qualche funzione di OUT o IN.-

avendo fatto delle modifiche per usare le arry.............
visto che la legge dal query di arrivo dell ASP
ho la varibalie Azione che una stringa, come faccio a passarla numerica?
IL PROBLEMA E ALLA RIGA 132 E DINTORNI.

questo però non ha il reinvio per CAROTA1 ecc....

Domotica_Completa_lavorazione_da_ASP_OK_v10.ino (24.7 KB)

Ti ho spiegato dove sta un errore, ma se non mi fai vedere l'indirizzamento dato dalla pagina ASP non posso dirti come correggere.
Se hai necessità di tenere la posizione delle porte lato server, usa un file di inclusione, usare un database è uno spreco di risorse.
Se il programma è impostato bene non vi possono essere loop.
Se vuoi passare un dato in formato numerico usa un enumeratone

enum azioni {accendi,  spegni, blocca};
string url = "\pagina.asp?a=";
url += azioni.spegni;

Stesso lavoro sulla pagina asp, uno 0 corrisponderà ad accendi, 1 a spegni e 2 a blocca.
Un metodo piu professionale sarebbe inventare una codifica personale.