moduli rf 433

Salve a tutti
vi pregherei di aiutarmi nel riuscire a modulare ciò che ricevo rimappato per 0,255 in modo da aumentare l’intensità del led…
ma ciò non funziona poichè si accende solo a 255 come mai dove sbaglio ecco i codici

RX
#include <VirtualWire.h>
int Lettura;
unsigned long Tmemoria;
int led = 10;
int Letturadef;

int fadeAmount = 5;
void setup() {
Serial.begin(9600) ;
pinMode(led, OUTPUT);

vw_set_rx_pin(2);

vw_setup(2000);
vw_rx_start();
}

void loop() {
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen))
{
Lettura = (int(buf[1]<<8)+buf[0]);
}

Letturadef = map(Lettura,0,1023,0,255);
analogWrite(led, Letturadef);

Serial.print("Lettura= ");
Serial.println(Letturadef);

}

TX

#include <VirtualWire.h>

void setup() {
vw_set_tx_pin(2);
vw_setup(2000);
}

void loop() {

int Lettura =map (analogRead(A0),510,1023,0,1023);
/* si possono inviare soltanto valori compresi tra
0 e 255 per tanto bisogna dividere la variabile in 2 parti
trasformare quindi in byte----> trasmettere---->
riconvertire…
char msg[2] è una variabile di tipo vettore

*/
byte Lettura1 = Lettura&0xFF;
byte Lettura2=(Lettura&0xFF00)>>8;
char msg[2] = {Lettura1,Lettura2};
digitalWrite(13, HIGH);
vw_send((uint8_t *)msg, 2 );
vw_wait_tx();
digitalWrite(13, LOW);

}

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare. Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

Ora riesco a mandare i valori usando questo codice però non riesco a modulare l’intensità del led qualcuno a qualche idea ??

//tx

#include <VirtualWire.h> 
int Letturadef;
int Lettura; 
void setup() { 
 Serial.begin(9600); 
vw_set_tx_pin(2); 
vw_setup(2000); 
} 

void loop() { 

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

byte Lettura1 = Letturadef&0xFF; 
byte Lettura2=(Letturadef&0xFF00)>>8; 
char msg[2] = {Lettura1,Lettura2}; 
digitalWrite(13, HIGH); 
vw_send((uint8_t *)msg, 2 ); 
vw_wait_tx(); 
digitalWrite(13, LOW); 
delay (200);
Serial.print("Lettura= "); 
Serial.println(Letturadef); 
}

per ricevere

#include <VirtualWire.h> 
int Lettura; 
unsigned long Tmemoria; 
int led =  10;   
void setup() { 
Serial.begin(9600) ; 
pinMode(led, OUTPUT);
vw_set_rx_pin(2); 
vw_setup(2000); 
vw_rx_start(); 
} 
void loop() { 
uint8_t buf[VW_MAX_MESSAGE_LEN]; 
uint8_t buflen = VW_MAX_MESSAGE_LEN; 
if (vw_get_message(buf, &buflen)) 
{ 
Lettura = (int(buf[1]<<8)+buf[0]);
}
analogWrite(led, Lettura);
Serial.print("Lettura= "); 
Serial.println(Lettura); 
delay(200);
}

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()
https://www.arduino.cc/en/Reference/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 :)

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à?