Светодиод на том же контакте, что и тумблер, не горит

Я пытаюсь сделать что-то, что, по моему мнению, должно быть относительно простым. Я хотел бы прочитать входной сигнал от тумблера, и чтобы красный светодиод диаметром 5 мм указывал состояние переключателя. Однако вместо того, чтобы иметь вход для переключателя и выход для светодиода (управляемый программным обеспечением), я бы хотел соединить их последовательно в одной цепи. То есть переверните переключатель, и ток потечет от источника 5 В на Arduino Uno через светодиод к входному контакту на Arduino. (В конечном итоге мне бы хотелось иметь восемь таких переключателей; я пытаюсь создать своего рода имитированный байт с индивидуально изменяемыми битами, управляемыми переключателями; это будет читаться программой GTK Python, которая может интерпретировать этот «байт» по-разному: как десятичное значение, шестнадцатеричное значение, символ ASCII, цвет в 8-битном цветовом пространстве и т. д.).

Итак, у меня есть светодиод с токоограничивающим резистором сопротивлением 200 Ом. У меня также есть понижающий резистор (1 кОм), чтобы предотвратить плавание переключателя.

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

Я экспериментировал с разными номиналами понижающего резистора и токоограничивающего резистора. Эта пара (ограничение тока 200 Ом; понижение напряжения 1 кОм) казалось работать, но сейчас это не так. (Я заменил светодиод; и ток проходит через светодиод, иначе я бы не смог прочитать правильное значение контакта, я думаю.)

Я чего-то не понимаю? Имеет ли значение положение токоограничивающего резистора (до/после светодиода) (я полагаю, нет)? Кажется ли это правильной настройкой для того, чего я пытаюсь достичь? В более общем плане, должен ли этот подход в принципе масштабироваться до еще 8 пар переключателей/светодиодов? Есть ли лучший/более разумный подход? Есть ли причина, по которой я вижу так мало проектов Arduino, в которых светодиоды соединены последовательно с переключателем входа?

Макет выглядит так:

Изображение макетной платы

, 👍0

Обсуждение

Хотите также включать и выключать светодиод независимо от выключателя? Или вы хотите только прочитать переключатель (а переключатель включает и выключает светодиод)., @Jot

Можете ли вы опубликовать свой код? Возможно у вас дребезг переключателя. Четное количество отскоков может отменить нажатие, а нечетное число фактически будет считаться одним нажатием., @Nick Gammon


2 ответа


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

4

Светодиоды имеют (достаточно) фиксированное падение напряжения на них. Красный светодиод имеет напряжение около 2 В.

Вы можете использовать это для определения напряжения на входе. По сути, у вас есть делитель напряжения с резистором 200 Ом в качестве R1 и резистором 1 кОм в качестве R2. Падение напряжения на диоде вычитается из Vin.

Итак:

Vout = (Vin - Vled) * (R2 / (R1 + R2))

     = (5 - 2) * (1000 / (200 + 1000))

     = 3 * (1000 / 1200) 

     = 3 * 0.833

     = 2.5V

В технической документации ATMega328P указано, что ВЫСОКОЕ входное напряжение должно быть более 0,6*Vcc, а НИЗКОЕ входное напряжение должно быть ниже 0,3*Vcc. Это означает, что для регистрации HIGH вам нужно более 3 В. Для регистрации LOW необходимо напряжение менее 1,5 В.

Вы находитесь между этими двумя напряжениями — в «мертвой зоне».

Самый простой способ добиться желаемого — использовать двухполюсный переключатель и держать светодиод полностью отдельно от Arduino.

,

Использование двухполюсного переключателя действительно кажется более разумным подходом. Спасибо. Я понимаю вашу логику... но она не учитывает мой случай, когда я получаю правильный входной сигнал на Arduino - светодиод не светится. Мертвая зона, которую вы заметили, будет похожа на плавающую булавку, не так ли?, @cforster


2

Вот ваша схема не работает:

schematic

Есть много способов использовать один пин. Некоторые схемы оснащены диодом, а в некоторых схемах необходимо выключить светодиод, чтобы прочитать переключатель. Самым простым решением может быть следующее:

schematic

Когда переключатель не замкнут, светодиод слабо подтягивается (возможно, слишком слабо). При использовании INPUT_PULLUP для D7 подтягивание становится сильнее, и D7 может прочитать переключатель.
Дополнительно можно включить светодиод при разомкнутом выключателе. Но вы должны обязательно переключаться между OUTPUT + LOW и INPUT_PULLUP в коде, иначе есть ярлык.

,