Включение и отключение групп точечных светильников одной клавишей
- Войдите на сайт для отправки комментариев
Добрый день уважаемые форумчане!
В зале установленно 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);
}

Дребезг аппаратно обрабатывается? Если нет, то это проблема.
Если я правильно понимаю строки №№ 33-36, то значение val никодна не может стать 4 (если станет, то тут же сбросится в 0). Тогда зачем строки №№ 64-69?
Строка №32, конечно достойна быть отлита в граните. Можете объяснить, что она делает?
Чтобы избежать дребезга изменение значения С меняется только после подачи LOW сигнала на пин 7.
Со строками 64-69 я точно тупанул.
Строка 32 по идее должна менять значение С, увеличивая ее на 1 значение. А что? Это делается не так? Просто у меня все работает.
Чтобы избежать дребезга изменение значения С меняется только после подачи LOW сигнала на пин 7.
Это не решает проблемы дребезга от слова "никак". При одном нажатии (а потом и при отпускании) значение сменяется HIGH на LOW и обратно раз по 10. И Вы всё это обрабатываете.
Чтобы в этом убедиться, поставьте печать в обнаружение нажатия/отжатия и полюбуйтесь.
Строка 32 по идее должна менять значение С, увеличивая ее на 1 значение. А что? Это делается не так? Просто у меня все работает.
Это сделано наиболее извращенским способом из всех возможных. Если нужно просто увеличить значение на единицу, достаточно просто "val++;" и ничего больше. А если хочется заодно проконтролировать и достижение 4, то можно написать "val = (val +1) % 4;" и тогда строки №№ 33-36 не нужны от слова "нафиг".
Для начала избавьтесь от дребезга. Если проблема останется, будем думать, но тогда нарисуйте нормальную схему. Из Вашего рисунка НИКАК не видно как подключена кнопка и как подключены реле.
Обновленная схема-чертеж во вложении.
Дребезга я не наблюдаю. Все переключения проходят строго по порядку. А причиной задержки в 6-8 секунд я считаю это из-за медленного разряда конденсаторов в блоке питания. Пока он не разрядится на пин 7 подается сигнал HIGH и только после разряда конденсаторов в блоке питания на пине 7 сигнал с HIGH меняется на LOW и происходит переключение.
Ну зашунтируй их резистором на килоом - два
Как не видно как подключена кнопка? Она подключена в разрыв фазы питающей блок питания на 5 В. От блока питания фаза идет дальше на контакты твердотельного реле, которое размыкает или замыкает те или иные контакты и замыкает одну из трех или все сразу группы светильников. Вроде на чертеже все нарисовано.
[/quote]
Прошу прощение, не туда контакты подвел. Исправил.