Управление группой реле кнопками без фиксации.
- Войдите на сайт для отправки комментариев
Втр, 28/06/2022 - 23:36
Добрый день!
Требуется управление группой реле, кнопками без фиксации.
Дано
5 кнопок без фиксации = 5 реле
1я кнопка нажимается = включается 1е реле, остальные 4 отключены (время бесконечно)
2я кнопка нажимается = включается 2е реле, 1,3,4,5 реле отключаются.
3я кнопка нажимается = включается 3е реле, а 1,2,4,5 реле отключаются.
И так далее. Последовательность вкючения может быть любая.
Общий смысл, одно реле включается, все остальные (ранее включенные) отключаются.
Модуль ардуино с группой реле.
Кнопки - простое замыкание одного из 5 входов на землю.
Нужен код.
iogi@mail.ru
Если вдруг кто возьмётся, выложите скетч после оплаты. Ну так, чисто из любопытства.
Насколько компактно можно переложить этот примитив
Кнопарь устанавливает бит в байте, байт пишется в порт. Наверное короче некуда.
man9913@mail.ru
200р
kakmycmail@gmail.com
Насколько компактно можно переложить этот примитив
А почему это примитив ?
Если делать все по уму, то примитивом там и не пахнет.
Тем более коротким кодом.
Как минимум нигде не указано, что невозможна ситуация при которой одновременно будут нажаты несколько кнопок, а написано, что реле должны быть включены согласно последней нажатой кнопки. Т.е. как минимум уже нужно отслеживать предыдущее состояние кнопок и плясать именно от него.
Конечно примитив. Самый короткий код будет у меня.) htpicc@gmail.com
Сделаю wizard-sen@yandex.ru
Конечно примитив. Самый короткий код будет у меня.) htpicc@gmail.com
Далеко не факт.
Самый короткий код , без учёта нюансов, будет длиной в три строки, по одному действию в каждой.
Инверсия соревнования. У кого короче)
Дьявол, как всегда , кроется в н̶ю̶а̶н̶с̶а̶х̶ деталях.
Ну, видимо, студенту решение нужно будет самое простое, а не короткое, т.к. спрос с него же и будет.
А в междусобойчике мне, например, интересно решение титанов форума.
Конечно примитив. Самый короткий код будет у меня.) htpicc@gmail.com
с антидребезгом три? хммм...
Так про антридребезг ни слова в задании, как и про нажатие нескольких кнопок одновременно.
Так к условию и запись в еепром можно добавить. Зачем?
Конечно примитив. Самый короткий код будет у меня.) htpicc@gmail.com
с антидребезгом три? хммм...
Да вполне себе три строчки.
Если конечно отталкиваться от описания данного ТС.
Нам тогда всего лишь нужны два порта , один для входа, второй для выхода.
Строка 1: настраиваем направление одного из портов на вывод.
Строка 2: подтягиваем входа порта 2 к VCC
Строка 3: записываем в порт 1 инвертированные значение порта 2.
Вот по ТЗ, все проходит.
Но тут начинаются нюансы , типа одновременного нажатия и прочие интересности.
ЗЫ: обманул малость.
Ещё нужно прерывания PCINT на порту входа включить, и строку 3 засунуть в функцию прерывания.
Ещё плюсом три строки.
Давай позанудствуем. Плата не указана, так что про порты сразу забыли, ОК? Чистая библиотека wiring и никаких портов.
Поэтому строчка задания массива пинов кнопок, строчка - реле, и в сетапе по строчке на инициализацию пинмодов. Так уж и быть - в цикле ;). Хотя при структурном программировании писать тело for в той же строке - не принято.
Дальше станем дискутировать? Никаких "трёх строчек" и в помине нет.
по ТЗ - не проходит. По ТЗ всегда работает ровно одно реле. Нет этой защиты в твоем варианте. Про одновременные кнопки не сказано. но про РОВНО ОДНО реле сказано четко. такшта..... ;))))))
по ТЗ - не проходит. По ТЗ всегда работает ровно одно реле. Нет этой защиты в твоем варианте. Про одновременные кнопки не сказано. но про РОВНО ОДНО реле сказано четко. такшта..... ;))))))
Занудствовать, так занудствовать.
Как написано :"нажимаем кнопку 1" , "включается реле 1, остальные выключается", ровно так все и работает.
Ситуации, когда "нажали кнопку 1 и нажали кнопку 2" , в природе вселенной ТС'а не существует.
по ТЗ - не проходит. По ТЗ всегда работает ровно одно реле. Нет этой защиты в твоем варианте. Про одновременные кнопки не сказано. но про РОВНО ОДНО реле сказано четко. такшта..... ;))))))
не подставляйся! Вот цитата из первого поста ТС:
Общий смысл, одно реле включается, все остальные (ранее включенные) отключаются.
Ровно одно реле. Твой вариант не соответствует ТЗ. Не будь дамой - ошибся в споре - признавай!
Ну так про "нажимаем две кнопки" там тем более ничего нет.
Пусть ставит кнопки с механической блокировкой :-)
Программа сдана заказчику. Есть и дребезг и нажатие нескольких кнопок и другие нюансы.
Код - 100 строк. Задачи минимизировать не стояла. Лучший код - работающий код.
Предлагаю тему не будоражить.
100 строк это конечно сильно...
Предлагаю тему не будоражить.
Родное сердце! Без обид, но что тебе нужно "будоражить", или наоборот - не нужно, ты подруге своей предлагай. Мы как-нибудь сами разберемся.
антидребезг, одно реле: 35 строк, в том числе:
16 из них содержат только одиночную скобку "{" или "}",
2 строки - setup+loop
и остальные по одному оператору.
без трюков, только wiring. номера пинов произвольные в массивах.
антидребезг, одно реле: 35 строк...
Уложусь в 25 строк.) Что значит "одно реле"?
антидребезг, одно реле: 35 строк...
Уложусь в 25 строк.) Что значит "одно реле"?
Строки я не экономил, писал набросок "как для себя" - чтобы прозрачно и без наворотов. Получилось столько, сколько получилось.
Перейти от моего форматирования к кривой расстановке фигурных скобок - будет на 8 строк меньше, т.е. 27 номеров. Можно еще 2 пары убрать (работать будет, но мне не нравится), как раз 25 будет.
Деньги были, деньги будут. Сейчас денег нет
...но вы держИтесь!
во как. ну пиши за тыщу. номер карты пришлю в лс.
======
Я так понял на ТС уже заработали. )
Мои 22 строчки кода в эмуляторе.
https://wokwi.com/projects/335969723980186196
ты на битву титанов ?
Не, я чёт программирование забросил, решил на простоте вспомнить.
Никогда не зарабатывал на программировании.
код ... лень проверять)))
Чё код то проверять, кнопочки в эмуляторе нажимаешь, работает - работает.
Я так понял на ТС уже заработали. )
Мои 22 строчки кода в эмуляторе.
https://wokwi.com/projects/335969723980186196
Работает неправильно - горят все, при нажатии кнопки нужный гаснет. А должно быть наоборот :D)))))
Работает неправильно - горят все, при нажатии кнопки нужный гаснет. А должно быть наоборот :D)))))
Реле обычно работает по минусу.
Реле работают по разному ))
Реле - это ладно. Первое нажатие. lastButton = 0. digitalWrite(relayPins[lastButton-1], HIGH); Куда мы пишем?
Реле - это ладно. Первое нажатие. lastButton = 0. digitalWrite(relayPins[lastButton-1], HIGH); Куда мы пишем?
Внутри условия 16 строка lastButton никогда не будет = 0
"Да сьто вы говолите." Добавил Serial.
Внутри условия 16 строка lastButton никогда не будет = 0
А при первом проходе?
"Да сьто вы говолите." Добавил Serial.
Соглашусь что туплю и ошибаюсь, но в эмуляторе всё работает же ж.
Достаточно исправить на if (lastButton) digitalWrite(relayPins[lastButton-1], HIGH); "Но, неприятный осадок остался.")))
1
int
*i;
2
int
q = 1000;
3
void
setup
(){
4
i=36;
5
*i|=32;
6
i=35; }
7
void
loop
(){
8
*i|=32;
9
delay(q); }
вот вам блинк офигенный
где-то я это уже видел... плагиат? :)
Немного изгальнувшись:)
01
uint8_t key_rel[] = {
/*кнопки: */
2, 3, 4, 5, 6,
/*реле: */
7, 8, 9, 10, 11};
//пины
02
03
void
setup
() {
04
for
(uint8_t i = 0; i <
sizeof
(key_rel); i++)
//реле активны высоким уровнем
05
i <
sizeof
(key_rel) / 2 ? pinMode(i, INPUT_PULLUP) : digitalWrite(key_rel[i], LOW), pinMode(key_rel[i], OUTPUT);
06
}
07
08
void
loop
() {
09
uint8_t key = 0;
10
for
(uint8_t i = 0; i <
sizeof
(key_rel) / 2; i++)
11
key |= !digitalRead(key_rel[i])<<i;
//кнопки активны низким
12
for
(uint8_t i = 0; i <
sizeof
(key_rel) / 2; i++)
13
if
(key == 1<<i)
//если нажата одна кнопка
14
for
(uint8_t j =
sizeof
(key_rel) / 2; j <
sizeof
(key_rel); j++)
15
digitalWrite(key_rel[j], i +
sizeof
(key_rel) / 2 == j ? HIGH : LOW);
16
}
Немного изгальнувшись:)
01
uint8_t key_rel[] = {
/*кнопки: */
2, 3, 4, 5, 6,
/*реле: */
7, 8, 9, 10, 11};
//пины
02
03
void
setup
() {
04
for
(uint8_t i = 0; i <
sizeof
(key_rel); i++)
//реле активны высоким уровнем
05
i <
sizeof
(key_rel) / 2 ? pinMode(i, INPUT_PULLUP) : digitalWrite(key_rel[i], LOW), pinMode(key_rel[i], OUTPUT);
06
}
07
08
void
loop
() {
09
uint8_t key = 0;
10
for
(uint8_t i = 0; i <
sizeof
(key_rel) / 2; i++)
11
key |= !digitalRead(key_rel[i])<<i;
//кнопки активны низким
12
for
(uint8_t i = 0; i <
sizeof
(key_rel) / 2; i++)
13
if
(key == 1<<i)
//если нажата одна кнопка
14
for
(uint8_t j =
sizeof
(key_rel) / 2; j <
sizeof
(key_rel); j++)
15
digitalWrite(key_rel[j], i +
sizeof
(key_rel) / 2 == j ? HIGH : LOW);
16
}
В этом коде одни сплошные "нюансы".
Мало того, что исключена возможность нажатия нескольких кнопок, так еще и неизвестно , какая кнопка была нажата последней.
А стало быть код не отвечает условию задачи
Немного изгальнувшись:)
1
uint8_t key_rel[] = {
/*кнопки: */
2, 3, 4, 5, 6,
/*реле: */
7, 8, 9, 10, 11};
//пины
2
3
void
setup
() {
4
for
(uint8_t i = 0; i <
sizeof
(key_rel); i++)
//реле активны высоким уровнем
5
i <
sizeof
(key_rel) / 2 ? pinMode(i, INPUT_PULLUP) : digitalWrite(key_rel[i], LOW), pinMode(key_rel[i], OUTPUT);
6
}
Б..же! Что это??
Это Бейсик из школы? Давно уже всякие foreach и auto появились в С++, а мы пишем "как на Фортране". Пох..ю мороз! Это же читать невозможно. Кровавые слёзы из глазьев тикуть....
01
const
byte
ButtonPins[] = {2, 3, 4, 5, 6};
02
const
byte
RelayPins[] = {7, 8, 9, 10, 11};
03
04
const
byte
debonceInt = 30;
05
06
void
setup
() {
07
for
(auto p : ButtonPins) {
08
pinMode(p, INPUT_PULLUP);
09
}
10
for
(auto p : RelayPins) {
11
digitalWrite(p, 1);
12
pinMode(p, OUTPUT);
13
}
14
}
Подписаться
Kakmyc, уж я бы лучше помолчала бы.) В три строки тут явно никак. И где в условиях про "возможность нажатия нескольких кнопок"? Не смеши.
Б..же! Что это??
Это Бейсик из школы? Давно уже всякие foreach и auto появились в С++, а мы пишем "как на Фортране". Пох..ю мороз! Это же читать невозможно. Кровавые слёзы из глазьев тикуть....
Граф. При всём уважении. Ну что здесь не Сишного? Неужто отвык? И даже "писать тело for в той же строке - не принято" и то выполнено. А foreach-и с auto здесь не играют на размер, согласись?