int imp0;
int imp1;

unsigned long t0;
unsigned long t1;
unsigned long dt;

int i;

unsigned long tr[60] = {600000, 300000, 200000, 150000, 120000, 100000, 85714, 75000, 66667, 60000, 54545, 50000, 46154, 42857, 40000, 37500, 35294, 33333, 31579, 30000, 28571, 27273, 26087, 25000, 24000, 23077, 22222, 21429, 20690, 20000, 19355, 18750, 18182, 17647, 17143, 16667, 16216, 15789, 15385, 15000, 14634, 14286, 13953, 13636, 13333, 13043, 12766, 12500, 12245, 12000, 11765, 11538, 11321, 11111, 10909, 10714, 10526, 10345, 10169, 10000};
unsigned long td[60] = {53333, 25980, 16863, 12304, 9569, 7745, 6443, 5466, 4706, 4098, 3601, 3187, 2836, 2535, 2275, 2047, 1846, 1667, 1541, 1427, 1325, 1231, 1146, 1068, 996, 930, 868, 811, 758, 708, 662, 618, 578, 539, 503, 469, 436, 405, 376, 349, 322, 297, 273, 251, 229, 208, 188, 169, 151, 133, 117, 102, 88, 74, 60, 47, 35, 23, 11, 0};

int cp;

unsigned long ctd;
unsigned long cts;

void setup()
{
  pinMode(3, INPUT);
  pinMode(12, OUTPUT);  
  digitalWrite(12, HIGH);   
  imp1 = LOW;
  t1 = 0;
}

void loop()
{
  while (1 == 1)  
  {
    imp0 = imp1;
    imp1 = digitalRead(3);
    if (imp1 == LOW) if (imp0 == HIGH) break;
  }
  t0 = t1;  
  t1 = micros();
  if (t0 > 0)
  if (t0 < t1)
  if (t1 < 4294367295)
  { 
    dt = t1 - t0;
    if (dt >= 5000)    
    if (dt <= 600000)
    {
      cp = 0;
      for (i = 59; i >= 0; i = i - 1) 
      {
        if (dt <= tr[i])
        {
          cp = i;
          break;
        }  
      }
      ctd = t1 + td[cp];
      while (micros() < ctd) {}    
      digitalWrite(12, LOW); 
      cts = micros() + 200;
      while (micros() < cts) {}    
      digitalWrite(12, HIGH); 
    }  
  }
}

