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, y muchas gracias por cualquier comentario o idea.

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>


LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7);
                    

int reverseSwitch=3;
int driverPUL=9;
int driverDIR=8;
int driverENA=6;
int limitSwitch=7;
int spd=A0;
int sensor=2;

boolean anterior=0;    
boolean actual=0; 
unsigned long contador=0;
long pd=0;
boolean dir=LOW;

void setup() 
{

lcd.setBacklightPin(3, POSITIVE);
lcd.setBacklight(HIGH);
lcd.begin(16,2);
lcd.clear();
pinMode(limitSwitch, INPUT);
pinMode(driverENA, OUTPUT);
digitalWrite(driverENA, HIGH);
pinMode(reverseSwitch, INPUT_PULLUP);
pinMode(sensor,INPUT_PULLUP);
pinMode(driverPUL, OUTPUT);
pinMode(driverDIR, OUTPUT);
attachInterrupt(digitalPinToInterrupt(reverseSwitch), dirmotor, RISING);
}


void dirmotor(){
  dir=!dir;
}

 boolean debounce(boolean dato_anterior) 
 {
   boolean dato_actual = digitalRead(sensor);
   if (dato_anterior != dato_actual)
   {
     delayMicroseconds(500);
     dato_actual = digitalRead(sensor);
   }
   return dato_actual;
 }  
               
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; 
}

La variable dir deberías declararla volatile porque se modifica en la rutina de interrupción.

Edita tu post e inserta el código según las Normas del Foro, punto 7. Es para tu beneficio.

Saludos

Moderador:
Por favor, lee las Normas del foro y edita tu código/error usando etiquetas de código.
Ve a edición, luego selecciona todo el código que has publicado, lo cortas y click en </>


Una disculpa ya corregí el post

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.