Не могли бы вы объяснить что она делает? Я читал материал на arduino.cc(http://arduino.cc/it/Tutorial/Debounce), но все что я понял - эта функция делает кнопку в примере переключателем(не надо держать её для получения 1 или 0). И где вообще эту функцию можно использовать?
Ну, судя из кода, переключает кнопку только с некоторой задержкой. То есть не сразу в момент нажатие, а спустя 50мс. Не знаю, с чем связано, я в английском не силен, но возможно это нужно для какой то стабилизации сигнала. Почитай про эти кнопки, может и суть всплывет, просто я больше программист, чем электрик и свой набор arduino из кучи вкусностей все никак дождаться не могу
Вы когда-нибудь видели, как при включении чего-то проскакивает искра ? Это когда подключается мощная нагрузка, а когда искры не видно, не значит, что её нет. Если представить себе нажатие на кнопку разложенное по шкале времени, то это будет выглядеть так: выключено...выключено, включено-выключено много раз, включено...включено. Вот это "включено-выключено много раз" ничто иное, как плохой контакт, в момент включения... Это безобразие прекращается, когда давление на кнопку превысило определённый порог, и контакт становится постоянным. Для нас в нашей жизни от выключено до включено проходит очень мало времени, нажат на кнопку, это мгновенное действие. Но микроконтроллер живёт гораздо более быстрой жизнью чем мы, и он видит этот плохой контакт, как последовательность состояний вкючено и выключено, то есть за некий промежуток времени ваш светодиод успеет включиться и выключиться несколько десятков раз, а может и сотен... Данный программный способ обхода Дребезга контактов, а именно так переводится Debounce, основан на добавлении паузы с целью пропустить момент дребезга. Это не самы лучший способ борбы с этим явлением, нельзя так бездарно разбазаривать мощности процессора, а то получится, что на целом микроконтроллере будет сделана одна кнопка и всё, больше он ничем в это время не может быть занят... Как обычно, очень много и занудно написал, наверно было проще отослать вас в раздел Вики к Десятому уроку Джереми Блюма, там всё подробно...
Эм... Вот тут немного не согласен. Та функция не занимает все время процессора. Правда и ее можно было бы реализовать получше (производительней), но идея у нее очень даже ничего. Хотя я не видел ни одной другой пока. Если бы там было что то вроде этого: Код (Text): void loop () { delay(50); int reading = digitalRead(buttonPin); if (reading != lastButtonState) { buttonState = reading; digitalWrite(ledPin, buttonState); } } Тогда да, плохо. А если использовать ту идею более логично, например так: Код (Text): void loop () { int reading = digitalRead(buttonPin); if ((millis() - lastDebounceTime) > debounceDelay) { lastDebounceTime = millis (); if (reading != lastButtonState) { lastButtonState = reading; digitalWrite(ledPin, lastButtonState); } } То мы бы не ждали каждый раз эту задержку... И могли бы в этот промежуток (равный задержке) исполнять остальной код программы... Ну или как то так, надеюсь не ошибся и суть ясна, просто время позднее уже, глаза слипаются