Рокерный переключатель
- Войдите на сайт для отправки комментариев
Втр, 29/11/2016 - 22:53
Всем привет.
У меня есть такой рокерный переключатель:
Центральный контакт подключен к GND. Левый контакт(то есть "|") подключен к D11 и правый контакт(то есть "||") подключен к D12.
Написал такой код, чтобы протестировать:
if ((digitalRead(11)==HIGH) && (digitalRead(12)==LOW)) //Включено положение | { digitalWrite(13, HIGH); } else if ((digitalRead(12)==HIGH) && (digitalRead(11)==LOW)) //Включено положение || { digitalWrite(13, HIGH); } else if ((digitalRead(12)==HIGH) && (digitalRead(11)==HIGH)) //Включено среднее положение. { digitalWrite(13, LOW); }
И сразу возникла проблема: в среднем положение почему-то не выключается светодиод.
Из-за чего это может происходить?
Причем иногда в среднем положение светодиод все-таки гаснит. (тоже не понимаю почему так)
Если же использовать такой код:
if ((digitalRead(11)==HIGH) && (digitalRead(12)==LOW)) //Включена | { digitalWrite(13, LOW); } else if ((digitalRead(12)==HIGH) && (digitalRead(11)==LOW)) //Включена || { digitalWrite(13, LOW); } else if ((digitalRead(12)==HIGH) && (digitalRead(11)==HIGH)) //Включено среднее положение. { digitalWrite(13, HIGH); }
то все работает хорошо.
Почему-то мне кажется, что в строке 11 Вам надо сравнивать не с HIGH, а с LOW. Хотя, может я и ошибаюсь, т.к. схему Вы не привели. Но попробуйте.
Вот низкий уровень (LOW) у Вас подаётся через кнопку, которая подключена к GND. А как подаётся высокий уровень (HIGH), когда кнопка выключена (в среднем положении) ?
То есть, чтобы сработало условие по digitalRead(хх)==HIGH, на пине действительно должен быть выский уровень (+5В).
Почему-то мне кажется, что в строке 11 Вам надо сравнивать не с HIGH, а с LOW. Хотя, может я и ошибаюсь, т.к. схему Вы не привели. Но попробуйте.
Все так же - ничего не изменилось.
Вот низкий уровень (LOW) у Вас подаётся через кнопку, которая подключена к GND. А как подаётся высокий уровень (HIGH), когда кнопка выключена (в среднем положении) ?
Не очень понял, так как плохо разбираюсь по части физики.
Пытался расписать как я это понимаю, в итоге, все удалил, потому что понял, что написал полный бред и ничего я не понимаю.
Вот низкий уровень (LOW) у Вас подаётся через кнопку, которая подключена к GND. А как подаётся высокий уровень (HIGH), когда кнопка выключена (в среднем положении) ?
То есть, чтобы сработало условие по digitalRead(хх)==HIGH, на пине действительно должен быть выский уровень (+5В).
Так на пины же подается всегда +5v
Так на пины же подается всегда +5v
Откуда подаётся?
Не очень понял, так как плохо разбираюсь по части физики.
Пытался расписать как я это понимаю, в итоге, все удалил, потому что понял, что написал полный бред и ничего я не понимаю.
ОК. Чтобы на пине считался низкий уровень (LOW), туда нужно подать GND (оно же "земля" или "минус" питания). Чтобы на пине считался высокий уровень (HIGH), туда нужно подать напряжение питания (+5В для пятивольтовой ардуины).
По-умолчанию пины сконфигурированы на вход. Там нет ни LOW (GND), ни HIGH (5В). Они в высокоомном состоянии. LOW (GND) вы подаёте через кнопку. Но когда её выключаете - на пинах само по себе не появится HIGH (+5В).
Так на пины же подается всегда +5v
Откуда подаётся?
Сама arduin'а же подает на каждый пин по +5v. Или я ошибаюсь?
Не очень понял, так как плохо разбираюсь по части физики.
Пытался расписать как я это понимаю, в итоге, все удалил, потому что понял, что написал полный бред и ничего я не понимаю.
ОК. Чтобы на пине считался низкий уровень (LOW), туда нужно подать GND (оно же "земля" или "минус" питания). Чтобы на пине считался высокий уровень (HIGH), туда нужно подать напряжение питания (+5В для пятивольтовой ардуины).
По-умолчанию пины сконфигурированы на вход. Там нет ни LOW (GND), ни HIGH (5В). Они в высокоомном состоянии. LOW (GND) вы подаёте через кнопку. Но когда её выключаете - на пинах само по себе не появится HIGH (+5В).
А как туда GND подать?
Не очень понял, так как плохо разбираюсь по части физики.
Пытался расписать как я это понимаю, в итоге, все удалил, потому что понял, что написал полный бред и ничего я не понимаю.
ОК. Чтобы на пине считался низкий уровень (LOW), туда нужно подать GND (оно же "земля" или "минус" питания). Чтобы на пине считался высокий уровень (HIGH), туда нужно подать напряжение питания (+5В для пятивольтовой ардуины).
По-умолчанию пины сконфигурированы на вход. Там нет ни LOW (GND), ни HIGH (5В). Они в высокоомном состоянии. LOW (GND) вы подаёте через кнопку. Но когда её выключаете - на пинах само по себе не появится HIGH (+5В).
Аааа, вот сейчас, я кажется, понял. Сейчас попробую и отпишусь.
Сама arduin'а же подает на каждый пин по +5v. Или я ошибаюсь?
Сама ардуина ничего не подаёт. По умолчанию пины находятся в режиме входа и имеют высокоомное состояние (Hi-Z). Это значит, что там нет ни "плюса", ни "минуса". Этот пин "висит в воздухе" и ловит всяческие помехи, беспорядчно принимая различные значения.
Не буду Вас больше мучать - на пин надо принудительно подать высокий уровень через "подтягивающий резистор". Либо внешний резистор (номиналом примерно 4,7кОм - 10кОм). Либо внутренний резистор, который встроен в сам микрконтроллер. Для этого нужно правильно сконфигурировать пин - pinMode(xx, INPUT_PULLUP);
То есть, напряжение питания на пине будет всегда. И подаётся оно через резистор, чтобы не было короткого замыкания, когда подадим туда GND.
Сама arduin'а же подает на каждый пин по +5v. Или я ошибаюсь?
Сама ардуина ничего не подаёт. По умолчанию пины находятся в режиме входа и имеют высокоомное состояние (Hi-Z). Это значит, что там нет ни "плюса", ни "минуса". Этот пин "висит в воздухе" и ловит всяческие помехи, беспорядчно принимая различные значения.
Не буду Вас больше мучать - на пин надо принудительно подать высокий уровень через "подтягивающий резистор". Либо внешний резистор (номиналом примерно 4,7кОм - 10кОм). Либо внутренний резистор, который встроен в сам микрконтроллер. Для этого нужно правильно сконфигурировать пин - pinMode(xx, INPUT_PULLUP);
То есть, напряжение питания на пине будет всегда. А резистор нужен, чтобы не было короткого замыкания, когда подадим тудя GND.
Огромное Вам спасибо! Все заработало.
Отлично :-)
Думал спросить про подтяжку, но как то язык (пальцы) не повернулись. Раз уж эта тема всплыла вновь аопрос к Jeka_M чем pinMode(xx,INPUT_PULLUP) отличается от digitalWrite(xx, HIGH);pinMode(xx,INPUT). Прошу прощения что без кодовых вставок, с телефона пишу...
Блин, ТС, ну Вы нарисуете схему подключения или так и будете мозг всем выносить?
Mr.Privet Ничем, просто меньше набирать на одну строчку.
На самом деле в AVR как-раз так и включается подтяжка: 1) режим входа, 2) подаем высокий уровень. А INPUT_PULLUP это уже разрабы Arduino IDE придумали, чтобы новичкам легче было.
Ясно, напоминает одну тему тут как кто то писал библеотеку для портов...
специально для себя выписал, возможно, и тебе поможет постичь дзен
Блин, ТС, ну Вы нарисуете схему подключения или так и будете мозг всем выносить?
я запретил.