Arduino 射频数据传输



我有3个超声波传感器连接到1个Arduino Uno设备。我想将他们的数据发送到另一个带有射频发射器的Arduino Uno。我想发送传感器的 ID 号(1,2,3(和数据(0 或 1(。

我想从 printDistance 方法传输数据,但发射器发送的消息是字符 *msg。我只需要发送字符值吗?

#include <VirtualWire.h>  
#undef int
#undef abs
#undef double
#undef float
#undef round
//Sonar 1
int echoPin1 =2;
int initPin1 =3;
int distance1 =0;
//Sonar 2
int echoPin2 =6;
int initPin2 =7;
int distance2 =0;
//Sonar 3
//int echoPin3 =8;
//int initPin3 =9;
//int distance3 =0;

void setup() {
        // Initialise the IO and ISR
    vw_set_ptt_inverted(true); // Required for RF Link module
    vw_setup(2000);                 
    vw_set_tx_pin(8);                

  pinMode(initPin1, OUTPUT);
  pinMode(echoPin1, INPUT);
  pinMode(initPin2, OUTPUT);
  pinMode(echoPin2, INPUT);
 // pinMode(initPin3, OUTPUT);
 // pinMode(echoPin3, INPUT);
//  pinMode(initPin4, OUTPUT);
 // pinMode(echoPin4, INPUT);
  delay(2000);
  Serial.begin(9600);
  Serial.println(" ");
}
void loop() {
     const char *msg;    // this is your message to send
   vw_send((uint8_t *)msg, strlen(msg));
   vw_wait_tx();                                          // Wait for message to finish
   delay(200);

  distance1 = getDistance(initPin1, echoPin1);
  printDistance(1, distance2);
  delay(10);
  distance2 = getDistance(initPin2, echoPin2);
  printDistance(2, distance2);
  delay(10);
  //distance3 = getDistance(initPin3, echoPin3);
  //printDistance(3, distance3);
  //delay(10);
 // distance4 = getDistance(initPin4, echoPin4);s
 // printDistance(4, distance4);
  Serial.println(" ");  
  delay(5000);
//  Serial.println(" ");
}
int getDistance (int initPin, int echoPin){
 digitalWrite(initPin, HIGH);
 delayMicroseconds(10); 
 digitalWrite(initPin, LOW); 
 delayMicroseconds(5);
 unsigned long pulseTime = pulseIn(echoPin, HIGH); 
 int distance = pulseTime/58;
 return distance;
}
 void printDistance(int id, int dist){
     Serial.print('<');  
     Serial.print( id );
       Serial.print( '>' );
    if (dist >= 30 || dist <= 0 ){
      Serial.print("0");
    }else {
    Serial.print("1");
    }
     Serial.print('<');
     Serial.print( '/' );
     Serial.print( id );
       Serial.print( '>' );
  //   Serial.println(" ");

 }

>uint8_t vw_send(uint8_t* buf, uint8_t len)发送一个字节数组,最大长度为 77。在 C 中,字节的类型称为 char 。在 AVR 中,这也有一个别名uint8_t

因此,您

发送一个字节数组,由您决定如何解释数组中的字符。例如,可以使用sprintf()将数字写入为 ASCII 编码的字符串。然后在接收端,您必须使用 atoi() 将数字从字符串中取回。

您也可以选择简单地用实际数字值填充数组。使用此选项,您必须将整数分解为单独的字节,并在接收端将它们重新组合在一起。在您的特定情况下,数据已经适合字节,因此您不必这样做。

请注意,vw_send((uint8_t *)msg, strlen(msg));无法在第二种方法中正常工作。 strlen()将计数到容纳 0 的第一个字节,从而有效地截断数组。只有在使用 sprintf() 方法时,才会使用此调用。

看起来您同时发送所有三个传感器的数据,并且每个传感器的数据为 0 或 1。为什么不发送 0 和 1 的 3 字节消息?

uint8_t msg[3];
msg[0] = 0;
msg[1] = 1;
msg[2] = 0; // fill these in as you like
vw_send(msg, 3);

我无法在注释中添加代码。

我更改了代码,如下所示;

void printDistance(int id, int dist){
     uint8_t msg[1];
if (dist >= 30 || dist <= 0 ){
   msg[0] = 0;
    vw_send(msg, 1);
     //vw_wait_tx(); 
}else {
  msg[0] = 1;
    vw_send(msg, 1);
     //vw_wait_tx(); 
}

相关内容

  • 没有找到相关文章

最新更新