So I have a piece code:
#include <TimerOne.h>
int led[] = {2,3,4,5,6,7,8,9,10,11};
int lever = 12;
int button = 13;
int buttonState = 0;
int buttonDelay = 0;
bool buttonAct = true;
int leverState = 0;
int fadeAmount = 2;
int fadeDelay = 0;
int modeCount = 0;
int maxCount = 4;
int counter = 0;
bool counterFl = true;
bool counterSwitch = true;
void setup() {
Serial.begin(9600);
Serial.println("Setup");
//Input
pinMode(button,INPUT_PULLUP);
pinMode(lever,INPUT_PULLUP);
Timer1.initialize(1500);
Timer1.attachInterrupt(inputInterrupt);
for(int i = 0; i<10; i++){
pinMode(led[i],OUTPUT);
Serial.println("Finish");
}
}
void loop(){
modeToggle();
}
void modeToggle() {
if(modeCount == maxCount){
modeCount = 0;
}
if(buttonAct == false){
Serial.println(modeCount);
buttonDelay++;
if(buttonDelay == 100){
buttonDelay = 0;
buttonAct = true;
}
}
if(leverState == HIGH){
if(modeCount == 0){
ledRun();
}
if(modeCount == 1){
ledOn();
}
if(modeCount == 2){
fade();
}
if(modeCount == 3){
blinkLeds();
}
}
else{
for(int i = 0; i<=10; i++){
digitalWrite(led[i],LOW);
}
}
}
void fade(){
for(int i = 0; i<=10; i++){
digitalWrite(led[i],HIGH);
}
delayMicroseconds(fadeDelay);
for(int i = 0; i<=10; i++){
digitalWrite(led[i],LOW);
}
delayMicroseconds(fadeDelay);
fadeDelay = fadeAmount + fadeDelay;
if(fadeDelay == 1500 || fadeDelay == 0){
fadeAmount = -fadeAmount;
}
//Serial.println(fadeDelay);
}
void ledOn(){
for(int i = 0; i<10; i++){
digitalWrite(led[i],HIGH);
}
}
void blinkLeds(){
if(counterFl){
if(counterSwitch){
for(int i = 0; i<10; i++){
digitalWrite(led[i],HIGH);
}
counterSwitch = false;
}
else{
for(int i = 0; i<10; i++){
digitalWrite(led[i],LOW);
}
counterSwitch = true;
}
counterFl = false;
}
else{
counter++;
//Serial.println(counter);
if(counter==50){
counter=0;
counterFl=true;
}
}
}
void ledRun(){
for(int i = 1; i<10; i++){
digitalWrite(led[i],HIGH);
digitalWrite(led[i-1],LOW);
delay(50);
}
for(int i=8; i>-1; i--){
digitalWrite(led[i],HIGH);
digitalWrite(led[i+1],LOW);
delay(50);
}
}
void inputInterrupt(){
if(buttonAct){
buttonState = 1-digitalRead(button);
}
if(buttonState == HIGH){
modeCount++;
buttonState = 0;
buttonAct = false;
}
leverState = 1-digitalRead(lever);
}
The idea is for a 10LED strip to be switched through different modes for a PC build. Did a sketch before where I didn't use the timer1 library and was horrendously inefficient.
The problem with the interrupts on this one is that whenever I have a "mode" (currently 'void ledRun()') the delays seem to confuse the arduino and it won't go to the inputInterrupt loop when I try to switch the mode with my button.
I've gotten around it one way with the Led flash with a counter, but seems too much code to try it again. So I am wondering if there is a better way to get round this, or why is the delays affecting my interrupts?