Do you really need an interupt?
#include "Led.h"
#include "constants.h"
#include <WProgram.h>
Led::Led(unsigned char pin, unsigned char initialState, unsigned short fi, unsigned short si)
{
this->pin = pin;
mode = initialState;
pinMode(pin, OUTPUT);
fastInt = fi;
slowInt = si;
update();
}
Led::~Led(){}
void Led::setFastInterval(unsigned short fi)
{
fastInt = fi;
}
void Led::setSlowInterval(unsigned short si)
{
slowInt = si;
}
void Led::slow()
{
mode = LED_SLOW_BLINK;
update();
}
void Led::fast()
{
mode = LED_FAST_BLINK;
update();
}
void Led::on()
{
mode = LED_ON;
update();
}
void Led::off()
{
mode = LED_OFF;
update();
}
void Led::reverse(void)
{
if(mode != LED_ON && mode != LED_OFF)
{
mode = LED_ON;
}
if(mode == LED_ON)
{
mode = LED_OFF;
}
else
{
mode = LED_ON;
}
update();
}
void Led::update(void)
{
short interval = 0;
if(mode == LED_ON)
{
state = LED_ON;
}
if(mode == LED_OFF)
{
state = LED_OFF;
}
if(mode == LED_FAST_BLINK)
{
interval = fastInt;
}
if(mode == LED_SLOW_BLINK)
{
interval = slowInt;
}
if(mode == LED_SLOW_BLINK || mode == LED_FAST_BLINK)
{
if(millis() - lastMs > interval)
{
// save the last time you blinked the LED
lastMs = millis();
// if the LED is off turn it on and vice-versa:
if(state == LED_ON)
{
state = LED_OFF;
}
else
{
state = LED_ON;
}
}
}
if(state == LED_ON)
{
digitalWrite(pin, LOW);
}
if(state == LED_OFF)
{
digitalWrite(pin, HIGH);
}
}
// Led.h
#ifndef LED_H
#define LED_H
#include "constants.h"
class Led
{
public:
Led(unsigned char pin, unsigned char initialState = LED_OFF, unsigned short fi = 100, unsigned short si = 750);
~Led(void);
void setFastInterval(unsigned short fi);
void setSlowInterval(unsigned short si);
void slow(void);
void fast(void);
void on(void);
void off(void);
void reverse(void);
void update(void);
private:
unsigned char pin;
unsigned long lastMs;
unsigned char mode;
unsigned char state;
unsigned short millDiff;
unsigned short fastInt;
unsigned short slowInt;
};
#endif