Mi arduino UNO no responde al delay

Soy nuevo y ando haciendo un proyecto para la escuela con Arduino UNO, solo que tengo un problema, mi Arduino no responde al delay, aveces no lo toma en cuenta, no respeta los milisegundos colocados, o simplemente se queda esperando por siempre.

Su publicacion se MUEVE a su ubicacion actual ya que es mas adecuada.

Publica el código completo que estás utilizando, recuerda ponerlo con el tag CODE y explica mejor esos fallos, en qué casos te hace cada cosa. No creo que con el mismo código te haga de forma aleatoria esos tres fallos.

Es un proyecto con el módulo RFID-RC522

#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h> 
 
Servo microservo9g;

#define SS_PIN 10
#define RST_PIN 9
// Definicoes pino modulo RC522
MFRC522 mfrc522(SS_PIN, RST_PIN); 


int led_liberado = 5;
int led_negado = 6;

char st[20];

void setup() 
{
  pinMode(led_liberado, OUTPUT);
  pinMode(led_negado, OUTPUT);
 
  microservo9g.attach(8);
 
  microservo9g.write(0);
  
  Serial.begin(9600);
 
  SPI.begin();
  
  mfrc522.PCD_Init();
  mfrc522.PCD_SetAntennaGain(112); 
  
  Serial.println("Kullanýma hazýr...");
  Serial.println();
}

void loop() 
{
  
  if ( ! mfrc522.PICC_IsNewCardPresent()) 
  {
    return;
  }
  // Seleciona um dos cartoes
  if ( ! mfrc522.PICC_ReadCardSerial()) 
  {
    return;
  }
  
  Serial.print("Lectura de tarjeta :");
  String conteudo= "";
  byte letra;
  for (byte i = 0; i < mfrc522.uid.size; i++) 
  {
     Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
     Serial.print(mfrc522.uid.uidByte[i], HEX);
     conteudo.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
     conteudo.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  Serial.println();
  Serial.print("Sezerduino:Error ");
  conteudo.toUpperCase();
  
  if (conteudo.substring(1) == "E3 98 03 FB")
  {
    Serial.println("Ingresado Correctamente");
    Serial.println();
    
    for (int i= 1; i<5 ; i++)
    {
       microservo9g.write(90);      
       delay (2000);
       microservo9g.write(0);
       
       }
  
  }}

Los fallos los hace de manera aleatoria, aveces solo hace lo que quiere con el delay

¿El fallo entiendo que sólo es cuando haces lectura de una tarjeta y entonces al moverse el servo, que haces 4 veces un giro de 0° a 90° cada 2 segundos, es cuando hace esos fallos? Si es así yo probaría a quitar el delay() y hacerlo con función millis(). Hay que huir del uso de delay() en el loop si no son tiempos muy cortos.

Perdón pero, siempre he intentado lo de millis pero no logro entender como reemplazarlo, me podrías guiar?

Siendo un proyecto para la escuela creo que lo que tienes que hacer es aprender así que te lo explico y te pongo la parte de los millis, intenta completarlo todo.
Cuando haces el giro en un sentido está 2 segundos pero al contrario no hay ningún retardo con lo que se le da la orden de ir a 0° y seguido se le dice ir a 90° que el servo no le da tiempo, probablemente ni se apreciará apenas que se mueve. Tal vez sea eso lo que te pasa. Puedes probar a poner un pequeño delay después de llevarlo a la posición 0°.
Pero para tenerlo realmente bien hecho y que puedas ampliar el código con otras cosas que quieras ir añadiendo sin tener problemas lo que yo haría sería algo así.

Tu bucle va leyendo el lector RFID. Quita el formato de los dos condicionales con return ya que si no hay lectura de tarjeta ya no ejecuta nada del resto del loop. Cuando se cumple una condición, en este caso la lectura de una tarjeta, lo comunicas a una variable por ejemplo lecturaTarjeta que normalmente tendrá valor 0 y tomará valores 1, 2, etc. si tienes varias tarjetas.
Por otro lado planteas la parte del código que cuando lecturaTarjeta sea distinto de 0 ponga otra variable cicloServo a 1 y otra inicioCiclo también a 1. Con inicioCiclo iniciaremos la cuenta de tiempo para el primer ciclo de la posición 0°.

if (inicioCiclo == 1) {
  inicioMillis = millis();
  inicioCiclo = 0)
}

Con la variable cicloServo haremos la cuenta de los 4 ciclos que tiene que hacer el servo. Pones otro condicional que si cicloServo es distinto de 0 harás los movimientos. Creas otra variable servoOnOff que podrá valer 0 si el servo está en la posición 0° y valdrá 1 si está en 90°. Y dentro haces los giros temporizados, algo así:

if (cicloServo != 0 && servoOnOff == 0 && (millis() - inicioMillis >= 100)) {
    microservo9g.write(90);
    servoOnOff = 1;
    inicioMillis = millis();
  }

if (cicloServo != 0 && servoOnOff == 1 && (millis() - inicioMillis >= 2000)) {
  microservo9g.write(0);
  servoOnOff = 0;
  inicioMillis = millis();
  if (cicloServo == 4) cicloServo = 0;
}

Observa que cada vez que se hace un giro comienza la temporización para el giro contrario. He puesto un retardo de 100 ms, seguro que necesitarás ampliarlo para que le dé tiempo al servo de hacer todo el giro.
No he hecho todo el programa y por tanto no lo he comprobado pero con esto debería ser suficiente para que lo desarrolles y según hagas vuelves a preguntar.

Puedes sacar una foto del chip que contiene tu UNO?

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