Включение и отключение групп точечных светильников одной клавишей

restiv
Offline
Зарегистрирован: 03.01.2016

Добрый день уважаемые форумчане!

В зале установленно 10 точечных светильников, я решил их разбить на 3 группы. Чтобы это раелизовать собрал небольшую схемку и скетч. Логика такая:

- один раз включаешь клавишу включателя и загорается 1 группа светильников;

- второй раз включаешь клавишу включателя и гаснет 1 группа светильников и загорается 2 группа;

- третий раз включаешь клавишу включателя и гаснет 2 группа светильников и загорается 3 группа;

- четвертый раз включаешь клавишу включателя и загораются все светильники.

Схема и скетч прилагаю. Все работает нормально, но есть дваНО!

1. Для осуществления переключения групп необходимо чтобы интервал между включениями и отключениями составлял примерно 6-8 секунд. мне бы хотелось чтобы это происходило быстрее.

2. Хотелось бы чтобы значание С обнулялось через, например, 1-2 минуты бездействия.

Подскажите как это можно исправить?

 

int relayPin1 = A0;
int relayPin2 = A1;
int relayPin3 = A2;
int switchPin = 7;

int val;

int state;
int c;

void setup()
{
  pinMode(relayPin1, OUTPUT);
  pinMode(relayPin2, OUTPUT);
  pinMode(relayPin3, OUTPUT);
  pinMode(switchPin, INPUT);
  digitalWrite(relayPin1, LOW);
  digitalWrite(relayPin2, LOW);
  digitalWrite(relayPin3, LOW);
}

void loop()
{
  state = digitalRead(switchPin);

  if (state == HIGH && c == 0) // нажали кнопку
  {
    c = 1;
  }
  if (state == LOW && c == 1) // отпустили кнопку
  {
    val = ++val;
    if (val == 4)
    {
      val = 0;
    }
    c = 0;
  }

  if (val == 0) // выключаем светодиоды
  {
    digitalWrite(relayPin1, LOW);
    digitalWrite(relayPin2, LOW);
    digitalWrite(relayPin3, LOW);
  }
  if (val == 1) // Если мы кнопку 1 раз нажали и отпустили
  {
    digitalWrite(relayPin1, LOW);
    digitalWrite(relayPin2, HIGH);
    digitalWrite(relayPin3, HIGH);
  }
  if (val == 2) // Если мы кнопку 2 раз нажали и отпустили
  {
    digitalWrite(relayPin1, HIGH);
    digitalWrite(relayPin2, LOW);
    digitalWrite(relayPin3, HIGH);
  }
 if (val == 3) // Если мы кнопку 3 раз нажали и отпустили
  {
    digitalWrite(relayPin1, HIGH);
    digitalWrite(relayPin2, HIGH);
    digitalWrite(relayPin3, LOW);
  }
  if (val == 4) // Если мы кнопку 4 раз нажали и отпустили
  {
    digitalWrite(relayPin1, HIGH);
    digitalWrite(relayPin2, HIGH);
    digitalWrite(relayPin3, HIGH);
  }
  delay(10);
 
} 

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Дребезг аппаратно обрабатывается? Если нет, то это проблема.

Если я правильно понимаю строки №№ 33-36, то значение val никодна не может стать 4 (если станет, то тут же сбросится в 0). Тогда зачем строки  №№ 64-69?

Строка №32, конечно достойна быть отлита в граните. Можете объяснить, что она делает?

restiv
Offline
Зарегистрирован: 03.01.2016

Чтобы избежать дребезга изменение значения С меняется только после подачи LOW сигнала на пин 7.

Со строками 64-69 я точно тупанул.

Строка 32 по идее должна менять значение С, увеличивая ее на 1 значение. А что? Это делается не так? Просто у меня все работает.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

restiv пишет:

Чтобы избежать дребезга изменение значения С меняется только после подачи LOW сигнала на пин 7.

Это не решает проблемы дребезга от слова "никак". При одном нажатии (а потом и при отпускании) значение сменяется HIGH на LOW и обратно раз по 10. И Вы всё это обрабатываете.

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

restiv пишет:

Строка 32 по идее должна менять значение С, увеличивая ее на 1 значение. А что? Это делается не так? Просто у меня все работает.

Это сделано наиболее извращенским способом из всех возможных. Если нужно просто увеличить значение на единицу, достаточно просто "val++;" и ничего больше. А если хочется заодно проконтролировать и достижение 4, то можно написать "val = (val +1) % 4;" и тогда строки №№ 33-36 не нужны от слова "нафиг".

Для начала избавьтесь от дребезга. Если проблема останется, будем думать, но тогда нарисуйте нормальную схему. Из Вашего рисунка НИКАК не видно как подключена кнопка и как подключены реле.

restiv
Offline
Зарегистрирован: 03.01.2016

Обновленная схема-чертеж во вложении.

Дребезга я не наблюдаю. Все переключения проходят строго по порядку. А причиной задержки в 6-8 секунд я считаю это из-за медленного разряда конденсаторов в блоке питания. Пока он не разрядится на пин 7 подается сигнал HIGH и только после разряда конденсаторов в блоке питания на пине 7 сигнал с HIGH  меняется на LOW и происходит переключение.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ну зашунтируй их резистором на килоом - два

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

restiv пишет:
Обновленная схема-чертеж во вложении.

ЕвгенийП пишет:
Из Вашего рисунка НИКАК не видно как подключена кнопка и как подключены реле

restiv
Offline
Зарегистрирован: 03.01.2016

Как не видно как подключена кнопка? Она подключена в разрыв фазы питающей блок питания на 5 В. От блока питания фаза идет дальше на контакты твердотельного реле, которое размыкает или замыкает те или иные контакты и замыкает одну из трех или все сразу группы светильников. Вроде на чертеже все нарисовано.

 

restiv
Offline
Зарегистрирован: 03.01.2016

ЕвгенийП пишет:
Из Вашего рисунка НИКАК не видно как подключена кнопка и как подключены реле

[/quote]

 

Прошу прощение, не туда контакты подвел. Исправил.