Нетипичные кнопки

flickster
Offline
Зарегистрирован: 09.06.2021

Добрый день. В ардуино и программировании новичок, но кое что знаю и кое что могу.

Хочу сделать 2 поста с кнопками и светодиодами. Логика такова:

1. При нажатии btn1 загорается светодиод led1, а при нажатии btn2 загорается светодиод led2.

2. После нажатия кнопки светодиод должен гореть n-секунд и гаснуть.

3. При нажатии одной из кнопок должен блокировать (или игнорирование)нажатие второй кнопки (исключаем одновременное нажатие) . Данное условие я хочу реализовать именно на стороне кнопок, а не светодиодов. В дальнейшем схема будет обрастать функционалом и основным триггером для всей программы будут состояния кнопок. Поэтому "действие  пока горит светодиод" не подходит в решении моей задачи. 

Теперь вопросы:

1. Как реализовать защиту от одновременного нажатия кнопок

2. С данным кодом есть баг: первое нажатие кнопки зажигает светодиод буквально на секунду, а повторное нажатие отрабатывает millis как положено. Думал это дребезг контактов и сделал защиту, но это не оно.

Готовый код не нужен, просто подопните в нужном направлении

 

 

 

int btn1 = 11;    // кнопка №1 — порт 11
int btn2 = 12;    // кнопка №2 — порт 12
int led1 = 13;    // порт 13, для светодиода
int led2 = 14;    // порт 14, для светодиода

// статусы состояний
#define B1HOLD    B00000001    // нажата первая кнопка
#define B2HOLD    B00000010    // нажата вторая кнопка
#define B1TO    B00000100    // у первой кнопки произошёл таймаут
#define B2TO    B00001000    // у второй кнопки произошёл таймаут

// таймеры кнопок
unsigned long timer1;
unsigned long timer2;

#define DEBOUNCE 300
unsigned long debounceTimer;

byte flags = 0;    // флаг состояния

void setup()
{
  Serial.begin(9600); //включаем com порт

  // Установим порты кнопок как входящие:
  pinMode(btn1, INPUT_PULLUP);
  pinMode(btn2, INPUT_PULLUP);

  // Установим порт светодиода как исходящий:
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);

  // Выключим светодиоды
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
}

void loop()
{
  if (!digitalRead(btn1))
    flags = B1HOLD;
  if (!digitalRead(btn2))
    flags = B2HOLD;

  //if (B2HOLD && B1HOLD)
  //  Serial.println("WTF?!");


  switch (flags) {
    case 0:    // никаких событий не зафиксировано
      break;

    case B1HOLD:
      if (millis() - debounceTimer > DEBOUNCE) {
        digitalWrite(led1, HIGH);
        Serial.println("B1HOLD");
        flags = B1TO;
        debounceTimer = millis();
      }
      break;

    case B2HOLD:
      if (millis() - debounceTimer > DEBOUNCE) {
        digitalWrite(led2, HIGH);
        Serial.println("B2HOLD");
        flags = B2TO;
        debounceTimer = millis();
      }
      break;

    case B1TO:
      if (millis() - timer1 >= 4000) {
        digitalWrite(led1, LOW);
        flags = 0;
        Serial.println("B1TO");
        timer1 = millis();
      }
      break;

    case B2TO:
      if (millis() - timer2 >= 4000)
      {
        digitalWrite(led2, LOW);
        flags = 0;
        Serial.println("B2TO");
        timer2 = millis();
      }
      break;

    //default:
      // if (millis() - timer1 > 4000)
     // digitalWrite(led1, LOW);
     // digitalWrite(led2, LOW);
      // timer1 = millis();
     //  Serial.println("Конец");
      //flags = 0;

  }
}

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Цитата:
подопните в нужном направлении

Прям точное направление указать?

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

Какая то логика непонятная. Со стороны кнопок, со стороны светодиодов... Это как? Есть программа и ей всё равно - кнопки или светодиоды. Всё что описано как задание делается через автоматное программирование - в вики есть большая статья. Прочитайте и попробуйте реализовать. С кнопками тоже беда. Возьмите титановый велосипед для кнопки из раздела программирование и получайте чистое нажатие.     

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

По второму пункту - строки 13 и 14, неинициализированные переменные. Перенесите их в loop() в самое начало, объявите static и инициализируйте

static unsigned long timer1 = millis();
static unsigned long timer2 = millis();

По первому пункту непонятно - защиту от нажатия именно пока нажата кнопка? Если да, то просто добавьте в условие проверку второй кнопки

  if (!digitalRead(btn1) && digitalRead(btn2))
    flags = B1HOLD;
  else if (!digitalRead(btn2) && digitalRead(btn1))
    flags = B2HOLD;

 

b707
Offline
Зарегистрирован: 26.05.2017

flickster - курсовик?

Вы уже не первый в этом месяце, кому надо кнопки с блокировкой нажимать.

Как же вы надоели, двоешники

flickster
Offline
Зарегистрирован: 09.06.2021

Вы бы всех под одну гребенку бы не чесали. Нет, не курсовик. Я пейнтболист и хочу сделать кнопки для банера.

Блокировка кнопок нужна для исключения спорных моментов из разряда "я первый нажал! нет, я первый!"

И нет, я не двоешик. Я сисадмин и поэтому частично знаком с кодом.

b707
Offline
Зарегистрирован: 26.05.2017

ОК, это не вы спрашивали на Гайвере тоже самое 2 дня назад?

Зажигание двух светодиодов двумя кнопками с блокировкой пишется в 6 строчек, никакие флаги вообще не нужны.

Что вы там накрутили в коде, непонятно.

flickster
Offline
Зарегистрирован: 09.06.2021

v258 пишет:

По второму пункту - строки 13 и 14, неинициализированные переменные. Перенесите их в loop() в самое начало, объявите static и инициализируйте

static unsigned long timer1 = millis();
static unsigned long timer2 = millis();

По первому пункту непонятно - защиту от нажатия именно пока нажата кнопка? Если да, то просто добавьте в условие проверку второй кнопки

  if (!digitalRead(btn1) && digitalRead(btn2))
    flags = B1HOLD;
  else if (!digitalRead(btn2) && digitalRead(btn1))
    flags = B2HOLD;

 

таймеры поправил.

Условие проверки поставил, и появился еще один баг: светодиод теперь залипает. По наблюдение после B*HOLD не уходит в B*TO. Нажимаю еще раз и все срабатывает. Это только после одновременного нажатия кнопок.

b707
Offline
Зарегистрирован: 26.05.2017

Добавка - посмотрел - на гайвере точно вы.

И что-то вы путаетесь в показаниях (попросту подвираете) - там вы писали что новичок и в коде не сечете, здесь строите из себя знающего и типа с кодом пришли...  а код-то чужой притащили, который вам на гайвере написали. Некрасиво.

 

Вам там написали код, нафига вы оттуда сюда пришли? Продолжали бы в той же ветке - это было бы логично, дописали бы вместе с автором кода

 

flickster
Offline
Зарегистрирован: 09.06.2021

b707 пишет:

Добавка - посмотрел - на гайвере точно вы.

И что-то вы путаетесь в показаниях (попросту подвираете) - там вы писали что новичок и в коде не сечете, здесь строите из себя знающего и типа с кодом пришли...  а код-то чужой притащили, который вам на гайвере написали. Некрасиво.

 

Вам там написали код, нафига вы оттуда сюда пришли? Продолжали бы в той же ветке - это было бы логично.

 

ВЫ либо меня с кем то путаете, либо ту тему одним глазом читали.

Из моего там было 15 строк "типичного для работы с кнопками" кода.

А от меня сейчас конкретно что именно хотите? Если Вы весь из себя детектив, то найдите в вк одноименную с моим ником тут страницу. Там много меня и пейнтбола. Там Вы кстати сможете увидеть, что я давненько закончил учиться ;)

А сюда я пришел потому, что как и там есть люди которые не читают видимо название раздела и включают "папку програмера", который тут же кучей критики впустую сотрясает воздух.

b707
Offline
Зарегистрирован: 26.05.2017

flickster пишет:

ВЫ либо меня с кем то путаете, либо ту тему одним глазом читали.

Простите, наверно это совпадение, тема с такой же задачей и с автором с таким же ником...

Все такие хитрые, блин.

flickster
Offline
Зарегистрирован: 09.06.2021

b707 пишет:

flickster пишет:

ВЫ либо меня с кем то путаете, либо ту тему одним глазом читали.

Простите, наверно это совпадение, тема с такой же задачей и с автором с таким же ником...

Вы между строк читает или Вам все равно?

flickster
Offline
Зарегистрирован: 09.06.2021

b707 пишет:

Добавка - посмотрел - на гайвере точно вы.

И что-то вы путаетесь в показаниях (попросту подвираете) - там вы писали что новичок и в коде не сечете, здесь строите из себя знающего и типа с кодом пришли...  а код-то чужой притащили, который вам на гайвере написали. Некрасиво.

 

Вам там написали код, нафига вы оттуда сюда пришли? Продолжали бы в той же ветке - это было бы логично, дописали бы вместе с автором кода

 

И раз уж на то пошло, то я взял оттуда часть кода с объявлением переменных. А все что в цикле писал  сам строка за строкой

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Откровенно говоря, в этот раздел за критикой и приходят. Когда хотят похвалиться, идут в раздел "Проекты". Вам же нужен именно папка - программер. Точнее, вам нужен платный исполнитель

b707
Offline
Зарегистрирован: 26.05.2017

дел

b707
Offline
Зарегистрирован: 26.05.2017

flickster пишет:

И раз уж на то пошло, то я взял оттуда часть кода с объявлением переменных. А все что в цикле писал  сам строка за строкой

ладно согласен, не по делу выступил.

flickster, приношу извинения.

 

И сюда на форум лезут почти сплошь школьники и птушники за курсовыми, время такое.

настроение херовое, задолбали все :)

flickster
Offline
Зарегистрирован: 09.06.2021

Rumata пишет:

Откровенно говоря, в этот раздел за критикой и приходят. Когда хотят похвалиться, идут в раздел "Проекты". Вам же нужен именно папка - программер. Точнее, вам нужен платный исполнитель

А как Вы решили, что мне нужен платный исполнитель? Я пытаюсь научиться и разбраться в непонятных моментах. А сейчас для меня самое непонятное это отношение знающих людей к новичкам.

Когда к нам в пейнтбол приходят новички, мы им даже маркера свои даём пострелять. Тут же я за неделю на двух форумах вижу одно и тоже: "ля какой вы тупой. тут ведь все просто..." и 200 строк непонятного кода или максимально клёвый ответ "там за 6 строк все кодится". На руборде для таких есть раздел андеграунд, а тут почему то вся "элита" лезет в раздел для помощи новичкам

flickster
Offline
Зарегистрирован: 09.06.2021

b707 пишет:

flickster пишет:

И раз уж на то пошло, то я взял оттуда часть кода с объявлением переменных. А все что в цикле писал  сам строка за строкой

ладно согласен, не по делу выступил.

flickster, приношу извинения.

 

И сюда на форум лезут почти сплошь школьники и птушники за курсовыми, время такое.

настроение херовое, задолбали все :)

вот. Теперь бы хотелось конструктивного диалога) К сожалению почему вторую неделю только через такие "атаки" все дела решаются =( Луна в какой то фазе что ли....

flickster
Offline
Зарегистрирован: 09.06.2021

b707 пишет:

flickster пишет:

И раз уж на то пошло, то я взял оттуда часть кода с объявлением переменных. А все что в цикле писал  сам строка за строкой

ладно согласен, не по делу выступил.

flickster, приношу извинения.

 

И сюда на форум лезут почти сплошь школьники и птушники за курсовыми, время такое.

настроение херовое, задолбали все :)

я понимаю общие принципы т.к. я сиадмин (не по профилю, просто как говорится душа лежит) и на информатике QBASIC мне хорошо заходил. Но вот нюансов я не понимаю и большинство уроков в инете сводятся к копипасту друг друга

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

flickster пишет:

Условие проверки поставил, и появился еще один баг: светодиод теперь залипает. По наблюдение после B*HOLD не уходит в B*TO. Нажимаю еще раз и все срабатывает. Это только после одновременного нажатия кнопок.

Это к условиям проверки никаким боком. Смотрите, что еще вы там поправили. Что там в сериал выдает?

flickster
Offline
Зарегистрирован: 09.06.2021

В коде Serial.println я использовал для того, чтобы хоть как то понять что происходит и куда я застреваю. Дребезг взят у гайвера, переменные у дяденьки с форума гайвера. Это все что я посчитал полезным из тех 200 строк. Подправил код в соответствии с рекомендациями "v258" и получил нарушение в работе loop. Или что то похожее на это. Сейчас B2 игнорирует нажатие B1, а B1 не игнорирует B2, и более того не переходит в кейс B1TO (по крайней мере светодиод горит и статус в консоли не проходит)

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

flickster пишет:

Когда к нам в пейнтбол приходят новички, мы им даже маркера свои даём пострелять. 

По постановке задачи понял. Вы же в С++ не рубите и не хотите. Контроллеры копипастингом тяжело программировать. Вам на двух форумах об этом сказали, вы не понимаете..

flickster
Offline
Зарегистрирован: 09.06.2021

v258 пишет:

flickster пишет:

Условие проверки поставил, и появился еще один баг: светодиод теперь залипает. По наблюдение после B*HOLD не уходит в B*TO. Нажимаю еще раз и все срабатывает. Это только после одновременного нажатия кнопок.

Это к условиям проверки никаким боком. Смотрите, что еще вы там поправили. Что там в сериал выдает?

02:25:46.703 -> B1HOLD
02:25:46.984 -> B1HOLD
02:25:47.265 -> B1HOLD
02:25:47.594 -> B1HOLD
02:25:47.875 -> B2HOLD
02:25:48.203 -> B1HOLD
02:25:48.485 -> B1HOLD
02:25:48.813 -> B1HOLD
02:25:49.094 -> B1HOLD
02:25:49.094 -> B1TO
светоиод горит пока я не нажму вторую кнопку и потом
02:26:15.477 -> B2HOLD
02:26:15.805 -> B2HOLD
02:26:15.805 -> B2TO
 
без 
1 if (!digitalRead(btn1) && digitalRead(btn2))
2   flags = B1HOLD;
3 else if (!digitalRead(btn2) && digitalRead(btn1))
4

  flags = B2HOLD

все кейсы отрабатывали на ок
 
 
flickster
Offline
Зарегистрирован: 09.06.2021

Rumata пишет:

flickster пишет:

Когда к нам в пейнтбол приходят новички, мы им даже маркера свои даём пострелять. 

По постановке задачи понял. Вы же в С++ не рубите и не хотите. Контроллеры копипастингом тяжело программировать. Вам на двух форумах об этом сказали, вы не понимаете..

а про копипаст Вы как решили? гляньте мой код и я объясню назначение в нём всех строк. Копипас в чем заключается? Объявление переменных и Setup? Я пытаюсь научиться делать сам, но это не запрещает мне смотреть чужие работы и разбирать их по кусочкам. Всё и сразу не бывает

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

flickster пишет:

без

if (!digitalRead(btn1) && digitalRead(btn2))
  flags = B1HOLD;
else if (!digitalRead(btn2) && digitalRead(btn1))
  flags = B2HOLD

все кейсы отрабатывали на ок

Ну еще бы им не отрабатывать - кнопок-то нет, никто состояния не меняет ))

Выкладывайте текущий код. Который вот сейчас у вас не работает

flickster
Offline
Зарегистрирован: 09.06.2021

v258 пишет:

flickster пишет:

без

if (!digitalRead(btn1) && digitalRead(btn2))
  flags = B1HOLD;
else if (!digitalRead(btn2) && digitalRead(btn1))
  flags = B2HOLD

все кейсы отрабатывали на ок

Ну еще бы им не отрабатывать - кнопок-то нет, никто состояния не меняет ))

Выкладывайте текущий код. Который вот сейчас у вас не работает

int btn1 = 11;    // кнопка №1 — порт 11
int btn2 = 12;    // кнопка №2 — порт 12
int led1 = 13;    // порт 13, для светодиода
int led2 = 14;    // порт 14, для светодиода

// статусы состояний
#define B1HOLD    B00000001    // нажата первая кнопка
#define B2HOLD    B00000010    // нажата вторая кнопка
#define B1TO    B00000100    // у первой кнопки произошёл таймаут
#define B2TO    B00001000    // у второй кнопки произошёл таймаут

byte flags = 0;    // флаг состояния

void setup()
{
  Serial.begin(9600); //включаем com порт

  // Установим порты кнопок как входящие:
  pinMode(btn1, INPUT_PULLUP);
  pinMode(btn2, INPUT_PULLUP);

  // Установим порт светодиода как исходящий:
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);

  // Выключим светодиоды
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
}

void loop()
{
  static unsigned long timer1 = millis();
  static unsigned long timer2 = millis();

  if (!digitalRead(btn1))
    flags = B1HOLD;
  if (!digitalRead(btn2))
    flags = B2HOLD;
  if (!digitalRead(btn1) && digitalRead(btn2))
    flags = B1HOLD;
  else if (!digitalRead(btn2) && digitalRead(btn1))
    flags = B2HOLD;


  switch (flags) {
    case 0:
      break;

    case B1HOLD:
      digitalWrite(led1, HIGH);
      Serial.println("B1HOLD");
      flags = B1TO;
      break;

    case B2HOLD:
      digitalWrite(led2, HIGH);
      Serial.println("B2HOLD");
      flags = B2TO;
      break;

    case B1TO:
      if (millis() - timer1 >= 2000) {
        digitalWrite(led1, LOW);
        flags = 0;
        Serial.println("B1TO");
        timer1 = millis();
      }
      break;

    case B2TO:
      if (millis() - timer2 >= 2000) {
        digitalWrite(led2, LOW);
        flags = 0;
        Serial.println("B2TO");
        timer2 = millis();
      }
      break;

    default:
      digitalWrite(led1, LOW);
      digitalWrite(led2, LOW);
      Serial.println("Конец");
      flags = 0;

  }
}

 

b707
Offline
Зарегистрирован: 26.05.2017

flickster, все таймеры запускаете не там. Дебонс надо запускать при нажатии кнопки, таймер светодиода - при окончании таймера дебонсе.

Блокировку кнопок в вашем коде сделать легче легкого - выставляйте новый фоаг только при отсутсвии других флагов.

sadman41
Offline
Зарегистрирован: 19.10.2016

flickster пишет:
На руборде для таких есть раздел андеграунд, а тут почему то вся "элита" лезет в раздел для помощи новичкам

А кто бы Вам помогал, если не "илита" b707 - другой новичок? Это им нахер не встряло. Вы решите свою задачу и больше не зайдете сюда, как и остальные 99% новичков.

flickster
Offline
Зарегистрирован: 09.06.2021

v258 пишет:

flickster пишет:

без

if (!digitalRead(btn1) && digitalRead(btn2))
  flags = B1HOLD;
else if (!digitalRead(btn2) && digitalRead(btn1))
  flags = B2HOLD

все кейсы отрабатывали на ок

Ну еще бы им не отрабатывать - кнопок-то нет, никто состояния не меняет ))

Выкладывайте текущий код. Который вот сейчас у вас не работает

я понял в чем беда) Заменил своей условие проверки Вашим и все поехало.

b707
Offline
Зарегистрирован: 26.05.2017

догадались - молодец

flickster
Offline
Зарегистрирован: 09.06.2021

b707 пишет:

flickster, все таймеры запускаете не там. Дебонс надо запускать при нажатии кнопки, таймер светодиода - при окончании таймера дебонсе.

Блокировку кнопок в вашем коде сделать легче легкого - выставляйте новый фоаг только при отсутсвии других флагов.

таймер светодиода же нужен мне в другом кейсе? мне нужно чтобы после нажатия светодиод горел еще 2 секкунды например. 

С флагами я если честно не до конца понял как работать. Толкового объяснения не встретил.

flickster
Offline
Зарегистрирован: 09.06.2021

b707 пишет:

flickster. после такого исправления вы будете утверждать, что понимаете строчки в коде? :)))

if (!digitalRead(btn1))
    flags = B1HOLD;
  if (!digitalRead(btn2))
    flags = B2HOLD;
  if (!digitalRead(btn1) && digitalRead(btn2))
    flags = B1HOLD;
  else if (!digitalRead(btn2) && digitalRead(btn1))
    flags = B2HOLD;

 

я же говорю, перечитал и понял свой косяк) 

  static unsigned long timer1 = millis();
  static unsigned long timer2 = millis();

  if (!digitalRead(btn1) && digitalRead(btn2))
    flags = B1HOLD;
  else if (!digitalRead(btn2) && digitalRead(btn1))
    flags = B2HOLD;

оставил так. У меня почти 3 часа ночи и я занимаюсь самообразованием пока дочь с женой спят) я тоже чуток устал и глаз замылился за день

sadman41
Offline
Зарегистрирован: 19.10.2016

Втупую это делается так: в лупе по инпуту1 зажигаем лед1, по инпуту2 зажигаем лед2. Затем дилэй на 10500мс и гасим оба леда.

flickster
Offline
Зарегистрирован: 09.06.2021

sadman41 пишет:
flickster пишет:
На руборде для таких есть раздел андеграунд, а тут почему то вся "элита" лезет в раздел для помощи новичкам
А кто бы Вам помогал, если не "илита" b707 - другой новичок? Это им нахер не встряло. Вы решите свою задачу и больше не зайдете сюда, как и остальные 99% новичков.

Дело в помощи, а не в реакции на 99%

с b707 мы уж поняли друг друга, но только после определенной полемики. Я понимаю, что у всех своя жизнь и свои проблемы, но убивать у новичков желание заниматься ардуинкой это тоже не дело

b707
Offline
Зарегистрирован: 26.05.2017

flickster пишет:

я же говорю, перечитал и понял свой косяк) 

   if (!digitalRead(btn1) && digitalRead(btn2))
    flags = B1HOLD;
  else if (!digitalRead(btn2) && digitalRead(btn1))
    flags = B2HOLD;

оставил так.

ничем не напоминает те 6 строчек. что я вам предлагал вчера? :)

flickster
Offline
Зарегистрирован: 09.06.2021

sadman41 пишет:
Втупую это делается так: в лупе по инпуту1 зажигаем лед1, по инпуту2 зажигаем лед2. Затем дилэй на 10500мс и гасим оба леда.

делай мне остановит весь код, а как я говорил выше, это только начало. По задумке после нажатия кнопки будет гореть светоион и еще будет играть аудиофайл с мп3 плеера. Поэтому делэй тут не уместен. 

flickster
Offline
Зарегистрирован: 09.06.2021

b707 пишет:

flickster пишет:

я же говорю, перечитал и понял свой косяк) 

   if (!digitalRead(btn1) && digitalRead(btn2))
    flags = B1HOLD;
  else if (!digitalRead(btn2) && digitalRead(btn1))
    flags = B2HOLD;

оставил так.

ничем не напоминает те 6 строчек. что я вам предлагал вчера? :)

их 4) Я отталкивался немного от другой логики. Не А+ и Б-, а если А+, то Б что то там. Вот она меня и завела не туда

sadman41
Offline
Зарегистрирован: 19.10.2016

Запусти аудиофайл и уйди в дилэй.

Любой блокирующий код автоматически отсечет вторую кнопку и подавит дребезг.

Не надо сразу комический корабль строить, начни с малого.

flickster
Offline
Зарегистрирован: 09.06.2021

b707 пишет:

flickster пишет:

я же говорю, перечитал и понял свой косяк) 

   if (!digitalRead(btn1) && digitalRead(btn2))
    flags = B1HOLD;
  else if (!digitalRead(btn2) && digitalRead(btn1))
    flags = B2HOLD;

оставил так.

ничем не напоминает те 6 строчек. что я вам предлагал вчера? :)

я потратил 2 ночи на разбор кода, который мне дали на гайвере. Откровенно говоря я не ожидал увидеть прям настолько голый СИ там. И это прям хардкор какой то оказался.

b707
Offline
Зарегистрирован: 26.05.2017

flickster пишет:

b707 пишет:

ничем не напоминает те 6 строчек. что я вам предлагал вчера? :)

их 4)

ну так тогда у вас не было требования держать светодиод включенным еще 4 секунды, они выключались сразу - и для этого было достаточно еще 2х строк

 

Тот участник, чей код вы в итоге взяли - хороший программист. но в данном случае моя идея явно была лучше... :)

flickster
Offline
Зарегистрирован: 09.06.2021

sadman41 пишет:
Запусти аудиофайл и уйди в дилэй. Любой блокирующий код автоматически отсечет вторую кнопку и подавит дребезг. Не надо сразу комический корабль строить, начни с малого.

это третья версия моего кода =) Я и так иду маленькими шажочками. Про дилэя с дребезгом думал, но все пишут, что дилэй зло и я решил сразу учиться работать без него

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

flickster пишет:

я понял в чем беда) Заменил своей условие проверки Вашим и все поехало.

Ну вот, а то я уже матюкнуться успел )))

sadman41
Offline
Зарегистрирован: 19.10.2016

В конце концов это придавит все :

if (!flags && !digitalRead(btn1)) flags = B1HOLD;
if (!flags && !digitalRead(btn2)) flags = B2HOLD;

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:
Не надо сразу комический корабль строить.

"Комический корабль" - это хорошо :) Отражает суть многих поделок новичков :)

flickster
Offline
Зарегистрирован: 09.06.2021

b707 пишет:

flickster пишет:

ничем не напоминает те 6 строчек. что я вам предлагал вчера? :)

их 4)

ну так тогда у вас не было требования держать светодиод включенным еще 4 секунды, они выключались сразу - и для этого было достаточно еще 2х строк

 

Тот участник, чей код вы в итоге взяли - хороший программист. но в данном случае моя идея явно была лучше... :)

[/quote]

 

повторюсь, я взял идею)

Вторая версия моего кода выглядела вот так:

int btn1 = 11; // кнопка №1 — порт 11
int btn2 = 12; // кнопка №2 — порт 12
int led1 = 13; // порт 13, для светодиода
int led2 = 14; // порт 14, для светодиода
uint32_t timer;
int buttonState = 0;

void setup()
{
  // Установим порты кнопок как входящие:
  pinMode(btn1, INPUT_PULLUP);
  pinMode(btn2, INPUT_PULLUP);

  // Установим порт светодиода как исходящий:
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
}

void loop()
{
 
  int button1State = digitalRead(btn1);
  int button2State = digitalRead(btn2);


  if (button1State && (!button2State))
  {
    digitalWrite(led1, HIGH);
  }
  if (millis() - timer > 3000)         // проверяем сколько прошло миллисекунд
  {
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);

    timer = millis();
  }

  if ((!button1State) && button2State)
  {
    digitalWrite(led2, HIGH);
  }
  if (millis() - timer > 3000)         // проверяем сколько прошло миллисекунд
  {
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);

    timer = millis();
  }

  if (!button1State)
  {
    digitalWrite(led1, LOW);
  }
  if (!button2State)
  {
    digitalWrite(led2, LOW);
  }
}

и если бы я сразу построил логику правильно, я бы в кейсы не полез. Но зато я попробовал кейсы в работе)

Лучше и понятнее для новичка. А это в данной ситуации главное. Я никоем образом не говорю, что он плохой человек или специлист, но его уровень кода слишком сложен для понимания на моей уровне развития. Я разобрал его код и взял с него интересные и полезные кусочки. К слову о том, что "цифры буквами" можно передавать (например B11111001, //1)  я узнал как раз в этих раскопках.

 

 

flickster
Offline
Зарегистрирован: 09.06.2021

sadman41 пишет:
В конце концов это придавит все : if (!flags && !digitalRead(btn1)) flags = B1HOLD; if (!flags && !digitalRead(btn2)) flags = B2HOLD;

вот это уже более похоже на корабль xD

Оптимизация кода для меня еще не скоро откроется)

flickster
Offline
Зарегистрирован: 09.06.2021

и к слову про новичков и 99%

Первым делом я бегло пробежался по первым 5-7 страницам форума в нужном разделе и оставил там полезный комент относительно Notepad++ для тех же новичков 

b707
Offline
Зарегистрирован: 26.05.2017

flickster пишет:

Оптимизация кода для меня еще не скоро откроется)

тут нет никакой оптимации, это всего лишь логическое выражение

flickster
Offline
Зарегистрирован: 09.06.2021

b707 пишет:

flickster пишет:

Оптимизация кода для меня еще не скоро откроется)

тут нет никакой оптимации, это всего лишь логическое выражение

оно сокращено в 1 строку = оптимизированно

b707
Offline
Зарегистрирован: 26.05.2017

flickster пишет:

Первым делом я бегло пробежался по первым 5-7 страницам форума в нужном разделе и оставил там полезный комент относительно Notepad++ для тех же новичков 

я видел. Комент типично новичковый - наивный и немного смешной. Если чо - подсветка синтаксиса есть практически в любом редакторе кода, а не только в Нотепаде. Вы Удивитесь - но она даже в Ардуино ИДЕ есть

sadman41
Offline
Зарегистрирован: 19.10.2016

case B1HOLD: {
digitalWrite(led1, HIGH);
Serial.println("B1HOLD");
flags = B1TO;
timer1 = millis();
}
break;

...
case B1TO: {
if (millis() - timer1 >= 4000) {
digitalWrite(led1, LOW);
flags = 0;
Serial.println("B1TO");
}
break;

...