нужна помощь

salih
Offline
Зарегистрирован: 27.03.2016

здравствуйте, есть у кого нибудь время поучить меня?

 

задача есть 10 кнопок и одна лампочка. при нажатии любых трех кнопок лампа загорается

salih
Offline
Зарегистрирован: 27.03.2016

народ, помогите, уроки читал. по одной кнопке подключить могу, спаять из микросхем 3 ИЛИ-НЕ могу, а вот понять как программировать не могу

salih
Offline
Зарегистрирован: 27.03.2016

какие переменные использовать?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

salih пишет:

народ, помогите, уроки читал. по одной кнопке подключить могу, спаять из микросхем 3 ИЛИ-НЕ могу, а вот понять как программировать не могу

Спаять - это как-то из области моторных навыков. НАРИСОВАТЬ схему можете?

Если ДА, запишите это схемное решение в виде логической функции.

Если не в ладах с логикой - просто тупо посчитайте количество нажатых кнопок. Надеюсь, до трех считать умеете?

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

при правильной подтяжке нажатая кнопка выдает HIGH, то есть единичку, ненажатая - LOW, т.е нолик.
Пробегаемся в цикле по всем кнопкам и суммируем их состояние. Если сумма равна 3, то включаем лампу.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Tomasina пишет:

при правильной подтяжке нажатая кнопка выдает HIGH, то есть единичку, ненажатая - LOW, т.е нолик.
Пробегаемся в цикле по всем кнопкам и суммируем их состояние. Если сумма равна 3, то включаем лампу.

А при расово верной подтяжке - нажатая кнопка выдаёт LOW, а ненажатая - HIGH ;)

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

salih пишет:

здравствуйте, есть у кого нибудь время поучить меня?

задача есть 10 кнопок и одна лампочка. при нажатии любых трех кнопок лампа загорается

Проблема с пониманием, как написать код? Вот смотри - есть у тебя 10 кнопок, как читать их состояние, надеюсь, знаешь. Тебе надо при нажатии любых трёх выставлять нужный уровень на пине. Значит, нужно опросить состояние кнопок, и если любые 3 из них нажаты - можно делать то, что тебе нужно.

Чтобы написать грамотный код, надо понимать, что вариантов подключений и получений информации о состоянии кнопки может быть несколько. Мы для простоты будем считать, что для каждой кнопки - свой пин, однако оставим возможность читать состояние кнопки как-то по-другому. Ниже - кусок кода, который поможет тебе понять, что происходит:

#define BUTTON_ON LOW // считаем, что если уровень LOW - то кнопка нажата, описываем это здесь, чтобы можно было легко поменять в одном месте

// считаем, что у тебя для каждой кнопки свой пин, объявляем массив пинов
byte pins[10] = {1,2,3,4,5,6,7,8,9,10}; // указываешь через запятую номера пинов

// функция, читающая состояние кнопки и возвращающая единичку,
// если кнопка нажата. Если кнопки будут подключены как-то по-другому - 
// достаточно внутри функции поменять логику опроса. Пока же мы просто 
// читаем из пина

int getButtonState(int buttonNum)
{
// читаем из пина, и если там нужный уровень - возвращаем 1, иначе - 0
 return digitalRead(pins[buttonNum]) == BUTTON_ON ? 1 : 0;
}

void loop()
{
// здесь мы будем читать состояние кнопок, для простоты понимания - 
// в каждом вызове loop

// гасим лампу
digitalWrite(lampPin,LOW);

int numberOfPressedButtons = 0; // сколько кнопок нажато?

// пробегаем по всем кнопкам
for(int i=0;i<10;i++)
{
 numberOfPressedButtons  += getButtonState(i);
 if(numberOfPressedButtons > 2)
 {
  // нажаты как минимум 3 кнопки, зажигаем лампу здесь
    digitalWrite(lampPin,HIGH);
 // выходим из цикла опроса кнопок
break;
 }
 
}

}

Как видишь - всё довольно просто.

salih
Offline
Зарегистрирован: 27.03.2016

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

salih
Offline
Зарегистрирован: 27.03.2016

спасибо за "byte pins[10] = {1,2,3,4,5,6,7,8,9,10};" , а то я вводил каждый пин вручную

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

DIYMan, пара вопросов?

1. Зачем в грамотном коде на каждом проходе цикла гасить лампу?

2. Каков будет результат, если будет нажато 4 кнопки?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

andriano пишет:

DIYMan, пара вопросов?

1. Зачем в грамотном коде на каждом проходе цикла гасить лампу?

2. Каков будет результат, если будет нажато 4 кнопки?

1. Если вы заметили - я отписал в комментариях, что "для простоты понимания будем считать...". Это принцип, не более того. Или вы предлагаете сразу грузить ТС всем до кучи? Флаги вводить, интервал опроса, кучу обвязки? Зачем всё это, для понимания основ-то? Грамотность там заключается только во введении дополнительного уровня абстракции, в виде функции, которая возвращает состояние кнопки, вместо того, чтобы читать напрямую - мы не знаем, как могут быть подключены сами кнопки.

2. Так условие "нажато 4 кнопки" является подмножеством истинного "нажаты любые 3 кнопки", не находите? Других оговорок не было ;)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

DIYMan пишет:

andriano пишет:

DIYMan, пара вопросов?

1. Зачем в грамотном коде на каждом проходе цикла гасить лампу?

2. Каков будет результат, если будет нажато 4 кнопки?

1. Если вы заметили - я отписал в комментариях, что "для простоты понимания будем считать...". Это принцип, не более того. Или вы предлагаете сразу грузить ТС всем до кучи? Флаги вводить, интервал опроса, кучу обвязки? Зачем всё это, для понимания основ-то? Грамотность там заключается только во введении дополнительного уровня абстракции, в виде функции, которая возвращает состояние кнопки, вместо того, чтобы читать напрямую - мы не знаем, как могут быть подключены сами кнопки.

2. Так условие "нажато 4 кнопки" является подмножеством истинного "нажаты любые 3 кнопки", не находите? Других оговорок не было ;)

1. На мой взгляд, если уж вводить понятие "обобщенной нагрузки" намного полезнее понятия"обобщенной кенопки". По крайней мере, то, что будет использоваться именно "простая" кнопка, намного вероятнее состояния, когда выходной сигнал будет использоваться исключительно для зажигания лампочки. В общем случае при переходе из одного состояния в другое может плтребоваться один сигнал, а для перехода из второго состояние в первое - другой сигнал. При этом совершенно не исключена ситуация, когда, например, после команды на выключение двигателя, исполнительное устройство не воспринимает никакие команды вплоть до полной остановки вращения ваоа. Таким образом вместо одной команды на изменение состояния мы будем бомбардировать исполнитиельной устройство противоречащими друг другу командами. Тем более что "правильное" решение по сложности практически не отличаетсяч от Вашкго.

2. Отнюдь. Условие "нажато 3 кнопки" является подмножеством "нажато не менее 3 кнопок". Но они ни в коем случае не тождественны.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

andriano пишет:

1. На мой взгляд, если уж вводить понятие "обобщенной нагрузки" намного полезнее понятия"обобщенной кенопки". По крайней мере, то, что будет использоваться именно "простая" кнопка, намного вероятнее состояния, когда выходной сигнал будет использоваться исключительно для зажигания лампочки. В общем случае при переходе из одного состояния в другое может плтребоваться один сигнал, а для перехода из второго состояние в первое - другой сигнал. При этом совершенно не исключена ситуация, когда, например, после команды на выключение двигателя, исполнительное устройство не воспринимает никакие команды вплоть до полной остановки вращения ваоа. Таким образом вместо одной команды на изменение состояния мы будем бомбардировать исполнитиельной устройство противоречащими друг другу командами. Тем более что "правильное" решение по сложности практически не отличаетсяч от Вашкго.

2. Отнюдь. Условие "нажато 3 кнопки" является подмножеством "нажато не менее 3 кнопок". Но они ни в коем случае не тождественны.

Как вы понимаете - каждый др...чит, как хочет, и в мои задачи не входит нагрузить ТС разными понятиями, типа MVC и т.п. Для того, чтобы вводить архитектурные решения на уровне кода - надо эти самые  решения для начала иметь, вы же, основываясь на куске примерочного кода - делаете слишком далеко идущие выводы, имхо ;)

По поводу тождественности - ок, строго говоря - не тождественны, да. Однако, раз не было оговорено, что только 3 кнопки - всё прокатывает. Заметьте - было сказано "любые 3 кнопки". Это значит, что при нажатии 4,5 6 кнопок - в массиве нажатых будет N комбинаций "любые 3". Значит, необходимым и достаточным, судя  по вводным, является проверка на нажатие минимум трёх кнопок, остальное - ненужный сахар.

Мы щас своими беседами нахрен отпугнём ТС :)))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Переводим с русского на С:

"три кнокпи" -> "==3"

"ровно три кнопки" -> "==3"

"только три кнопки" -> "==3"

"не менее трех кнопок" -> ">=3"

"три или более кнопок" -> ">=3"

"по крайней мере три кнопки" -> ">=3"

разве нет?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

andriano пишет:

Переводим с русского на С:

"три кнокпи" -> "==3"

"ровно три кнопки" -> "==3"

"только три кнопки" -> "==3"

"не менее трех кнопок" -> ">=3"

"три или более кнопок" -> ">=3"

"по крайней мере три кнопки" -> ">=3"

разве нет?

Переводим с языка ТЗ на С:

"любые три кнопки" - так написано ТС, согласны? На языке С это значит ровно следующее: если из массива в N элементов как минимум 3 элемента имею статус "нажато" - задача решена. То есть, на конкретном примере, специально для вас:

1. Считаем, что кнопки у нас нумеруются от 1 до 10.

2. Считаем, что нажаты кнопки с первой по четвёртую.

3. Проверяем:

1, 2, 3 - любые три? Да => профит.

2,3,4 - любые три? Да => профит.

1,2,4 - любые три? Да => профит.

1,3,4 - любые три? Да => профит.

Следовательно, делаем вывод: при постановке задачи "если нажаты любые три кнопки" - неважно, сколько их нажато, главное, чтобы кол-во нажатых было не менее 3-х.

Вопросы?