Ayuda con mi servo

quiero que mi codigo se ejecute cada 10 segundos pero no lo logro hacer funcionar bien, mi servo es un sg90

#include <Servo.h>
Servo servo;

void setup() {
  servo.attach(3);
}

void loop() {
  servo.write(180);
  delay(500);
    servo.write(0); // Vuelve a la posición inicial
  delay(500);
}

He trasladado su tema de una categoría de idioma inglés del foro a la categoría International > Español @maximoracing.

En adelante por favor usar la categoría apropiada a la lengua en que queráis publicar. Esto es importante para el uso responsable del foro, y esta explicado aquí la guía "How to get the best out of this forum".
Este guía contiene mucha información útil. Por favor leer.

De antemano, muchas gracias por cooperar.

Tienes que usar millis() y olvidarte de delay() (al menos en aplicaciones de este tipo).

En la sección Documentación tienes excelentes tutoriales, por ej.

Muy util, no lo entendí del todo, genere un loop y empezó a girar sin parar jajaja

otra cosa, sabes porque no se estara cumpliendo el angulo exacto de 180?

#include <Servo.h>
Servo servo;

unsigned long tiempoAnterior = 0; // Variable para almacenar el tiempo anterior
const unsigned long intervalo = 10000; // Intervalo de 10 segundos en milisegundos
bool enMovimiento = false; // Variable para controlar si el servo está en movimiento

void setup() {
  servo.attach(3);
}

void loop() {
  unsigned long tiempoActual = millis(); // Obtiene el tiempo actual

  if (!enMovimiento && tiempoActual - tiempoAnterior >= intervalo) {
    // Si el servo no está en movimiento y ha pasado el intervalo de tiempo
    enMovimiento = true; // Activar el movimiento
    tiempoAnterior = tiempoActual; // Actualizar el tiempo anterior
  }

  if (enMovimiento) {
    if (tiempoActual - tiempoAnterior <= 500) {
      // Mueve el servo a 180 grados durante los primeros 500ms
      servo.write(180);
    } else if (tiempoActual - tiempoAnterior <= 1000) {
      // Luego, mueve el servo a 0 grados durante los siguientes 500ms
      servo.write(0);
    } else {
      // Desactivar el movimiento después de completar el ciclo
      enMovimiento = false;
    }
  }
}

La verdad no tengo experiencia con servos pero el primer movimiento (90º) lo hace al ejecutar

servo.attach(3);

Supongo que lo podés solucionar así

void setup() {
  servo.attach(3);
  servo.write(0);
}

Menos mal que millis() no lo entendiste del todo! :wink:
:clap: :clap: :clap:

#include <Servo.h>
Servo servo;

unsigned long tiempoAnterior = 0; // Variable para almacenar el tiempo anterior
const unsigned long intervalo = 10000; // Intervalo de 10 segundos en milisegundos
bool movimientoActivo = false; // Variable para controlar si el movimiento está activo

void setup() {
  servo.attach(3);
}

void loop() {
  unsigned long tiempoActual = millis(); // Obtiene el tiempo actual

  if (!movimientoActivo && tiempoActual - tiempoAnterior >= intervalo) {
    // Si el movimiento no está activo y ha pasado el intervalo de tiempo
    movimientoActivo = true; // Activar el movimiento
    tiempoAnterior = tiempoActual; // Actualiza el tiempo anterior
  }

  if (movimientoActivo) {
    servo.write(180);
    delay(500);
    servo.write(0); // Vuelve a la posición inicial
    delay(500);
    servo.write(90); // frena
    delay(500);
    movimientoActivo = false; // Desactivar el movimiento después de completarlo
  }
}