Monitoraggio silos

Salve ragazzi, vorrei chiedervi cosa mi consigliate per monitorare la temperatura di 30 silos.
Mi spiego meglio, ho circa 30 silos di piccole dimensioni, la temperatura dell' liquido al loro interno deve rimanere compresa tra i 30°c ei 40°c, essendo molto distanti l'uno dall'altro dovrei usare un hardware per ogniuno, e questo non è un problema, ma per ricevere i dati di 30 o più hardware su una pagina web come posso fare?
Che hardware usare e con che "tipologia" di sensore?
Devo creare un websocket o una normale pagina php può sopportare quel traffico dati?
Grazie

Beh intanto se il server è in php immagino sia su Raspberry o su un PC, e credo che qualsiasi server sia in grado di supportare 30 piccole connessioni anche contemporanee.

In ogni caso le temperature non credo che cambino rapidamente, quindi non hai bisogno di avere dati più spesso diciamo di una volta al minuto. Se metti dei sensori con un Wemos D1 mini ciascuno, potresti mandare i dati con una chiamata http GET opportuna, ed il server memorizza il dato mettendolo in un file locale o un piccolo db.

Oppure, ancora più semplicemente, io farei pacchetti UDP in broadcast (che semplifica anche la configurazione) di un paio di byte che rappresentano l'ID del sensore (primo byte) e la temperatura (secondo byte), quindi avresti un traffico bassissimo. A ricevere questi pacchetti basta un qualsiasi programmino su RPi o su PC che li intercetta e li usa per aggiornare il file che poi il tuo sito web legge per mostrare i valori.

Insomma, tutto fattibile e ci sono anche varie soluzioni possibili (non solo queste).

Senza mettere in piedi una rete WiFi con 31 dispositivi, potresti usare degli HC12:
Discussione sugli HC12 multipli
Periodicamente, quello centrale manda dei codici da 1 a 30 e quello che riconosce il suo codice risponde. I dati ricevuti, poi, puoi trasformarli come vuoi.

Per evitare dati errati dovuti a possibili interferenze, imposta ciascuna trasmissione con una certa forma, ad esempio trasmetti "chiamata per silos 1" e quello deve rispondere "1 temperatura 35", oppure "ch silos 1" e deve rispondere "1 temp 35". Se vengono ricevuti dati difformi da quelli previsti, vengono effettuate altre chiamate, ad esempio fino a 5, ciascuna dopo una pausa di alcuni secondi. Tali chiamate aggiuntive possono essere effettuate dopo aver completato il giro: ogni 10 minuti chiama da 1 a 30; finito il giro, se qualcuno non ha risposto, lo chiama nuovamente.

Datman:
Senza mettere in piedi una rete WiFi con 31 dispositivi

Beh anche se la soluzione con HC12 è ovviamente una delle possibilità, non vedo quale sia il problema. Se ha già una WiFi si usa quella (pacchetti UDP che mandano 2 byte per volta non sono un problema per nessuna rete), se non ha una WiFi può impostare il WeMos centrale come AP.
Ma ti evita tutto quello che hai descritto dopo (il controllo di dati errati dovuti a possibili interferenze, il polling..).

Bisogna anche vedere che superficie occupano i silos e la distanza dall'unità centrale. Inoltre, se per come sono disposti ostacolano la trasmissione dei segnali e sono sufficientemente vicini, conviene addirittura una RS485.

Ah! "molto distanti" dice. Allora conviene usare gli HC12, che hanno una portata di 1km. Con una rete WiFi non ce la fa...

Addirittura, se necessario, potrebbe usare un HC12 intermedio o due come ripetitori per quelli più lontani: se arriva una chiamata per n>15, non risponde e la ripete. Se riceve una risposta da n>15, la ripete per il dispositivo centrale.

Se vogliamo dare un po' di ridondanza, per evitare che il guasto di un ponte blocchi tutti i dispositivi che lo usano, possiamo fare così:
Il dispositivo centrale chiama silo 16: se arriva il segnale, risponde direttamente il silo 16.
Se non risponde, chiama silo 16p1: il ponte 1 (silo 14) deve inoltrare la chiamata e il silo 16 deve rispondere.
Se non risponde, chiama silo 16p2: il ponte 2 (silo 15) deve inoltrare la chiamata e il silo 16 deve rispondere.
Se ancora non risponde, il dispositivo centrale informa che non ha ricevuto risposta.

Certamente, la soluzione migliore dipende anche da alcune condizioni che non conosciamo, per cui attenderei che l'OP dia maggiori info.

Ma considera che se parla di "silos di piccole dimension" non credo che siano distribuiti geograficamente lontani tra loro, ma che siano tutti più o meno nello stesso locale.. :wink:

Nello stesso locale?... No! Stanno all'aperto, immagino. Dice: "essendo molto distanti l'uno dall'altro".
Potrebbe essere una cosa del genere:
Silos
Se c'è un posto dove passare un cavo elettrico, si potrebbe anche considerare la RS485, che ha una portata di oltre 1km.

Non sappiamo cosa intenda con "molto distanti", io l'ho interpretata nel senso che sono "troppo distanti per poter usare un unico Arduino" il che significa anche che possono essere anche a soli 2 metri di distanza cioè "troppo distanti per far passare solo i fili dei sensori".

Ma, ripeto, evitiamo di ingolfare il thread con disquisizioni ed ipotesi su cose che l'OP ancora deve chiarire, aspetta che chiarisca poi si vede.

Elencate le possibilità, attendiamo una risposta.

Intanto vorrei ringraziarvi per le risposte e per i l tempo che mi avete dedicato,
effettivamente ho omesso alcuni particolari.

  1. i silos sono distribuiti su un piazzale esterno a circa 2,5 metri l'uno dall'altro
  2. esiste una rete wifi aziendale che copre tutta l'area
  3. vorrei conoscere la temperatura ogni 30 sec
  4. i dati verranno trasmessi su un virtual server aruba, e visualizzati tramite pagina web
  5. entro fine anno i silos diventeranno circa 100/130, ma potrebbero aumentare

il mio intento è quello di avere un monitoraggio web in real-time di tutti i silos in contemporanea.

Ok, allora anche se ovviamente di possibili soluzioni ce ne sono tante, confermo cosa farei io: eviterei cablaggi in filo ed userei per ogni silo un piccolo device come WeMos D1 Mini per trasmettere ogni "x" secondi (direi tra 10 e 30) via UDP i dati (un byte come ID del silo -per averne massimo 255- e diciamo 2 byte per la lettura in decimi di grado) ad un "concentratore" che può essere a sua volta un altro WeMos o Arduino (con shield WiFi o Ethernet) o un Raspberry Pi o altro (se già esiste un qualche serverino, è un programma molto piccolo e semplice chesi può anche fare in C#).

A sua volta il "concentratore" deve acquisire i dati ricevuti, inviandoli al server remoto, o una chiamata alla ricezione di ogni dato, oppure, meglio, potrebbe accumulare i dati in un array locale ed inviarli in blocco ogni 30 secondi.

Lato server non c'è molto da fare, personalmente userei una tabella dei silo (con ID silo, descrizione, ultima lettura) aggiornata alla ricezione dei dati dal concentratore, e da questa poi una pagina potrebbe mostrare i valori.

docdoc:
Lato server non c'è molto da fare, personalmente userei una tabella dei silo (con ID silo, descrizione, ultima lettura) aggiornata alla ricezione dei dati dal concentratore, e da questa poi una pagina potrebbe mostrare i valori.

Concordo su tutto ma la struttura della tabella non da accesso allo storico delle lettura se costruita in questo modo.
Se all'OP non serve e gli basta sapere la condizione attuale ok perfetto, se invece ha necessità dello storico letture io la costuirei come:
TimeStampLettura, ID Silo, valore
avente TimeStampLettura, ID Silo come chiave composta
e una seconda tabella
ID silo, descrizione con IDSilo chiave.
Cosa ne pensi?

fabpolli:
TimeStampLettura, ID Silo, valore
avente TimeStampLettura, ID Silo come chiave composta
e una seconda tabella
ID silo, descrizione con IDSilo chiave.
Cosa ne pensi?

Certamente, io ho fatto la soluzione "semplice" ma dipende da cosa gli serve avere o memorizzare. Aveva parlato solo di visualizzazione per cui ho assunto che bastasse il valore corrente, ma comunque sia quando la pagina del sito riceve i dati può farne quello che vuole.
Personalmente se dovessi progettare un sistema per acquisizione dati, farei due tabelle una con i silo e l'ultimo valore, e l'altra con lo storico. Diciamo in una generica pseudo codifica db:

Tabella "silo":
id_silo int
nome varchar(20)
valore float (ultima lettura)

Tabella "silo_temp": (storico letture)
id bigint PK IDENTITY
id_silo int FK
ora datetime
valore float

Ma qui ora entriamo in un campo che esula da quello di questo forum, torniamo alla soluzione "arduinata"... :wink:

PS: e comunque concluderei l'OT con questo... :wink:

Grazie a tutti per l’aiuto, vi terrò aggiornati sul mio progetto