несколько кнопок через делитель напряжения ESP8866

sg12@list.ru
Offline
Зарегистрирован: 13.08.2013

Делаю бизиборд, так как основная фишка это много разных кнопок, а на ESP портов не так много, сделал через делитель напряжения. Схема классическая, в роде все работает. Если в лупе без delay выводить в порт значения то показания скачат +/-1, чтто ы целом хорошо. Но вот стоит только пробовать отрабатывать нажатия, при нажатии случайны значения появляются. 

Пример кода просто проверка работы, тут все хорошо

void loop() {


  int bt = analogRead(A0);
  Serial.println(bt);
 
}

Вот так пытаюсь обработать

void loop() {

  int bt = analogRead(A0);
  presBt = bt > 50;
  
  if (presBt) {
    delay(100);
    int bt = analogRead(A0);
  }
  if (presBt && !PredPresBt) {
    eventBt(bt);
    Serial.println(bt);
  }
  PredPresBt = presBt;
}

В чем я промахнулся, может кто натолкнет на правильный путь?

inspiritus
Offline
Зарегистрирован: 17.12.2012

Поставьте pcf8574 и забудъте про кнопках на делителе навсегда.

rkit
Offline
Зарегистрирован: 23.11.2016

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ну да, на киловаттном передатчике 12 аналоговых кнопок работают и сбоев нет, а на столе им что-то мешает (на 5 вольтах nano)

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

sg12@list.ru пишет:

void loop() {

  int bt = analogRead(A0);
  presBt = bt > 50;
  
  if (presBt) {
    delay(100);
    int bt = analogRead(A0);
  }
  if (presBt && !PredPresBt) {
    eventBt(bt);
    Serial.println(bt);
  }
  PredPresBt = presBt;
}

Простите, а в восьмой строке, это что?

Как надпись на письме "Настолько секретно, что перед прочтением уничтожить"?

sg12@list.ru
Offline
Зарегистрирован: 13.08.2013

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

sg12@list.ru пишет:

void loop() {

  int bt = analogRead(A0);
  presBt = bt > 50;
  
  if (presBt) {
    delay(100);
    int bt = analogRead(A0);
  }
  if (presBt && !PredPresBt) {
    eventBt(bt);
    Serial.println(bt);
  }
  PredPresBt = presBt;
}

Простите, а в восьмой строке, это что?

Как надпись на письме "Настолько секретно, что перед прочтением уничтожить"?

Лишняя инициализация переменной, это критично? или не про это вопрос?

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

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Это не "лишняя инициализация, это - лишняя переменная.

Кстати, думаю, она действительно лишняя - по идее оптимизатор ее должен выкинуть. В общем, строки 6, 8 и 9 можно совершенно безболезненно удалить из кода.

sg12@list.ru
Offline
Зарегистрирован: 13.08.2013

Логика какая была. Читаю вход, значение не нажатой кнопки где то 20, если больше 50 то точно, что то нажато, после ждем 100 милисекунд, и читаем еще раз, пропуская дребезг.

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

sg12@list.ru пишет:

Логика какая была. Читаю вход, значение не нажатой кнопки где то 20, если больше 50 то точно, что то нажато, после ждем 100 милисекунд, и читаем еще раз, пропуская дребезг.

Зачем для этого объявлять еще одну переменную, которая нигде не будет использована?

sg12@list.ru
Offline
Зарегистрирован: 13.08.2013

v258 пишет:

sg12@list.ru пишет:

Логика какая была. Читаю вход, значение не нажатой кнопки где то 20, если больше 50 то точно, что то нажато, после ждем 100 милисекунд, и читаем еще раз, пропуская дребезг.

Зачем для этого объявлять еще одну переменную, которая нигде не будет использована?

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

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

sg12@list.ru пишет:

v258 пишет:

sg12@list.ru пишет:

Логика какая была. Читаю вход, значение не нажатой кнопки где то 20, если больше 50 то точно, что то нажато, после ждем 100 милисекунд, и читаем еще раз, пропуская дребезг.

Зачем для этого объявлять еще одну переменную, которая нигде не будет использована?

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

То то ж и оно, что в таком виде никуда она не передается, туда передается объявленная в строке 3 переменная, которая, однако, обновлена не была

sg12@list.ru
Offline
Зарегистрирован: 13.08.2013

v258 пишет:

sg12@list.ru пишет:

v258 пишет:

sg12@list.ru пишет:

Логика какая была. Читаю вход, значение не нажатой кнопки где то 20, если больше 50 то точно, что то нажато, после ждем 100 милисекунд, и читаем еще раз, пропуская дребезг.

Зачем для этого объявлять еще одну переменную, которая нигде не будет использована?

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

То то ж и оно, что в таком виде никуда она не передается, туда передается объявленная в строке 3 переменная, которая, однако, обновлена не была

Спасибо понял, тогда получается delay вообще нечего не делал, буду пробовать. Такой особенности не знал, предполагал что в таком случае просто запишется новое значение. Я 1Сник, у нас с этим делом чуть проще.