Salve a tutti spero di aver fatto la presentazione nel posto giusto, ora vorrei sottoporvi il mio problema.
Io abito in una casa dove ho tutte le fonti energetiche possibili (metano, geotermia, solare termico e fotovoltaico,reattore syngas, pellet) ogni impianto ha la sua elettronica che lavora in stand alone e basata su schede arduino.
Ad esempio il geotermico ha un arduino mega che gestisce le temperature del fluido refrigerante l'inverter della pompa geotermica l'inverter del chiller ed inserisce anche il sistema ad assorbimento controllandone i parametri.
Ora per vedere tutti i parametri devo andare a collegarmi materialmente con il computer (via USB) e vedere se tutto va come dovrebbe andare.
Da qualche tempo infatti sto cercando di interfacciare tutte le schede con un supervisore unico, ed ho pensato a processing.
Il problema sta nel fatto che le schede Arduino comunicano già tra loro, una passa un dato all'altra che lo usa per fare i suoi settaggi, poi questa risponde con un altro dato che la prima usa per dei parametri.
Come posso inserire un secondo client ( processing) tra le due schede senza interferire nello scambio dei dati?
Ma queste schede COME comunicano tra loro? Dal punto di vista fisico, hai messo una seriale, una RS485, cosa? E dal punto di vista della comunicazione, hai un tuo protocollo o usi qualcosa di standard?
La scheda delle caldaie (che controlla caldaia chiller ecc) è un server che comunica alla scheda al 1° piano (client) dei dati di temperatura. La scheda al 1° piano accende la stufa a pellet utilizzando quei dati.
Le altre schede lavorano ancora in stand alone.
Se io realizzo un interfaccia processing ho bisogno di sapere i valori sia della prima scheda (che non è un problema visto che è un server) e sia della seconda che invece è un client.
Se configuro anche la scheda al 1° piano come server, con processing accedo ad entrambe ma tra loro non comunicano più.
Si tratta di un valore di temperatura per ora, ma poi quando andrò ad inserire le altre sarà un bel problema perchè i valori saranno parecchi.
L'idea è quella di lavorare su 4 o 5 pagine di processing
Magomerlino:
La scheda delle caldaie (che controlla caldaia chiller ecc) è un server che comunica alla scheda al 1° piano (client) dei dati di temperatura. La scheda al 1° piano accende la stufa a pellet utilizzando quei dati.
Le altre schede lavorano ancora in stand alone.
Non mi hai chiarito come comunicano, ma se parli di client/server devo desumere che tu stia usando una connessione di rete TCP/IP, è così? In tal caso il protocollo è una connessione TCP punto-punto tra un Arduino e l'altro (ossia apre la connessione, scrive, riceve eventuale "ACK" e poi chiude) o sono connessioni permanenti? I device sono tutti nella stessa subnet?
E' importante capire il canale di comunicazione che usi per poterti dare consigli.
Ad esempio se usi una connessione Ethernet (o WiFi non importa) potresti sostituire le connessioni P2P con dei pacchetti UDP broadcast, nel quali prevedere identificativi che dicono chi sta mandando il dato e chi lo riceve. In questo modo un "terzo" sistema di monitoraggio può riceverli anche lui e quindi memorizzare o mostrare i dati o fare altre cose. Altrettanto ovviamente in questo caso è essenziale disegnare un apposito protocollino di comunicazione UDP. Per dire, io ho fatto una cosa del genere nel mio progetto di ripetitore di telecomando via WiFi...
E' questo che cerchi?
per iscrizione
Le schede comunicano tramite rete LAN con ethernet shield w 5100 originale. La rete è intranet con IPstatico in mezzo ho il router vodafone che mi fa da switch ( al quale ho disabilitato il DHCP ) perche rompeva... connessione con l'esterno non ne ho bisogno perchè poi se voglio entrare da fuori, uso il Teamwiever del computer (meno problemi e più sicurezza).
Al momento ho due idee:
La prima è quella di usare il protocollo UDP ma quasi tutte le realizzazioni si parla di Arduino-computer oppure di Arduino-Arduino oppure più schede collegate al computer ma non intercomunicanti tra loro.
La seconda è quella di creare tutti server per poi avere due client, il primo che mi gestisce le interconnessioni ed eventuali istruzioni da impartire, mentre il secondo è processing che andrebbe a cambiare i parametri che l'utente vuole cambiare.
Magomerlino:
Le schede comunicano tramite rete LAN con ethernet shield w 5100 originale. La rete è intranet con IPstatico
Ottimo.
La prima è quella di usare il protocollo UDP ma quasi tutte le realizzazioni si parla di Arduino-computer oppure di Arduino-Arduino oppure più schede collegate al computer ma non intercomunicanti tra loro.
L'UDP prevede nel pacchetto l'indicazione dell'IP (e porta) al quale è indirizzato, ma se come IP destinatario ci metti quello del broadcast della tua rete non è indirizzato a nessun client particolare, TUTTI gli apparati in ascolto su QUELLA subnet e QUELLA porta lo riceveranno. Per cui se provi a farti un protocollino come ti ho già descritto, vedrai che funziona. E tra l'altro non hai neanche la necessità di conoscere l'iindirizzo IP di chi poi dovrà "usare" quel pacchetto (il che ti evita anche di dover definire IP statici, volendo...).
Per determinare l'indirizzo di broadcast di una rete si prende la subnet mask e si impostano ad 1 tutti i bit a 0 che si trovano partendo da destra.
Per esempio, per la 192.168.1.* (tipica dei router casalinghi) la subnet mask è 255.255.255.0 (la "classe C", ossia 255 indirizzi che iniziano con "192.168.1."): prendi il prefisso della subnet "192.168.1." e come ultimo byte metti 255 quindi "192.168.1.255".
Assumendo di non avere subnet "strane", ma solo classe A (255.0.0.0), B (255.255.0.0) o C (255.255.255.0), con questo codice determini l'indirizzo di broadcast (nel mio caso in WiFi ma non cambia se lo fai su Ethernet):
...
ipLocal = WiFi.localIP();
IPAddress subnet = WiFi.subnetMask();
Serial.println("");
Serial.print ("WiFi connected ");
Serial.print(ipLocal);
Serial.print(" ");
Serial.println(subnet);
// Calcola l'indirizzo broadcast
ipBroadcast = ipLocal;
for (int i=3; i>=0; i--)
if ( subnet[i] == 0 )
ipBroadcast[i] = 255;
Serial.print("Broadcast: ");
Serial.println(ipBroadcast);
La seconda è quella di creare tutti server per poi avere due client, il primo che mi gestisce le interconnessioni ed eventuali istruzioni da impartire, mentre il secondo è processing che andrebbe a cambiare i parametri che l'utente vuole cambiare.
In UDP non ci sono "client" e "server" (mi sa che ti conviene studiare un poco questi concetti, anche solo su Wikipedia). Diciamo che "client" è "l'apparato che invia un pacchetto UDP" mentre "server" è "qualsiasi apparato che è in attesa di ricevere un pacchetto UDP indirizzato a lui o in broadcast".
Grazie per l'aiuto, appena ho un po'di tempo provo a smanettarci sopra. Purtroppo ho sempre poco tempo per stare nei forum, rispondo sempre dopo del tempo perchè sono via spesso per lavoro.
In settimana mi arriveranno due ethernet ed allora ci lavorerò un po sopra, non voglio toccare quello che a suo modo già funziona.
Per il momento grazie.
Ciao magomerlino benvenuto, dai un occhio alla libreria PJON GitHub - gioblu/PJON: PJON (Padded Jittering Operative Network) is an experimental, arduino-compatible, multi-master, multi-media network protocol. in particolare il layer fisico LocalUDP PJON/src/strategies/LocalUDP at master · gioblu/PJON · GitHub
La strategia LocalUDP sviluppata Fred Larsen e' molto potente per reti locali con tanti device Arduino compatibili, si inizializza senza dover configurare ip o altro e opera utilizzando un indirizzo di un byte, la stessa implementazione gira anche su computer Linux Windows e Apple.
Dopo lungo smanettarci ora sembra funzionare, il problema stava nel rendere disponibili i dati sia per Arduino e sia per Processing che sono simili come linguaggio ma hanno più di qualche differenza nel lavorare i dati.
In pratica un Arduino rende disponibile il dato all'altro Arduino ma nello stesso tempo, se interrogato da processing lo rende disponibile per la visualizzazione.
Il programmino ora è in test.
Ho solo un paio di cosine da chiedere: la prima riguarda l'estrazione di un dato da un array che mi ha tolto un anno di vita e che ho risolto con un sistema alquanto fantasioso (vorrei che qualcuno ci desse un occhiata) la seconda invece è come si mette "Risolto"?
per la seconda è semplice
clicchi su more e poi modify del tuo primo post e cambi il titolo come preferisci
Magomerlino:
la prima riguarda l'estrazione di un dato da un array che mi ha tolto un anno di vita e che ho risolto con un sistema alquanto fantasioso (vorrei che qualcuno ci desse un occhiata)
Un'occhiata ok, ma a COSA?
Metti il codice e vediamo cosa intendi con "metodo alquanto fantasioso"...