Урок 11. Программные таймеры

Обсуждение и вопросы по урокам Ардуино
vedimv
Сообщения: 1
Зарегистрирован: 02 фев 2021, 20:59

Урок 11. Программные таймеры

Сообщение vedimv » 02 фев 2021, 21:15

/* Урок 11. Выдержка времени. Принажати кнопки запускается таймер выдержки времени и через
установленое время (#define LEDTimer 1500 //Выдержка времени для СИД1)
загорается светодиод СИД.
После повторного нажатия опять выдерка времени и СИД гаснет.

Вот только у меня так не получается. А получилось, что после загрузки скетча в Ардуино
кнопка не реагирует, а реагирует она после выдержки установленого времени (#define LEDTimer 1500 //Выдержка времени для СИД1)
и СИД переключается одновремено с нажатием кнопки.
Подскажите пожалуйста, в чем ошибка? Спасибо.*/



#include <MsTimer2.h> //Библиотека таймера
#include <Button.h> //Библиотека кнока

#define LED_1_PIN 13 //СИД1 подключен к выводу 13
#define BUTTON_1_PIN 2 //Кнопка подключена к выводу 2

#define LEDTimer 1500 //Выдержка времени для СИД1
boolean flagLEDTimer; //признак программного таймера
int LEDCount; //счетчик таймера СИД1

Button button1 (BUTTON_1_PIN, 15); //создание объекта-кнопка

void setup(){

pinMode (LED_1_PIN, OUTPUT); //определяем вывод СИД1 как выход
MsTimer2::set(2, timerInterrupt);// задаем период прерывания по таймеру 2мс
MsTimer2::start(); //разрешаем прерывание по таймеру
}

void loop(){

//управление СИДом1
if(button1.flagClick==true){ //был клик кнопки
button1.flagClick=false; //сброс признака

if(flagLEDTimer==true){
flagLEDTimer=false; //сброс флага выдержки времени
digitalWrite(LED_1_PIN,!digitalRead(LED_1_PIN)); //инверсия состояния СИДа
}
}
}

void timerInterrupt(){ //обработчик прерывания
button1.scanState(); //вызов метода ожидания стабилбного состояния для кнопки

LEDCount++; //+1 к счетчику тамера СИД1
if(LEDCount>LEDTimer){
LEDCount=0; //сброс счетчика
flagLEDTimer=true; //установка флага выдержка времени СИД1
}
}




Эдуард порекомендовал изменить своим кодом:

Вот такой вариант не работает?
void loop(){
//управление СИДом1
if(button1.flagClick==true){ //был клик кнопки
button1.flagClick=false; //сброс признака
flagLEDTimer=true; //установка флага выдержка времени СИД1
}
}

void timerInterrupt(){ //обработчик прерывания
button1.scanState(); //вызов метода ожидания стабилбного состояния для кнопки

if( flagLEDTimer == true ) {
LEDCount++; //+1 к счетчику тамера СИД1
if(LEDCount>LEDTimer){
digitalWrite(LED_1_PIN,!digitalRead(LED_1_PIN)); //инверсия состояния СИДа
flagLEDTimer=false;
}
}
else LEDCount=0;
}


Переписал код предложенный Эдуардом.
Не работает. Кнопка не реагирует, СИД не меняет свое состояние.

Участники форума, дайте дельный совет.


Вернуться в «Уроки Ардуино»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей