По-разному срабатывают кнопки, при подключении Arduino Uno к разным компьютерам

BorLand_07
Offline
Зарегистрирован: 15.06.2016

Здравствуйте возник такой вопрос. Для начала та часть кода, которая отвечает за кнопки.

void ButtonPress()
{
  //513
  if ((KeyButton1Value>500) and (KeyButton1Value<520))
    {
      UpPress(); 
    }
  //341
  if ((KeyButton1Value>330) and (KeyButton1Value<355))
    {
      DownPress();
    }
  //255 
  if ((KeyButton1Value>240) and (KeyButton1Value<265))
    {
    LeftPress();  
    }
  //204 
  if ((KeyButton1Value>190) and (KeyButton1Value<230))
    {
    RightPress();
    }
}
 
 
void KeyBoardCalculate()
{
  //Часть отработки нажатия клавиши
  KeyButton1Value=analogRead(KeyButton1Pin); 
  //если сигнал с кнопки нулевой то обнуляем метку обработки нажатия
  if (KeyButton1Value<190)
    {
      WasChecked=false;
      repet=0;
    } 
        
  //KeyButton1TimeFromPress=micros()-KeyButton1TimePress;
  //исключаем шумы
  if ((KeyButton1Value>=190) and (WasChecked==true))
  {
    repet=repet+1;
  }
  if ((KeyButton1Value>=190) and (WasChecked==true) and (repet>=3))
  {
      ButtonPress();
  }  
 
  if ((KeyButton1Value>=190) and (WasChecked==false))
    {
      /*delay(100);*/
      WasChecked=true;
      ButtonPress();
    }
}
Кнопки подключены к аналоговому входу А0. При питании Arduino от ноутбука Lenovo, алгоритм срабатывает отлично, кнопки работают безотказно (подключаю к USB2.0). Как только приношу в лабораторию подключаю к стационарному компьютеру или другому(старому) ноутбуку, кнопки начинают плохо срабатывать (подключаю к USB2.0). То дважды сработают, то не сработают при нажатии. Проверяя значения аналогового входа при нажатии кнопок и на ноутбуке и настационарном компьютере серьезных расхождений не получил. Что посоветуете, товарищи. Как решить проблему?
Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Дело явно в плавающем напряжении разных USB-портов. При считывании аналогового входа достаточно большое расхождение показаний всё таки иногда присуствует, поэтому условия if не всегда срабатывают. Для отладки сделайте вывод значения при нажатии кнопки в serial-монитор.

BorLand_07
Offline
Зарегистрирован: 15.06.2016

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

 

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Я сначала не заметил, а что это у вас за "and" в условиях if ? В языке Си логическое И (AND) записывается как &&

http://arduino.ru/Reference/Boolean

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Пардон, оказывается в стандарте С++ определены диграфы для некоторых операторов. И действительно можно использовать "and" вместо "&&", препроцессор сам правильно подставит. Для меня это открытие, если честно... 0_о

P.S. Если кто в теме, ответьте пожалуйста - применяются ли в практике диграфы и как часто? Любопытство одолевает.

BorLand_07
Offline
Зарегистрирован: 15.06.2016

Мой косяк. По привычке пишу, компиллятор не ругается на использование "and", поэтому ошибки здесь быть не может, плюс я проверял работоспособность этого алгоритма, вставляя в тело if serial.println('x'), соответственно, если программа заходила в тело этого условного оператора, то последовательный порт выдавал соответствующую запись.