2015-04-28 3 views
-1

У меня странная проблема: o Я делаю связь между двумя xbee, когда я нажимаю кнопку, светодиод, подключенный к контакту 13, загорается, а затем координатор xbee отправляет информацию для переключения на светодиод, подключенный к выходу D3 маршрутизатора xbee. проблема заключается в том, что я нажимаю на кнопку несколько раз, когда переключатель включения иногда не работает. я не знаю, проблема в коде или это просто проблема подключениясветодиод не включается

int led = 13; 
 
const int bouton = 2; 
 
boolean state; 
 
boolean laststate; 
 
void setup() { 
 
    // put your setup code here, to run once: 
 
pinMode(led, OUTPUT); 
 
Serial.begin(9600); 
 
pinMode(bouton, INPUT); 
 
    digitalWrite(led, LOW); 
 

 

 
} 
 
void loop() { 
 
    // put your main code here, to run repeatedly: 
 
state = digitalRead(bouton); 
 
    digitalWrite(led, state); 
 
    if (state == HIGH) { 
 
    Serial.println("on"); 
 
    setRemoteState(5); 
 
    delay(5000); 
 
    } else { 
 
    Serial.println("off"); 
 
    setRemoteState(4); 
 
    delay(5000); 
 

 
    } 
 
} 
 

 
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.println(sum,HEX); 
 
} 
 
    
 

ответ

0

Похоже, проблема заключается в задержке (5000) микро-контроллер будет ждать 5 секунд между выборкой состояния кнопки. если вы удалите оператор задержки, он должен быть включен и выключен мгновенно.

вы должны попытаться вызвать setRemoteState только при изменении состояния, поэтому он не будет отправлять его постоянно. что-то вроде

loop() { 
state = digitalRead(bouton); 
    digitalWrite(led, state); 
if(state != lastState) 
{ 
    if (state == HIGH) { 
    Serial.println("on"); 
    setRemoteState(5); 
    } else { 
    Serial.println("off"); 
    setRemoteState(4); 

    } 
} 
    lastState = state 
} 
+0

вы должны попытаться вызвать setRemoteState только на изменение состояния, поэтому он не будет посылать его постоянно. – assaf

+0

haw я могу это сделать! я не очень хорошо тебя понял – sawi

+0

это все еще всегда проблема синхронизации между светодиодами – sawi

-1

я думаю о сценарии, как этот!

String inputString; 
 
int led = 13; 
 
boolean state; 
 
boolean laststate; 
 
void setup() { 
 
    // put your setup code here, to run once: 
 
pinMode(led, OUTPUT); 
 
Serial.begin(9600); 
 
Serial1.begin(9600); 
 

 
} 
 
void loop() { 
 
while (Serial.available()) { 
 
    // get the new byte: 
 
    delay(3); 
 
    char inChar = Serial.read(); 
 
    // add it to the inputString: 
 
    inputString += inChar; 
 
    } 
 
    if (inputString.length() >0) { 
 
    Serial.println(inputString); 
 
if (inputString == "on"){ 
 
digitalWrite(led,HIGH); 
 
    setRemoteState(5); 
 

 
} 
 

 
if (inputString == "off"){ 
 
digitalWrite(led,LOW); 
 
setRemoteState(4); 
 

 
} 
 
inputString=""; 
 
} 
 
} 
 

 
void setRemoteState(char value){ 
 
    Serial1.write(0x7E); // start byte 
 
    Serial1.write((byte)0x0); 
 
    Serial1.write(0x10); 
 
    Serial1.write(0x17); 
 
    Serial1.write((byte)0x0); 
 
    // id of recipient or use 0xFFFF for broadcast 
 
    Serial1.write((byte)00); 
 
    Serial1.write((byte)00); 
 
    Serial1.write((byte)00); 
 
    Serial1.write((byte)00); 
 
    Serial1.write((byte)00); 
 
    Serial1.write((byte)00); 
 
    Serial1.write(0xFF); 
 
    Serial1.write(0xFF); 
 
    // 16 bit of reciepent 
 
    Serial1.write(0xFF); 
 
    Serial1.write(0xFE); 
 
    
 
    Serial1.write(0x02); 
 
    
 
    Serial1.write('D'); 
 
    Serial1.write('2'); 
 
    
 
    Serial1.write(value); 
 
    
 
    long sum = 0x17 + 0xFF + 0xFF + 0xFF + 0xFE + 0x02 + 'D' + '2' + value; 
 
    Serial1.write(0xFF - (sum & 0xFF)); 
 
    Serial1.print(sum,HEX); 
 
} 
 
    
 

+0

выглядит нормально, В общем, вам следует избегать использования задержек в таких приложениях, он может блокировать аппаратный опрос и вызывать «перерасход» (зависит от того, как Arduino реализовал там Serial-класс). кроме того, вы должны сбросить inputString только при поступлении действительной команды, или - вы должны прочитать серийный номер, пока не появится escape-символ. в противном случае он будет сброшен на каждом символе. – assaf

Смежные вопросы