Несколько кнопок на один вход

lcd input analog

Итак, я пытаюсь использовать один вход для управления ЖК-дисплеем. Цель состоит в том, чтобы после нажатия одной из кнопок было отправлено сообщение. Я просмотрел довольно много уроков и могу получить программа иногда работает. Тем не менее, это все еще довольно глючит, и мне интересно, почему это так. Чтобы заставить этот проект работать, в некоторой степени использовался этот код.

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int buttonPin = A0;     //Номера контактов кнопок и светодиодов
    void setup() 
{
  // устанавливаем количество столбцов и строк ЖК-дисплея:
  lcd.begin(16, 2);
  // Вывести сообщение на ЖК-дисплей.
  //lcd.print("привет, мир!");
  Serial.begin(9600);           //Последовательный монитор, используемый для определения предельных значений
  
  
 }

void loop() 
{
  int temp = analogRead(buttonPin);   //Чтение аналогового ввода
  Serial.println(temp);               // Отображаем прочитанное значение в Serial Monitor
  if (temp = 340)                     //Нижний предел для первой кнопки - если ниже этого предела, ни одна кнопка не нажимается, а светодиоды выключаются.
  {
  lcd.print("No Button Pushed \n");
  }
  else if (temp = 867)                // Лимит первой кнопки - если ниже этого лимита, но выше предыдущего лимита, то нажимается первая кнопка
  {
    lcd.print("Button 1 Pushed");
  }
  else if (temp = 156 )                // Ограничение второй кнопки
  {
    lcd.print("Button 2 Pushed");
  }
  
  else                                //Если ни одна из предыдущих кнопок не нажата, то необходимо нажать третью кнопку
  {
    lcd.print("Button 3 Pushed");
  }
  delay(100);                         //Задержка для стабильности
}

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

Схема

, 👍5


2 ответа


Лучший ответ:

4

Мишель Кейзерс указал на проблемы в вашем коде. Но потом есть также проблема с вашей схемой: если вы нажмете любую из кнопок кнопки аналоговый вход подключается к одному из узлов резисторной лестнице, и вы получите четко определенные показания напряжения. Хороший. Однако, если ни одна из кнопок не нажата, вход не подключен ни к чему: оно плавает. В этом случае вы получаете чтение непредсказуема, так как зависит от паразитического влияния бродячих емкости, окружающий шум и т. д. Вы должны изменить свою схему чтобы убедиться, что входное напряжение хорошо определено, даже если нет кнопки нажимается.

Тогда, что касается программы, я рекомендую вам удалить все после Serial.println(temp);. Просто сделайте так, чтобы это работало, и обратите внимание на показания, которые вы получаете в каждом случае. Убедитесь, что они последовательны. Один раз вы знаете значения, которые вы ожидаете, вы можете выбрать порог для применить, что должно быть примерно посередине между типичными показаниями. Например если два самых низких значения, которые вы получаете, это 0 и 240, вы должны установить порог 120.

,

Итак, если бы я хотел получить четкое показание напряжения, я бы привязал крайнюю правую кнопку к 5 В. Правильно?, @David Wisniewski

Хорошо, я перестал смотреть, когда увидел проблему в коде. Угадайте, что требуется комбинация вашего и моего решения (сначала сделайте свое решение)., @Michel Keijzers

Поэтому я собираюсь добавить еще одну картинку, которая является причиной моего замешательства., @David Wisniewski

Теперь я понимаю, что если я свяжу это с низким значением, я могу получить хорошие растущие значения. Спасибо за помощь, очень помогло, @David Wisniewski


3

Вы допустили несколько ошибок с тремя строками, первая из которых:

if (temp = 340)   

Во-первых, одиночное '=' является оператором присваивания, а не оператора сравнения. Вы хотите использовать '=='.

Однако вам нужно проверить, находится ли оно в диапазоне, поэтому вам нужно использовать <= (чтобы увидеть, меньше оно или равно). Также вам нужно расположить их в правильном порядке, чтобы получилось что-то вроде:

if (temp <= 156)
{
   // Обрабатываем значение, если temp меньше или равно 156
}
else if (temp <= 340)
{
   // Обрабатываем значение, если temp меньше или равно 340 (и больше 156)
}
else if (temp <= 860)
{
   // Значение обработки, если temp меньше или равно 860 (и выше 340)
}
else 
{
   // Значение обработки, если temp выше 860
}
,

Хорошо, это устраняет некоторые проблемы, но кнопки не дают таких хороших значений. Когда ни одна кнопка не нажата, A0 показывает 340, а первая кнопка дает значение 860. Это заставляет меня усомниться в самой схеме., @David Wisniewski

Да, вам сначала нужно исправить проблему, которую решает Эдгар, а затем использовать мое решение, как только вы узнаете правильные диапазоны значений., @Michel Keijzers