Eres un crack,
por un lado quemé el LED que lleva el optoacoplador (o eso creo jeje) ya que conecté directamente 5v a esa patita para probar. Leyendo por internet aprendí que hay que pasar por resistencia si o si o te cargas el LED interno.
He cambiado el optoacoplador por otro nuevo y poniendo una resistencia... funciona desde ahí!
He ido yendo hacia atras y efectivamente el "tapón" se produce en ese punto que comentas. Muchisimas gracias por la explicación, no se si eres consciente pero me estas haciendo aprender un montón de cosas!
Aplicando tu teoría le he dado la vuelta al diodo zener, y efectivamente así si que funciona dejando todo lo demás igual.
Por tanto, ahora la cuestión es probar así con mis 5V (supongo que no hay problema... verdad?) y una vez que tenga el programa perfecto darle la vuelta al zener y enchufarle los 12V.
Si estoy haciendo alguna chapuza me lo dices!
Ahora el problema, sin revisar aún el código, es que me da algunas lecturas "falsas":
- El valor correcto para los pulsos que le estoy metiendo es exactamente 600 RPM
600 RPM
600 RPM
600 RPM
600 RPM
600 RPM
600 RPM
1200 RPM
1800 RPM
2400 RPM
....
..
600 RPM
600 RPM
600 RPM
600 RPM
600 RPM
600 RPM
Toca liarme con el código o puede ser debido a otra cosa?
volatile unsigned long timePointsOpen, timePointsClosed, lastChange;
volatile unsigned int numBangs;
void pointsOpening(){
unsigned long t;
t = millis();
if (lastChange > 0){
timePointsClosed += (t - lastChange);
}
lastChange = t;
++numBangs;
}
void setup(){
pinMode(3, INPUT);
digitalWrite(3, HIGH);
Serial.begin(9600);
Serial.print("Inicializado ");
}
void loop(){
// Number of coil pulses
numBangs = 0;
attachInterrupt(0, pointsOpening, RISING);
delay(50);
detachInterrupt(0);
numBangs = ((60000/50)*numBangs)/2;
Serial.print("RPM: ");
Serial.println(numBangs);
}
La sentencia digitalWrite(3, HIGH) no activa el Pull up? No sé si en el otro pin hay que hacerle algo tambien (el 2 de las interrupciones)