Grazie mille per la risposta :
l'esempio lo sto analizzando e piano piano sto capendo il meccanismo anche se per ora sono riuascito ad inviare solo numeri interi... e non riesco a trovare il modo per inviare uin numero con decimali.
Il codice che mi hai postato è molto interessante solo credo che l'ultima riga sia errata e quella corretta sia questa (se ho capito come funziona )
Franchelli:
Grazie mille per la risposta :
l'esempio lo sto analizzando e piano piano sto capendo il meccanismo anche se per ora sono riuascito ad inviare solo numeri interi... e non riesco a trovare il modo per inviare uin numero con decimali.
Ti basta considerarli stringhe, ad esempio questo è quello che mi invia il mini in lavanderia: "LAV T21.6 U45.5 W276". LAV è il nome del sensore, T la temperatura, U l'umidità e W sono i watt attuali. Con le stringe si usano tanti byte, ma così è più semplice.
Franchelli:
Il codice che mi hai postato è molto interessante solo credo che l'ultima riga sia errata e quella corretta sia questa (se ho capito come funziona )
No il codice è giusto, in pratica non puoi trasmettere una stringa intera "ciao pippo" ma devi inserirla in un array. In questo caso "ciao pippo" tramite "toCharArray" diventa bufferTemp[0]=c, bufferTemp[1]=i, bufferTemp[2]="a", bufferTemp[3]="o" e via così.. dai un'occhiata al reference
Franchelli:
Perchè quel +2 alla fine della seconda riga?
Il "+2" è per aggiungere 2 byte alla stringa stringa inviata, penso li usi PJON, senza ti taglia la stringa...
Ti basta considerarli stringhe, ad esempio questo è quello che mi invia il mini in lavanderia: "LAV T21.6 U45.5 W276". LAV è il nome del sensore, T la temperatura, U l'umidità e W sono i watt attuali. Con le stringe si usano tanti byte, ma così è più semplice.
Ok, in pratica devo crearmi una stringa (la tua è un "enciclopedia...") che contiene tutto quello che voglio mandare e poi con il metodo che mi hai indicato, questo
Un po' macchinoso da capire ma senz'altro funzionale. Ci lavorerò su.
Potrebbe essere fattibile anche l'uso di una union?
Dato che il tuo sistema sembra nettamente più complesso del mio, hai mai notato problemi di "intasamento" del bus per concomitanza di pacchetti inviati da altrettanti dispositivi contemporaneamente?
Io ho realizzato un "Termostato Avanzato" per la gestione dei fancoil di casa, in pratica leggono temperatura ed umidita ambientali, la temperatura dell'acqua che circola nel radiatore del faincoli e gestiscono l'accensione del motore che aziona la ventola, ho implementato un menu di gestione e la visualizzazione grafica sul lcd dei vari parametri impostati e rilevati.
Ora con l'aiuto della PJON tutti i termostati (per ora 3 ma in totale 9) comunicano tra di loro i vari valori rilevati in futuro vorrei impementare la possibile di settaggio "remoto" da qualsiasi termostato a qualsiasi termostato.
nel primo sketch di esempio che hai postato avevi scritto questa riga
int lunghezza=Stringa_da_inviare.length()+2;
e avevi detto che era necessaria per visualizzare la stringa nella sua completezza. In effetti senza i due bit aggiuntivi viene troncata
Nei successivi sketch però non hai messo il +2
mi sfugge qualcosa?
Anche mettendo i due bit aggiuntivi la lettura appare strana con un . alla fine del valore
Forse i due sketch che hai postato sono in via di sviluppo e quindi non pienamente funzionanti?
la funzione dtostrf non la conoscevo e mi sembra parecchio flessibile nel suo uso che ti permette di configurare in maniera semplice la stringa in uscita.
Ora sto provando anche la tua strada ma da super-profano penso che il tuo sistema sia, senza togliere nulla a Mauroz, leggermente più semplice. Bravi comunque tutti e due, non ci sarei mai arrivato da solo.
Non sapete che piacere enorme e' per me vedere che troviate utile quello che ho realizzato in questi 5 anni di sperimentazione nel mondo dei protocolli di comunicazione :). Ci sono alcune novita' in arrivo, soprattutto in termini di compatibilita'. Infatti sto lavorando molto con ESP8266 e un altro utente di PJON sta lavorando con l'Arduino Zero.
Vorrei rilasciare la versione 2.0 di PJON a breve rendendo compatibili anche queste due architetture sommate a (se possibile) all'Arduino due.
Ho recentemente fixato un bug scoperto da un utente di nome Stephan (veramente un grande) che era nella codebase da anni. Di conseguenza consiglio a tutti di pullare PJON e aggiornare i firmware dei vostri device. Questo dovrebbe ridurre drasticamente i problemi di interferenze che avete lamentato e rimuovere alcuni comportamenti non voluti e assolutamente erronei che avvenivano solo in alcuni casi particolari solo se il destinaratio non era connesso.
Sarei molto felice di mostrare le vostre realizzazioni nella wiki del repository e nel sito della libreria, che sto proprio ora realizzando. Chiunque fosse interessato puo' postare in questo thread le info che vorrebbe rilasciare
Grazie a tutti per i complimenti e buona sperimentazione.
Fatemi sapere i vostri consigli / critiche.
Quei 2 sketch erano dei semplici test che stavo effettuando, semplificando il tutto puoi dimensionare l'array conoscendo la lunghezza della stringa da inviare, in questo caso "Ciao Pippo" sono 10 caratteri (compreso lo spazio) quindi:
String Stringa_da_inviare = "Ciao Pippo"; //stringa da inviare
char bufferTemp[10]; //imposti l'array
Stringa_da_inviare.toCharArray(bufferTemp, 10); //converto la stringa
network.send(PinTrasmissione, bufferTemp, 10); //invio la stringa con Pjon
come vedi tolta la stringa ed il network.send con 2 righe fai tutto
Assolutamente il tuo sketch è funzionale peò mi sta dando qualche grattacapo:
con questa versione tratta dalla tua e modificata per le mie esigenze
if(millis() - time > 1000) {
time = millis();
sensors.requestTemperatures(); // Send the command to get temperatures
stringVal=String(nomeSensore+float(sensors.getTempCByIndex(0)));// crea la stringa nomesensore + lettura
int lun=stringVal.length(); // calcola lunghezza stringa
char charVal[lun]; // crea array con lunghezza della stringa
stringVal.toCharArray(charVal,lun);//riempie l'array con la stringa
network.send(1, charVal, lun); // invia al Id1 la stringa di lunghezza lun
}
La lettura ricevuta sul ricevente è la seguente:
Tm1 23.8.
Per avere una lettura corretta devo modificare la seguente riga così:
stringVal.toCharArray(charVal,lun+1);//riempie l'array con la stringa
La letture quindi è questa:
Tm1 23.63
con due decimali.
Se invii sempre "Tm1 xx.xx" ti conviene fare un buffer fisso a 10, fai riposare un po' il povero arduino
if(millis() - time > 1000) {
time = millis();
sensors.requestTemperatures(); // Send the command to get temperatures
stringVal=String(nomeSensore+float(sensors.getTempCByIndex(0)));// crea la stringa nomesensore + lettura
#define Tot_Car 10 //totale caratteri della stringa da inviare
char charVal[Tot_Car]; // crea array con lunghezza della stringa
stringVal.toCharArray(charVal,Tot_Car);//riempie l'array con la stringa
network.send(1, charVal, Tot_Car); // invia al Id1 la stringa di lunghezza lun
}
Si, ovvio ma dato che il valore nelle x è un valore di temperatura potrebbe perdere le decine e quindi crreare una lettura scorretta.
Cmq alla fine, diversamente da quanto detto prima e facendo delle prove, ho visto che la tua strada è la più user friendly per chi è alle prime armi come me.
Spiegami alcune cose che non mi sono chiarissime:
network.receive(1000);
come mai è settato ad 1 secondo mentre
network.update();
è libero di girare alla velocità del loop?
Il primo abilita la ricezione sul bus e quindi se un dispositivo deve solo trasmettere può essere omesso così come può essere omesso il secondo se deve solo ricevere, ho interpretato bene?
Questa riga che hai inserito
network.send(1, "*", 1, 10000000); //CONTROLLO OGNI 10sec. se l'id1 risponde
è a titolo di debug in quanto se c'è una mancata connessione comunque viene visualizzata sulla seriale/led del TX e potrebbe essere omessa? In pratica fa un ping per capire se c'è continuità di comunicazione in caso di silenzio di comunicazioni sul bus per periodi prolungati?
Franchelli:
Si, ovvio ma dato che il valore nelle x è un valore di temperatura potrebbe perdere le decine e quindi crreare una lettura scorretta.
Cmq alla fine, diversamente da quanto detto prima e facendo delle prove, ho visto che la tua strada è la più user friendly per chi è alle prime armi come me.
In ogni caso con un buffer di 10 invia il dato che leggi, che sia 20.01, 20.00 o 1
Franchelli:
Spiegami alcune cose che non mi sono chiarissime:
network.receive(1000);
come mai è settato ad 1 secondo mentre
Il master interroga ogni x sec. se gli slave rispondono, se questi perdono la connessione si accende il led (13), si può togliere tranquillamente il receive, tanto se non sono accesi alla fine lo capiscie perché non ti arriva nulla
Franchelli:
network.update();
è libero di girare alla velocità del loop?
Si, nel readme di Gioblu c'è scritto:
"the update() function has to be called at least once per loop cycle. "
Franchelli:
...
network.send(1, "*", 1, 10000000); //CONTROLLO OGNI 10sec. se l'id1 risponde
è a titolo di debug in quanto se c'è una mancata connessione comunque viene visualizzata sulla seriale/led del TX e potrebbe essere omessa? In pratica fa un ping per capire se c'è continuità di comunicazione in caso di silenzio di comunicazioni sul bus per periodi prolungati?
esatto si può togliere, se non ricevi nulla alla fine lo vedi
Quando si parla di stringhe allocate sempre un byte in più. In C le stringhe sono terminate da un carattere ( "\0" )
Se non si tiene in considerazione questo, prima o poi ci si trova con qualche funzionamento anomalo e ci si perde la testa a capire il perché di certi comportamenti
In ogni caso con un buffer di 10 invia il dato che leggi, che sia 20.01, 20.00 o 1
Ok ma se il dato da trasmettere è più breve delle dimensioni del buffer, oltre al dato verranno visualizzati altri simboli a caso (già testato) da cui l'importanza ad avere il buffer identico come dimensioni al dato da inviare.
Si, nel readme di Gioblu c'è scritto:
"the update() function has to be called at least once per loop cycle. "
Si, l'avevo letto pure io ma mi piaceva capirne il perché...
nabla:
Quando si parla di stringhe allocate sempre un byte in più. In C le stringhe sono terminate da un carattere ( "\0" )
grazie
[/quote]
Franchelli: @Mauroz
Ok ma se il dato da trasmettere è più breve delle dimensioni del buffer, oltre al dato verranno visualizzati altri simboli a caso (già testato) da cui l'importanza ad avere il buffer identico come dimensioni al dato da inviare.
ecco io ancora non l'avevo notato, perché l'array lo creo sempre della giusta dimensione, per l'update() ti può rispondere solo GioBlu..
Ciao ragazzi! Nel readme consiglio di chiamare update() ogni ciclo perche' la libreria non e' interrupt-driven e quindi non assicura che i pacchetti schedulati vengano inviati nel momento richiesto nel futuro. Questa responsabilita' e' in un certo senso destinata all'utente, finche' update() non verra' chiamata, nessun pacchetto verra' instradato e quindi anche i pacchetti in attesa di essere inviati, potrebbero essere inviati in ritardo. Ovviamente in alcune applicazioni chiamare update() non e' necessario, per esempio se un device e' solo dedicato alla ricezione.
Se potete postate le vostre realizzazioni sono curioso di vederle