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