我有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();
}