the code i posted was untested (i was traveling).
i'm home and when i tested it, it turned the led on and off, but it did not blink.
i corrected the problem and now it turns the led on, off and blinks if held for more than 2 secs but less than 3 (count mississippi)
#undef MyHW
#ifdef MyHW
int pinBut = A1;
int pinLed = 13;
#else
int pinBut =2;
int pinLed = 4;
#endif
byte butLst;
unsigned long msec;
unsigned long time;
unsigned long ledTime;
// -----------------------------------------------------------------------------
#define BlinkPeriod 250
enum { Off = HIGH, On = LOW };
enum { LedOff, LedOn, LedBlink };
int ledState = LedOff;
void
led (void)
{
switch (ledState) {
case LedBlink:
if ( (msec - ledTime) > BlinkPeriod) {
ledTime = msec;
digitalWrite (pinLed, ! digitalRead (pinLed));
}
break;
case LedOn:
digitalWrite (pinLed, On);
break;
case LedOff:
default:
digitalWrite (pinLed, Off);
break;
}
}
// -----------------------------------------------------------------------------
void loop () {
msec = millis ();
led ();
byte but = digitalRead (pinBut);
if (butLst != but) {
butLst = but;
if (LOW == but) // pressed
time = msec;
else { // button released
if (time) { // 3000 not exceeded
if ( (msec - time) > 2000) {
ledState = LedBlink;
Serial.println ("led blink");
}
else {
ledState = LedOn;
Serial.println ("led On");
}
time = 0;
}
}
}
// turn LED off as soon as time > 3000 w/o waiting for button release
if (time && (msec - time) > 3000) {
time = 0;
ledState = LedOff;
Serial.println ("led Off");
}
}
// -----------------------------------------------------------------------------
void setup (){
Serial.begin (9600);
pinMode (pinBut, INPUT_PULLUP);
butLst = digitalRead (pinBut);
pinMode (pinLed, OUTPUT);
}