Go Down

Topic: moduli rf 433  (Read 3804 times) previous topic - next topic

nid69ita

Verifica bene cosa spedisci
my name is IGOR, not AIGOR

Gianluca9779

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

nid69ita

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()
Code: [Select]
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
my name is IGOR, not AIGOR

nid69ita

#18
Jul 10, 2015, 11:20 am Last Edit: Jul 10, 2015, 11:22 am by nid69ita
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.
my name is IGOR, not AIGOR

Gianluca9779

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

nid69ita

#20
Jul 10, 2015, 12:01 pm Last Edit: Jul 10, 2015, 01:34 pm by nid69ita
No, devi spedire buf, non più msg

Code: [Select]
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.

Code: [Select]
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.
my name is IGOR, not AIGOR

Gianluca9779

Appena lo provo ti saprò dire sempre grazie ancora

Gianluca9779

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"

nid69ita

Posta il codice completo che da errore.
my name is IGOR, not AIGOR

nid69ita

Usa il tag code per il codice, c'e' rischio di perdere dei pezzi.

Nella riga che ho scritto c'e' un errore, manca il + dopo il 10:

Code: [Select]
Lettura = (buf[0]-'0')*100 + (buf[1]-'0')*10 + (buf[2]-'0');
my name is IGOR, not AIGOR

Gianluca9779

Scusa mi sono scordato del Tag code..
ora controllo ;)

nid69ita

#26
Jul 15, 2015, 07:07 pm Last Edit: Jul 15, 2015, 09:33 pm by nid69ita
Trasmissione:
Code: [Select]
#include <VirtualWire.h>

const byte pinLettura=A0;
const byte pinLed=13;
char buf[4];
int valLettura, valMappato;

void setup() {
  delay(1000);
  Serial.begin(9600);
  Serial.println("Avvia programma tx");
  pinMode(pinLettura,INPUT);
  vw_set_tx_pin(2);
  vw_setup(2000);
}

void loop() {  
  valLettura = analogRead(pinLettura);
  Serial.print("Valore letto = ");
  Serial.println(valLettura);
  valMappato= map(valLettura,0,1023,0,255);
  snprintf(buf,4,"%03d",valMappato);          
  digitalWrite(pinLed, HIGH);
  vw_wait_tx();
  digitalWrite(pinLed, LOW);
  delay(200);
}

Ricezione:
Code: [Select]
#include <VirtualWire.h>

unsigned int Lettura;
const byte pinLed = 3;  

void setup() {
  delay(1000);
  Serial.begin(9600);
  Serial.println("Avvio programma rx");
  pinMode(pinLed, 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 = (buf[0]-'0')*100 + (buf[1]-'0')*10 + (buf[2]-'0');
    Serial.print("Lettura = ");
    Serial.println(Lettura);
    analogWrite(pinLed, Lettura);
  }
}


Non li ho provati, solo compilati.
my name is IGOR, not AIGOR

nid69ita

Hai già provato a cambiare pin ? 
Pare proprio che la VirtualWire ha dei problemi con il pwm (sembra tutte e due si basino su stesso timer)
my name is IGOR, not AIGOR

Gianluca9779

Tu che consigli di fare come ultima possibile soluzione

nid69ita

MI spiace, ma non ho idea. Sorry  :)
my name is IGOR, not AIGOR

Go Up