Hi all,
I am currently having a problem receiving an array from my Transmitter using 433MHz. From the led on pin 13 I can see that the Arduino is transmitting but the other one is not receiving this data. Individually the program code and the RF code work, however when they are combined this problem occurs.
Transmitter:
void rfunction()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
// Non-blocking
if (vw_get_message(buf, &buflen))
{
int i;
digitalWrite(13, true);
for (i = 0; i < buflen; i++)
{
Sensor1CharMsg[i] = char(buf[i]);
}
Sensor1CharMsg[buflen] = '\0';
Sensor1Data = atoi(Sensor1CharMsg);
Serial.print("Sensor 1: ");
Serial.println(Sensor1Data);
digitalWrite(13, false);
output_voltage = Sensor1Data * (5 / 1023);
wi = (6 * output_voltage);
}
}
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
MsTimer2::set(200, rfunction);
MsTimer2::start();
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start();
}
void loop() {
Serial.println(wi);
delay(2000);
}
Receiver:
void rfunction()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen))
{
int i;
digitalWrite(13, true);
for (i = 0; i < buflen; i++)
{
Sensor1CharMsg[i] = char(buf[i]);
}
Sensor1CharMsg[buflen] = '\0';
Sensor1Data = atoi(Sensor1CharMsg);
Serial.print("Sensor 1: ");
Serial.println(Sensor1Data);
digitalWrite(13, false);
output_voltage = Sensor1Data * (5 / 1023);
wi = (6 * output_voltage);
}
}
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
MsTimer2::set(200, rfunction);
MsTimer2::start();
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start();
}
battery_state();
lcd.setCursor(0,1);
lcd.print("Choose option: ");
lcd.setCursor(0,2);
lcd.print("1: AI 92");
lcd.setCursor(0,3);
lcd.print("2: Sensor Readings");
}
void loop() {
char key = keypad.getKey();
if(key == '1')
{
battery_state();
lcd.setCursor(0,1);
lcd.print("Range: ");
dist = range();
battery_state();
lcd.setCursor(0,1);
lcd.print("Angle: ");
deg = angle();
battery_state();
new_range = horizontal_range(dist, deg);
temp = (temperature - Base_Temperature_C) / 25;
hum = (humidity - Base_Humidity) / 20;
alt = (altitude - Base_Altitude_m) / 3048;
clicks_1 = range_clicks(new_range);
clicks_elevation = clicks_1 + temp + hum + alt;
clicks_wind = wind_speed(new_range, wi);
lcd.setCursor(0,0);
lcd.print("Elevation: ");
lcd.setCursor(0,1);
lcd.print(" UP ");
lcd.print(clicks_elevation);
lcd.print(" clicks");
lcd.setCursor(0,2);
lcd.print("Windage: ");
wind_dir(clicks_wind);
}
if(key == '2')
{
battery_state();
lcd.setCursor(0,0);
lcd.print("Temp = ");
lcd.print(temperature);
lcd.print(" *C");
lcd.setCursor(0,1);
lcd.print("Pressure = ");
lcd.print(pressure);
lcd.print("hPa");
lcd.setCursor(0,2);
lcd.print("Altitude = ");
lcd.print(altitude);
lcd.print(" m");
lcd.setCursor(0,3);
lcd.print("Humidity = ");
lcd.print(humidity);
lcd.print(" %");
delay(2000);
}
}
void battery_state()
{
lcd.clear();
int val = analogRead(A0);
float batt = (val / 1023.00) * 9.00;
if(batt >= 8.00)
{
lcd.setCursor(19,0);
lcd.write((uint8_t)0);
}
else if((batt < 8.00) && (batt >= 6.50))
{
lcd.setCursor(19,0);
lcd.write((uint8_t)1);
}
else
{
lcd.setCursor(19,0);
lcd.write((uint8_t)2);
}
}
int range()
{
int i, r;
lcd.setCursor(0,2);
for(i=0;i<3;i++)
{
keyNew[i] = keypad.waitForKey();
lcd.print(keyNew[i]);
count ++;
}
while(count == 3)
{
char key = keypad.getKey();
if(key == '#')
{
count ++;
}
while(count == 4)
{
r = atoi(keyNew);
count = 0;
}
}
return r;
}
int angle()
{
int i, a;
lcd.setCursor(0,2);
for(i=0;i<2;i++)
{
keyNew1[i] = keypad.waitForKey(); // Stores number pressed in an array
lcd.print(keyNew1[i]); // Prints number pressed to the LCD
count ++; // Increments the count variable by 1
}
while(count == 2)
{
char key = keypad.getKey();
if(key == '#')
{
count ++;
}
while(count == 3)
{
a = atoi(keyNew1);
count = 0;
}
}
return a;
}
int horizontal_range(int num_range, int num_angle)
{
int val;
if(num_angle <= 5)
{
val = num_range * 0.99;
}
else if((num_angle > 5) && (num_angle <= 10))
{
val = num_range * 0.98;
}
else if((num_angle > 10) && (num_angle <= 15))
{
val = num_range * 0.96;
}
else if((num_angle > 15) && (num_angle <= 20))
{
val = num_range * 0.94;
}
else if((num_angle > 20) && (num_angle <= 25))
{
val = num_range * 0.91;
}
else if((num_angle > 25) && (num_angle <= 30))
{
val = num_range * 0.87;
}
else if((num_angle > 30) && (num_angle <= 35))
{
val = num_range * 0.82;
}
else if((num_angle > 35) && (num_angle <= 40))
{
val = num_range * 0.77;
}
else if((num_angle > 40) && (num_angle <= 45))
{
val = num_range * 0.70;
}
else if((num_angle > 45) && (num_angle <= 50))
{
val = num_range * 0.64;
}
else if((num_angle > 50) && (num_angle <= 55))
{
val = num_range * 0.57;
}
else if((num_angle > 55) && (num_angle <= 60))
{
val = num_range * 0.50;
}
else if((num_angle > 60) && (num_angle <= 65))
{
val = num_range * 0.42;
}
else if((num_angle > 65) && (num_angle <= 70))
{
val = num_range * 0.34;
}
else if((num_angle > 70) && (num_angle <= 75))
{
val = num_range * 0.26;
}
else if((num_angle > 75) && (num_angle <= 80))
{
val = num_range * 0.17;
}
else if((num_angle > 80) && (num_angle <= 85))
{
val = num_range * 0.09;
}
else
{
val = num_range * 0.01;
}
return val;
}
RX continued:
int range_clicks(int num)
{
int clicks;
if(num <= 100)
{
clicks = 0;
}
else if((num > 100) && (num <= 140))
{
clicks = 1;
}
else if((num > 140) && (num <= 180))
{
clicks = 3;
}
else if((num > 180) && (num <= 220))
{
clicks = 6;
}
else if((num > 220) && (num <= 260))
{
clicks = 9;
}
else if((num > 260) && (num <= 300))
{
clicks = 12;
}
else if((num > 300) && (num <= 340))
{
clicks = 15;
}
else if((num > 340) && (num <= 380))
{
clicks = 19;
}
else if((num > 380) && (num <= 420))
{
clicks = 23;
}
else if((num > 420) && (num <= 460))
{
clicks = 27;
}
else if((num > 460) && (num <= 500))
{
clicks = 31;
}
else if((num > 500) && (num <= 540))
{
clicks = 35;
}
else if((num > 540) && (num <= 580))
{
clicks = 40;
}
else if((num > 580) && (num <= 620))
{
clicks = 45;
}
else if((num > 620) && (num <= 660))
{
clicks = 50;
}
else if((num > 660) && (num <= 700))
{
clicks = 56;
}
else if((num > 700) && (num <= 740))
{
clicks = 62;
}
else if((num > 740) && (num <= 780))
{
clicks = 68;
}
else if((num > 780) && (num <= 820))
{
clicks = 74;
}
else if((num > 820) && (num <= 860))
{
clicks = 81;
}
else if((num > 860) && (num <= 900))
{
clicks = 88;
}
else if((num > 900) && (num <= 940))
{
clicks = 97;
}
else
{
clicks = 105;
}
return clicks;
}
void wind_dir(int w_clicks)
{
int i;
int w;
lcd.setCursor(0,2);
for(i=0;i<2;i++)
{
keyNew2[i] = keypad.waitForKey();
lcd.print(keyNew2[i]);
count ++;
}
while(count == 2)
{
char key = keypad.getKey();
if(key == '#')
{
count ++;
}
while(count == 3)
{
w = atoi(keyNew2);
count = 0;
}
}
if((w > 0) && (w <= 6))
{
lcd.setCursor(0,3);
lcd.print("RIGHT ");
lcd.print(w_clicks);
lcd.print(" clicks");
}
else if((w > 6) && (w <= 12))
{
lcd.setCursor(0,3);
lcd.print("LEFT");
lcd.print(w_clicks);
lcd.print(" clicks");
}
else
{
lcd.setCursor(0,3);
lcd.print("ERROR re-enter value");
}
}
int wind_speed(int wind_range, int w_val)
{
int clicks;
int w;
output_voltage = w_val * (5.0 / 1023);
level = (6 * output_voltage); //The level of wind speed is proportional to the output voltage.
if(wind_range < 150)
{
w = 1;
}
else if((wind_range >= 150) && (wind_range < 250))
{
w = 2;
}
else if((wind_range >= 250) && (wind_range < 350))
{
w = 3;
}
else if((wind_range >= 350) && (wind_range < 450))
{
w = 4;
}
else if((wind_range >= 450) && (wind_range < 550))
{
w = 5;
}
else if((wind_range >= 550) && (wind_range < 650))
{
w = 7;
}
else if((wind_range >= 650) && (wind_range < 750))
{
w = 8;
}
else if((wind_range >= 750) && (wind_range < 850))
{
w = 10;
}
else if((wind_range >= 850) && (wind_range < 950))
{
w = 12;
}
else
{
w = 13;
}
if(level <= 2.22)
{
clicks = w;
}
else if((level > 2.22)&&(level < 4.44))
{
clicks = w * 2;
}
else
{
clicks = w * 4;
}
return clicks;
}
Under "transmitter" you have posted receiver code.
Make sure that a simple example of message transmission is working, with the same sort of message that will be sent in the full length application, before adding all the extra code.
That way, forum members can help you find problems without having to wade through hundreds of lines of irrelevant code.