Problema con lógica

Continuando la discusión desde Problema con logica del programa:

hola buenos días, tardes o noches, he estado programando un código en arduino uno para una idea de proyecto de universidad, soy nuevo hace 5 meses que estoy en el mundo de arduino, el programa se trata del conteo del numero de vueltas en un eje con un encoder optico y un disco con 30 ranuras acoplado a dicho sensor, y tambien al mismo tiempo quiero controlar la velocidad de un motor a pasos Nema 23 con un potenciometro y un boton para la inversión de giro, primero probé cada tarea por separado y funcionaban correcto, pero cuando junté el código todo funcionaba mal, el conteo se retrasaba y el motor se forzaba o no lograba la velocidad que le indicaba con el potenciómetro, y la sorpresa que me lleve fue que como estoy utilizando DELAY y se me hizo facil usarlo, se crean errores de lógica porque esa función detiene por completo el programa, y he estado leyendo en paginas de internet que es recomendable usar millis o micros los cuales tienen como ventaja contra el delay que no detienen el programa y se basa en el tiempo transcurrido del reloj del microprocesador para hacer los eventos al tiempo que uno lo defina. Pero no sé como reeemplazar el delay con millis, les dejo mi código a continuación:

 //INICIO //LIBRERIAS// INICIO//
//Librerias necesarias para para el funcionamiento del display lcd
//junto con el módulo incorporado I2C
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

//Se definen los pines del display lcd
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7);
//FIN //LIBRERIAS// FIN//

     //INICIO //DECLARACIÓN DE VARIABLES// INICIO//
//Definir pines del arduino, de izquierda a derecha primero se
//define el tipo de dato, después el nombre de la variable y por
//ultimo el valor al que se iguala la variable indica el número
//del pin del Arduino
int reverseSwitch=3;
int driverPUL=9;
int driverDIR=8;
int driverENA=6;
int limitSwitch=7;
int spd=A0;
int sensor=2;

//Variables secundarias, las tres primeras "anterior", "actual",
// y contador son para hacer la función de conteo y guardar los
//estados del conteo, la variable "pd" es el periodo de retardo
//del pulso el cual debe ser lo necesario para permitir al motor
//conmutar los pasos y aumentarlos desde ese valor y la ultima
//variable funciona con el cambio de dirección para el motor con
//un simple switch.
boolean anterior=0;
boolean actual=0;
unsigned long contador=0;
long pd=0;
boolean dir=LOW;

            //FIN //DECLARACIÓN DE VARIABLES// FIN//


               //INICIO //FUNCIÓN SETUP// INICIO//         
//BLOQUE DE SETUP, ÚNICAMENTE PARA INICIALIZAR LOS PINES DEL
//ARDUINO COMO ENTRADAS O SALIDAS DE HARDWARE EXTERNO (BOTONES,
//CONEXIONES, SENSORES, ETC.) SOLO SE INICIA UNA VEZ CADA QUE SE
//ENCIENDE O RESETEA EL ARDUINO
void setup()
{

lcd.setBacklightPin(3, POSITIVE);//Inicializar luz de fondo, pin 3 del display
lcd.setBacklight(HIGH);//Encender luz de fondo del display
lcd.begin(16,2);//Inicilizar display de 16 segmentos y 2 columnas
lcd.clear();//Limpiar pantalla
pinMode(limitSwitch, INPUT);
pinMode(driverENA, OUTPUT);
digitalWrite(driverENA, HIGH);
pinMode(reverseSwitch, INPUT_PULLUP);//Inicializar switch de cambio de dirección como entrada
pinMode(sensor,INPUT_PULLUP);//Inicializar entrada del sensor optoacoplador infrarrojo
pinMode(driverPUL, OUTPUT);//Inicializar como salida de pulsos hacia el driver
pinMode(driverDIR, OUTPUT);//Inicializar como salida de dirección de rotación hacia el driver
attachInterrupt(digitalPinToInterrupt(reverseSwitch), dirmotor, RISING);
}
//FIN //FUNCIÓN SETUP// FIN//

                //INICIO //FUNCIÓN DE INTERRUPCIÓN// INICIO//
//Función para el cambio de sentido del motor, la cuál es llamada por la interrupción inicializada "revmotor" en el setup
void dirmotor(){
dir=!dir;
}
//FIN //FUNCIÓN DE INTERRUPCIÓN// FIN//

                 //INICIO //FUNCIÓN ANTIRREBOTE// INICIO//
//Este bloque sirve para evitar falsos conteos dados por el sensor y guardar los estados declarados//
boolean debounce(boolean dato_anterior)
{
boolean dato_actual = digitalRead(2);
if (dato_anterior != dato_actual)
{
delayMicroseconds(pd);
dato_actual = digitalRead(2);
}
return dato_actual;
}
//FIN //FUNCIÓN ANTIRREBOTE// FIN//

            //INICIO //FUNCIÓN BUCLE// INICIO//
//FUNCIÓN QUE SE ESTARÁ REPITIENDO INFINITAMENTE MIENTRAS ESTÉ ENERGIZADO EL ARDUINO
//AQUI SE EJECUTAN TODAS LAS CONDICIONES QUE ESTRUCTURAN EL PROCESO PRINCIPAL DE
//LA TAREA QUE SE REQUIERE REALIZAR
void loop()
{
if(digitalRead(limitSwitch)==LOW){
pd=map((analogRead(spd)),0,1024,2000,50);
digitalWrite(driverDIR, dir);
digitalWrite(driverPUL, HIGH);
delayMicroseconds(pd);
digitalWrite(driverPUL, LOW);
delayMicroseconds(pd);
}

actual = debounce(anterior);
if (anterior==0 && actual==1)
{
contador++;
delayMicroseconds(500);
lcd.setCursor(0,0);
lcd.print("Vueltas:");
lcd.setCursor(8,0);
lcd.print(contador/30);
lcd.setCursor(11,0);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(" ");
}
anterior = actual;
}

Moderador:
Hilo cerrado
No puedes continuar algo cuando tienes algo ya comenzado.
Te he pedido en el otro hilo que edites, pues haz exactamente eso.
Lo que has hecho se llama doble posteo y la proxima vez será sancionable.