Controlar velocidad motor AC con Triac y arduino

Hola, soy nuevo en el foro y necesito ayuda con la programación, tengo una parte pero me falta bastante.
La idea mia es controlar la velocidad de un motor AC universal usando un triac (para lo que ya encontré un código) y ademas el motor tiene un tacometro que devuelve un voltaje dependiendo la velocidad.
Lo que necesito es establecer una velocidad deseada y que arduino me la compare con la velocidad que me devuelve el tacometro y dependiendo eso aumente o disminuya la corriente que le entrega.

//Desenvolvido por Marco Silva
//Email: Marco.silva@labdegaragem.com
//Lab de Garagem

int AC_LOAD = 12;// Dará o pulso no Triac pin
int dimming = 125;// Dimming level (0-128) 0 = ON, 128 = OFF
unsigned long time;//Contará o tempo
unsigned long timeout;//Estouro
int brilho[3];//Recebe os valores da serial
int i=0;//Quantidade de caracteres recebida pela serial
int flag=0;//Indica que foi recebida informação pela serial
char temp;//Armazena dados recebidos pela serial
int x,y;//Variaveis auxiliares

void setup()
{
  pinMode(AC_LOAD, OUTPUT);// Disparo do Triac pino 3
  attachInterrupt(0, zero_crosss_int, RISING);// Interrupção detecta a passagem por 0, quando passa de nível baixo para auto
  pinMode(4, INPUT);// Configura o pino 4 como entrada
  pinMode(5, INPUT);// Configura o pino 5 como entrada
  
}

void zero_crosss_int() // Função que detecta a passagem por 0
{
  
  // Calculo do ângulo de disparo :: 60Hz-> 8.33ms (1/2 Cycle)
  //6941-6.94/128
  // (8333us - 8.33us) / 128 = 65 (Approx)
  int dimtime = (75*dimming); // 65 equivale a 1 de 128
  delayMicroseconds(dimtime); // Off cycle
  digitalWrite(AC_LOAD, HIGH); // disparando o Triac
  delayMicroseconds(1); // Aguarda o tempo de disparo
  digitalWrite(AC_LOAD, LOW); // finaliza o pulso do Triac
 }

void loop()
{
  //------------------------------------------------------------------------------------------
  // Retorna o tempo em milisegundos desde que o Arduíno começou a rodar,
  time = millis()%2;//Divide por 2 e salva o resto
  if(time==1||time==0)//Compara se o resto é igual a 0 ou 1 e sempre vai ser
  {
  timeout++;// Cronômetro
    if (timeout>300)// Compara se houve estouro do tempo
    {
    i=0;// Zera o quantidades de caracteres recebidos
    flag=0;// Zera o aviso de que foi recebido algum dado na serial
    }  
   }
 
  //-------------------------------------------------------------------------------------------
  
  //Aumenta a intensidade
  if(digitalRead(4)==1 && dimming >5)// Compara se o botão foi pressionado e se o dimming é maior que 10 seu limite máximo
  {
   dimming= dimming -5;// Aumenta a intensidade de 5 em 5
    delay(150);// Aguarda um tempo até o próximo acionamento
  }
  //Diminui a intensidade
  if(digitalRead(5)==1&& dimming<125)
  {
    dimming= dimming +5; 
  }
}

esta seria la pare del código que tendría que cambiar.

//Aumenta a intensidade
  if(digitalRead(4)==1 && dimming >5)// Compara se o botão foi pressionado e se o dimming é maior que 10 seu limite máximo
  {
   dimming= dimming -5;// Aumenta a intensidade de 5 em 5
    delay(150);// Aguarda um tempo até o próximo acionamento
  }
  //Diminui a intensidade
  if(digitalRead(5)==1&& dimming<125)
  {
    dimming= dimming +5; 
  }

Este es el diagrama que use para controlar el triac

Gracias por la ayuda y cualquier dato extra que necesiten no duden en pedirlo.

Bueno pero transmite como es la curva de transferencia del tacómetro como para armar el loop de control.

el motor entrega un voltaje de 0-30v ac. Para poder leerlo use un puente de diodos y un divisor resistivo (100k en la entrada y 20k al negativo) que me ubica dicho voltaje ente los 0y5volt.

0 5V en semionda, debes medir el nivel pico.
Y que tipo de control quieres hacer?
Proporcional alcanza o debe ser PID?

me da un valor proporcional. supongamos que a 14000rpm genera 26volt y ese valor lo leo analogicamente.
lo que quiero es decirle que gire a 14000rpm, si el valor que me devuelve el motor es menor a 26v, tengo que aumentar la corriente que le envío(lo cuan se logra cambiando el valor de "dimming",que va de 0 a 128) y asi hasta llegar a las rpm que yo le pido.
Mi principal problema es mi incapacidad para crear un código que sea capas de compara la señal analógica de entrada, compararla con un valor "x" y aumentar, mantener o disminuir el valor de una variable.

perdón si no me explico muy bien.

Bueno, con algunos cambios este link tal vez te ayude.
Implementa un PID y en lugar de tu tacómetro usa un detector optico, asi que requerirá de alguna adaptación.
Esta muy completo, bien explicado y es una buena base para tu proyecto.

Genial!!. Muchas gracias por el enlace.