обработка нажатия кнопки

demon969
Offline
Зарегистрирован: 24.04.2012

К 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();

}

 

step962
Offline
Зарегистрирован: 23.05.2011

 Ну, если вы и в других функциях своего скетча столь же щедро кормите микроконтроллер Delay'ами, то ничего удивительного в этом нет. Хотите повысить скорость реагирования на нажатия кнопок - уходите от использования Delay'ев.

demon969
Offline
Зарегистрирован: 24.04.2012

Хорошо, тогда хотелось бы увидеть пример как заставить гореть экран в течении 3-5 сек. без delay();, и чтобы контроллер продолжал выполнять следующие функции.

 

maksim
Offline
Зарегистрирован: 12.02.2012
demon969
Offline
Зарегистрирован: 24.04.2012

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

maksim
Offline
Зарегистрирован: 12.02.2012

Поробуйте как то так

чать кода

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();

}

 

demon969
Offline
Зарегистрирован: 24.04.2012

Пример работает, но информация выводимая на экран пропала(

step962
Offline
Зарегистрирован: 23.05.2011

demon969 пишет:

Пример работает, но информация выводимая на экран пропала(

Что значит - "пример работает"? Как вы это определили? При нажатии на кнопку вывелась сторка "LCD screen is highlighted"? Или чот-то иное происходит?

Что значит - "информация, выводимая на экран, пропала"? Не выводится строка "LCD screen is highlighted"? Тогда возвращаемся к первому вопросу - как вы определили, что пример работает?

 УПС... Эта строка у вас в Serial выводится...

Но все равно - а что у вас выводится на дисплей? И где? И как часто?

В примере maksima дисплей выключается через 8 секунд после последнего нажатия клавиши. Естественно, после этого выключения дисплея вы на нем ничего не увидите. Так что или увеличивайте выдержку (строка 16), или почаще выводите информацию на дисплей, чтобы успеть заметить этот вывод.

И вообще, судя по тому куску кода, что вы привели, в оставшихся строках можно ожидать любые побочные эффекты. Выискивать эти эффекты, не имея перед глазами кода - дело неблагодарное. Поэтому приведите-ка весь код, если хотите добиться реализации своих задумок.

demon969
Offline
Зарегистрирован: 24.04.2012

При включении дисплея информация выводимая пропала. просто горит подсветка экрана и сам экран. А сам скеч просто высчитывает температуру с датчика и выводит на экран.

maksim
Offline
Зарегистрирован: 12.02.2012

Я все писал по вашему примеру. Попробуйте 09 строку закоментировать.

maksim
Offline
Зарегистрирован: 12.02.2012

И кстати, иногда проще прерывания использовать. 

demon969
Offline
Зарегистрирован: 24.04.2012

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

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Что бы информация выводилась нужно поместить Serial.print("LCD screen is highlighted"); 

внутрь таймера if(millis()-millis_old > 8000 && mil_stt).

А вообще , для корректной работы , ВСЯ функия должна находится внутри этого таймера.

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

У меня получилось примерно так.

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;
  
      
 }


//ваша основная программа
 }
 }