#include <Servo.h>
Servo miServo;
#define servoVcc 6
#define servoCrtl 5
int minAngle=0, maxAngle=180, angle=0;
/*
LED Display
*/
const int numLeds = 10;
const byte led[numLeds] = {23,25,27,29,31,33,35,37,39,41};
int ledIndex = 0;
/*
Buttons
*/
#define downBttn 9
#define upBttn 8
/*
RGB LED
*/
const byte channels = 3;
const int rgb[channels]={A0,A1,A2};
/*
Timers
*/
int timer0 = 100, timer1=1000, rgbDelay=20;
void setup() {
miServo.attach(servoCrtl);
pinMode(servoVcc,OUTPUT);
digitalWrite(servoVcc,HIGH);
for(int i=ledIndex;i<numLeds;i++){
pinMode(led[i], OUTPUT);
digitalWrite(led[i],LOW);
}
digitalWrite(led[ledIndex],HIGH);
pinMode(upBttn, INPUT_PULLUP);
pinMode(downBttn, INPUT_PULLUP);
for(int i=0;i<channels;i++){
pinMode(rgb[i],OUTPUT);
digitalWrite(rgb[i],LOW);
}
digitalWrite(rgb[1],HIGH);
delay(timer1);
}
void loop() {
upDetect();
downDetect();
servoAngle();
rgbNeon();
delay(50);
}
void upDetect(){
if(!digitalRead(upBttn)){
digitalWrite(led[ledIndex],LOW);
ledIndex = max(0,ledIndex-1);
digitalWrite(led[ledIndex],HIGH);
delay(timer0);
}
}
void downDetect(){
if(!digitalRead(downBttn)){
digitalWrite(led[ledIndex],LOW);
ledIndex = min(numLeds-1,ledIndex+1);
digitalWrite(led[ledIndex],HIGH);
delay(timer0);
}
}
void servoAngle(){
angle = map(ledIndex,0,numLeds-1,minAngle,maxAngle);
miServo.write(angle);
}
void rgbNeon(){
static double crTime = 0, psTime = 0;
static short rgbIndex = 0;
static int dimm = 0, maxDimm = 255, minDimm = 0, increment=1;
if(crTime - psTime >= rgbDelay){
psTime = crTime;
if(dimm<minDimm || dimm>maxDimm){
increment = increment * (-1);
if(dimm<minDimm){
if(rgbIndex<3){
rgbIndex++;
}else{
rgbIndex=0;
}
}
}
dimm+=increment;
analogWrite(rgb[rgbIndex],dimm);
}
crTime = millis();
}