Проблема с библиотекой Bounce.h

Osgiliath
Offline
Зарегистрирован: 03.09.2016

Всем доброго времени суток. Помогите разобраться с проблемой. Имеется простой "автомат световых эффектов" на 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;
 }

}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Osgiliath пишет:

Хоть я и использовал в качестве антидребезга библиотеку Bounce.h, но все равно он присутствует, приходится по несколько раз нажимать кнопку.

Дребезг, это когда при одном нажатии вылетает пачка, как будто Вы много раз нажимали. А то. что у Вас - просто тормозит кнопка и, собственно, понятно почему. Посмотрите сколько у Вас delay в функции LED_CENTER. Вы запросто можете нажать кнопку и успеть отпустить её (а то и два раза), а программа всё будет сидеть в этих delay и контроллер никогда не узнает, что Вы там что-то нажимали. Проблема Ваша именно в этом. Избавьтесь от delay или выведите конпку на внешнее прерывание и всё будет прожиматься хорошо.

Osgiliath пишет:

И еще один вопрос: как можно уменьшить количество строк кода в функции LED_CENTER, оставив тот же функционал? Светодиоды в этой функции зажигаются от центра в обе стороны.

Вопрос непонятен. Цель уменьшения? В обоих смыслах: И "для чего?" И "до какого размера нужно уменьшить?"

 

nik182
Offline
Зарегистрирован: 04.05.2015
057 char c=0;
058 while(c < 0)
059   {
060   RANDOM_LED();
061   c++;
062   }
063  
064 }
065  

Это пять! Конечно можно принять, что этот кусок закоментирован. 

Создайте свой delay на основе millis(). Внутри крутите bounce. 

Osgiliath
Offline
Зарегистрирован: 03.09.2016

ЕвгенийП пишет:

Избавьтесь от delay или выведите конпку на внешнее прерывание и всё будет прожиматься хорошо.

Ну да логично...  Если избавдятся от delay, то надо функцию millis применять, не совсем понятно как ее внутри того же for использовать.

nik182
Offline
Зарегистрирован: 04.05.2015

Osgiliath пишет:

ЕвгенийП пишет:

Избавьтесь от delay или выведите конпку на внешнее прерывание и всё будет прожиматься хорошо.

Ну да логично...  Если избавдятся от delay, то надо функцию millis применять, не совсем понятно как ее внутри того же for использовать.

зачем внутри for?  while((millis()-timeSave) < delayTime) {....bounce.....); 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, думайте. Как всегда есть 100500 способов решения задачи. Ищите.

Как самый тупой вариант, вместо delay поставьте цикл в котором проверяется не нажата ли кнопка и выполняется совсем крохотный делэй. Если кнопка нажата - немедленный выход из функции. Типа такого:

// вместо delay(100)
for (int8_t i=0; i < 100; i++) {
   if (<нажата кнопка>) return;
   delay(1);
}

Это очень тупо и топорно, но работать будет.

Osgiliath
Offline
Зарегистрирован: 03.09.2016

nik182 пишет:

Создайте свой delay на основе millis(). Внутри крутите bounce. 

Вот в чем и проблема(( Не доходит до мемя как реализовать с помощью millis()  то, что у меня сделано с помощью цикла for  

Osgiliath
Offline
Зарегистрирован: 03.09.2016

ЕвгенийП пишет:

зачем внутри for?  while((millis()-timeSave) < delayTime) {....bounce.....); 

Я как понимаю в собках это условие при котором while будет работать? Или подругому как то???