Aiuto Libreria RF22

ciao, sto cercando di far lavorare la libreria RF22 -> RF22: RF22 library for Arduino
e lo sketch di prova va bene. c'è uno sketch per il server e uno per il client.
nello sketch i due chip si mandano delle scritte, tipo Hello World, etc..

ora io sto provando a mandare un byte, che sia la lettura di un potenziometro su A0, solo che non riesco a capire come si traduce analogRead() in un byte da poter spedire con RF22.

le parti funzionanti sono:
uint8_t data[] = "Hello World!";
rf22.send(data, sizeof(data));

sul client e:
while (1)
{
rf22.waitAvailable();

// Should be a message for us now
uint8_t buf[RF22_MAX_MESSAGE_LEN];
uint8_t len = sizeof(buf);
if (rf22.recv(buf, &len))
{
Serial.print("got request: ");
Serial.println((char*)buf);
sul server..

ho cambiato la parte client in questo:
uint8_t data[] = byte(analogRead(A0));
rf22.send(data, sizeof(data));
ma non gli piace...
come si scrive giusto?

grazie.

In che senso non gli piace? :slight_smile:
Cmq considera che una lettura analogica è un valore compreso fra 0 e 1023 (10 bit) per cui il numero viene scomposto in 2 byte. Quando ti arriva devi prenderti tu la briga di ricomporlo.

Prendi ad esempio 700: verrà scomposto in 2 e 188.

è vero, sono due byte..
ora con questo:
uint8_t data[] = byte(analogRead(A0));
rf22.send(data, sizeof(data));

l'errore che mi da è questo:
rf22_client_pot:27: error: initializer fails to determine size of ‘data’

però, scusa, questo è funzionante dallo sketch d'esempio:
uint8_t data[] = "Hello World!";
rf22.send(data, sizeof(data));

se ho capito, ogni lettera di "Hello World!" è un byte, che viene registrato in data[].
quindi rf22.send manda la sequenza di byte, con numero totale di byte 12, giusto?

allora io dovrei tradurre con map(), la lettura analogica, in un numero da 0 a 255, poi posso inviarlo come un singolo byte?

provo..
se avete qualche suggerimento, fa piacere..
ciaps!

neanche così funziona..

byte val = map(analogRead(A0),0,1023,0,255);
uint8_t data[] = (val);
rf22.send(data, sizeof(data));

mi da quest'errore:
rf22_client_pot:27: error: initializer fails to determine size of ‘data’

come si scrive questa cosa? sembra così semplice!

ok, questo ha funzionato, o meglio lo ha compilato, adesso vedo se funziona..

byte val = map(analogRead(A0),0,1023,0,255);
uint8_t data[] = {val};
rf22.send(data, sizeof(data));

Mi dite se è corretto?

ma questo:
uint8_t data[] = {val};
non dovrebbe essere al contrario?
{val}=uint8_t data[] ;

..e se faccio così e risparmio un passaggio?
se pò ffa?

uint8_t data[] = {map(analogRead(A0),0,1023,0,255)};
rf22.send(data, sizeof(data));

Scusa, non per essere rompiscatole, puoi racchiudere il codice tra i tag appositi per il codice???, così viene una cosa del genere:

 nell' editor devi cliccare sul "#"

così si capisce meglio!!!

Ciao...

no, scusa, hai ragionissima! è che stavo di fretta e ho copiaincollato al volo senza pensarci. sorry!

allora, c’è qualcosa che non va nel mio codice, potreste dirmi dove sbaglio?
sto facendo una prova con un pulsante su un chip, il ‘send’ di un byte, e alla ricezione lampeggia tre volte il LED, poi se viene letto quel byte dovrebbe rimanere il LED acceso.
con questo codice, avvengono i tre lampeggi di ricezione ‘qualcosa’, ma non paragona il byte per tenere acceso il LED:

lato client:

#include <SPI.h>
#include <RF22.h>

RF22 rf22;

void setup() 
{
  Serial.begin(9600);
  if (!rf22.init())
    Serial.println("RF22 init failed");
  // Defaults after init are 434.0MHz, modulation GFSK_Rb2_4Fd36
  pinMode(8, INPUT);
  pinMode(9, OUTPUT);
    
}

void loop() {
  if (digitalRead(8) == HIGH) {
    digitalWrite(9, HIGH);
    uint8_t data[] = {65};
    rf22.send(data, 1);   
    rf22.waitPacketSent();
  }  
  else if (digitalRead(8) == LOW) {
    digitalWrite(9, LOW);
  }
}

e lato server:

#include <SPI.h>
#include <RF22.h>

RF22 rf22;

void setup() 
{
  Serial.begin(9600);
  if (!rf22.init())
    Serial.println("RF22 init failed");
  // Defaults after init are 434.0MHz, modulation GFSK_Rb2_4Fd36
  pinMode (9, OUTPUT);
}

void loop() {
  rf22.waitAvailable(); 
  uint8_t buf[RF22_MAX_MESSAGE_LEN];
  uint8_t len = sizeof(buf);
  int comp = int(buf);
  if (rf22.recv(buf, &len)) {
    blink1time();
    blink1time();
    blink1time();
    if (comp == 65) { 
      digitalWrite (9, HIGH);
    }
    else {
      digitalWrite (9, LOW);
    }
  }
}

void blink1time() {
  digitalWrite (9, HIGH);
  delay(50);
  digitalWrite (9, LOW);
  delay(50);
}

c’è da dire che sto usando i chip standalone per poterli pilotare a 3V (2 pile AA), visto che le logiche dell’RFM22B sono a 3V, e quindi non mi è possibile fare debug su un monitor seriale.
l’unico riscontro che posso avere è far fare qualcosa al LED.

Qualcuno può gentilmente aiutarmi?

grazie, Davide.