That works purely by accident. In the receive code, the variable i is never defined to have any particular value, so the compiler must be initializing it to zero.
Also, in the receive code, it is required to reset the maximum allowed receive buffer length, every time through the loop.
int i;
...
if(vw_get_message(buf, &buflen)) // Non-blocking
{
Trigger = buf[i];
Try these somewhat simplified examples (not tested) and let me know if it works.
TX:
#include <VirtualWire.h>
char msg = 'B'; //no array necessary for a single character
void setup()
{
// Initialise the IO and ISR
vw_set_tx_pin(0);
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(2000); // Bits per sec
}
void loop()
{
vw_send((uint8_t *)msg, 1);
vw_wait_tx(); // Wait until the whole message is gone
delay(200);
}
RX:
#include <VirtualWire.h>
int Trigger = 0; //Variable for the Received Trigger
uint8_t buf; //one character buffer
uint8_t buflen = 1; //buffer length
void setup()
{
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
// Initialise the IO and ISR
vw_set_rx_pin(8);
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(2000); // Bits per sec
vw_rx_start(); // Start the receiver PLL running
}
void loop()
{
buflen=1; //*** it is required to reset max value of buflen, every iteration of loop ***
if(vw_get_message(buf, &buflen)) // Non-blocking
{
Trigger = buf;
Serial.println(Trigger);
}
if(Trigger == 66) //ASCII for B, 066
{
digitalWrite(LED_BUILTIN, HIGH);
}
else
{
digitalWrite(LED_BUILTIN, LOW);
}
}