Привет! Есть такой код:
- Код: Выделить всё
boolean laight = 0;
int incomingByte = 0;
int action = 0;
void setup() {
Serial.begin(9600);
pinMode(4, OUTPUT); //light
pinMode(7, OUTPUT); // 11
pinMode(8, OUTPUT); // 12
pinMode(11, OUTPUT); // 21
pinMode(12, OUTPUT); // 22
}
void loop() {
if (Serial.available() >0 ) { //если есть доступные данные// считываем байт
incomingByte = Serial.read();
if(incomingByte == 97) // a
action = 7;
if(incomingByte == 65) // A
action = 7;
if(incomingByte == 100) // D
action = 8;
if(incomingByte == 115) // S
action = 11;
if(incomingByte == 119) // W
action = 12;
if(incomingByte == 108) // L
laight=!laight;
digitalWrite(4, laight);
digitalWrite(action, HIGH);
delay(100);
digitalWrite(action, LOW);
action = 0;
}
}
Суть, понятна, думаю. Отправляем значение, Ардуино парсит его, в случае с четвёртым пином меняет его состояние на противоположное, в других случаях на 100 милисек выставляет высокий уровень на пине, соответствующем значению action, которое в свою очередь назначено распарсенному символу. Всё, вроде бы ок, и должно работать. Работает, если отправляю значения в порт через ардуино ide. Но, если отправлять значение из роутера, то происходит какая-то задержка, всегда равная установленному delay. А именно,когда пин HIGH, потом задержка, потом пин LOW, а потом, если сразу же послать команду (или слать непрерывно) пин не сразу переходит в HIGH, а через указанное delay. Такое только когда с роутера данные отправляю. Пробовал разные задержки ставить, до пяти сек, delay почемуто повторяется ещё раз. Это первая проблема.
Второе, если долго держать кнопку (а скетч не так быстро выполняется, как передаются данные), то происходит накопление комманд в ардуино, и после снятия воздействия (отпускания кнопки) эти комманды ещё долгое время выполняются, так долго, как долго держал кнопку. Это не приемлемо, так как эти кнопки - кнопки управления движением машинки, и получается, чтобы ей управлять, нужно либо постоянно тыкать на кнопку, как бы пошагово выполняя движение, (нажал кратковременно, отпустил, она поехала, остановилась, как остановилась, снова нажал, и т.д.) либо если держать, то это накопится в буфере ардуино, и потом эту машинку долго не остановишь. Вопрос, как решить эту проблему? Как-то можно каждый цикл очищать буфер комманд, ну или каждый n- цикл.
P.S. Я всё о том проекте:
http://habrahabr.ru/post/153017/ , все скрипты и код отсюда.