#include <Adafruit_NeoPixel.h>
#define ledPin 4
#define btnPin 2
#define bazPin 12
#define pixelCount 16
#define wait 50
volatile bool isRight = true;
volatile bool btnFlag = true;
volatile uint32_t prewMillis;
volatile uint8_t speedLvl = 1;
volatile bool isBlink = false;
volatile uint16_t bazTone = 1000;
volatile bool isWaitingTone = false;
uint8_t pixelPosition = 0;
Adafruit_NeoPixel led(pixelCount, ledPin, NEO_RGB + NEO_KHZ800);
void setup() {
Serial.begin(9600);
pinMode(btnPin, INPUT);
pinMode(ledPin, OUTPUT);
attachInterrupt(digitalPinToInterrupt(btnPin), btnPress, RISING);
}
void loop()
{
if(isWaitingTone)
{
tone(bazPin, bazTone, 120);
isWaitingTone = false;
}
circleFrame();
}
void circleFrame()
{
for(int i = 0; i <= led.numPixels(); i++)
{
if(i == pixelPosition)
led.setPixelColor(i, 255, 255, 255);
else
led.setPixelColor(i, 0, 0, 0);
}
led.show();
if(isRight)
pixelPosition = ++pixelPosition % pixelCount;
else
pixelPosition = --pixelPosition % pixelCount;
if(speedLvl == 0)
{
isBlink = true;
for(int j = 0; j < 3; j++)
{
for(int i = 0; i <= led.numPixels(); i++)
led.setPixelColor(i, 255, 255, 255);
led.show();
tone(bazPin, bazTone);
delay(120);
noTone(bazPin);
for(int i = 0; i <= led.numPixels(); i++)
led.setPixelColor(i, 0, 0, 0);
led.show();
delay(120);
}
speedLvl++;
bazTone = 1000;
isBlink = false;
}
else
delay(wait / speedLvl);
}
void btnPress()
{
if(millis() - prewMillis >= 200)
{
btnFlag = true;
prewMillis = millis();
}
if(btnFlag && !isBlink)
{
action();
btnFlag = false;
}
}
void action()
{
isRight = !isRight;
isWaitingTone = true;
speedLvl = ++speedLvl % 5;
bazTone += 1000;
}