trasmissione con modulo 433mhz

salve, mi sto esercitando ad utilizzare i moduli trasmettitori/ricevitori 433 mhz, ora il mio intento è quello di inviare la temperatura (per ora solo questa) letta da un sensore dht11.
Per farlo se ho capito bene devo inserire il valore intero della temperatura e metterlo in un array di char?
me lo confermate?

Direi di si. Un array di char è una stringa classica del C (da non confondere con gli oggetti di tipo String)
In poche parole una "frase" di testo. Quindi spedirai un testo che rappresenta la cifra.
Se devi mandare la virgola, usa dstrof() per convertire.

nid69ita:
Direi di si. Un array di char è una stringa classica del C (da non confondere con gli oggetti di tipo String)
In poche parole una "frase" di testo. Quindi spedirai un testo che rappresenta la cifra.
Se devi mandare la virgola, usa dstrof() per convertire.

si però quello che non ho capito è che senso ha convertire il valore intero in char se poi durante la trasmissione viene fatto il casting in byte?

  1. una temperatura ha le virgole di solito quindi non è un intero
  2. Un valore intero sono 2 byte
  3. se basta un byte (senza segno) o un int_8 con temperature tra 0 e 50 o -20 e 50° allora invece di
    fare una trasmissione in formato testo si può fare trasmissione in formato binario.

Di solito si opta per una trasmissione testuale perchè
a) è più semplice (trasmetti qualcosa di leggibile tramite monitor seriale ad esempio)
b) le cifre singole sono valori ascii ben definiti ‘0’=48 e ‘9’=57
3) visto che le cifre sono sempre valori ben definiti si possono aggiungere ai dati dei caratteri speciali di controllo (per creare un protocollo), esempio si potrebbero inviare ‘#’ prima delle cifre e poi ‘@’ alla fine per indicare inizio trasmissione e fine trasmissione.
In formato binario inviando una cifra tra 0 e 50° in alcuni valori hai codici ascii non leggibili

nid69ita:

  1. una temperatura ha le virgole di solito quindi non è un intero
  2. Un valore intero sono 2 byte
  3. se basta un byte (senza segno) o un int_8 con temperature tra 0 e 50 o -20 e 50° allora invece di
    fare una trasmissione in formato testo si può fare trasmissione in formato binario.

Di solito si opta per una trasmissione testuale perchè
a) è più semplice (trasmetti qualcosa di leggibile tramite monitor seriale ad esempio)
b) le cifre singole sono valori ascii ben definiti '0'=48 e '9'=57
3) visto che le cifre sono sempre valori ben definiti si possono aggiungere ai dati dei caratteri speciali di controllo (per creare un protocollo), esempio si potrebbero inviare '#' prima delle cifre e poi '@' alla fine per indicare inizio trasmissione e fine trasmissione.
In formato binario inviando una cifra tra 0 e 50° in alcuni valori hai codici ascii non leggibili

grazie adesso ho le idee molto più chiare.. solo che non ho capito molto la funzione dtostrf() potresti dirmi la sintassi?

AVR-Link

dtostrf (floatVar, minStringWidthIncDecimalPoint, numVarsAfterDecimal, charBuf);

vuole 4 parametri: il numero, minima dimensione completa, numero cifre dopo decimale, buffer stringa che riceve valore

char buf[11];  // 10 cifre + fine stringa = dimensione 11 
float f=123.456;
...
dtostrf( f,10,2,buf);
Serial.println(buf);

nid69ita:
AVR-Link

dtostrf (floatVar, minStringWidthIncDecimalPoint, numVarsAfterDecimal, charBuf);

vuole 4 parametri: il numero, minima dimensione completa, numero cifre dopo decimale, buffer stringa che riceve valore

char buf[11];  // 10 cifre + fine stringa = dimensione 11 

float f=123.456;
...
dtostrf( f,10,2,buf);
Serial.println(buf);

grazie mille, quando posso provo e vedo se funziona

curiosità... visto il sensore credo che la precisione massima richiesta non vada oltre al centesimo di grado...
non sarebbe quindi più semplice prendere la temperatura, moltiplicarla per 100 e trasmettere così solo la parte intera? con 4 cifre (2 per la parte intera e 2 per quella decimale) te la cavi...
dall'altra parte prendi l'intero che arriva e lo dividi per 100 e hai il tuo float...

nid69ita:
AVR-Link

dtostrf (floatVar, minStringWidthIncDecimalPoint, numVarsAfterDecimal, charBuf);

vuole 4 parametri: il numero, minima dimensione completa, numero cifre dopo decimale, buffer stringa che riceve valore

char buf[11];  // 10 cifre + fine stringa = dimensione 11 

float f=123.456;
...
dtostrf( f,10,2,buf);
Serial.println(buf);

Ciao.. ho provato e funziona solo che non ho capito come stabilire la dimensione dell'array di char (quello buf), perché ogni dimensione che metto funziona. Altra domanda se volessi trasmettere pure il valore umidità (visto che si tratta di un sensore dht11) la funzione dtostrf va bene lo stesso?

la dimensione dell'array buf dipende da quante cifre vuoi memorizzare... nell'esempio hai 10 cifre + fine stringa, quindi puoi memorizzare un numero con 7 cifre intere, la virgola e 2 cifre decimali... oppure 6 cifre intere, la virgola e 3 cifre decimali... e così via.
la funzione dtostrf converte semplicemente un float in una stringa, quindi va bene per qualunque valore float (o anche int... avrai semplicemente i decimali a zero).

fratt:
la dimensione dell'array buf dipende da quante cifre vuoi memorizzare... nell'esempio hai 10 cifre + fine stringa, quindi puoi memorizzare un numero con 7 cifre intere, la virgola e 2 cifre decimali... oppure 6 cifre intere, la virgola e 3 cifre decimali... e così via.
la funzione dtostrf converte semplicemente un float in una stringa, quindi va bene per qualunque valore float (o anche int... avrai semplicemente i decimali a zero).

Quindi se voglio trasmettere 2 valori quale funzione mi conviene utilizzare?

ho come l'impressione che la mia risposta non sia stata capita...
la funzione è sempre la stessa (dtostrf). per inviare 2 valori, secondo me, puoi:

  • convertirli uno alla volta e inviarli uno alla volta
  • convertirli uno alla volta, concatenarli ed inviare un'unica stringa che poi decodificherai in ricezione dall'altro lato