我有3个超声波传感器连接到1个Arduino Uno设备。我想将他们的数据发送到另一个带RF发射器的Arduino Uno。我想发送传感器的ID号(1,2,3)和数据(0或1)。
我想从printDistance方法传输数据,但是传输器发送的消息是char * msg。我只需要发送char值吗?
#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(" ");
}
答案 0 :(得分:0)
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);
答案 1 :(得分:0)
我无法添加代码进行评论。
我改变了代码;
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();
}