uint8_t light1=9;
uint8_t light2=10;
uint8_t light3=11;
uint8_t music=7;
uint8_t vibro=8;
uint8_t button1=5;
uint8_t button2=4;
void setup()
{
pinMode(light1, OUTPUT);
pinMode(light2, OUTPUT);
pinMode(light3, OUTPUT);
pinMode(music, OUTPUT);
pinMode(vibro, OUTPUT);
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
analogWrite(light1, 0);
analogWrite(light2, 0);
analogWrite(light3, 0);
digitalWrite(music, LOW);
digitalWrite(vibro, LOW);
}
void loop()
{
//ожидание активации
waitActivation();
//включение музыки
digitalWrite(music, HIGH);
//поочередное включение гирлянд за 5 секунд каждая
for (int i=1; i<=255; i++)
{
analogWrite(light1, i);
delay(20);
}
for (int i=1; i<=255; i++)
{
analogWrite(light2, i);
delay(20);
}
for (int i=1; i<=255; i++)
{
analogWrite(light3, i);
delay(20);
}
//моторчик, имитация периодического включения на 4 секунды
for (int i=0; i < 20; i++)
{
digitalWrite(vibro, HIGH);
delay(100);
digitalWrite(vibro, LOW);
delay(100);
}
//одновременное выключение гирлянд за 5 секунд
for (int i=255; i>=0; i--)
{
analogWrite(light1, i);
analogWrite(light2, i);
analogWrite(light3, i);
delay(20);
}
//выключение музыки
digitalWrite(music, LOW);
}
void waitActivation()
{
int buttonState1 = 0;
int buttonState2 = 0;
int lastButtonState1 = LOW;
int lastButtonState2 = LOW;
unsigned long pressTime = 0;
unsigned long blinkTime = 0;
int activationStep = 0;
int blink = 0;
int codeDelay=5000; //допустимая задержка между нажатиями кнопок, мс
while (activationStep < 4)
{
buttonState1 = digitalRead(button1);
buttonState2 = digitalRead(button2);
if (buttonState1 == LOW && lastButtonState1 == HIGH)
{
if ( activationStep == 0
|| activationStep == 2 )
{
pressTime = millis();
activationStep++;
}
}
if (buttonState2 == LOW && lastButtonState2 == HIGH)
{
if ( activationStep == 1
|| activationStep == 3 )
{
pressTime = millis();
activationStep++;
}
}
if ( activationStep != 0
&& (millis() - pressTime > codeDelay) )
{
activationStep = 0;
}
lastButtonState1 = buttonState1;
lastButtonState2 = buttonState2;
delay(10);
//подсказка ввода кода моргает
if (millis() - blinkTime >= 100)
{
if (blink == 0)
{
//чем ближе к концу тем слабее подсветка
blink = ( 255*(codeDelay - (millis()-pressTime)) ) / codeDelay;
}
else
{
blink = 0;
}
blinkTime = millis();
}
//чем ближе к правильному коду, тем больше лампочек мигают
switch (activationStep)
{
case 0:
analogWrite(light1, 0);
analogWrite(light2, 0);
analogWrite(light3, 0);
break;
case 1:
analogWrite(light1, blink);
analogWrite(light2, 0);
analogWrite(light3, 0);
break;
case 2:
analogWrite(light1, blink);
analogWrite(light2, blink);
analogWrite(light3, 0);
break;
case 3:
analogWrite(light1, blink);
analogWrite(light2, blink);
analogWrite(light3, blink);
break;
}
} //while
//выключение подсказки кода
analogWrite(light1, 0);
analogWrite(light2, 0);
analogWrite(light3, 0);
}
music
vibro
activate
lights