Salve salve galera, estou aqui mais uma vez. Estou com um problema entre a comunicação entre um modulo tx e um rx, pois a IDE não indica nenhum erro, mas o TX perde o valor e não envia ao RX. Segue abaixo o código.
Transmissor
//Programa : Comunicacao com Modulo RF 433 - Emissor
//Autor : Arduino e Cia
#include <VirtualWire.h>
int joystick =0;
int joystick1 =0;
int eixoY = A1;
//Define pinos Led e Botao
int eixoX = A0;
String str=0;
String str1=0;
int valorInicial =0;
int valorInicial1 = 0;
char Valor_CharMsg[4];
char Valor_CharMsg1[4];
String pre="0";
int ledPin = 13;
String conc="";
//Armazena estado led = ligar/desligar
char recebe[7];
int cont;
int cont1;
void setup()
{
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
//Pino ligado ao pino DATA do transmissor RF
vw_set_tx_pin(4);
//Velocidade de comunicacao (bits por segundo)
vw_setup(5000);
Serial.println("Trasmissao modulo RF - Acione o botao...");
}
void loop(){
delay(25);//espera 190mS
joystick = (analogRead(eixoY)-505)*2;
valorInicial = joystick/4;
if (valorInicial >255)
valorInicial = 255;
if (valorInicial <0)
valorInicial = 0;
joystick1 = analogRead(eixoX);
valorInicial1 = joystick1;
if (valorInicial1<0)
valorInicial1=0;
else if (valorInicial1>1000)
valorInicial1 = 999;
itoa(valorInicial1,Valor_CharMsg1,10);
itoa(valorInicial,Valor_CharMsg,10);
str = (String) Valor_CharMsg;
str1 = (String) Valor_CharMsg1;
cont = strlen(Valor_CharMsg);
cont1 = strlen(Valor_CharMsg1);
if(cont<2)
{str = pre+pre+str;}
else if (cont<3)
{str = pre+str;}
else
{str = str;}
if(cont1<2)
{str1 = pre+pre+pre+str1;}
else if (cont1<3)
{str1 = pre+pre+str1;}
else if (cont1<4)
{str1 = pre+str1;}
else
{ str1 = str1;}
conc = str+str1;
for(int i = 0;i < 8;i++)
{ recebe[i] = conc[i];}
Serial.println(recebe);
vw_send((uint8_t *)recebe, strlen(recebe));
delay(1000);
digitalWrite(ledPin,HIGH);
delay(500);
digitalWrite(ledPin,LOW);
vw_wait_tx();
// Serial.print("Valor enviado: ");
// Serial.println(Valor_CharMsg);
}
Receptor
//Programa : Comunicacao com Modulo RF 433 - Receptor
//Autor : Arduino e Cia
#include <VirtualWire.h>
//Define pino led
int ledPin = 6;
int valor_recebido_RF;
char recebido_RF_char[9];
void setup()
{
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
//Pino ligado ao pino DATA do receptor RF
vw_set_rx_pin(7);
//Velocidade de comunicacao (bits por segundo)
vw_setup(5000);
//Inicia a recepcao
vw_rx_start();
Serial.println("Recepcao modulo RF - Aguardando...");
}
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen))
{
int i;
for (i = 0; i < buflen; i++)
{
//Armazena os caracteres recebidos
recebido_RF_char[i] = char(buf[i]);
}
recebido_RF_char[buflen] = '\0';
//Converte o valor recebido para integer
valor_recebido_RF = atoi(recebido_RF_char);
//Mostra no serial monitor o valor recebido
Serial.print("Recebido: ");
Serial.print(valor_recebido_RF);
//Altera o estado do led conforme o numero recebido
analogWrite(ledPin,valor_recebido_RF);
}
}
Abraço a todos.
Exactamente onde está o erro? É recebida alguma coisa do lado do Rx? As conversões são mal feitas? O Tx chega a enviar alguma coisa? Tem que se explicar melhor.
O TX não chega a enviar...
O que aparece no “serialprint” que é feito exactamente antes de enviar a mensagem? Aparece alguma coisa? Também não gosto nada dessas coisas que faz com a classe String.
Aparece sim, Serial.println(recebe); mostra exatamente o que eu esperava, algo como "2551023", só na hora de enviar que parece que perde. A intenção é passar valor de pwm e leitura de porta analogica através do RF.
Esse 1023 indica que algo está mal…
O teu array só tem 4 posições… E tu precisas de 5.
Porque não estudas a sprintf para fazer zero padding e não andares ali às voltas com a variável pre e o itoa?
Porque tens o delay entre a função de envio e a função vw_wait_tx ? Será que a função fica parada porque o que devia acontecer já passou durante o delay?
Como sabes que não envia? O código do receptor já foi comprovado?
Tentei array com 5 posições mas não mudou nada, o receptor estava funcionando quando o transmissor estava com outro código em que enviava somente um valor entre 0 e 255, mas depois precisei enviar mais de um valor para o receptor, então decidi converter para string e concatenar tudo e enviar de uma vez só e fazer o tratamento no receptor, mas o receptor não recebe nada. Vou seguir o conselho e estudar o sprintf.
Pode postar o código que funciona?
luisilva:
Pode postar o código que funciona?
Segue abaixo, não foi possível postar antes.
#include <VirtualWire.h>
int joystick =0;
int eixoY = A1;
//Define pinos Led e Botao
int valorInicial =0;
char Valor_CharMsg[4];
//Armazena estado led = ligar/desligar
void setup()
{
Serial.begin(9600);
//Pino ligado ao pino DATA do transmissor RF
vw_set_tx_pin(4);
//Velocidade de comunicacao (bits por segundo)
vw_setup(5000);
Serial.println("Trasmissao modulo RF - Acione o botao...");
}
void loop(){
delay(50);//espera 190mS
joystick = (analogRead(eixoY)-505)*2;
valorInicial = joystick/5;
if (valorInicial >255)
valorInicial = 255;
itoa(valorInicial,Valor_CharMsg,10);
vw_send((uint8_t *)Valor_CharMsg, strlen(Valor_CharMsg));
delay(25);
vw_wait_tx();
Serial.print("Valor enviado: ");
Serial.println(Valor_CharMsg);
}
Algures lá em cima eu referi um delay de segundo e meio logo após chamares a mensagem... Isso é uma das diferenças.
A outra é a brincadeira da variável pre para fazer zero padding... Já agora porque precisas de enviar os dados em char?
Esse delay foi só para dar tempo de (eu) ler o que estava sendo printado no serial, essa brincadeira da variável pre vou contornar dando uma estudada na função sprintf.... um exemplo que achei na net e funcionava estava dessa maneira com char, e então seguir dessa forma.
O teu monitor de porta série apaga o que foi enviado? :?
A mim parece -me que esse segundo e meio é apenas para piscar um led... Porque não piscas o led depois da função wait transmit?
O comentário dos zeros é apenas porque fico com a sensação que lá pelo meio deixa de existir um string de fim de array e o software fica louco... Já experimentaste imprimir o tamanho da string só para confirmar isso?
bubulindo, abandonei esse código de Emissor, agora estou usando sprintf, só que começou novo erro quando uso a biblioteca virtualwire.h junto com a biblioteca servo.h
Servo\Servo.cpp.o: In function `__vector_11':
E:\arduino\arduino-1.0.3\libraries\Servo/Servo.cpp:103: multiple definition of `__vector_11'
VirtualWire\VirtualWire.cpp.o:E:\arduino\arduino-1.0.3\libraries\VirtualWire/VirtualWire.cpp:639: first defined here
será que é possível alterar uma das 2 bibliotecas?
achei que tinha resolvido o problema. Mas continua essa multipla definição do “__vector_11”
Como fazer para colocar todas as saídas em LOW se o receptor parar de receber o sinal?
Muito provavelmente ambas as bibliotecas usam o mesmo timer e como tal não são compatíveis uma com a outra.
É possível usares outro timer para uma dessas funções, mas não será algo simples de reescrever.