Добрый день. Возникла необходимость на одном контакте иметь светодиод и кнопку. При этом светодиод светится постоянно, но с кнопки надо считывать нажатия. И что-то не получается это реализовать. На плате светодиод подключен анодом к +5В, а катодом к выводу МК. А кнопка подключена между землей и ногой контроллера. Вот кусок кода: Код (C++): void setup() { pinMode(btn3, INPUT); Serial.begin(9600); Serial.println("Ready..."); } void loop() { byte val3 = readBtn(btn3); } int readBtn(int num){ Serial.print("readBtn "); Serial.print(num); Serial.print(": "); pinMode(num, INPUT); //Переключил в режим входа digitalWrite(num, HIGH); //Подтянул резистор к +5В int val = digitalRead(num); //Считал данные с ноги pinMode(num, OUTPUT); //Возврат к режиму вывода Serial.println(val); return val; } Затык в процедуре readBtn. Почему-то digitalRead не возвращает 0. Там всегда 1. Нажимая на кнопку, я вижу, что на ногу приходит 0, т.к. светодиод включается. Что я не так делаю?
Я упростил описание. На самом деле там семисегметный индикатор и к четырем сегментам привязаны кнопки. Это не мое изобретение. Ковыряю сломанную вытяжку.
Это и есть по делу. Вешайте светодиод на +5В. А если мало ног пользуйтесь расширителями, вариантов масса. Вы же пытаетесь какой то шим организовать между периодами которого снимаете показания. Для спортивного интереса что ли? И что, светодиод воткнут катодом в пин?
Про "по делу" это я для akl написал. Не люблю подобные ответы. Про схему. Я не могу использовать расширители или пр. Блок кнопок и индикации на отдельной плате, которая по геометрии подогнана к устройству. Плюс провода и пр. И переразводить ее я пока не готов. Блока управления просто нет. Его когда-то пожгли электрики. Вроде забрали, чтобы починить, и понятное дело, пропали. Поэтому, что там было, я понятия не имею. Найти в инете схему устройства не получилось. Поэтому изобретаю сам. Схема одного сегмента. Индикатор с общим анодом. Никаких резисторов на плате нет. Контакты сведены в один разъем.
На самом деле GND просто сведены на один контакт. Не факт, что это именно общий провод всей схемы. Что-то я начинаю подозревать, что эта цепь выводилась на один из контактов контроллера. Правда, как всем этим управлять, я не понимаю. Получается, то СД накоротко с питанием подключается, то кнопка коротит два контакта МК, +5В, тоже просто контакт на разъеме. Но не думаю, что он подключался к выводу МК. Там тока не хватит.
А там была Ардуина?В вытяжке?Любой выход может работать и как вход.По прерываниям.Но для этого надо писать или на ассемблере или на си.Среда Ардуино IDE это не позволяет.
Ну, ардуна, там вряд ли стояла. ))))) То, что любой контакт работает и на вход и на выход я в курсе. Вот и пытаюсь переключать направление. Не совсем понял, что именно не позволяет Ардуино IDE. Писать на Ассемблере? Или нельзя в основном цикле изменять направление работы вывода? Кстати, а можно ли использовать прерывание на пине, который сконфигурирован как OUTPUT?
Не позволяет работать в прерываниях хотя не совсем так позволяет только Int0 и Int1.Теоретически да практически не помню чтобы кто то пробовал.Попробуйте и отпишитесь.
В моем случае прерывание особо не поможет. Это я спросил чисто из академического интереса. После получения прерывания все равно придется считать данные, чтобы определиться какая кнопка нажата. А у меня не получается перевести контакт на вход. Так все-таки главный вопрос. Можно ли и как изменить направление работы контакта в основном цикле? Функция pinMode похоже не работает.
Схема дич конечно. Может быть какие то элементы скрываются за JP? Или это пины контроллера? Если второе, то очень странно как это вообще работает. Для светодиода пин является землей без резистора, а для кнопки пином без притяжки. Чушь и то и другое.
Вот пытаюсь теоретизировать. Быстро переключая вход на выход чего добьемся? Либо земля от пина, либо от кнопки, либо кнопка навесу, тогда шим на сд. То есть он или горит в полсилы (при отжатой кнопке) или в полную силу (при нажатой). В промежутках можно отслеживать состояние кнопки. Но нафига такие страдания? Сдается мне вы не правильно поняли логику схемы.
Вот без понятия. Я уже писал, что платы контроллера нет. Есть только плата управления с кнопками и индикатором. Поэтому полет фантазии не ограничен ни чем. Ломаю голову второй день. Собственно, выводы, которые я обозначил как +5В и GND, скорее всего таковыми не являются. Это скорее всего тоже ноги процессора. Я их переподключил и несколько изменил программу. Алгоритм следующий. Для включения СД на +5В подается высокий уровень с ноги МК. Катод СД подключен к ноге МК, на которую подается 0. Т.е. по факту каждый светодиод подключается между двумя контактами МК. При этом никаких резисторов нет. Сам удивляюсь, но это работает и даже яркость не падает и СД не горит. На плате стоит индикатор KT10391. Но в его даташите тоже резисторы не указаны. Для кнопок цепь GND тоже подключается к контакту МК, на который подается 0. Но это делается не постоянно, а только в момент считывания данных. Соответственно, через цепь катода СД делается считывание данных. Эта часть не работает. Пока мне так и не удалось считать данные с кнопок. Но есть у меня одна мысль. Надеюсь заработает.
YES!!!!!! Я ее расковырял. Итак. 1. Как я и писал раньше цепи +5В и GND - это отдельные ноги на МК. Дальше я буду использовать именно эти названия чтобы не было путаницы. 2. Никаких переключений INPUT / OUTPUT не надо. +5В и все катоды СД определяются как OUTPUT GND - определяется как INPUT и подключается подтягивающий резистор. 3. Для вывода данных на индикатор на нужные линии подается 0. 4. Для чтения данных с кнопок запускается процедура чтения. Но! В цикле на нужную ногу подается 0. Остальные устанавливаются в 1. Производится чтение на контакте GND. Если считано значение 0 - значит кнопка нажата. 5. Процедуру чтения кнопок запускаю раз в 50 мс. Эта схема работает.