Проблема с библиотекой Bounce.h
- Войдите на сайт для отправки комментариев
Вс, 04/09/2016 - 15:16
Всем доброго времени суток. Помогите разобраться с проблемой. Имеется простой "автомат световых эффектов" на 7 светодиодах и с 3 режимами работы. Режимы переключаются автоматически, а также по нажатию кнопки. С кнопкой как раз и проблема. Хоть я и использовал в качестве антидребезга библиотеку Bounce.h, но все равно он присутствует, приходится по несколько раз нажимать кнопку. В чем тут дело? У меня единственная мысль, что библиотека Bounce.h не хочет работать внутри функции viod. И еще один вопрос: как можно уменьшить количество строк кода в функции LED_CENTER, оставив тот же функционал? Светодиоды в этой функции зажигаются от центра в обе стороны.
#include <Bounce.h> // Основная часть #define LED1 0 #define LED2 1 #define LED3 2 #define LED4 3 #define LED5 4 #define LED6 5 #define LED7 6 #define BUTTON 8 int value = 0; Bounce bouncer = Bounce(BUTTON,5); void setup() { pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(LED3, OUTPUT); pinMode(LED4, OUTPUT); pinMode(LED5, OUTPUT); pinMode(LED6, OUTPUT); pinMode(LED7, OUTPUT); pinMode(BUTTON, INPUT); } void loop() { char a=0; while(a < 50) { LED_CENTER(); a++; BOUNCE(); if(value==1) break; } value=0; delay(1000); char b=0; while(b < 5) { RUN_LED(); b++; BOUNCE(); if(value==1) break; } value=0; delay(1000); char c=0; while(c < 0) { RANDOM_LED(); c++; } } //// ОПИСАНИЕ ФУНКЦИЙ ////// void RUN_LED() // ПРОГРАММА 1 { for (int i=0; i<=7; i++) { digitalWrite(i,HIGH); delay(50); digitalWrite(i,LOW); delay(50); if(i==7) { for (int i=7; i>=0; i--) { digitalWrite(i,HIGH); delay(50); digitalWrite(i,LOW); delay(50); } } } } void RANDOM_LED() // ПРОГРАММА 2 { for (int i=random(0, 15); i<=random(0, 10); i++) { digitalWrite(i,HIGH); delay(50); digitalWrite(i,LOW); delay(50); } } void LED_CENTER() // ПРОГРАММА 3 { digitalWrite(LED4,HIGH); delay(50); digitalWrite(LED3,HIGH); digitalWrite(LED5,HIGH); delay(50); digitalWrite(LED6,HIGH); digitalWrite(LED2,HIGH); delay(50); digitalWrite(LED7,HIGH); digitalWrite(LED1,HIGH); delay(50); digitalWrite(LED7,LOW); digitalWrite(LED1,LOW); delay(50); digitalWrite(LED6,LOW); digitalWrite(LED2,LOW); delay(50); digitalWrite(LED3,LOW); digitalWrite(LED5,LOW); delay(50); digitalWrite(LED4,LOW); delay(50); } void BOUNCE() { if ( bouncer.update() ) { if ( bouncer.read() == HIGH) value=1; } }
Хоть я и использовал в качестве антидребезга библиотеку Bounce.h, но все равно он присутствует, приходится по несколько раз нажимать кнопку.
Дребезг, это когда при одном нажатии вылетает пачка, как будто Вы много раз нажимали. А то. что у Вас - просто тормозит кнопка и, собственно, понятно почему. Посмотрите сколько у Вас delay в функции LED_CENTER. Вы запросто можете нажать кнопку и успеть отпустить её (а то и два раза), а программа всё будет сидеть в этих delay и контроллер никогда не узнает, что Вы там что-то нажимали. Проблема Ваша именно в этом. Избавьтесь от delay или выведите конпку на внешнее прерывание и всё будет прожиматься хорошо.
И еще один вопрос: как можно уменьшить количество строк кода в функции LED_CENTER, оставив тот же функционал? Светодиоды в этой функции зажигаются от центра в обе стороны.
Вопрос непонятен. Цель уменьшения? В обоих смыслах: И "для чего?" И "до какого размера нужно уменьшить?"
057
char
c=0;
058
while
(c < 0)
059
{
060
RANDOM_LED();
061
c++;
062
}
063
064
}
065
Это пять! Конечно можно принять, что этот кусок закоментирован.
Создайте свой delay на основе millis(). Внутри крутите bounce.
Избавьтесь от delay или выведите конпку на внешнее прерывание и всё будет прожиматься хорошо.
Ну да логично... Если избавдятся от delay, то надо функцию millis применять, не совсем понятно как ее внутри того же for использовать.
Избавьтесь от delay или выведите конпку на внешнее прерывание и всё будет прожиматься хорошо.
Ну да логично... Если избавдятся от delay, то надо функцию millis применять, не совсем понятно как ее внутри того же for использовать.
зачем внутри for? while((millis()-timeSave) < delayTime) {....bounce.....);
Ну, думайте. Как всегда есть 100500 способов решения задачи. Ищите.
Как самый тупой вариант, вместо delay поставьте цикл в котором проверяется не нажата ли кнопка и выполняется совсем крохотный делэй. Если кнопка нажата - немедленный выход из функции. Типа такого:
Это очень тупо и топорно, но работать будет.
Вот в чем и проблема(( Не доходит до мемя как реализовать с помощью millis() то, что у меня сделано с помощью цикла for
зачем внутри for? while((millis()-timeSave) < delayTime) {....bounce.....);
Я как понимаю в собках это условие при котором while будет работать? Или подругому как то???