Счётчик нажатий в проекте умного выключателя врал по-хвастливому: одно нажатие засчитывалось как три-пять, а иногда кнопка «срабатывала» вообще без касания. Я уже переписал антидребезг тремя способами, когда заметил закономерность: враньё усиливалось, если слегка нажать на макетку рядом с кнопкой. Диагноз — растянутая пружина лунки: нога кнопки болталась, и контакт то появлялся то пропадал сам по себе, а дребезг был лишь симптомом. Макетке было четыре года, и она честно отслужила свой срок.
Плохой контакт — самый коварный тип неисправности, потому что маскируется под глюки кода: «срабатывает через раз» списывают на дребезг, шум АЦП — на помехи, а случайные ресеты — на питание. Разберём, как отличить дребезг механики кнопки (норма, 5-20 мс) от больной макетки (не норма), как прозвонить лунку мультиметром с шевелением провода, чем лечится окисление и почему толстые ноги деталей убивают лунки навсегда. Финал — детектор дребезга на millis(), который за минуту покажет, где проблема: в кнопке, в макетке или в коде.
Дребезг или контакт? Как отличить
Дребезг механики — штатное явление: контакты кнопки подпрыгивают 5-20 мс при нажатии и отпускании, лечится программным фильтром на 20-50 мс и живёт ровно в момент нажатия. Больная макетка ведёт иначе: срывы случаются В ЛЮБОЙ момент, без нажатий, и часто зависят от механики — шевельнул макетку, задел провод, нажал рядом. Третий признак — окисление: лунки потемнели, макетка старше пары лет или жила в сыром гараже. Диагностика делается мультиметром в режиме прозвонки: щупы в две лунки одной цепи, пилишь шевелить соседние провода и легонько давишь на макетку — звонок должен быть непрерывным. Пропал — нашёл.
Лечится по диагнозу. Окисление: изопропиловый спирт в лунки, десять раз проткнуть каждую ногой резистора — пружинки зачищаются, у моей гаражной макетки это вернуло 95% точек. Растянутая пружина — только вычёркивание ряда из схемы: воткни деталь в соседний свободный ряд, жизнь продолжится. Грязь и стружка — продуть и протереть. А вот от привычки «воткнуть потолще» лечи себя: ноги толще 0,8 мм (лопатки на 2,8 мм, силовые клеммы) разгибают пружину за одно включение, и ряд умирает навсегда — для толстых ног держи переходники или панельки. Классификацию рядов и ходы по макетке я давал в уроке про GND и общие провода — там же про то, почему «висящая земля» выглядит как плохой контакт.
// Кто шумит: кнопка или макетка? Считаем чистые нажатия// и паразитные срывы отдельно, чтобы увидеть виновника.const int PIN_BTN = 2; int last = HIGH; // INPUT_PULLUP: покой = HIGHint stable = HIGH;unsigned long tChange = 0;unsigned long presses = 0; // чистые нажатияunsigned long ghosts = 0; // срывы без нажатия void setup() { Serial.begin(9600); pinMode(PIN_BTN, INPUT_PULLUP);} void loop() { int raw = digitalRead(PIN_BTN); if (raw != last) { // фронт: дребезг или контакт last = raw; tChange = millis(); } if (millis() - tChange > 50 && raw != stable) { // уровень устоялся stable = raw; if (stable == LOW) { presses++; Serial.print("nazhatie #"); Serial.println(presses); } else { // отпустили: если прошло < 50 мС с последнего фронта - // это был короткий паразитный срыв, считаем отдельно ghosts++; Serial.print("GHOST-sryv #"); Serial.println(ghosts); } }}Счетчики разделяют симптомы: «nazhatie» растёт только от устоявшихся нажатий с фильтром 50 мС — это честная работа кнопки; «GHOST-sryv» — короткие пропадания уровня, которые человек не мог сделать. Если ghosts растут при неподвижной кнопке — проблема в контакте, а не в коде. Дальше идёт механический тест: легко давишь на разные участки макетки — рост ghosts укажет на конкретный ряд, и мультиметр подтвердит.
Практический приём из той же оперы: втыкай светодиод с резистором в подозрительный ряд и шевели макетку — мигает при шевелении, значит, контакт рваный. Это примитивно, но быстрее прозвонки, когда под рукой только макетка и пара проводов.
| Симптом | Причина | Диагноз и лечение |
|---|---|---|
| Одно нажатие засчитывается 3-5 раз | дребезг механики кнопки 5-20 мс | норма: фильтр 20-50 мС на millis |
| Срывы сигнала без нажатий, при шевелении | растянутая пружина лунки или плохой провод | прозвонка с шевелением; ряд вычеркнуть |
| Глюки усиливаются от влажности/времени | окисление лунок (старая макетка) | изопропанол + проткнуть ногой резистора 10 раз |
| Деталь еле держится, выпадает | нога тоньше 0,6 мм или перегретая пружина | слегка изогнуть ногу или взять переходник |
| Ряд умер после одной детали | нога толще 0,8 мм разогнала пружину | ряд на выброс; толстые ноги — через панельки |
- 1. Счётчик срабатываний растёт, когда кнопку никто не трогает. Что это чаще всего?
- 2. Чем убивается лунка макетки навсегда?
- дребезг кнопки — норма (5-20 мС, лечится фильтром), срывы в покое — больная макетка
- прозвонка с шевелением провода — главный тест: звонок должен быть непрерывным
- окисление лечится изопропанолом и протыканием лунок ногой резистора
- ноги толще 0,8 мм убивают ряд лунок с одного включения — только через панельки
Частые вопросы по теме урока
- Счётчик срабатываний растёт, когда кнопку никто не трогает. Что это чаще всего?
- Штатный дребезг живёт только в момент нажатия. Срывы в покое — это механика макетки: растянутая пружина, окисление или плохой провод. Диагноз подтверждают шевелением и прозвонкой. плохой контакт макетки — рваная лунка или провод
- Чем убивается лунка макетки навсегда?
- Пружина рассчитана на 0,5-0,8 мм. Лопатки 2,8 мм и силовые клеммы разгибают её с первого включения — ряд вычёркивается из схемы. Толстые ноги ставят через панельки. ногой детали толще 0,8 мм — пружина разгибается