Помогите разобраться с кодом
- Войдите на сайт для отправки комментариев
Чт, 05/12/2013 - 15:37
Здравствуйте. Имеется код в котором при нажатии на кнопку на СОМ порт ПК передается значение "H" а при повторном нажатии - "L", интересует как можно сделать еще одно событие а именно: при нажатии на кнопку на порт передается значение "H", при нажатии еже раз - "Р", а при удержании клавиши одну секунду на СОМ порт должен передаваться значение "L". Выкладываю имеющийся код, подскажите пожалуйста. Если что то будет не ясно я объясню
int switchPin = 12;
int ledPin = 13;
boolean lastBut = LOW;
boolean curBut = LOW;
boolean ledOn = false;
int val=0;
void setup()
{
pinMode (switchPin, INPUT);
pinMode (ledPin, OUTPUT);
Serial.begin(9600);
}
boolean debounce(boolean last)
{
boolean cur=digitalRead(switchPin);
if (last!=cur)
{
delay(5);
cur = digitalRead(switchPin);
}
return cur;
}
void loop()
{
curBut=debounce (lastBut);
if (lastBut == LOW && curBut == HIGH)
{
ledOn =!ledOn;
}
lastBut = curBut;
digitalWrite(ledPin,ledOn);
if (ledOn == HIGH)
{
Serial.println("H");
}
else
{
Serial.println("L");
}
delay(100);
}
Не раскрыт вопрос - как программа должна реагировать на нажатие, следующее за односекундным (L). Т.е. должна ли она после "L" начинать сначала, т.е. с "H" или продолжать попеременно переключаться между "H" и "P". Другими словами:
H-P-H-L-P... или
H-P-H-L-H...
Думаю нужно ввести как минимум еще одну проверку нажатия кнопки, а для отсчета времени использовать millis()
при нажатии на кнопку - Н-Н-Н...
при повторном нажатии - Р-Р-Р...
а при нажатии с задержкой в 1 секунду - L-L-L... и так будет пока кнопка не нажмётся еще раз, потом снова Н-Н-Н...
То есть когда нажать кнопку то Н-Н-Н если еще раз нажать кнопку то Р-Р-Р если повторно нажать кнопку то опять Н-Н-Н но у когда нажать удерживая секунду то L-L-L
надеюсь я объяснил...
С какого это перепугу у вас вдруг пошли по три одинаковых состояния подряд ("при нажатии на кнопку - Н-Н-Н... при повторном нажатии - Р-Р-Р...")?
Вот скелет для вашего случая:
curState=digitalRead(...); // ну или debounce()... if(prevState==btnReleased && curState==btnPressed) { // кнопку только что нажали timeOn=millis(); } if(prevState==btnPressed && curState==btnReleased) { // кнопку только что отпустили if(millis()-timeOn)>1000 { // это было длинное нажатие [...] } else { // это было короткое нажатие [...] } } prevState=curState;мясо навесите сами
если чесно какраз мася не могу навесить, не понимаю что нужно делать...
если чесно какраз мася не могу навесить, не понимаю что нужно делать...
Суть вашего кода я понял но не могу переписать под свой... не силен в программировании...
Суть вашего кода я понял но не могу переписать под свой... не силен в программировании...
Помогите пожалуйста разобраться...