можно ли на один пин повесить и LED и кнопку?

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Знаю, что есть расширители портов или I2C.
Можно ли обойтись без них? К примеру, параллельно светодиоду включить кнопку. Как можно отследить нажатие кнопки, если пин в состоянии output? 2 раза в секунду переключать в режим input, а параллельно LED еще конденсатор (чтобы он не гас)? Но тогда все равно на пине будет больше 2.5 Вольт, т.е. HIGH.
Зачем мне это надо? А вот свободных пинов не хватает ;)

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Tomasina, по моему это обычная практика. Конденсатор не нужен, если вы будите опрашивать кнопку раз в скажем 100мс, и переводить выход на вход на одну команду digitalRead , то глазу заметно не будет. Кнопку паралелльно светодиоду, резистор светодиода будет служить ограничителем тока кз. В момент нажатия кнопки конечно светодиод будет гаснуть.

axill
Offline
Зарегистрирован: 05.09.2011

лучше конечно применить сдвиговый регистр 74HC595

но можно и так извратиться)

кстати как вариант. использовать аналоговый выход (PWM) и настроить выход на нужную яркость, но не 100%. Настроить прерывания по нужному таймеру так, чтобы таймер срабатывал в момент сброса состояния порта (когда на порт выводится LOW). В этот момент отключать пин от PWM (в даташите описано как, могу подсказать), меняем режим на вход, опрашиваем состояние и снова включаем выход и PWM

 

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

А что еще подключено к ардуино ? Может можнт с другими выводами поиграться ? C LCD например

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

74HC595 вроде только как расширение выходов можно использовать. Или нет?
В будущем планирую это использовать:http://arduino.ru/forum/obshchii/eshche-raz-ob-uvelicheni-kolichestva-portov-io
Но сейчас я далеко от магазинов электроники, в наличии только светодиоды и резисторы разных номиналов.
Есть 10 свободных цифровых пинов, надо бюджетно подключить 8 кнопок и 8 LED (отображают состояние кнопки).

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

LED и кнопку?

Когда несколько лет назад я увидел     ЭТО   - то просто выпал в осадок.

ATtiny13ОДИН килобайт Flash , 64 байта RAM ,   всего 6 ног для сигналов

вольтметр, амперметр, датчик температуры и LCD  , вот это настоящее совместное использование ног

http://www.rlocman.ru/shem/schematics.html?di=106946

А авторы вроде поляки, http://www.elektroda.pl/

axill
Offline
Зарегистрирован: 05.09.2011

8 светодиодов и 8 кнопок можно еще подключить как матрица 3х3 светодиодов и 3х3 кнопок, с 3 общими линиями переключения.

получится 9 пинов. Три линии динамически переключаем чтобы в один момент времени HIGH был только на одном из них, динамически считываем одну лирию матрицы кнопок и динамически зажигаем одну линию светодиодов

можно подключить 9 кнопок и 9 светодиодов на 9 пинах, нажатие кнопок гасить светодиоды не будет

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

кроме параллельного подключения кнопки:

 

Google выдал еще вариант:

Что предпочтительнее?

 

axill, можно схемку? Непонятно именно подключение элементов.

axill
Offline
Зарегистрирован: 05.09.2011

Ближе к вечеру могу, если не поздно

вторая картинка из гугла не вариант, вы не избежите так короткого замыкания на выход МК. В этой картинке наверняка МК работает только на вход. Можно использовать, но последовательно с кнопкой нужен резистор

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

axill пишет:

вторая картинка из гугла не вариант, вы не избежите так короткого замыкания на выход МК. В этой картинке наверняка МК работает только на вход. Можно использовать, но последовательно с кнопкой нужен резистор

Да, схемка странная, чтобы светодиод не горел, на 5-м пине должно быть HIGH, т.е. 5 Вольт. При LOW пин коммутирует землю на катод. В момент, когда пин в состоянии output+HIGH, нажатие кнопки сжигает порт :)

Upd: хотя тут обсуждается именно такая схема, но сам пин подключен через внутренний подтягивающий резистор. Тогда, по идее, все нормально, КЗ нет.

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

axill прав. получается самый простой вариант в случае использования кнопок и светодиодов. Дополнительно, можно расмотреть встречное включение свевтодиодов на 4 пинах (получим 4 * 3 = 12 светодиодов). А можно используя 1 аналоговый вход, подключить 8 кнопок через резистивный делитель. (есть возможность использовать аналоговый вход ?)

Остается 6, на них можно матричную клавиатуру 2*4 или 3*3 повесить.

Использую схема из Гугла, получим коротыш, в случае если на ножке лог 1  и ножка сконфигурирована как выход (светодиод потушен) и кнопка нажата . Можно избежать, поставив резистор между ногой и кнопкой (номинал = 5В / 40 мА = 125 Ом, лучше 1 кОм)  (написано на 2 поста выше, просто перефразировал :))

Но, возникло следующее предположение. На схеме, нога МК сконфигурирована как вход. Подтягивающий резистор подключен к 5В, ток не течет => светодиод не горит. Но если включить подтягивающий резистор на GND на этой ноге, то ток потечет через этот резистор и светодиод загориться(управляем подтягивающим резисторомdigitalWrite(PIN, LOW) - включить светодиод, digitalWrite(PIN, HIGH) - выключить светодиод,). Чтение кнопки, как обычно digitalRead(PIN). 

надо проверить... Кто проверит ?

Главное его как выход случайно не сконфигурить (при включении он сконфигурирован как вход), иначе ...

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

roman2712@mail.ru пишет:
Главное его как выход случайно не сконфигурить (при включении он сконфигурирован как вход), иначе ...

Тогда не пойдет, нужна дуракоустойчивая схема.

axill
Offline
Зарегистрирован: 05.09.2011

roman2712@mail.ru пишет:

Но если включить подтягивающий резистор на GND

у AVR нет внутренней подтяжки на GND

Geronimo
Offline
Зарегистрирован: 06.05.2013

А если сделать такую схему, от пяти вольт на диод, от диода на нормально-замкнутую кнопку и далее на вход, через подтяжку к земле, параллельно диоду кондей, достаточной емкости. Когда нажимаем кнопку, она размыкает контакты, мк получает лог. ноль. Кондей питает диод. Кнопку отпустили, диод загорелся кондей заря дился.

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

согласен, с подтяжки на минус действительно нет... 

Тогда поставить резистор между ногой и кнопкой и смирится что во время нажатия светодиод будет тухнуть. 

Ну или использовать матричную схему включения кнопок и диодов. 

gena
Offline
Зарегистрирован: 04.11.2012

  Я бы изменил нижнюю схему так: параллельно диоду LED1 включить резистор на 10 кОм. Вывод 1 кнопки S1 подключить к аноду LED1. Т.о. не будет к.з. вывода микроконтроллера и есть подтяжка к +5 В когда вывод работает на вход.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Все говорят про какое-то КЗ в схеме из 7 поста. Откуда?  Нога контроллера пребывает в  2х состояниях  либо  output-LOW  либо в input. Эта-же схема в обучалке от ДиХалта была с примером на ассемблере. Ссылки не нашёл, но точно было :)

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

если по той схеме светодиод надо погасить, то на ногу (катод) подаем HIGH, так? Если в это время нажать кнопку, будет КЗ.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Tomasina,  гасим светик переводом пина в input.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

опа, не дошло :) А текущее состояние пина при этом сбрасывается?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Tomasina, ну да, выход "отсоединиться" :) , по сути переключение на вход можно  рассматривать не как работу с входом, а как программное отключение пина. Так что схема хорошая, а я вот изначально во 2 посте что-то не то замыслил.

axill
Offline
Зарегистрирован: 05.09.2011

dimax пишет:

Tomasina,  гасим светик переводом пина в input.

вы правы в том, что в этой схеме можно избежать КЗ, но новичку легко ошибиться

Вот вы тоже внесли ошибку :) Ошибка в последовательности "гасим, светик, переводим в инпут". Чтобы погасить светик надо на выход подать HIGH. Вот тут, пока мы не успели перевести вывод на инпут КЗ и случится. Правильно "переводим на инпут, светик и погаснет, перед тем как снова переводим на аутпут - записываем в порт LOW"

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Набил от нефик делать скетч, работающий со схемой из 7 сообщения. Мож кому понадобится как заготовка.  Нажатие кнопки циклически включает или отключает светодиод на пине "in" , сканирование кнопки раз в 15 мс.  Проверил -срабатывает чётко, без проблем.

/* проверка работы светодиода и кнопки на одном выводе. Скетч зажигает 
или гасит светодиод от нажатия на кнопку*/

#define in 7 //пин ардуино
unsigned long prevmillis = 0;
boolean state=0; 
// state 1 - светодиод светится, пин=выход
// state 0 светодиод не светится, пин=вход
void setup() {
pinMode(in, INPUT);
}
void loop() {
 
  if (millis()-prevmillis >=15) {
    
    // если светодиод светился и нажали кнопку
    if (state==1) { 
      pinMode(in, INPUT); // временно отключим светик
        if (digitalRead (in)==LOW) { // тут нажали кнопку
           while (digitalRead (in)==LOW); //антидребезговое..
           delay(100);  //антидребезговое..
           state= 0; // меняем режим. А пин оставим как есть (пин=вход) 
         }
           else pinMode(in, OUTPUT); //если кнопку не нажимали -обратно включим
  }
   //если светодиод не светился и нажали кнопку    
  if (state==0 && digitalRead (in)==LOW ) {
      while (digitalRead (in)==LOW);  //антидребезговое..
      pinMode  (in, OUTPUT); //включим светик 
      state=1;
    }
  //сбросить таймер проверки состояния
   prevmillis=millis();
}
}