//Состояния лампочек
int ledA=0;//лампочка - определяемая красной кнопкой
int ledB=0;//лампочка - определяемая синей кнопкой
int ledC=0;//лампочка - определяемая зеленой кнопкой
//таймеры для кнопок (исключение дребезга с помощью millis())
long past = 0;
long past1 = 0;
long past2 = 0;
long past3 = 0;
//Состояния кнопок: A - красная
//B - синяя
//С - зеленая
//X - серая
int laststatA=0;//красная
int laststatB=0;//синяя
int laststatC=0;//зеленая
int laststatX=0;//серая
//флаг блокировки кнопок - красная лампочка
bool block = false;
void setup() {
// конфигурация входов/выходов
//для кнопок
pinMode(8, INPUT);//вход для серой
pinMode(9, INPUT);//вход для зеленой
pinMode(10, INPUT);//вход для синей
pinMode(11, INPUT);//вход для красной
//для лампочек
pinMode(4, OUTPUT);//выход для зеленой определяемой серой кнопкой
pinMode(5, OUTPUT);//выход для зеленой определяемой зеленой
pinMode(6, OUTPUT);//выход для зеленой определяемой синей
pinMode(7, OUTPUT);//выход для зеленой определяемой красной
}
void loop() {
//определение блокировки при нажатии СЕРОЙ (X) кнопки
if (laststatX==0 & digitalRead(8))//нажали кнопку
{
laststatX = 1;//смена состояния кнопки X
}
long now = millis();//использование таймера с периодом 100
if (now - past >=100)
{
past = now;//сброс таймера
if (laststatX == 1 & !digitalRead(8))//отпустили кнопку
{
laststatX = 0;//смена состояния X кнопки
block = !block;//вкл/выкл флага блокировки
}
}
//если блокировка не включена, можно управлять лампочками через кнопки:
if (!block)
{
digitalWrite(4, LOW);//отключение индикатора-лампочки блокировки
//КНОПКА А - красная
if (laststatA==0 & digitalRead(11))//нажали кнопку
{
laststatA = 1;//сменили состояние кнопки
}
long now1 = millis();//использование таймера с периодом 100
if (now1 - past1 >=100)
{
past1 = now1;//сброс таймера
if (laststatA == 1 & !digitalRead(11))//отпустили кнопку
{
laststatA = 0;//сменили состояние кнопки - отпустили
//переключение лампочки в зависимости от ее предыдущего состояния
if (ledA==0){//если она не горит
digitalWrite(7, HIGH);//включаем
ledA=1;//смена состояния лампочки
}
else {//если горит лампочка
digitalWrite(7, LOW);//выключаем лампочку
ledA=0;//фиксация ее состояния
}
}
}
//КНОПКА В - синяя
if (laststatB==0 & digitalRead(10))//нажали кнопку
{
laststatB = 1;//зафиксировали состояние кнопки
}
long now2 = millis();//использование таймера с периодом 100
if (now2 - past2 >=100)
{
past2 = now2;//сброс таймера
if (laststatB == 1 & !digitalRead(10))//отпустили кнопку
{
laststatB = 0;//зафиксировали состояние кнопки
//переключение лампочки в зависимости от ее предыдущего состояния
if (ledB==0){//если она не горит
digitalWrite(6, HIGH);//включаем
ledB=1;//фиксация ее состояния
}
else {//если горит
digitalWrite(6, LOW);//выключаем
ledB=0;//фиксация ее состояния
}
}
}
//КНОПКА С
if (laststatC==0 & digitalRead(9))//нажали кнопку
{
laststatC = 1;//зафиксировали состояние кнопки
}
long now3 = millis();//использование таймера с периодом 100
if (now3 - past3 >=100)
{
past3 = now3;//сброс таймера
if (laststatC == 1 & !digitalRead(9))//отпустили кнопку
{
laststatC = 0;//фиксируем состояние кнопки
//переключение лампочки в зависимости от ее предыдущего состояния
if (ledC==0){//если она не горит
digitalWrite(5, HIGH);//включаем
ledC=1;//фиксируем состояние лампочки
}
else {//если горит она
digitalWrite(5, LOW);//выключаем эту лампочку
ledC=0;//фиксируем состояние лампочки
}
}
}
}
//ПРИ ВКЛЮЧЕНИИ БЛОКИРОВКИ ЗАГОРАЕТСЯ ИНДИКАТОР - КРАСНАЯ ЛАМПОЧКА:
else {
digitalWrite(4, HIGH);
}
//СПЕЦИАЛЬНЫЙ КОД 101
if (digitalRead(7) & !digitalRead(6) & digitalRead(5))// проверка на состояние лампочек 101
{
for (int i=0; i<3;i++){//цикл с миганием лампочек - 3 раза - с промежутком 500 мс
delay(200);//задержка перед выключением ламопчек
digitalWrite(7, LOW);//выключение лампочки - состояние которой определяется красной кнопкой
digitalWrite(6, LOW);//выключение лампочки - состояние которой определяется синей кнопкой
digitalWrite(5, LOW);//выключение лампочки - состояние которой определяется зеленой кнопкой
digitalWrite(4, LOW);//выключение лампочки - состояние которой определяется серой кнопкой
delay(500);//задержка перед включением лампочек
digitalWrite(7, HIGH);//включение лампочки - состояние которой определяется красной кнопкой
digitalWrite(6, HIGH);//включение лампочки - состояние которой определяется синей кнопкой
digitalWrite(5, HIGH);//включение лампочки - состояние которой определяется зеленой кнопкой
digitalWrite(4, HIGH);//включение лампочки - состояние которой определяется серой кнопкой
}//возврат лампочек в исходное состояние
delay(300);//задержка до возврата в исходное состояние "000"
digitalWrite(7, LOW);//выключение лампочки - состояние которой определяется красной кнопкой
digitalWrite(6, LOW);//выключение лампочки - состояние которой определяется синей кнопкой
digitalWrite(5, LOW);//выключение лампочки - состояние которой определяется зеленой кнопкой
digitalWrite(4, LOW);//выключение лампочки - состояние которой определяется серой кнопкой
ledA=0;//возврат состояний лампочек
ledC=0;//так как перед комбинацией они были включены, а после мигания - отключаются
}
}