Как программно ограничить число нажатий кнопки?

VictorArx

★★✩✩✩✩✩
22 Мар 2021
518
82
Спасибо за участие всем. Мне очень хочется освоить ардуинку, но есть много вопросов. Чтобы не плодить темы, хочу ещё спросить. Можно ли программно ограничить число нажатий кнопки. Поясняю. Например 5 раз нажимаем кнопку, светодиод загорается 5 раз. Шестой раз нажимаем кнопку и ничего не происходит и далее тоже не действует кнопка.
 

Nikanor

★★✩✩✩✩✩
1 Окт 2020
178
51
можно.
в программе пропишите и наслаждайтесь.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,234
1,297
Москва
Число нажатие кнопки постоянно увеличивается. после 5 будет 6. потом 7 и т.д. Отслеживать надо не только кол-во нажатий но и время, за которое было это число сделано. Начните с простого : изучите библиотеку Гайвер-Батон
 

VictorArx

★★✩✩✩✩✩
22 Мар 2021
518
82
можно.
в программе пропишите и наслаждайтесь.
Дык, как прописать, то? Хоть намекните. Если бы я это знал, есесено нарисовал.

Число нажатие кнопки постоянно увеличивается. после 5 будет 6. потом 7 и т.д. Отслеживать надо не только кол-во нажатий но и время, за которое было это число сделано. Начните с простого : изучите библиотеку Гайвер-Батон
Почитал, там про это не сказано.
 

VictorArx

★★✩✩✩✩✩
22 Мар 2021
518
82
Там есть готовые функции отслеживания кол-ва кликов. И примеров море
Можете подсказать хоть один пример из его библиотеке. Там много чего написано. Пока это для меня дебри. Просто дайте ссылку илиещё лучше обведите конкретный пример.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,234
1,297
Москва
Для начала вот "_1-2-3-click.ino"
а потом любые примеры где есть использование getClicks, например many_clicks.ino
C++:
uint8_t getClicks();    // вернуть количество кликов
 

VictorArx

★★✩✩✩✩✩
22 Мар 2021
518
82
C++:
int led = 11;         //  Номер Pin к которому подключен диод
int brightness =0;    //  Переменная в которой хранится уровень яркости (От 0 до 254)
int buttonPlus=2;     //  Номер Pin к которому подключена кнопка 
int buttonMinus=4;

int flag =0;

int range =0;
 
 
 
 
  //  Номер Pin к которому подключена кнопка -
void setup()  {
 
   Serial.begin(9600);
  pinMode(buttonPlus, INPUT);
 
   pinMode(buttonMinus, INPUT);
 
 
 
 
  pinMode(led, OUTPUT); // Порт 11 (led) будет работать как Выход.
 
 
















  boolean flag = false;

 



}



void loop()  { // Этот цикл будет выполняться бесконечное количество раз.
 
 

 
 
 


 
 
 
 
 
 
 
 
 
  if (digitalRead(buttonPlus) == HIGH) {
    brightness   +=   5;
 
 
 
 
 
 
 
 range = digitalRead(buttonPlus);
 
 
  range =  brightness ;



 
 
 
  
 
   }
  
  
  
  
 
  
  
  
  
   if (digitalRead(buttonMinus) == HIGH) {
    brightness   -=   5;
 
 
 
 
 
 
 
 range = digitalRead(buttonMinus);
 
 
  range =  brightness ;// Эта функция контролирует, что бы переменная brightness не стала больше 254 и меньше 0, если значение вылазит за границу то функция 0 или 254
 
 
 
  
    
  
  
  
    
 
}
 
 
 
   switch (range) {
    case 0:    // your hand is on the sensor
      Serial.println("dark");
    
    brightness = constrain(brightness, 0, 254);   
 analogWrite(led,255);     
      
 
      
      break;
    case 1:    // your hand is close to the sensor
    
  brightness = constrain(brightness, 0, 254);   
analogWrite(led,150 );     
      
     Serial.println("bright");
      break;
    case 2:    // your hand is a few inches from the sensor
      Serial.println("medium");
    
  brightness = constrain(brightness, 0, 254);   
 analogWrite(led,50);     
      
      
      
      break;
    case 3:    // your hand is nowhere near the sensor
      
      Serial.println("dim");
  brightness = constrain(brightness, 0, 254);   
analogWrite(led, 15);     
      
      
      break;
 
 
 
 
 
 
  case 4:    // your hand is nowhere near the sensor
      
      Serial.println("pim");
  brightness = constrain(brightness, 0, 254);   
analogWrite(led,0);     
        
      
      break;
  
            


   }
 
   }





Вот такой скетч сделал. Кнопкой регулирую яркость. Когда достигается максимальная яркость после 4 нажатий кнопки, нажимаю пятый раз и начинается всё сначала, поэтому и хочу заблокировать кнопку на 5 раз. Куда в данный скетч вставить
uint8_t getClicks();
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,234
1,297
Москва
Так тут совсем другое надо.
1) Нажатия одиночные. Просто введите переменную которая будет считать нажатия.
2) А как обратно разблокировать ?
 

xof

★✩✩✩✩✩✩
24 Окт 2020
123
44
Код выше не смотрел, но что-то такое должно дать представление как это можно просто сделать:

C++:
uint8_t count = 0 ;
if (button.isClick)
{
    //change bright to level 'count'
    count = count == 4 ? 0 : count++;
}
 

VictorArx

★★✩✩✩✩✩
22 Мар 2021
518
82
Так тут совсем другое надо.
1) Нажатия одиночные. Просто введите переменную которая будет считать нажатия.
2) А как обратно разблокировать ?
Хороший вопрос. Теоретически примерно так. Вводим переменную, ограничиваем на 5 раз, светодиод светит максимально, второй кнопкой убавляем яркость до нуля и потом сбрасываем и всё повторяется.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,234
1,297
Москва
Тогда не надо ограничивать количество нажатий. Надо ограничить максимальную яркость и сделать как то так
если нажата кнопка, то: если яркость меньше 5, то увеличить ее на 1
если нажата другая кнопка то : если яркость больше 0, то уменьшить ее на 1

У Вас пока проблемы с машинной логикой, но это нарастет.
 

VictorArx

★★✩✩✩✩✩
22 Мар 2021
518
82
Избыточное цитирование
Тогда не надо ограничивать количество нажатий. Надо ограничить максимальную яркость и сделать как то так
если нажата кнопка, то: если яркость меньше 5, то увеличить ее на 1
если нажата другая кнопка то : если яркость больше 0, то уменьшить ее на 1

У Вас пока проблемы с машинной логикой, но это нарастет.
Верно есть проблемы. Простые скетчи рисую. Азы знаю и закон Ома тоже. Проблема с переменными и в инете нет про енто. Вы знаете, таки сделал, благодаря Вашим советам. Если интересно могу нарисовать скетч.

Не совсем верно, нужно
if (button.isClick())
{
//change bright to level 'count'
count = count == 4 ? 0 : count++;
}
 
Изменено:

VictorArx

★★✩✩✩✩✩
22 Мар 2021
518
82
Да, разумеется. Писал на коленке, пропустил.
Всё нормально. Медленно продвигаюсь к цели. Немного нужно доработать. Теперь после 4 нажатий кнопки светодиод горит в полную яркость, далее нажимаю 5, 6,7 и т.д. диод горит в полную яркость. Ура! В чём проблема. Начинаю второй кнопкой убирать яркость. Она начинает действовать только после тех раз, сколько лишних нажатий я сделал первой кнопкой, когда добавлял яркость.
 

Nikanor

★★✩✩✩✩✩
1 Окт 2020
178
51
вы какой то ненужный алгоритм придумали и воюете с ним.
есть переменная, определяющая яркость светика.
одной кнопкой её увеличиваете до 255, второй уменьшаете до 0.
никакие счётчики нажатий нафиг не нужны.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,234
1,297
Москва
У него яркость состоит из 4 (или 5, если считать выключено) предустановок. Тогда максимальная 255 это будет кол-во нажатий *63, не очень то сочетается, но пойдет. И вот это кол-во нажатий надо всего то менять от 0 до 4-х ( а я бы сделал до 5, тогда умножать на 51 и весь диапазон покрывается) с помощью 2-х кнопок. Ну застрял человек, пошел как нормальный герой не туда. Бывает.
 

Nikanor

★★✩✩✩✩✩
1 Окт 2020
178
51
ну кто мешает тс посмотреть в иде пример fade - ТАМ ВСЁ ПОКАЗАНО)))))
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,234
1,297
Москва
Иногда просто незнание что и где смотреть. Бывает такое, когда столкнулся с чем то новыми и даже не знаешь куда сунуться.
 
  • Лойс +1
Реакции: xof

VictorArx

★★✩✩✩✩✩
22 Мар 2021
518
82
вы какой то ненужный алгоритм придумали и воюете с ним.
есть переменная, определяющая яркость светика.
одной кнопкой её увеличиваете до 255, второй уменьшаете до 0.
никакие счётчики нажатий нафиг не нужны.
Для начала Вам спасибо, что уделяете мне своё драгоценное время. Скетч , про который Вы говорите уже исправлен и вот новый.Он рабочий.
C++:
  int led = 11;         //  Номер Pin к которому подключен диод
   //  Переменная в которой хранится уровень яркости (От 0 до 254)
     //  Номер Pin к которому подключена кнопка 


#include "GyverButton.h"

#define BTN1 2                // кнопка подключена сюда (PIN --- КНОПКА --- GND)
#define BTN2 3       // кнопка подключена сюда (PIN --- КНОПКА --- GND)


uint8_t value = 0 ;



GButton butt1(BTN1);
GButton butt2(BTN2);


















 
 
 
 
  //  Номер Pin к которому подключена кнопка -
void setup()  {
 
   Serial.begin(9600);
 
  
 
 
 
  pinMode(led, OUTPUT); // Порт 11 (led) будет работать как Выход.
 
 
















 

 



}



void loop()  { // Этот цикл будет выполняться бесконечное количество раз.
 

butt1.tick();  // обязательная функция отработки. Должна постоянно опрашиваться
 butt2.tick(); 


  

 
 
 


 
 
 
 
 
 
 
 
 
   if (butt1.isClick()) {           // одиночное нажатие
                

  
  value++; 

 
  
  
   }
 
 



 
 
 
  
 
  
  
  
  
  
 
  
  
  
  
   if (butt2.isClick()) 
   {
    value --;

 
   }
 

 
 

 
 
 
  
    
  
  
  
    
 

 
 
 
   switch (value) {
    case 0:    // your hand is on the sensor
      Serial.println("dark");
    
        
 analogWrite(led,0);     
      
 
      
      break;
    case 1:    // your hand is close to the sensor
    
      
analogWrite(led,25 );     
      
     Serial.println("bright");
      break;
    case 2:    // your hand is a few inches from the sensor
      Serial.println("medium");
    
 
 analogWrite(led,50);     
      
      
      
      break;
    case 3:    // your hand is nowhere near the sensor
      
      Serial.println("dim");
    
analogWrite(led, 115);     
      
      
      break;
 
 
 
 
 
 
  case 4:    // your hand is nowhere near the sensor
      
      Serial.println("pim");
    
analogWrite(led,255);     





 
        
      
      break;
  

 


 




            


   }
 
   }
вы какой то ненужный алгоритм придумали и воюете с ним.
есть переменная, определяющая яркость светика.
одной кнопкой её увеличиваете до 255, второй уменьшаете до 0.
никакие счётчики нажатий нафиг не нужны.
Этот скетч я делал, мне нужен оператор switch.

Иногда просто незнание что и где смотреть. Бывает такое, когда столкнулся с чем то новыми и даже не знаешь куда сунуться.
Мой юный друг( позвольте Вас так называть) Вы наверно програмисты С++, поэтому , что для Вас элементарно, для меня не очень. Я только учусь.

ну кто мешает тс посмотреть в иде пример fade - ТАМ ВСЁ ПОКАЗАНО)))))
А теперь расшифруйте , Вы же мне отвечаете, а не Знатокам.
 

xof

★✩✩✩✩✩✩
24 Окт 2020
123
44
if (butt1.isClick()) { // одиночное нажатие value++; }
Я же писал уже как делать.
Вместо value++, напишите
value = value == 4 ? 4 : value++; (некорректное решение, но тоже будет работать. Скорее нужно если бы была одна кнопка и при максимуме чтобя сбрасывалась на 0)

Ещё проще и правильнее, учитывая много кнопок и то как Вы пишите код, написать вот так
if (butt1.isClick() && value < 5)

Аналогичная логика для уменьшения, только будет value != 0 или какое там минимальное.
 

VictorArx

★★✩✩✩✩✩
22 Мар 2021
518
82
Избыточное цитирование
Я же писал уже как делать.
Вместо value++, напишите
value = value == 4 ? 4 : value++; (некорректное решение, но тоже будет работать. Скорее нужно если бы была одна кнопка и при максимуме чтобя сбрасывалась на 0)

Ещё проще и правильнее, учитывая много кнопок и то как Вы пишите код, написать вот так
if (butt1.isClick() && value < 5)

Аналогичная логика для уменьшения, только будет value != 0 или какое там минимальное.
Дружище, огромное Вам человеческое спасибо! Всё заработало, как я хотел. Теперь всё регулируется без задержек. Только вы разобрались, остальные только читали мораль. Благодарю Вас! Если хотите могу нарисовать скетч, это Ваша заслуга.

C++:
int led = 11;         //  Номер Pin к которому подключен диод
int brightness =0;    //  Переменная в которой хранится уровень яркости (От 0 до 254)
int buttonPlus=2;     //  Номер Pin к которому подключена кнопка
int buttonMinus=4;


void setup()  {
 
   Serial.begin(9600);
  pinMode(buttonPlus, INPUT);
 
   pinMode(buttonMinus, INPUT);
 
   pinMode(led, OUTPUT); // Порт 11 (led) будет работать как Выход.}
}
void loop()  { // Этот цикл будет выполняться бесконечное количество раз.
 
 if (digitalRead(buttonPlus) == HIGH &&brightness<5) {
    brightness  ++  ;
 
  delay(300);
 }
 if (digitalRead(buttonMinus) == HIGH &&brightness>0 ) {
    brightness  --  ;
 
 delay(300);
 
 }
 
switch (brightness) {
    
  
    
    case 0:    // your hand is on the sensor
      Serial.println("dark");
    
  
analogWrite(led,0);     
      
 
      
      break;
    case 1:    // your hand is close to the sensor
    
  
analogWrite(led,50 );     
      
     Serial.println("bright");
      break;
    case 2:    // your hand is a few inches from the sensor
      Serial.println("medium");
    
 
analogWrite(led,100);     
      
      
      
      break;
    case 3:    // your hand is nowhere near the sensor
      
      Serial.println("dim");
 
analogWrite(led, 150);     
      
      
      break;
 
 
  case 4:    // your hand is nowhere near the sensor
      
      Serial.println("pim");
 
analogWrite(led,200);     
        
      
      break;
 
  case 5:    // your hand is nowhere near the sensor
      
      Serial.println("pim");
 
analogWrite(led,255);     
        
      
      break;
            
    }

   }
 
Изменено:

VictorArx

★★✩✩✩✩✩
22 Мар 2021
518
82
Вот какую смысловую нагрузку несут пустые строки например с 86 по 94 ? Думаете так смотреть удобно ? Мне нет
Вы правы, не обратил на это внимание. Обрадовался. что получилось за 3 дня и не обратил на это внимание. Счас исправлю. Не обижайся старина, я чайник в Arduino/
 

xof

★✩✩✩✩✩✩
24 Окт 2020
123
44
Дружище, огромное Вам человеческое спасибо! Всё заработало, как я хотел. Если хотите могу нарисовать скетч, это Ваша заслуга.
Пожалуйста. Рад что у Вас всё получилось как Вы хотели.

А касательно скетча, я бы всё-таки советовал использовать библиотеку gyver-button хотя бы чтобы защититься от дребезга контактов. Тогда и задержку в 21\26 строчках не надо использовать.