Урок 11. Программные таймеры
Добавлено: 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;
}
Переписал код предложенный Эдуардом.
Не работает. Кнопка не реагирует, СИД не меняет свое состояние.
Участники форума, дайте дельный совет.
установленое время (#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;
}
Переписал код предложенный Эдуардом.
Не работает. Кнопка не реагирует, СИД не меняет свое состояние.
Участники форума, дайте дельный совет.