обработка нажатия кнопки
- Войдите на сайт для отправки комментариев
Втр, 29/05/2012 - 10:48
К 13 пину подключена подсветка LCD экрана, ко второму пину подключена кнопка. При нажатии кнопки должен загораться экран, он загорается с задержкой, причем каждый раз задержка разная, как сделать чтобы 13 пин сразу переходил в состояние HIGT при нажатии кнопки?
Пример: в автомагнитоле например нажатие кнопки напанели обрабатывается почти мгновенно, как так же сделать?
чать кода
void Light(void) {
// считываем значения с входа кнопки
buttonState = digitalRead(buttonPin);
// проверяем нажата ли кнопка
// если нажата, то buttonState будет HIGH:
if (buttonState == HIGH) {
delay(50);
lcd.display(); //включить дисплей
digitalWrite(BackLight, HIGH);// включаем подсветку
Serial.print("LCD screen is highlighted");
delay(8000); //задержка времени для подсветки экрана
lcd.noDisplay(); //выключить дисплей
}
else {
// выключаем подсветку
digitalWrite(BackLight, LOW);
lcd.noDisplay(); //выключить дисплей
}
}
void loop(void) {
Light();
getSerial();
getTemp();
printTemp();
}
Ну, если вы и в других функциях своего скетча столь же щедро кормите микроконтроллер Delay'ами, то ничего удивительного в этом нет. Хотите повысить скорость реагирования на нажатия кнопок - уходите от использования Delay'ев.
Хорошо, тогда хотелось бы увидеть пример как заставить гореть экран в течении 3-5 сек. без delay();, и чтобы контроллер продолжал выполнять следующие функции.
Мигаем светодиодом без delay()
Сто раз читтал этот пример, но увязать со своим примером кода приведенном выше не смог.
Поробуйте как то так
чать кода boolean btn_stt, mil_stt = 0; unsigned long millis_old = 0; void Light(void) { if (digitalRead(buttonPin) && !btn_stt) { // проверяем нажата ли кнопка delay(150); lcd.display(); //включить дисплей digitalWrite(BackLight, HIGH);// включаем подсветку Serial.print("LCD screen is highlighted"); btn_stt = 1; mil_stt = 1; millis_old = millis(); } if(millis()-millis_old > 8000 && mil_stt){ //задержка времени для подсветки экрана lcd.noDisplay(); //выключить дисплей digitalWrite(BackLight, LOW);// выключаем подсветку mil_stt = 0; } if (!digitalRead(buttonPin)) { // проверяем нажата ли кнопка btn_stt = 0; } } void loop(void) { Light(); getSerial(); getTemp(); printTemp(); }Пример работает, но информация выводимая на экран пропала(
Пример работает, но информация выводимая на экран пропала(
Что значит - "пример работает"? Как вы это определили? При нажатии на кнопку вывелась сторка "LCD screen is highlighted"? Или чот-то иное происходит?
Что значит - "информация, выводимая на экран, пропала"? Не выводится строка "LCD screen is highlighted"? Тогда возвращаемся к первому вопросу - как вы определили, что пример работает?
УПС... Эта строка у вас в Serial выводится...
Но все равно - а что у вас выводится на дисплей? И где? И как часто?
В примере maksima дисплей выключается через 8 секунд после последнего нажатия клавиши. Естественно, после этого выключения дисплея вы на нем ничего не увидите. Так что или увеличивайте выдержку (строка 16), или почаще выводите информацию на дисплей, чтобы успеть заметить этот вывод.
И вообще, судя по тому куску кода, что вы привели, в оставшихся строках можно ожидать любые побочные эффекты. Выискивать эти эффекты, не имея перед глазами кода - дело неблагодарное. Поэтому приведите-ка весь код, если хотите добиться реализации своих задумок.
При включении дисплея информация выводимая пропала. просто горит подсветка экрана и сам экран. А сам скеч просто высчитывает температуру с датчика и выводит на экран.
Я все писал по вашему примеру. Попробуйте 09 строку закоментировать.
И кстати, иногда проще прерывания использовать.
да, я сейчас и пробую разобраться с прерываниями, вот только я понял на двух пинах можно сделать прерывания, pin 1 и pin2, если не получится разобраться, то выложу скеч, чтоб помог кто-нибудь)) Погуглить оссобенно))
Что бы информация выводилась нужно поместить Serial.print("LCD screen is highlighted");
внутрь таймера if(millis()-millis_old > 8000 && mil_stt).
А вообще , для корректной работы , ВСЯ функия должна находится внутри этого таймера.
У меня получилось примерно так.
int state=0; int knopka=0; int vremia=0; long previousMillis = 0; void setup() { pinMode(5, OUTPUT); } void loop() { if (millis() - previousMillis >1) { previousMillis = millis(); vremia++; if(vremia<4000&&state==1) { digitalWrite(5,HIGH);//подсветка } else { digitalWrite(5,LOW);//подсветка vremia=0; state=0; } if(digitalRead(13)==HIGH&&knopka==0)//кнопка. защита от дребезга и т.д. { knopka=1; state=1; } if(digitalRead(13)==LOW&&knopka==1)//кнопка { knopka=0; } //ваша основная программа } }