modulo tx rx 433mhz vw_send((uint8_t *)recebe, strlen(recebe)) não envia o valor

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.