Обсуждаем цифровые устройства...
Ответить

кнопка + 3 светодиода

Сб мар 06, 2021 18:41:52

Добрый день форумчане! Прошу не большой помощи. Есть скетч (выдернул с управления RGB светодиодами) управаление кнопкой поочередно включать и потом не начинать сначала а возвращаться. Сейсас: красный, желтый, зеленый. и цикл начинается снова. Надо при следующих нажатиях: зеленый, желтый красный. И еще одна беда. При включении последнего светодиода требуется нажать кнопку ещё раз. Лишний.

#define BLED 9 //9 контакт для синего вывода RGB-светодиода
#define GLED 10 //10 контакт для зеленого вывода RGB-светодиода
#define RLED 11 //11 контакт для красного вывода RGB-светодиода
#define BUTTON 2 //2 контакт для кнопки

boolean lastButton = LOW; //предыдущее состояние кнопки
boolean currentButton = LOW; //текущее состояние кнопки
int ledMode = 0; //статус RGB-светодиода

void setup()
{
pinMode (BLED, OUTPUT); //Устанавливаем контакт BLED(Blue LED, т.е 9 контакт) как выход
pinMode (GLED, OUTPUT); //Устанавливаем контакт GLED(Green LED, т.е 9 контакт) как выход
pinMode (RLED, OUTPUT); //Устанавливаем контакт RLED(Red LED, т.е 9 контакт) как выход
pinMode (BUTTON, INPUT); //Устанавливаем контакт BUTTON(т.е. 2 контакт) как вход(опционально)
}

void loop()
{
currentButton = debounce(lastButton); //считываем состояние кнопки с применением "антидребезга"
if (lastButton == LOW && currentButton == HIGH) //если кнопка была нажата
{
ledMode++; //инкрементируем значение переменной
}
lastButton = currentButton; //сохраняем текущее состояние кнопки в предыдущее

if (ledMode == 4) ledMode = 0; //если прошли по циклу все режимы свечения светодиода, делаем сброс до 0
setMode(ledMode); //изменить режим светодиода
}

/*
* Функция антидребезга
* принимает предыдущее значение кнопки и возвращает текущее состояние кнопки с подавлением дребезга контактов
*/
boolean debounce(boolean last)
{
boolean current = digitalRead(BUTTON); //считываем состояние кнопки
if (last != current) //если есть изменения
{
delay(5); //ждем 5мс
current = digitalRead(BUTTON); //считываем состояние кнопки
}
return current; //возвращаем, считанное состояние кнопки
}

/*
* Выбор режима работы светодиода
* Передача номера режима и его установка
* Функция ничего не возвращает
*/
void setMode(int mode)
{
//Красный
if (mode == 1)
{
digitalWrite(RLED, HIGH);
digitalWrite(GLED, LOW);
digitalWrite(BLED, LOW);
}
//Зеленый
else if (mode == 2)
{
digitalWrite(RLED, LOW);
digitalWrite(GLED, HIGH);
digitalWrite(BLED, LOW);
}
//Синий
else if (mode == 3)
{
digitalWrite(RLED, LOW);
digitalWrite(GLED, LOW);
digitalWrite(BLED, HIGH);
}

}

Re: кнопка + 3 светодиода

Сб мар 06, 2021 19:45:44

Код:
signed char direction = 1;
unsigned char mode = 1;

function KeyPressed()
{
  if (direction)
  {
    if (mode == 3)
       direction = -1;
  }
  else
    if (mode == 1)
       direction = 1;

  mode += direction;
 
  digitalWrite(RLED, LOW);
  digitalWrite(GLED, LOW);
  digitalWrite(BLED, LOW);
  switch (mode)
  {
      case 1:
         digitalWrite(RLED, HIGH);
         break;
      case 2:
         digitalWrite(GLED, HIGH);
         break;
      case 3:
         digitalWrite(BLED, HIGH);
         break;
   }
}

Re: кнопка + 3 светодиода

Вт мар 09, 2021 18:43:54

Доброго дня! Благодарность моя не знает границ. Огромное спасибо. Честно говоря не ожидал.
Пытаюсь сделать дубль автоматики открытия ворот - жалюзи. Успех на лицо, один мотор спалил.
Оказывается там не все так просто. За помощь (консультацию) готов отблагодарить. Все дело в том что начинал с детекторных приемников и ремонта радио аппаратуры. но это было еще в 60-х. С ув. Петр.

Добавлено after 22 minutes 26 seconds:
Что то пошло не так.
строка function KeyPressed() при компиляции подсвечивается. Может какая мелочь, но в скетчах я не особо.
Уже возраст 70+

Re: кнопка + 3 светодиода

Вт мар 09, 2021 19:22:37

Пытаюсь сделать дубль автоматики открытия ворот - жалюзи. Успех на лицо, один мотор спалил.

вообще не понятно что вы делаете :dont_know: :dont_know:

опишите подробнее что , на чем , желательно схему.

Добавлено after 19 minutes 38 seconds:
Надо при следующих нажатиях: зеленый, синий, красный. И еще одна беда. При включении последнего светодиода требуется нажать кнопку ещё раз. Лишний.


Спойлер#define BLED 9 //9 контакт для синего вывода RGB-светодиода
#define GLED 10 //10 контакт для зеленого вывода RGB-светодиода
#define RLED 11 //11 контакт для красного вывода RGB-светодиода
#define BUTTON 2 //2 контакт для кнопки

boolean lastButton = LOW; //предыдущее состояние кнопки
boolean currentButton = LOW; //текущее состояние кнопки
int ledMode = 0; //статус RGB-светодиода

void setup()
{
pinMode (BLED, OUTPUT); //Устанавливаем контакт BLED(Blue LED, т.е 9 контакт) как выход
pinMode (GLED, OUTPUT); //Устанавливаем контакт GLED(Green LED, т.е 10 контакт) как выход
pinMode (RLED, OUTPUT); //Устанавливаем контакт RLED(Red LED, т.е 11 контакт) как выход
pinMode (BUTTON, INPUT); //Устанавливаем контакт BUTTON(т.е. 2 контакт) как вход(опционально)
}

void loop()
{
currentButton = debounce(lastButton); //считываем состояние кнопки с применением "антидребезга"
if (lastButton == LOW && currentButton == HIGH) //если кнопка была нажата
{
ledMode++; //инкрементируем значение переменной
}
lastButton = currentButton; //сохраняем текущее состояние кнопки в предыдущее

if (ledMode == 3) ledMode = 0; //если прошли по циклу все режимы свечения светодиода, делаем сброс до 0

switch(ledMode) //изменить режим светодиода
{
case 0:
digitalWrite(RLED, LOW);
digitalWrite(GLED, HIGH);
digitalWrite(BLED, LOW);
break;
case 1:
digitalWrite(RLED, LOW);
digitalWrite(GLED, LOW);
digitalWrite(BLED, HIGH);
break;
case 2:
digitalWrite(RLED, HIGH); //горит
digitalWrite(GLED, LOW); //не горит
digitalWrite(BLED, LOW); //не горит
break;
}
}

/*
* Функция антидребезга
* принимает предыдущее значение кнопки и возвращает текущее состояние кнопки с подавлением дребезга контактов
*/
boolean debounce(boolean last)
{
boolean current = digitalRead(BUTTON); //считываем состояние кнопки
if (last != current) //если есть изменения
{
delay(5); //ждем 5мс
current = digitalRead(BUTTON); //считываем состояние кнопки
}
return current; //возвращаем, считанное состояние кнопки
}


попробуй так?
Вложения
svetofor.zip
(18.05 KiB) Скачиваний: 630

Re: кнопка + 3 светодиода

Пт мар 12, 2021 19:49:33

Доброго дня всем! И спасибо за помощь.
Пытаюсь сделать дубликат автоматики радиоуправления гаражными воротами. Это шторка из узких ламелей и накручивается она на вал. Внутри асинхронный двигатель и два концевых выключателя. С мотора выходит три провода: один общий и два на вращение в разные стороны. Этой автоматике сто лет в обед. Остался один брелок и тот еле дышит. Дубликат брелока приобрести нет возможности. Эта серия давно не выпускается. И белорусы так сказали. В приемнике стоит прошитая микросхема и алгоритм работы такой: при достижении крайней точки срабатывает концевой выключатель и шторка останавливается. (Радио управление одно канальное) При очередном нажатии уже включается реверс. Кроме того если через 40 секунд не поступает команда, с последней задействованной обмотки снимается питание. Тогда шторка начинает движение при нажатии на кнопку два раза. Вроде все.
Вот хочу по принципу поочередности включения светодиодов подавать питание на обмотки двигателя. Может что и получится. С ув. Петр

Re: кнопка + 3 светодиода

Пт мар 12, 2021 22:30:56

Дубликат брелока приобрести нет возможности.

Во первых - в наше время такого не может быть (совсем).
Во вторых - озвучьте рабочую частоту и название вашей автоматики. Это поможет подобрать вам новый брелок, который запросто станет дублем вашего.
Иначе дальнейший разговор, акромя откровенного флуда, не будет иметь смысла.
Если у вас с этим будут затруднения, то проще вам будет за почти копейки на Али прикупить новый комплект управления (Прм. с парой брелков).

Re: кнопка + 3 светодиода

Сб мар 13, 2021 09:12:56

вот парень делал, подойдет? или че подправить?
https://www.radiokot.ru/circuit/digital/automat/35/

Re: кнопка + 3 светодиода

Пн мар 15, 2021 18:37:26

Труда вложено не мало, но пульт в моих воротах работает от одной кнопки практически при той же функциональности.

Re: кнопка + 3 светодиода

Вт мар 16, 2021 07:46:33

мне тоже интересно стало как написать скеч с концевиками и одной кнопкой управления... :kill:
пульт в моих воротах работает от одной кнопки практически при той же функциональности.

вот навоял :)))

Изображение



Спойлер#define MOTOR_OPEN 9 //9 контакт для обмотки мотора открывания
#define LED 10 //10 контакт для зеленого вывода RGB-светодиода
#define MOTOR_CLOSE 11 //11 контакт для обмотки мотора закрывания
#define BUTTON 2 //2 контакт для кнопки или пульта
#define SWITCH_OPENED 3 // концевик полностью открытых ворот
#define SWITCH_CLOSED 4 // концевик полностью закрытых ворот

boolean flag_close=HIGH;//флаг
boolean current_close=HIGH;// переменная концевика
boolean flag_open=HIGH;//флаг
boolean current_open=HIGH;// переменная концевика

boolean current=HIGH;// переменная кнопки
boolean last=HIGH;// переменная кнопки
int Mode = 1; // режим

void setup()
{

pinMode (MOTOR_OPEN, OUTPUT); //Устанавливаем контакт BLED(Blue LED, т.е 9 контакт) как выход
pinMode (LED, OUTPUT); //Устанавливаем контакт GLED(Green LED, т.е 10 контакт) как выход
pinMode (MOTOR_CLOSE, OUTPUT); //Устанавливаем контакт RLED(Red LED, т.е 11 контакт) как выход
pinMode (BUTTON, INPUT_PULLUP); //установить на данный порт высокий уровень сигнала.
pinMode(SWITCH_OPENED, INPUT_PULLUP);//установить на данный порт высокий уровень сигнала.
pinMode(SWITCH_CLOSED, INPUT_PULLUP);//установить на данный порт высокий уровень сигнала.
}

void loop()
{
//==========================

current = digitalRead(BUTTON);
if ( current_open==HIGH && current_close==HIGH){play_1();flag_open=HIGH; flag_close=HIGH;} // если концевик открытия и концевик закрытия НЕ нажаты то режим ОТКРЫТЬ/СТОП/ЗАКРЫТЬ/СТОП флаги поднять

current_open=digitalRead(SWITCH_OPENED);
if (current_open==LOW && flag_open==HIGH ){ Mode=1; flag_open=LOW; flag_close=HIGH; } // если концевик открытия нажат И ФЛАГ ПОДНЯТ то режим СТОП, флаг_открыть опустить флаг_закрыт поднять
if (current_open==LOW && flag_open==LOW ){ play_2() ;} // если концевик открытия нажат И ФЛАГ ОПУЩЕН то режим СТОП/ОТКРЫТЬ

current_close=digitalRead(SWITCH_CLOSED);
if (current_close==LOW && flag_close==HIGH){ Mode=1; flag_close=LOW; flag_open==HIGH; } // если концевик закрытия нажат И ФЛАГ ПОДНЯТ то режим СТОП, флаг_закрыт опустить флаг_открыть поднять
if (current_close==LOW && flag_close==LOW) { play_3();} // если концевик закрытия нажат И ФЛАГ ОПУЩЕН то режим СТОП/ЗАКРЫТЬ



//===========

//===========
switch(Mode) //изменить режим светодиода
{
case 0://РЕЖИМ ОТКРЫТЬ
digitalWrite(LED, LOW );
digitalWrite(MOTOR_OPEN, HIGH);
digitalWrite(MOTOR_CLOSE, LOW );
break;

case 1://РЕЖИМ СТОП
digitalWrite(LED, HIGH );
digitalWrite(MOTOR_OPEN, LOW );
digitalWrite(MOTOR_CLOSE, LOW);
break;

case 2://РЕЖИМ ЗАКРЫТЬ
digitalWrite(LED, LOW );
digitalWrite(MOTOR_OPEN, LOW);
digitalWrite(MOTOR_CLOSE, HIGH);
break;

case 3://РЕЖИМ СТОП
digitalWrite(LED, HIGH );
digitalWrite(MOTOR_OPEN, LOW );
digitalWrite(MOTOR_CLOSE, LOW);
break;
}

}

//=======кнопки============

void play_1(){
current = digitalRead(BUTTON); // считываем текущее состояние кнопки
if ( current!=last ) { // если состояние изменилось
delay(5); // делаем задержку на 5 мсек, пока уляжется дребезг
current = digitalRead(BUTTON); // и считываем снова
}
if (last == LOW && current == HIGH) //если кнопка была нажата
{
Mode++; //инкрементируем значение переменной
}
last = current; //сохраняем текущее состояние кнопки в предыдущее
if (Mode == 4) Mode = 0; //если прошли по циклу все режимы ОТКРЫТЬ/СТОП/ЗАКРЫТЬ/СТОП, делаем сброс до 0
}
//----------
void play_2(){
boolean current = digitalRead(BUTTON); // считываем текущее состояние кнопки
if (last != current) { // если состояние изменилось
delay(5); // делаем задержку на 5 мсек, пока уляжется дребезг
current = digitalRead(BUTTON); // и считываем снова
}
if (last == LOW && current == HIGH) //если кнопка была нажата
{
Mode++; //инкрементируем значение переменной
}
last = current; //сохраняем текущее состояние кнопки в предыдущее
if (Mode == 2) Mode = 0; //если прошли по циклу режимы СТОП/ОТКРЫТЬ, делаем сброс до 0
}
//----------
void play_3(){
boolean current = digitalRead(BUTTON); // считываем текущее состояние кнопки
if (last != current) { // если состояние изменилось
delay(5); // делаем задержку на 5 мсек, пока уляжется дребезг
current = digitalRead(BUTTON); // и считываем снова
}
if (last == LOW && current == HIGH) //если кнопка была нажата
{
Mode++; //инкрементируем значение переменной
}
last = current; //сохраняем текущее состояние кнопки в предыдущее
if (Mode == 3) Mode = 1; //если прошли по циклу режимы СТОП/ЗАКРЫТЬ, делаем сброс до 1
}


есть замечания, предложения, комментарии?
осталось пульт приделать и и и... :lol:
Вложения
VOROTA.zip
(40.73 KiB) Скачиваний: 403

Re: кнопка + 3 светодиода

Вт мар 16, 2021 18:07:30

Опоньки!?? Это значит челюсть отпала. Круто.
какие комментарии... надо комплектующие и пробовать. Радиорынок!! Я уже еду.
Ради интереса сниму и сфоткаю рабочую плату исполнительную, приемник. Спасибо. С ув. Петр

Re: кнопка + 3 светодиода

Вт мар 16, 2021 18:42:03

один вопрос у вас концевики работают на замыкание или размыкание контактов ? я написал под замыкающиеся!!!

и наверно надо схему нарисовать, из каких деталек, как питать будем ардуино, да и вообще может по ходу чо то поправить надо будет :wink: скеч написан как я это вижу и понял из ваши вводных...

Re: кнопка + 3 светодиода

Ср мар 17, 2021 00:22:05

Управление рольставнями ворот, лучше применить модульного типа. Радиомодуль с брелком управляет исполнительным механизмом…
Радиомодуль можно применить подобного типа:
https://aliexpress.ru/item/32873494738. ... 5483003867
Механизм управления можно сделать на МК или на логических микросхемах…
Если будет интересно – могу написать свой вариант алгоритма управления на МК с привязкой выше упомянутого радиомодуля (или подобного).

Добавлено after 49 seconds:
один вопрос у вас концевики работают на замыкание или размыкание контактов ? я написал под замыкающиеся!!!

Концевые выключатели должны работать на разрыв – так надёжней.

Re: кнопка + 3 светодиода

Ср мар 17, 2021 07:36:39

лучше применить модульного типа

да интересный вариант :roll: :roll: https://aliexpress.ru/item/100500151812 ... 6436637712

Механизм управления можно сделать на МК или на логических микросхемах…
Если будет интересно – могу написать свой вариант алгоритма управления на МК с привязкой выше упомянутого радиомодуля (или подобного).


очень любопытно :shock: заценить Ваш вариант алгоритма управления на МК с привязкой выше упомянутого радио модуля (или подобного).

Добавлено after 42 minutes 28 seconds:
Концевые выключатели должны работать на разрыв – так надёжней.


по началу не придал особого внимания... а подумав :roll:

если пропадет контакт, у закрытых ворот, верхнего концевика / ворота просто не откроются, не страшно /
а вот ворота закрываются/открываются и не сработает концевик :facepalm: двигатель будет все равно крутиться
и тут что слабее обмотка, редуктор...

:idea: нужен таймер в скеч добавить : скажем ворота закрываются/открываются 12 секунд, а остановка по таймеру сработает через 13 секунд и ничего страшного не случиться :))) что скажете??? нужен таймер ?

и наверно хоть какую-нибудь индикацию добавить надо. будем знать что в мозгах у ардуине твориться :wink:
к примеру RGB светодиод : зеленый - ворота открываются
красный - стоп
синий - закрываются
желтый - авария
ну и т.д пока не придумал еще чего

что скажете??? нужно все это или что то другое? :tea:

Re: кнопка + 3 светодиода

Ср мар 17, 2021 09:44:29

что скажете??? нужен таймер ?

Зависит от алгоритма. В некоторых случаях он не нужен.
что скажете??? нужно все это или что то другое? :tea:

На мой взгляд, все эти цветные дополнения быстро забываются и не несут в дальнейшем информативной визуализации. Чем проще индикация, тем понятнее… индикацию состояния концевых выключателей можно сделать, как и индикацию при открытии/закрытии. Остальное делать лишнее… что касается аварийных режимов, так их и так сразу видно, когда ворота не двигаются при их управлении.
очень любопытно

Я уже писал подобный алгоритм для распашных ворот:
https://radiokot.ru/forum/viewtopic.php?f=3&t=174782
В место модуля GSM можно применить радиомодуль с брелком…
Алгоритм конечно необходимо немного поправить с изменением схемы, чтобы управлять рольставней. Но в целом (на мой взгляд) алгоритм вполне нормальный.

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

В общим подожду, что ответит ТС. Может ему вполне достаточно Вашего варианта. :)

Re: кнопка + 3 светодиода

Ср мар 17, 2021 12:17:23

Я уже писал подобный алгоритм для распашных ворот:

на каком языке пишите? хотел посмотреть исходник и не нашёл :dont_know: его в той ветки нет ? :P

Re: кнопка + 3 светодиода

Ср мар 17, 2021 14:25:31

Пишу на Algorithm Builder (АВ). Других языков не знаю… ввиду самообразования в данной области, мои исходники далеки с точки зрения правильного изложения алгоритмов, от классического исполнения, потому их стыдливо выкладывать на всеобщее обозрение. :oops: Для меня, главное как работает устройство в конечном исполнении… всё остальное второстепенно. Да и с данным языком мало кто знаком. :roll:

Re: кнопка + 3 светодиода

Чт мар 18, 2021 17:43:26

На мой взгляд, все эти цветные дополнения быстро забываются и не несут в дальнейшем информативной визуализации. Чем проще индикация, тем понятнее… индикацию состояния концевых выключателей можно сделать, как и индикацию при открытии/закрытии. Остальное делать лишнее… что касается аварийных режимов, так их и так сразу видно, когда ворота не двигаются при их управлении.


нет мне кажется индикация, хотя бы минимальная должна быть. типа зашел в гараж на стеночки коробочка светится светодиодик зеленый во :idea: !! значит все в порядке :)))

в общем приделал я вот такой светодиод
Изображение
зеленый - стоп
желтый - открывается
синий - закрывается
красный - авария
8)
Изображение

и приделал таймер сейчас выставил на 10 секунд, если нужно другое время ищем такую строчку
int STOP = 10000; // Остановится двигатель через 10 секунд (1 сек = 1000 миллисекунд ) Вместо 10000 подставьте нужное вам значение

попробуйте не понравиться удалю :wink:
Вложения
VOROTA.zip
(94 KiB) Скачиваний: 351

Re: кнопка + 3 светодиода

Чт мар 18, 2021 19:05:42

Добрый день всем! Подскажите как сюда воткнуть изображение приемника ?
В хостинге изображений ОНО уже есть...

Re: кнопка + 3 светодиода

Чт мар 18, 2021 19:12:02

нажать на картинку потом на фотоаппарат нажать выскочит ссылка ее и вставьте в сообщения

Re: кнопка + 3 светодиода

Чт мар 18, 2021 19:31:29

В инструкции к моему блоку написано что напряжение с обмотки снимается через 40-45 секунд. Шторка открывается за 30-35. По моему так. Концевые выключатели в двигателе НЗ , при полном откр. или наоборот они размыкаются. Это регулируется двумя винтиками на двигателе. Вспомнил отсчет времени на снятие напряжения с обмотки начинается после срабатывания концевого выключателя

Добавлено after 8 minutes 1 second:
Изображение
Ответить