Dubbi su libreria VirtualWire

Mi sto cimentando nell'utilizzo di alcuni moduli radio e dopo molti ostacoli sono riuscito a farli funzionare, un pò a fortuna un pò spulciando qualche esempio già fatto su internet.
Però vorrei capirne bene il funzionamento, in modo da poterli gestire al meglio. Lesto tempo fa mi consigliò di rivedermi alcune cose basilari come :
-Reference su string
-Funzione sprintf
-Puntatori

Piano piano mi voglio vedere tutto. Ora sono qui per esporvi il mio primo dubbio sulla libreria che sto utilizzando per la comunicazione dei due moduli, ovvero la VirtualWire.

La funzione:
vw_send((uint8_t *)val, sizeof(val));
come si vede dalla sua "firma" vuole tra i suoi parametri un puntatore a uint8_t e un intero che sta ad indicare la grandezza del dato da passare.
E' giusto?

Grazie

La risposta alla mia domanda è SI (grazie brain).

Comunque:
Ora il mio problema è :

dall'arduino Server voglio leggere il valore di una porta analogica e inviarlo tramite modulo radio all'arduino client. Il mio è un problema di programmazione, ora mi sto vedendo un pò qualcosa sui puntatori, ma ancora non riesco a capire appieno la cosa.

Ci Sono riuscito ad inviare il valore della porta analogica, però non ho capito bene come :smiley:

      if(buf[i]=='R'){        //Lampeggia
      //Manda i parametri del pozzo ....
      //....................................      
      sonda1= analogRead(1);
      sprintf(msg1, "%i", sonda1);
      Serial.print("msg1:");
      Serial.println(msg1);
      send_message(msg1);
      lampeggia(LED);
      }

PErchè ho dovuto definire msg come char msg1[24] ???

Grazie!!!

che usi char o unit_8t è la stessa cosa, son 1byte di grandezza(perchè la seriale scrive un baud alla volta, composto da 1byte di payload, ovvero i tuoi dati, e nel caso di arduino 2 bit di controllo)

tu sai che la funzione write prende in input un array di unit_8t (o char) e la dimensiuone dell'array. Invece tu vuoi inviare un int, composto da 2byte se lo mantieni in int, 1byte per cifra se lo converti in stringa, a cui però poi dovrai aggiungere un carattere di fine stringa (la sprintf in automatico mette lo '\0', carattere standar di fine stringa, ma non so se viene trasmesso), altrimenti non saprai dove finisce un numero e inizia l'altro.

il codice che usio te trasforma il numero in stringa, mentre il codice seguente divide l'intero (2byte) a metà e poi li invia. In questo modo risparmi, per numeri a più cifre, un byte per cifra, che sembra poco ma a 9600baud può fare la differenza.

unit_8t messaggio[2];
messaggio[0] = (unit_8t)intero; //vengono copiati i primi 8 bit, i restanti, che non ci stanno, vengono scartati.
messaggio[1] = (unit_8t)(intero << 8); //i bit prima scartati vengono fatti "scivolare" al posto di quelli che abbiamo già copiato, e quindi si può eseguire la stessa operazione di prima
vw_send( messaggio, 2);

xome puoi vedere, un array e un puntatore sono la stessa cosa! in realtà l'array è una semplificazione dei puntatori nata per risparmiare un sacco di tempo, se non ci fossero gli array il codice sarebbe stato:

unit_8t *messaggio;//puntatore a uint8
messaggio = (unit_8t)malloc ( sizeof (unit_8t)*2 ); //do al puntatore 2 spazi di memoria

*messaggio = (unit_8t)intero; //il valore è salvato nella prima cella di memoria
*(messaggio+sizeof (unit_8t)) = (unit_8t)(intero << 8); //il valore è salvato nella seconda cella di memoria.

vw_send( messaggio, 2);

Nota come volendo, potrei scrivere:
messaggio+sizeof (unit_8t)*i
al variare di i vario la cella di memoria in cui voglio scrivere: se è 0 scrivo nella prima cella, se 1 nella seconda e così via... ed ecco spioegato come mai gli array iniziano a contare da 0. :grin:

Salve a tutti, sono nuovo del forum e di arduino anche se appassionato da molti anni di elettronica ed informatica, ho montato alcuni pannelli solari sul mio terrazzo, con arduino in wireless a 433MHz in configurazione trasmettitore/ricevitore, per leggere sul ricevitore una serie di informazioni che riguardano il funzionamento dei pannelli. Magari in futuro con untransceiver potrei comandare anche alcune funzioni( accensione, tensione in uscita, ecc.). Essendo un neofita sto procedendo a piccoli passi e sino ad ora sono riuscito a trasmettere un messaggio di testo dal trasmettitore al ricevitore (il classico msg. "hello!") che viene correttamente visualizzato sul monitor seriale, ma non viene stampato su lcd( che funziona perfettamente) di cui ho dotato il ricevitore.
Chi mi può aiutare? Grazie.
Questo è il codice.....

#include <LiquidCrystal.h>
#include <VirtualWire.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup()
{
lcd.begin(16, 2);
lcd.clear();
Serial.begin(1200);
Serial.println("setup");
vw_setup(1200); // Bits per sec
vw_set_rx_pin(7);
vw_rx_start(); // Start the receiver PLL running

}
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Non-blocking
{
int i;
digitalWrite(13, true); // Flash a light to show received good message

Serial.print("Got: ");
for (i = 0; i < buflen; i++)
{
char val=buf*;*

  • scanf("%x", &buf);*
    _ printf("%c", buf*);_
    _
    Serial.print(val);_
    _
    Serial.print(" ");_
    _
    lcd.print(val);*_

* }*
* Serial.println("");*
* digitalWrite(13, false);*
* }*
}