Sensor Pick up y sensor hall

Mi duda es la siguiente.
Tengo el siguiente codigo y tengo una duda con respecto aun sensor, este proyecto es una computadora para mi moto que mide temp, RPM, indicador de cambios, y un lujo que es la luz del auto fantastico, pero cometi un error al hacerlo, ya que muy tarde me di cuenta que los motores de las motos no traen un sensor hall para el manejo del CDI si no un CAPTOR o un sensor pick-up he buscado por toda la web un proyecto similar al mio usando estos sensores, pero realmente no existen. Quisiera saber algun electronico, el sensor pick-up es similar al hall y si lo conecto al arduino leera las RPM como si fuera un Hall.

Gracias por su atencion y pronta respuesta. Muchs gracias.

//V1 programa con indicador de temperatura y carga de bateria
//V2 se elimina carga de bateria y se inicia modulo para RPM
//V3 copia de seguridad
//v4 Se incluye modulo para luces del auto fantastico
//V5 Se incluye secuencia para el GEAR INDICATOR se cambia modulo de arduino UNO a MEGA

#include <LiquidCrystal.h>;                 
#include <DS3231.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);     
const int hallPin = 10;                     
const int ledPin =  13;                     
const int rpmmax = 12000;                   
DS3231  rtc(SDA, SCL);  // pines A4 y A5
Time  t;
//___________________________
//Secuencia autofantastico
//__________________________
int led1 = 1;
int led2 = 6;
int led3 = 7;
int led4 = 8;
int led5 = 9;
int tiempo=20;

//___________________________
//secuencia Gear Indicator

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
const int upShift = 14;
const int dwnShift = 15;
int NeutralSense;
int currentPos;
int newPos;
int Neutral;
int NeutralFlag;
int NeutralWarn;

//_____________________________________________________________________



int hallState = 0;                             
unsigned long time = millis();                 
int RPM = 0;                                   
int Limpiart1 = 0;                             
// int KMh = 0;                                 
float perisensor = 6 * 3.1416;                 
float factorescala = perisensor * 87 *60 / 1000;
long t1 = millis();                                   
long t2 = millis();                                   
//int barras = 0;                                     
int numcar = 0;                                       
float TempVolt_1 = 0;
float TempCelsius_1 = 0;
//definimos icono motor
byte motor[8] = {
  B11111,
  B11111,
  B10101,
  B00100,
  B01110,
  B01010,
  B01110,
  B00000
};
//definimos simbolo grado celsius
byte grado[8] = {
  B01110,
  B01010,
  B01110,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000
};
//______________________________________________________________________

// INICIALIZACION: Se inicializan todos los valores en Arduino para su calibración

void setup()
{{{                                               
  lcd.begin(1, 2);                   
  lcd.print("Bajaj 125+");             
   pinMode(ledPin, OUTPUT);           
  pinMode(hallPin, INPUT);                   
  Serial.begin(9600);                             
  lcd.print("            ");                   
  while (millis() < 5000) {}                   
  time = millis();                             
  lcd.begin(16, 2);                             
  lcd.print("            ");                   

  rtc.begin();
 
  //rtc.setDOW(LUNES);         // Set dia de la semana en mayusculas
  //rtc.setTime(02, 24, 00);     // Set hora formato hh:mm:ss (24 H)
  //rtc.setDate(1, 2, 2016);   // Set fecha dia, mes, año
  //creamos iconos y los enviamos a la memoria de la pantalla
  lcd.createChar(3, motor);
  lcd.createChar(4, grado);
}
//______________________
// secuencia auto fantastico
//______________________

pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(led3,OUTPUT);
pinMode(led4,OUTPUT);
pinMode(led5,OUTPUT);
}
//______________________________
//secuencia GEAR INDICATOR
                
  Serial.begin(9600); //To comunicate with the PC
  display.begin(SSD1306_SWITCHCAPVCC);
  pinMode(upShift, INPUT_PULLUP); //Set analog pin 0 as an input from the sensor
  pinMode(dwnShift, INPUT_PULLUP);
  pinMode(NeutralSense, INPUT);

  int NeutralSense = analogRead(0);
  
  Neutral = map (NeutralSense, 0, 1023, 0, 1);
  
  if (Neutral > 0){
    NeutralFlag = 1;
    NeutralWarn = 0;
  }
  else{
    NeutralWarn = 1;
  }
 
  display.clearDisplay();
  display.display();

}

//___________________________________________________________________________

void loop()
{{{                                     
 hallState = digitalRead(hallPin);           
 if (hallState == LOW)
 {                     
 digitalWrite(ledPin, HIGH);             
 if (Limpiart1 == 1)
 {                   
 t2 = millis();                       
 RPM = 260000 / (t2 - t1);             
 //barras = RPM / revbarra;           
 // KMh = RPM * factorescala / 1000;     
 t1 = t2;                                         
 Limpiart1 = 0;                                   
 
 
 lcd.setCursor(0, 1);                   
 lcd.print("RPM ");                     
 lcd.print(RPM);                       
 lcd.print("    ");                         
 
 
 // leemos la trama de datos del reloj
 
 t = rtc.getTime();
 
 TempVolt_1 = analogRead (1)*0.004882812;
 TempCelsius_1 = (TempVolt_1 - 0.5) * 100;
 
 //Muestra la hora con formato hh:mm:ss
 
 lcd.setCursor(0, 0);
 if (t.hour < 10) lcd.print ("0");
 lcd.print (t.hour, DEC);
 lcd.print (":");
 if (t.min < 10) lcd.print ("0");
 lcd.print (t.min, DEC);
 lcd.print (":");
 if (t.sec < 10) lcd.print ("0");
 lcd.print (t.sec, DEC);
 
 // Muestra la temperatura del modulo RTC D3231
 lcd.setCursor (10,0);
 lcd.print (rtc.getTemp());
 lcd.write(4);                 
 
 lcd.setCursor (10,1);
 lcd.write (3);               
 lcd.print (" ");
 lcd.print (TempCelsius_1,0);
 lcd.write (4);               
 lcd.print ("  ");
 
 delay (1000); // se actualiza cada segundo
 }
 }
}
//__________________________________
//secuencia auto fantastico
//__________________________________

digitalWrite(led1,HIGH);
delay(tiempo);
digitalWrite(led1,LOW);
delay(tiempo);
digitalWrite(led2,HIGH);
delay(tiempo);
digitalWrite(led2,LOW);
delay(tiempo);
digitalWrite(led3,HIGH);
delay(tiempo);
digitalWrite(led3,LOW);
delay(tiempo);
digitalWrite(led4,HIGH);
delay(tiempo);
digitalWrite(led4,LOW);
delay(tiempo);
digitalWrite(led5,HIGH);
delay(tiempo);
digitalWrite(led5,LOW);
delay(tiempo);
digitalWrite(led5,HIGH);
delay(tiempo);
digitalWrite(led5,LOW);
delay(tiempo);
digitalWrite(led4,HIGH);
delay(tiempo);
digitalWrite(led4,LOW);
delay(tiempo);
digitalWrite(led3,HIGH);
delay(tiempo);
digitalWrite(led3,LOW);
delay(tiempo);
digitalWrite(led2,HIGH);
delay(tiempo);
digitalWrite(led2,LOW);
delay(tiempo);
digitalWrite(led1,HIGH);
delay(tiempo);
digitalWrite(led1,LOW);
delay(tiempo);
}
//________________________________________
//secuencia gear indicator

  
 int NeutralSense = analogRead(0);

 Neutral = map (NeutralSense, 0, 1023, 0, 1);
  
 if (Neutral > 0){
    delay(500);
    { 
    NeutralFlag = 1;
    NeutralWarn = 0;
    }
 }
 
 if (digitalRead(upShift) == LOW && NeutralFlag == 1){
    delay(1000);
    {
     newPos = 2;
     NeutralFlag = 0; 
    }
  }  

 if (digitalRead(upShift) == LOW){
    delay(1000);
    {
     newPos = currentPos + 1;
     NeutralFlag = 0; 
    }
 }
 
if (digitalRead(dwnShift) == LOW && NeutralFlag == 1){
    delay(1000);
    {
     newPos = 1;
     NeutralFlag = 0; 
    }
 }
 
 if (digitalRead(dwnShift) == LOW){
    delay(1000);
    {
     newPos = currentPos - 1;
     NeutralFlag = 0; 
    }
  }
 
if (newPos >= 6){
  newPos = 6;
}
if (newPos <= 1){
  newPos = 1;
}
 
if (NeutralWarn == 1 && NeutralFlag == 0){
 delay(500);
{
 display.setTextColor(WHITE);
 display.setTextSize(2);
 display.setCursor(28,10);
 display.println("Select");
 display.setCursor(25,40);
 display.println("Neutral"); 
 display.display();
}
}

if (NeutralFlag == 1){
 delay(500);
{
 display.clearDisplay();
 display.setTextColor(WHITE);
 display.setTextSize(2);
 display.setCursor(28,32);
 display.println("Neutral"); 
 display.display();
}
}
else{
  
if (NeutralFlag == 0 && NeutralWarn == 0){
  currentPos = newPos;
  
  display.setTextColor(WHITE);
  display.setTextSize(6);
  display.setCursor(50,22);
  display.println(currentPos);
  display.display();
  display.clearDisplay();
}
}
}

5 seg de Google : sensor pick up arrojó esto Inductive & magnetic type electrical speed sensor complete concept

Al menos te ubica en que estas recibiendo. Si la salida es una senoide con leer el cruce por cero será suficiente para contabilizar con algunas correcciones.