//variables to keep track of the timing of recent interrupts
unsigned long trigger_time = 0;
unsigned long last_trigger_time = 0;
unsigned long period = 1;
unsigned long idle = 1;
unsigned int rpm = 0;
const int pulsePerRev = 2;
int pulseDelay = 3;
unsigned int fireFlag = 0;
void IRAM_ATTR isr() {
trigger_time = millis();
period = trigger_time - last_trigger_time;
last_trigger_time = trigger_time;
fireFlag = 1;
while (millis() < trigger_time + pulseDelay){}
digitalWrite(19, LOW);
while (millis() < trigger_time + pulseDelay +1){}
}
void fireCoil() {
//Serial.printf( fireFlag ? "true" : "false"); // prints true
//printf("\n");
//Serial.printf("fire coil\n");
delay(pulseDelay);
digitalWrite(19, LOW);
delayMicroseconds(500);
digitalWrite(19, HIGH);
fireFlag = 0;
}
void setup() {
Serial.begin(115200);
pinMode(18, INPUT_PULLUP);
pinMode(19, OUTPUT);
digitalWrite(19, HIGH);
attachInterrupt(18, isr, FALLING);
}
void loop() {
//Serial.print( fireFlag ); // prints true
//Serial.printf("\n");
if (fireFlag==true) {fireCoil();}
rpm = 60000/(period*pulsePerRev);
float deg_per_usec = 1000000.*60./360./rpm
//Serial.printf("Period is %u msec\n", period);
//Serial.printf("RPM is %u \n", rpm);
Serial.printf("deg/usec is %.1 \n", deg_per_usec);
}