2015-04-22 143 views
0

我要xbee S2,一个作为连接到arduino的协调器API,另一个作为路由器AT, 我的项目是关于发送命令到路由器点亮一个led。协调员发送数据,如果我点击一个按钮。 问题是路由器不立即反应需要一段时间才能收到数据。 谁能帮助我,请
此使用xbee之间没有同步

int led = 13; 
 
const int bouton = 2; 
 
void setup() { 
 
    // put your setup code here, to run once: 
 
pinMode(led, OUTPUT); 
 
Serial.begin(9600); 
 
pinMode(bouton, INPUT); 
 
} 
 
void loop() { 
 
    // put your main code here, to run repeatedly: 
 
    if(digitalRead(bouton)==HIGH) 
 
    { 
 
    digitalWrite(led,HIGH); 
 
    setRemoteState(0x5); 
 
    delay(500); 
 
    } 
 
    if(digitalRead(bouton)==LOW) 
 
    { 
 
     digitalWrite(led,LOW); 
 
     setRemoteState(0x4); 
 
     delay(500); 
 
    
 
    } 
 
} 
 
void setRemoteState(char value){ 
 
    Serial.write(0x7E); // start byte 
 
    Serial.write((byte)0x0); 
 
    Serial.write(0x10); 
 
    Serial.write(0x17); 
 
    Serial.write((byte)0x0); 
 
    // id of recipient or use 0xFFFF for broadcast 
 
    Serial.write((byte)00); 
 
    Serial.write((byte)00); 
 
    Serial.write((byte)00); 
 
    Serial.write((byte)00); 
 
    Serial.write((byte)00); 
 
    Serial.write((byte)00); 
 
    Serial.write(0xFF); 
 
    Serial.write(0xFF); 
 
    // 16 bit of reciepent 
 
    Serial.write(0xFF); 
 
    Serial.write(0xFE); 
 
    
 
    Serial.write(0x02); 
 
    
 
    Serial.write('D'); 
 
    Serial.write('2'); 
 
    
 
    Serial.write(value); 
 
    
 
    long sum = 0x17 + 0xFF + 0xFF + 0xFF + 0xFE + 0x02 + 'D' + '2' + value; 
 
    Serial.write(0xFF - (sum & 0xFF)); 
 
    Serial.print(sum,HEX); 
 
} 
 
    
 

回答

0

现在,你表现上的按钮状态每1/2秒,无论代码我'的,如果它改变从上次开始。你正在做很多不必要的工作,包括每秒发送两帧。

您应该解决您的循环只发送一个帧时的状态变化:

state = digitalRead(bouton); 
if (state != laststate) { 
    laststate = state; 
    digitalWrite(led, state); 
    if (state == HIGH) { 
    setRemoteState(5); 
    } else { 
    setRemoteState(4); 
    } 
}  

随着这一变化,您不再需要在您的loop()功能的延迟,所以这将是更加适应按下按钮。 LED应该立即改变并且信息将被发送。使用旧代码,可能需要700毫秒才能检测到按钮更改。

+0

非常感谢你!它现在很好,现在我很感激你 – sawi

0

我想用一个字符串替换按钮!当我在xbee上写入时,发送消息来切换led,当我写下xbee时,发送消息关闭led!在这个例子中我'去,因为我需要串行端口,一个用于读取的字和一个用于发送命令到路由器

void loop() { 
 
receivedata(); 
 
if (inputString.length() >0) { 
 
    Serial.println(inputString); 
 
if (inputString == "on"){ 
 
digitalWrite(led,HIGH); 
 
} 
 

 
if (inputString == "off"){ 
 
digitalWrite(led,LOW); 
 
} 
 
inputString=""; 
 
} 
 
    // put your main code here, to run repeatedly: 
 
state = digitalRead(led); 
 
if (state != laststate) { 
 
    laststate = state; 
 
    digitalWrite(led, state); 
 
    if (state == HIGH) { 
 
    setRemoteState(5); 
 
    } else { 
 
    setRemoteState(4); 
 
    } 
 
} 
 
} 
 
void receivedata(){ 
 
    while (Serial.available()) { 
 
    // get the new byte: 
 
    delay(3); 
 
    char inChar = Serial.read(); 
 
    // add it to the inputString: 
 
    inputString += inChar; 
 
     
 
}}

它仍然一点儿也不工作,将使用Arduino万:/