дребезг контактов выключателя

Тема в разделе "Arduino & Shields", создана пользователем qwerty12344321, 10 янв 2016.

  1. MESS

    MESS Гик

    просто вариант: дребезг "транзистор pmos это как бы реле" мог появится также из-за плохого контакта затвора в бредборде. я уже сталкивался с низким качеством отдельных экземпляров. покачал -заработало.
     
  2. a.skalkin

    a.skalkin Нуб

    Доброго времени суток. Решил обратиться за помощью. Я в ардуино новичок, но надеюсь когда-нибудь разобраться.
    Вопрос заключается в следующем: Хотелось бы написать программу, которая будет управлять 4 или более кнопками, которые включают соответствующие 4 и более диода, плюс 5 кнопка, при нажатии которой выключаются все диоды. Разумеется код нужен с программным подавлением дребезга, и чтобы он не занимал много памяти.
    В силу своих возможностей набросал код, но он не действует, поэтому прошу совета, куда копать.
    Заранее спасибо

    Код (C++):
    int index = 0;
    long previousMillis[] = {0, 0, 0, 0};
    int val[] = {0, 0, 0, 0};
    int flag[] = {0, 0, 0, 0};
    int ledPins[] = {8, 9, 10, 11};
    int switchPins[] = {2, 3, 4, 5};
    int alloffPin = 6;

    void setup()
    {
      for (index = 0; index <= 3; index++)
      {
        pinMode(ledPins[index], OUTPUT);
        pinMode(switchPins[index], INPUT);


      }
    }
    void loop()

    { for (index = 0; index <= 3; index++)
      {
        if (switchPins[index] == HIGH && flag[index] == 0) //если кнопка нажата и flagравен 1 , то ...
        {

          if (millis() - previousMillis[index] > 50)  //каждую секунду добавляем 1 в  переменную Val
          {
            previousMillis[index] = millis();
            val[index]++;
          }
        }
        if (switchPins[index] == LOW && flag[index] == 1) // если кнопка не нажата и переменная flag равна 1
        {
          flag[index] = 0; // обнуляем переменную flag
        }

        if (val[index] >= 5)
        {
          ledPins[index] = !switchPins[index];//инвертируем состояние пина
          flag[index] = 1; // присваиваем пременной значение 1
          val[index] = 0; //обнуляем переменную таймера

        }
      }

    }
     
     
  3. DrProg

    DrProg Вечный нерд

    Осмотрел бегло. Сразу: (millis()- previousMillis[index]>50) - это не каждая секунда, это 20 раз в секунду. Не вижу антидребезга. А что будет если (switchPins[index]== LOW && flag[index]==0) или (switchPins[index]== HIGH && flag[index]==1) ? Вот это: ledPins[index]=!switchPins[index]; как и зачем вы инвертируете целые числа типа 2, 4, 5 и так далее? Инвертируют булевы переменные.
     
    ИгорьК нравится это.
  4. Alex19

    Alex19 Гуру

    Добавлю к сказанному DrProg, а почему Вы решили, что этот код проверяет кнопку?
    Код (C++):
    switchPins[index]== HIGH
    Он просто сравнивает значения в switchPins.

    Вот код который проверяет
    Код (C++):
    digitalRead(switchPins[index])== HIGH
    А это устанавливает состояние светодиода?
    Код (C++):
    ledPins[index]  =
    Тут просто присваивается новое значение элемента в массиве ledPins

    Вот код который меняет состояние светодиода
    Код (C++):
    digitalWrite(ledPins[index],  !digitalRead(switchPins[index]))
     
  5. DrProg

    DrProg Вечный нерд

    Хороший пример программного антидребезга есть у Амперки на Вики. Но, ИМХО, по возможности лучше использовать аппаратное:
    [​IMG]
     
    ИгорьК нравится это.
  6. Onkel

    Onkel Гуру

    в С все что не нуль - не нуль, соответсвенно !1==0 и т.д. А ! это просто "не". Так что ! очень даже имеет право на жизнь и я очень часто его использую, не используя булевых переменных (в мк все равно занимает байт).
     
  7. DrProg

    DrProg Вечный нерд

    В данном случае вряд ли имеет. Потому что элементы массива все ненулевые, стало быть в любом случае результатом будет 0. Зачем так усложнять, если проще написать:
    Код (C++):
    ledPins[index]=0;
    Автор явно хотел этой строкой добиться чего то другого. Судя по слову в комментарии "инвертируем" могу предположить, что аргументы слева и справа должны были быть одинаковыми. Но что именно призвана сделать эта строка лучше пусть объяснит он сам.
     
    ИгорьК нравится это.
  8. Onkel

    Onkel Гуру

    рассеиватель незримо реет ...Речь не о конкретном (не столько ) примере, а о фразы "Инвертируют булевы переменные." Фраза эта неверна, и вы неправы, поучая ТС и продолжая раздавать вредные советы. Инвертируют. еще как инвертируют, причем даже у классиков , тем более в мк аtmega где битов как таковых и нет и все операции работают с байтами, так что если вы объявляете переменные как булевы все равно они занимают целый байт, а операция ! не ограничена лишь булевым аргументом. Аргумент может быть любым, хоть указателем на указатель.
     
  9. ИгорьК

    ИгорьК Гуру

    Вы не правы! Максим ВСЕГДА дает правильные советы!
     
  10. Onkel

    Onkel Гуру

    ясен пень. я член клуба его фанатов.
     
  11. Alex19

    Alex19 Гуру

    Согласен, вне конкретно примера, фраза не верна.

    Подумал, что DrProg делает намек, что код не соответствует ни поставленной задаче, не комментариям. Человек просто проверяет/меняет значения массивов, а судя по комментариям (и описанной задачи), думает, что проверяет/меняет значения пинов.
     
  12. DrProg

    DrProg Вечный нерд

    Инвертация в цикле, и в данном случае особенно, это попытка переключения туда и обратно каждую итерацию. Понятное дело, что из любого числа можно получить 0, но получить из 0 что то кроме 1 нельзя. Стало быть операция эта бессмыслена, а совет подумать над ее нужостью не вредный, а полезный. в отличии от вашего ворчания.
     
    ИгорьК нравится это.
  13. Onkel

    Onkel Гуру

    ув. сниматель рассеивателей, перевод стрелок не прокатит. Операция ! работает с аргументом любого вида. Это медицинский факт, а не ворчание. Удачи в применении стеклянных линз с пир датчиками.
     
  14. Onkel

    Onkel Гуру

    прикольный набор слов. Только смысл в этом наборе слов==!1.
     
  15. DrProg

    DrProg Вечный нерд

    То что операция работает не отменяет того факта, что программа с ней не работает. А все потому, что смысла в этом факте !=(любое число).
     
    ИгорьК нравится это.
  16. Onkel

    Onkel Гуру

    ага. например, если любое число==0.
     
  17. Onkel

    Onkel Гуру

    Так, первый пошел. Дошло до вас - уже хорошо.
    Вы бы классику Керниган /Ричи почитали. Классики рекомендуют вместо
    if(x==0) {}
    писать
    if(!x){}
    при не только булевой х, но и при целой, float и т.д. Хоть при char.
     
    Последнее редактирование: 14 янв 2016
  18. DrProg

    DrProg Вечный нерд

    В этом смысл в самом клиническом признании что функция работает с любым числом, то есть он есть, но его немного.

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

    Или смысл глубже - превратить любую тему во флуд?
     
    ИгорьК нравится это.
  19. DrProg

    DrProg Вечный нерд

    Здорово горячо доказывать очевидные вещи, против которых никто не спорит?
     
    ИгорьК нравится это.
  20. Onkel

    Onkel Гуру

    "зачем вы инвертируете целые числа типа 2, 4, 5 и так далее? Инвертируют булевы переменные." - чей текст?
    Вся глубина смысла состоит в том, что вы пишете треш который начинающими вроде вас же может быть принят за истину. Вот представим что человек послушал вас и снял "рассеиватель", искал где купить линзу, поехал линзу купил, поставил перед пир сенсором и после опытов, изучения основ оптики до него дошло , что совет ваш был неверным? Он перестанет заходить на форум, где дают такие советы, а дающие неправильные советы до последнего отпираются, отписываются, переводят стрелки, прибегают к казуистике и делают умный вид. Или про "зачем вы инвертируете целые числа...." человек откроет Кернигана/Ричи и увидит if( !getch()) - что он должен подумать? Что getch() - булево?