moduli rf 433

https://www.arduino.cc/en/Reference/Map

Ho sbagliato qualcosa nella funzione map ???

Direi che qualcosa nella logica non è giusto.
Se il trasmittente riporta i valori tra 0-1023 a valori tra 0-255, a che serve spedire 2 byte ?

Il rx riceve il valore corretto ? Hai verificato su Monitor Seriale ?

Quando trasmetti, perchè usi 2 map ?

Lettura = map(analogRead(A0),510,1023,0,1023); 
Letturadef = map(Lettura,0,1023,0,255);

Basta una sola map:

Letturadef = map(analogRead(A0),0,1023,0,255);

Per "costringere" un valore in un range 510->1023 esiste la constrain()

Uso due map perché il mio joystick quando parte dal centro non mi da 0 ma 512 e quindi mi serve il primo map per farmi risultare il centro 0 e il secondo per gestire i valori da 255 a 0 a - 255
ho provato a mandare una sola variabile ma mi sfalsa i valori..

Poi i valori li ricevo completamente giusti sia quelli che invio corrispondono a quelli che ricevo..
Il led invece si accende solo a 255 a 254 è spento..

Quale scheda Arduino ? Come hai collegato il led ?

Allora utilizzo arduino uno per ricevere i dati e ho collegato al Pin 10 il led essendo un Pin pwm e per trasmettere utilizzo una scheda arduino nano

Led normale ? Di che colore ? sul pin nessuna resistenza ?

il led è normalissimo di colore verde con nessuna resistenza attaccata...

eseguendo passo passo istruzione per istruzione il problema nasce sia dal trasmettitore che dal ricevitore infatti le funzioni che lo fanno impestare sono

vw_setup(1000);// 
vw_send((uint8_t *)msg, 1 ); 
vw_wait_tx(); //

Appena le introduco funziona tutto male..

  1. MAI mettere un led senza resistenza.
    I led a secondo del colore e dei Volt DEVONO avere una resistenza adeguata al massimo numero di mA che sopportano, di solito 20mA sono il max.
    Per un led verde e i 5V di Arduino metti una R da 180ohm
    Ti allego tabella volt/led/resistenze

  2. potrebbe essere che quella libreria lavora con uno dei timer interni.
    I pin quando in PWM lavorano associati ai timer. Prova ad esempio ad usare un altro pin, esempio il 3

http://www.airspayce.com/mikem/arduino/VirtualWire/
Qui dice: "Caution: ATTiny85 has only 2 timers, one (timer 0) usually used for millis() and one (timer 1) for PWM analog outputs. The VirtualWire library, when built for ATTiny85, takes over timer 0, which prevents use of millis() etc but does permit analog outputs."

Ma anche Arduino Uno ha solo 4 timer.
http://www.engblaze.com/microcontroller-tutorial-avr-and-arduino-timer-interrupts/

Appena arrivo a casa ti saprò dire grazie mille :slight_smile:

Allora ho buone notizie e cattive notizie il pin 3 è quello giusto quindi per modulare il segnale bisogna connetterlo li..
invece la cattiva e che come muovo il potenziometro si blocca la ricezione..

Verifica bene cosa spedisci

Ho fatto diciamo una verifica mettendo solamente un solo valore quindi un solo map che mi fa risultare da 0 a 255..
ora però se prima potevo avere qualche dubbio di errore ora sono nella pupu

Non ho mica capito. Quando spedisci, sei in grado di vedere su Serial Monitor quale valore è stato spedito ?

Una modifica che potresti fare è spedire sempre il valore come testo, fillato di 0, cioè spedire "003" per il 3, "040" per 40 e "123" per 123. Dall'altra parte ricevi e converti da testo a numero con atoi()

char buf[4];
snprintf(buf,4,"%03d",valore);

In pratica "stampi" dentro a buf un valore numerico di 3 cifre fillato con 0
Poi spedirai buf, quindi 3 byte

Quando spedisci una frase, composta da 3 cifre, sei sicuro che sono sempre caratteri tra 48 quindi '0' e 57 quindi '9'.
Quando spedisci un valore tra 0-255 è un byte. Ma tra i valori tra 0-255 potrebbero esserci dei valori riconosciuti come "speciali"
Inviare sempre come testo assicura che spedisci sempre caratteri che nella tabella ascii non sono valori "speciali".
Non è detto che la libreria che usi "senta" o tratti i valori speciali, ma meglio andare sul sicuro.
Se cerchi su internet tabella ascii, noterai che i valori sotto il 32 (spazio) sono indicati come speciali e hanno una specie di significato.

Vabbene ma il codice così come l ho scritto va bene ?
E al ricevitore come sarà?

No, devi spedire buf, non più msg

vw_send((uint8_t *)buf, 3 );

Ne riceverai 3 ora e non più 2. Si potrebbe usare atoi() ma vuole che la 4° byte ci sia 0 ovvero '\0'
Quindi possiamo fare noi il calcolo. Se spedisci sempre 3 byte, il primo è le centinaia, poi decine e poi unità il calcolo non è difficile.

Lettura = (buf[0]-'0')*100+(buf[1]-'0')*10(buf[2]-'0');

il valore ricevuto è ascii quindi esempio '5'-'0' => 53-48 => 5 come valore
non sono sicuro dell'ordine in cui ricevi, forse buf[0] è unità, buf[2] è centinaia.

Appena lo provo ti saprò dire sempre grazie ancora

ciao rieccomi scusa ma ho avuto un gran mal di testa ho provato a fare come tu mi hai consigliato ottenendo questo risultato nel trasmettitore...

Arduino:1.6.5 (Windows 7), Scheda:"Arduino Uno"

Ricevitrore.ino: In function 'void loop()':
Ricevitrore:18: error: expression cannot be used as a function
expression cannot be used as a function

Questo report potrebbe essere più ricco
di informazioni con
"Mostra un output dettagliato durante la compilazione"
abilitato in "File > Impostazioni"