Управление группой реле кнопками без фиксации.

Hairtone
Offline
Зарегистрирован: 23.12.2015

Добрый день!
Требуется управление группой реле, кнопками без фиксации.
Дано
5 кнопок без фиксации = 5 реле
1я кнопка нажимается = включается 1е реле, остальные 4 отключены (время бесконечно)
2я кнопка нажимается = включается 2е реле, 1,3,4,5 реле отключаются.
3я кнопка нажимается = включается 3е реле, а 1,2,4,5 реле отключаются.
И так далее. Последовательность вкючения может быть любая. 
Общий смысл, одно реле включается, все остальные (ранее включенные) отключаются.

Модуль ардуино с группой реле.
Кнопки - простое замыкание одного из 5 входов на землю.
Нужен код.

 

 

_Igor_
Offline
Зарегистрирован: 10.01.2022
Dumper
Offline
Зарегистрирован: 21.09.2020

Если вдруг кто возьмётся, выложите скетч после оплаты. Ну так, чисто из любопытства.
Насколько компактно можно переложить этот примитив

sadman41
Offline
Зарегистрирован: 19.10.2016

Кнопарь устанавливает бит в байте, байт пишется в порт. Наверное короче некуда.

man9913
Offline
Зарегистрирован: 19.03.2016
Kakmyc
Offline
Зарегистрирован: 15.01.2018
Kakmyc
Offline
Зарегистрирован: 15.01.2018

Dumper пишет:
Если вдруг кто возьмётся, выложите скетч после оплаты. Ну так, чисто из любопытства.
Насколько компактно можно переложить этот примитив

А почему это примитив ?
Если делать все по уму, то примитивом там и не пахнет.
Тем более коротким кодом.
Как минимум нигде не указано, что невозможна ситуация при которой одновременно будут нажаты несколько кнопок, а написано, что реле должны быть включены согласно последней нажатой кнопки. Т.е. как минимум уже нужно отслеживать предыдущее состояние кнопок и плясать именно от него.

Green
Offline
Зарегистрирован: 01.10.2015

Конечно примитив. Самый короткий код будет у меня.) htpicc@gmail.com

Wizard2022
Offline
Зарегистрирован: 22.02.2022

Сделаю   wizard-sen@yandex.ru

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Green пишет:

Конечно примитив. Самый короткий код будет у меня.) htpicc@gmail.com


Далеко не факт.
Самый короткий код , без учёта нюансов, будет длиной в три строки, по одному действию в каждой.

Dumper
Offline
Зарегистрирован: 21.09.2020

Kakmyc пишет:
Далеко не факт

Инверсия соревнования. У кого короче)

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Дьявол, как всегда , кроется в н̶ю̶а̶н̶с̶а̶х̶ деталях.

Dumper
Offline
Зарегистрирован: 21.09.2020

Ну, видимо, студенту решение нужно будет самое простое, а не короткое, т.к. спрос с него же и будет.

А в междусобойчике мне, например, интересно решение титанов форума.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Kakmyc пишет:
Green пишет:

Конечно примитив. Самый короткий код будет у меня.) htpicc@gmail.com

Далеко не факт. Самый короткий код , без учёта нюансов, будет длиной в три строки, по одному действию в каждой.

с антидребезгом три? хммм...

Dumper
Offline
Зарегистрирован: 21.09.2020

wdrakula пишет:
с антидребезгом три? хммм...

Так про антридребезг ни слова в задании, как и про нажатие нескольких кнопок одновременно.

Так к условию и запись в еепром можно добавить. Зачем?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

wdrakula пишет:

Kakmyc пишет:
Green пишет:

Конечно примитив. Самый короткий код будет у меня.) htpicc@gmail.com

Далеко не факт. Самый короткий код , без учёта нюансов, будет длиной в три строки, по одному действию в каждой.

с антидребезгом три? хммм...

Да вполне себе три строчки.
Если конечно отталкиваться от описания данного ТС.
Нам тогда всего лишь нужны два порта , один для входа, второй для выхода.

Строка 1: настраиваем направление одного из портов на вывод.
Строка 2: подтягиваем входа порта 2 к VCC
Строка 3: записываем в порт 1 инвертированные значение порта 2.

Вот по ТЗ, все проходит.
Но тут начинаются нюансы , типа одновременного нажатия и прочие интересности.

ЗЫ: обманул малость.
Ещё нужно прерывания PCINT на порту входа включить, и строку 3 засунуть в функцию прерывания.
Ещё плюсом три строки.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Kakmyc пишет:
Строка 1: настраиваем направление одного из портов на вывод.

Давай позанудствуем. Плата не указана, так что про порты сразу забыли, ОК? Чистая библиотека wiring  и никаких портов.

Поэтому строчка задания массива пинов кнопок, строчка  - реле, и в сетапе по строчке на инициализацию пинмодов. Так уж и быть - в цикле ;). Хотя при структурном программировании  писать тело for в той же строке - не принято.

Дальше станем дискутировать? Никаких "трёх строчек" и в помине нет.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Kakmyc пишет:
3: записываем в порт 1 инвертированные значение порта

по ТЗ - не проходит. По ТЗ всегда работает ровно одно реле. Нет этой защиты в твоем варианте. Про одновременные кнопки не сказано. но про РОВНО ОДНО реле сказано четко. такшта..... ;))))))

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

wdrakula пишет:

Kakmyc пишет:
3: записываем в порт 1 инвертированные значение порта

по ТЗ - не проходит. По ТЗ всегда работает ровно одно реле. Нет этой защиты в твоем варианте. Про одновременные кнопки не сказано. но про РОВНО ОДНО реле сказано четко. такшта..... ;))))))

 

Занудствовать, так занудствовать.
Как написано :"нажимаем кнопку 1" , "включается реле 1, остальные выключается", ровно так все и работает.
Ситуации, когда "нажали кнопку 1 и нажали кнопку 2" , в природе вселенной ТС'а не существует.

rst
Offline
Зарегистрирован: 25.06.2018

Dumper пишет:
Так про антридребезг ни слова в задании
А зачем тут какой-то антидребезг? Если предположить, что ТС не предполагает нажимать кнопки при нажатых других кнопках, то антидребезг здесь совершенно не нужен.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Kakmyc пишет:
wdrakula пишет:

Kakmyc пишет:
3: записываем в порт 1 инвертированные значение порта

по ТЗ - не проходит. По ТЗ всегда работает ровно одно реле. Нет этой защиты в твоем варианте. Про одновременные кнопки не сказано. но про РОВНО ОДНО реле сказано четко. такшта..... ;))))))

 

Занудствовать, так занудствовать. Как написано :"нажимаем кнопку 1" , "включается реле 1, остальные выключается", ровно так все и работает. Ситуации, когда "нажали кнопку 1 и нажали кнопку 2" , в природе вселенной ТС'а не существует.

не подставляйся! Вот цитата из первого поста ТС:

Hairtone пишет:

Общий смысл, одно реле включается, все остальные (ранее включенные) отключаются.

Ровно одно реле. Твой вариант не соответствует ТЗ. Не будь дамой - ошибся в споре - признавай!

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Ну так про "нажимаем две кнопки" там тем более ничего нет.
Пусть ставит кнопки с механической блокировкой :-)

_Igor_
Offline
Зарегистрирован: 10.01.2022

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

Код - 100 строк. Задачи минимизировать не стояла. Лучший код - работающий код.

Предлагаю тему не будоражить.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

100 строк это конечно сильно...

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

_Igor_ пишет:

Предлагаю тему не будоражить.

Родное сердце! Без обид, но что тебе нужно "будоражить", или наоборот - не нужно, ты подруге своей предлагай. Мы как-нибудь сами разберемся.

SLKH
Offline
Зарегистрирован: 17.08.2015

Kakmyc пишет:
100 строк это конечно сильно...

 антидребезг, одно реле: 35 строк, в том числе:

16 из них содержат только одиночную скобку "{" или "}", 

2 строки - setup+loop

и остальные по одному оператору.

без трюков, только wiring. номера пинов произвольные в массивах.

Скетч использует 1284 байт (4%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 19 байт (0%) динамической памяти, оставляя 2029 байт для локальных переменных. Максимум: 2048 байт.
Green
Offline
Зарегистрирован: 01.10.2015

SLKH пишет:

 антидребезг, одно реле: 35 строк...

Уложусь в 25 строк.) Что значит "одно реле"?

SLKH
Offline
Зарегистрирован: 17.08.2015

Green пишет:

SLKH пишет:

 антидребезг, одно реле: 35 строк...

Уложусь в 25 строк.) Что значит "одно реле"?

как в задании - одновременно работает не более одного реле.

Строки я не экономил, писал набросок "как для себя" - чтобы прозрачно и без наворотов. Получилось столько, сколько получилось.

Перейти от моего форматирования к кривой расстановке фигурных скобок - будет на 8 строк меньше, т.е. 27 номеров. Можно еще 2 пары убрать (работать будет, но мне не нравится), как раз 25 будет.

Dumper
Offline
Зарегистрирован: 21.09.2020

S123T пишет:
Dumper а денежка будет за скеч ?

Деньги были, деньги будут. Сейчас денег нет

Green
Offline
Зарегистрирован: 01.10.2015

...но вы держИтесь!

Dumper
Offline
Зарегистрирован: 21.09.2020

S123T пишет:
что совсем совсем нет ? да как так то ? может блинк тогда, за рублей 500 хотя бы, а если 1000 есть то я такой блинк напишу, да так коротко, что вы даже не видели такого ни разу, но это не точно

во как. ну пиши за тыщу. номер карты пришлю в лс.

rst
Offline
Зарегистрирован: 25.06.2018

SLKH пишет:
Глобальные переменные используют 19 байт (0%) динамической памяти
А динамическая память-то зачем для такой примитивной задачи???

SLKH
Offline
Зарегистрирован: 17.08.2015

rst пишет:

SLKH пишет:
Глобальные переменные используют 19 байт (0%) динамической памяти
А динамическая память-то зачем для такой примитивной задачи???

а я знаю? Вот программа покороче:

======

void setup() {
  // put your setup code here, to run once:
 
}
 
void loop() {
  // put your main code here, to run repeatedly:
 
}
=========
Скетч использует 444 байт (1%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 9 байт (0%) динамической памяти, оставляя 2039 байт для локальных переменных. Максимум: 2048 байт.

 

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

Я так понял на ТС уже заработали. )

Мои 22 строчки кода в эмуляторе.

https://wokwi.com/projects/335969723980186196

 

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

S123T пишет:

ты на битву титанов ? 

Не, я чёт программирование забросил, решил на простоте вспомнить.

Никогда не зарабатывал на программировании.

S123T пишет:

код ... лень проверять))) 

Чё код то проверять, кнопочки в эмуляторе нажимаешь, работает - работает.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

AndreyD пишет:

Я так понял на ТС уже заработали. )

Мои 22 строчки кода в эмуляторе.

https://wokwi.com/projects/335969723980186196

 

Работает неправильно - горят все, при нажатии кнопки нужный гаснет. А должно быть наоборот :D)))))

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

v258 пишет:

Работает неправильно - горят все, при нажатии кнопки нужный гаснет. А должно быть наоборот :D)))))

Реле обычно работает по минусу.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Реле работают по разному ))

Green
Offline
Зарегистрирован: 01.10.2015

Реле - это ладно. Первое нажатие. lastButton = 0. digitalWrite(relayPins[lastButton-1], HIGH); Куда мы пишем? 

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

Green пишет:

Реле - это ладно. Первое нажатие. lastButton = 0. digitalWrite(relayPins[lastButton-1], HIGH); Куда мы пишем? 

Внутри условия 16 строка lastButton никогда не будет = 0

Green
Offline
Зарегистрирован: 01.10.2015

"Да сьто вы говолите." Добавил Serial.

mifar
Offline
Зарегистрирован: 07.04.2021

AndreyD пишет:

Внутри условия 16 строка lastButton никогда не будет = 0

А при первом проходе?

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

Green пишет:

"Да сьто вы говолите." Добавил Serial.

Соглашусь что туплю и ошибаюсь, но в эмуляторе всё работает же ж.

Green
Offline
Зарегистрирован: 01.10.2015

Достаточно исправить на if (lastButton) digitalWrite(relayPins[lastButton-1], HIGH); "Но, неприятный осадок остался.")))

b707
Offline
Зарегистрирован: 26.05.2017

S123T пишет:

1int *i;
2int q = 1000;
3void setup(){
4i=36;
5*i|=32;
6i=35; }
7void loop(){
8*i|=32;
9delay(q); }

вот вам блинк офигенный

где-то я это уже видел... плагиат? :)

Green
Offline
Зарегистрирован: 01.10.2015

Немного изгальнувшись:)
 

01uint8_t key_rel[] = {/*кнопки: */2, 3, 4, 5, 6,  /*реле: */7, 8, 9, 10, 11}; //пины
02 
03void 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 
08void 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}

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Green пишет:

Немного изгальнувшись:)
 

01uint8_t key_rel[] = {/*кнопки: */2, 3, 4, 5, 6,  /*реле: */7, 8, 9, 10, 11}; //пины
02 
03void 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 
08void 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}

 

В этом коде одни сплошные "нюансы".
Мало того, что исключена возможность нажатия нескольких кнопок, так еще и неизвестно , какая кнопка была нажата последней.
А стало быть код не отвечает условию задачи

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Green пишет:

Немного изгальнувшись:)
 

1uint8_t key_rel[] = {/*кнопки: */2, 3, 4, 5, 6,  /*реле: */7, 8, 9, 10, 11}; //пины
2 
3void 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 появились в С++, а мы пишем "как на Фортране". Пох..ю мороз! Это же читать невозможно. Кровавые слёзы из глазьев тикуть....

01const byte ButtonPins[] = {2, 3, 4, 5, 6};
02const byte RelayPins[] = {7, 8, 9, 10, 11};
03 
04const byte debonceInt = 30;
05 
06void 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}

 

NikShel
Offline
Зарегистрирован: 21.01.2018

Подписаться

Green
Offline
Зарегистрирован: 01.10.2015

Kakmyc пишет:
В этом коде одни сплошные "нюансы". Мало того, что исключена возможность нажатия нескольких кнопок, так еще и неизвестно , какая кнопка была нажата последней. А стало быть код не отвечает условию задачи

Kakmyc, уж я бы лучше помолчала бы.) В три строки тут явно никак. И где в условиях про "возможность нажатия нескольких кнопок"? Не смеши.

Green
Offline
Зарегистрирован: 01.10.2015

wdrakula пишет:

Б..же! Что это??

Это Бейсик из школы? Давно уже всякие foreach и auto появились в С++, а мы пишем "как на Фортране". Пох..ю мороз! Это же читать невозможно. Кровавые слёзы из глазьев тикуть....


Граф. При всём уважении. Ну что здесь не Сишного? Неужто отвык? И даже "писать тело for в той же строке - не принято" и то выполнено. А foreach-и с auto здесь не играют на размер, согласись?