Go Down

Topic: PJON - Multi-master, multi-media network protocol stack  (Read 85309 times) previous topic - next topic

st_e

Franchelli fai una prova con tre alimentazioni diverse per i tre arduini.

Sto utilizzando ache'io questa libreria per comunicare diverse stringhe di valori tra vari arduini.

Franchelli

Franchelli fai una prova con tre alimentazioni diverse per i tre arduini.

Sto utilizzando anche'io questa libreria per comunicare diverse stringhe di valori tra vari arduini.

Ottimo, la prova da fare immagino è per limitare le interferenze, vero?
Posso farle tutte e tre separate sempre da USB?

Per il resto cosa mi puoi dire?

Gia che ci siamo:

hai detto che invii stringhe di valori: io per ora ho provato solo ad inviare il singolo carattere  ma sto tentando di capire la tecnica per mandare dei valori numerici come potrebbe essere quello in uscita da un sensore di tempreatura. Hai qualche spezzone di schema da inserire, magari commentato, per cercare di far chiarezza?
Grazie mille
Franco


mauroz

ciao,
sto usando anche io la libreria PJON per inviare e ricevere dati da vari sensori. Attualmente ho 5 mini pro collegati a varie distanze (max 15mt) e finora non ho avuto nessun problema.
Per inviare i dati dei sensori puoi guardare l'esempio di Gioblu "SendArbitraryValues" dove con pochi byte invia il valore di un sensore. Se invece vuoi inviare una stringa, io ho fatto così:

Code: [Select]

String Stringa_da_inviare = "Ciao Pippo";
int lunghezza=Stringa_da_inviare.length()+2;
char bufferTemp[lunghezza];
Stringa_da_inviare.toCharArray(bufferTemp, lunghezza); 
network.send(PinTrasmissione, bufferTemp, lunghezza);   


Se hai dubbi ti posto l'intero sketch..

ciao :)


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.

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  :smiley-mr-green: )
Code: [Select]

network.send(PinTrasmissione, Stringa_da_inviare, lunghezza);


Perchè quel +2 alla fine della seconda riga?
Grazie

mauroz

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. :)

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  :smiley-mr-green: )
Code: [Select]

network.send(PinTrasmissione, Stringa_da_inviare, lunghezza);

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

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...


mauroz

Franchelli, poi per ricostruire la stringa fai così:

Code: [Select]

void receiver_function(uint8_t length, uint8_t *payload) {

String dati;

for (int i = 0; i < length; i++) {
    char tmp = payload[i];
    dati += String (tmp);
    }
   
Serial.print ("Dati PJON ricevuti --> ");
    Serial.println (dati);



Franchelli

Quote
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

Code: [Select]
String Stringa_da_inviare = "Ciao Pippo";
int lunghezza=Stringa_da_inviare.length()+2;
char bufferTemp[lunghezza];
Stringa_da_inviare.toCharArray(bufferTemp, lunghezza); 
network.send(PinTrasmissione, bufferTemp, lunghezza);

 invio tutto il pacco al ricevente.

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?


mauroz

i miei vari mini pro inviano i dati ogni 5 sec., durante il test con qualche mt. di cavo ne ho connessi 12 e ho rilevato solo un problema che ho segnalato a Gioblu che  ha prontamente risolto. Ecco a proposito, assicurati di usare l'ultima libreria master dal repository https://github.com/gioblu/PJON, ne approffitto anche per ringraziare pubblicamente Gioblu per il lavoro svolto, mi ha fatto risparmiare un po' di 485 :)

ti allego un paio di sketch che ho usato per test, c'è un mini che riceve e visualizza le temperature su lcd e 3 mini che inviano la temperatura.



st_e

Vi posto le linee di codice che utlizzo per inviare i dati con la lib PJON

Code: [Select]

  hu = dht.readHumidity();
  t = dht.readTemperature();
  sensors.requestTemperatures();
  double tempC = sensors.getTempCByIndex(0);
  if(millis() - time > 1000) {
    time = millis();
    dtostrf( tempC, 2, 2, contenuto);
    dtostrf( hu, 2, 2, conten);
    char cont[10] = {0};
    sprintf(cont,"%s %s",contenuto,conten);
    network.send(BROADCAST, cont, 10);


ho utilizzato un approccio diverso rispetto a mauroz per creare le stringhe, non so valutare se sia migliore il suo ol il mio ma sono entrambi validi.

Un grosso grazie a Gioblu per la libreria da lui creata !!!!

st_e

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.

 

Franchelli

Un grazie a mauroz, a St_e  e ovviamente a Gioblu per il grossissimo aiuto che mi state dando in questa fase ed avrei da chiedere alcune cose :

@Mauroz

nel primo sketch di esempio che hai postato avevi scritto questa riga

Code: [Select]
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?

@St_e

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.




gioscarab

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.

 

mauroz

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:

Code: [Select]
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 :)

Franchelli

@Mauroz

Assolutamente il tuo sketch è funzionale peò mi sta dando qualche grattacapo:
con questa versione tratta dalla tua e modificata per le mie esigenze
Code: [Select]

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ì:

Code: [Select]

stringVal.toCharArray(charVal,lun+1);//riempie  l'array con la stringa

La letture quindi è questa:
Tm1 23.63
con due decimali.

Hai qualche idea ?

mauroz

Se invii sempre "Tm1 xx.xx" ti conviene fare un buffer fisso a 10, fai riposare un po' il povero arduino :)

Code: [Select]

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
}

Go Up