Controlar Fan Cooler 12V 3 pines

Saludos, estoy intentando construir un proyecto que me permita controlar la velocidad de un Fan Cooler 12V 3 Pines con Arduino Uno R3 a partir de la lectura de un sensor de temperatura TMP36, la lectura de la temperatura la tengo resuelta, sin embargo tengo un problema algo macabro con el control del Fan Cooler, es decir, se que la línea roja debe alimentarse de una fuente externa de 12 V, que la línea negra debe compartir la línea de tierra con el Arduino y que la línea amarilla controla la velocidad del Fan Cooler a través de un pin PWM, el problema radia en que tengo claro que no debo conectar la línea amarilla directamente al arduino sino a través de un circuito de protección compuesto por un diodo (1N4001) y un transistor (BD137), circuito que debe estar controlado por un optoacoplador (intenté con el 4N35 sin éxito) ya que éste se activa de acuerdo a la temperatura leída en el sensor TMP36, PERO surgen varias preguntas

  1. ¿Realmente es necesario el optoacoplador?
  2. ¿Cuál es el optoacoplador correcto para este circuito?
  3. ¿Cómo integrar el circuito de protección al optoacoplador?
  4. ¿Cómo quedaría el código que debo cargar al arduino?

PDTA: Llevo dos días googleando con este problema y he encontrado tantas opciones (todas imcompletas) que me veo a la tarea de recurrir a los que más saben.

Gracias.

el cable rojo es +12
el cable negro gnd
el cable amarillo es la salida del sensor hall, que te dice a que revoluciones está girando el rotor.

el control de la velocidad es tan simple como hacer esto sin lectura de giro

analogWrite(pinMotor,map(analogRead(pinTemperatura),0,1023,0,255));
delay(1000); //esperar 1 segundo para evitar histerisis

donde 0,1023, es la lectura del temometro
0,255 el la velocidad minima y maxima que gererará

maxid:
analogWrite(pinMotor,map(analogRead(pinTemperatura),0,1023,0,255));
delay(1000); //esperar 1 segundo para evitar histerisis

donde 0,1023, es la lectura del temometro
0,255 el la velocidad minima y maxima que gererará

¿Entiendo bien si lo que me dices significa que no necesito circuito de seguridad para el arduino contra el reflujo de corriente cuando el ventilador se queda sin alimentación?

Si utiliza el map como esta en la línea que me recomiendas el Fan Cooler permanece encendido todo el tiempo y va aumentado las revoluciones a medida que la temperatura aumenta, esta bien, pero si yo quiero que empiece a girar a partir de cierta temperatura ¿puedo mapear el sensor de temperatura no desde 0 sino por ejemplo desde 500? es decir

analogWrite(pinMotor,map(analogRead(pinTemperatura),500,1023,0,255));
delay(1000);

¿La conexión con circuito de protección que muestro en la imagen adjunta es correcta?

La primera pregunta no la entiendo. Pero está de más el optoacoplador para este caso.
La segunda es correcta.
Y el circuito estaría bien pero el diodo va en paralelo al motor + con + y - con -

maxid:
Pero está de más el optoacoplador para este caso.
La segunda es correcta.
Y el circuito estaría bien pero el diodo va en paralelo al motor + con + y - con -

Corrigiendo el diodo ¿puedo prescindir del optoacoplador en el circuito de la imagen?

Si. Incluso usar un 2n2222 con una r 2k2

Ok gracias Maxid por tu tiempo, ya logré controlar el encendido y apagado del Fan Cooler utilizando un mosfet y un diodo, eso esta bien, ahora lo que quisiera es controlar la velocidad de rotación del Fan Cooler, he intentado hacerlo con analogWrite pero el comportamiento es muy errático y además afecta el funcionamiento de un LCD 16x2 que tengo conectado para monitorear la temperatura del sensor, lo he intentado con dos velocidades nada más pero no lo consigo con éxito, el código que he utilizado es el siguiente:

if (valTmp36 > 250)
analogWrite(fanPin, 191)
if (valTmp36 > 280)
analogWrite(fanPin, 255)

con este código cuando debe iniciarse en 191 el Fan Cooler tiene un chillido extraño y cuando cambia a 255 el LCD deja de mostrar caracteres o empieza a mostrar caracteres extraños y el Fan Cooler pierde totalmente el control, no se apaga nunca y varía las velocidades sin control.

Gracias.

que tan lineal es la medicion de rpm que da el cable amarillo (sensor hall)?
Si es lineal plantea un control lineal no lo que estas haciendo.

tu código esta mal.

if (valTmp36 > 250)
  analogWrite(fanPin, 191)
if (valTmp36 > 280)
    analogWrite(fanPin, 255)

dice que si valTmp36 es mayor a 250 le digas al ventilador que gire a 191 (me expreso asi pero se entiende la idea).. todo bien entre 251 y 280 pero cuando valTmp36 supera 281, que pasa? que tienes un instante que lo pone a 191 y luego a 255 o sea chirrido, es muy rapido tanto que no se si mecánicamente pueda acusarlo.

en principio modifica eso asi

if (valTmp36 > 280) 
  analogWrite(fanPin, 255);
if (valTmp36 > 250 & valTmp36 <= 280)
    analogWrite(fanPin, 191);

Ahora un valor mayor a 280 tendra una pwm de 255 solamente.
un valor comprendido entre 251 y 280 tendra un valor de 191

Muy bien surbyte. Ademas agregar un delay entre 1 y 3 segundos para estabilidad de la medición

Ok gracias por los aportes sin embargo corrigiendo las condiciones en el if, hay un chirrido al andar a 191 y realmente es muy errático la activación y desactivación del cooler, estuve buscando un datasheet para verificar las características de linealidad pero no logro encontrar nada de información, se trata de un Fan Cooler Foxconn Model PV802512L, no dispongo de un osciloscopio para medir la onda.

Gracias.

El Chillido no me extrañaría, se debe a la modulación. Haz la prueba de ir elevando de 0 a 255 cada 100ms y verás como chilla y cambia la música.
Lo errático es otra cosa. Despues de leer haz una pausa. Y lee almenos 3 veces y promedia antes de tomar el valor como correcto