LED TEMPORIZADO

Hola a todos

soy nuevo en esto de arduino, me gustaría hacer un proyecto y ojala me puedan ayudar.

quiero que pulsando un botón y se encienda un led, después de cierto tiempo el led se apaga y se prenda otro, (que yo le pueda asignar el tiempo y modificar), y que vuelva a estado inicial y se vuelvo y presiono el botón se repita la operación.

gracias por la ayuda.

Hola, debieras definir el problema de manera mas precisa...

cuando ha iniciado la secuencia, si vuelves a pulsar el boton, la reinicia o lo ignora?

como modificas el tiempo por programa?, o con un input exterior?, y en este caso, de que tipo

Hecha esta aclaración yo definiria un diagrama de estados, (Ver en el subforo documentacion si no te suena nada)

Inicializacion Inicio temporizacion /* si la temporizacion viene definida por programa, si no, lectura de temporizacion */ apagado de los leds

Bucle En Estado 0 todos los leds apagados, espera de pulsador, enciende el led, pasa a estado 1 Estado 1, espera final tempo, apagado led 1, encendido led 2, reinicio tempo, pasa a estado 2 Estado 2, espera final tempo, apagado led 1, apagado led 2, reinicio tempo, pasa a estado 0

Observaras que apago los dos leds en la ultima linea, finalmente, si los quieres tener apagados ambos, apagalos cada vez, que no hace daño

Programar no consiste en copiar tutoriales, se trata de entender el problema, y solo despues usar unas estructuras básicas, que siempre son las mismas, programes para arduino o para la NASA

Lo importante no es Arduino, es entender el concepto... bueno, eso opino yo, que no se de Arduino

Otra tarea escolar. Haz tu código, compártelo y luego comenta tus dudas. Asi no podemos ayudarte.

Hola, demas q para vos q sabes es una tarea escolar, para los que apenas estamos en esto es un poco mas dificil, anexo el codigo que llevo lo que pasa es que aveces hace el intervalo y el led se apaga pero tras veces no.

const int pinled = 10; // el pin del led
const int pinbtn = 8; // el pin del botón
const long interval = 6000; // tiempo de temporizado
unsigned long previousMillis = 0;

int encender = 0; // si está encendido el led
int anterior = 0; // pulsacion anterior
int estado = 0; // el estado del botón actual
boolean State1 = false;

void setup()
{
  pinMode(pinled, OUTPUT);     //pin del led como salida
  pinMode(pinbtn, INPUT);      //pin del botón como entrada
}

void loop()
{
 estado = digitalRead(pinbtn); // comprobamos el estado

 if(estado && anterior == 0)   //
 {
   encender = 1 - encender;   // asigamos el estado contrario
   delay(30);
 }

 anterior = estado;           //guardamos el estado actual para comprobaciones

 if(encender) 
 {
digitalWrite(pinled, HIGH);
State1 = true;
previousMillis = millis();

 }
{
if ((State1 = true) && (millis() - previousMillis >= interval))
digitalWrite(pinled, LOW);
State1 = false;
anterior = estado;
}
}

cgriell:
cuando ha iniciado la secuencia, si vuelves a pulsar el boton, la reinicia o lo ignora?

Pregunta clave para comprender qué quieres hacer con el código.

Lo estuve analizando, aunque luego lo dejé; porque el releer:

Paoloso:
quiero que pulsando un botón y se encienda un led, después de cierto tiempo el led se apaga y se prenda otro, (que yo le pueda asignar el tiempo y modificar), y que vuelva a estado inicial y se vuelvo y presiono el botón se repita la operación.

Me dejó la siguiente duda: para qué rayos necesitas usar millis entonces? Si la secuencia no va a ser detenida ni interrumpida por el botón (solo iniciada), entonces este último perfectamente puede pasar desapercibido durante la secuencia de LEDs…

Bueno, en principio hay cientos de personas que llegan acá con tareas escolares y preguntas como la tuya. Entonces como bien te ha dicho cgriell y Lucario, al no definir debidamente tu problema cuesta entenderte. Pero visto que has publicado un código ahora si mereces para mi sano entender una respuesta aproopiada. Porque además has usado correctamente el posteo de acuerdo a las normas del foro, lo que me hace pensar que tal vez las has leído. Dicho esto te respondo: Acá has cometido un pequeño error

   if (State1 && (millis() - previousMillis >= interval))
       digitalWrite(pinled, LOW);
       State1 = false;
       anterior = estado;
   }

anterior = estado; ya fueron cambiados luego de que comparas si se presiona el botón de modo que esto es como mínimo redundante.

Este código que es apenas diferente al tuyo debería hacer lo que quieres

const byte pinled            = 10; // el pin del led
const byte pinbtn            = 8; // el pin del botón
const unsigned long interval = 6000; // tiempo de temporizado
unsigned long previousMillis = 0;

bool encender = 0; // si está encendido el led
bool anterior = 0; // pulsacion anterior
bool estado = 0; // el estado del botón actual
bool State1 = false;

void setup() {
  pinMode(pinled, OUTPUT);     //pin del led como salida
  pinMode(pinbtn, INPUT);      //pin del botón como entrada
}

void loop() {
   estado = digitalRead(pinbtn); // comprobamos el estado
   
   if (estado && !anterior)  {
       encender = !encender;   // asigamos el estado contrario
       delay(30);
   }
   anterior = estado;           //guardamos el estado actual para comprobaciones
   
   if (encender) {
      digitalWrite(pinled, HIGH);
      State1 = true;
      encender = false;
      previousMillis = millis();
   }

   if (State1 && (millis() - previousMillis >= interval))
       digitalWrite(pinled, LOW);
       State1 = false;
   }
}

Presionas el botón, cambia el estado como si fuera un switch. cuando estado es TRUE entonces activas el disparo por tiempo demorado poniendo al pinLED en HIGH por interval = 60 segundos. Apagas encender para que no se dispare de nuevo Hecho esto, bloqueas State1 para que no se repita.

Gracias por tu ayuda surbyte, le he intentado mil veces el led enciende pero después que pasara el intervalo este no se apaga, la verdad no se ni que hacer creo que lo he intentado casi todo, igual no me daré por vencido.

Ya quedó listo, lo que le cambie es que cuando quería que el led se apagara tenia el estado en FALSE, le cambie el estado a TRUE y quedo perfecto, gracias surbyte por tu ayuda mi proyecto no acaba acá y de pronto necesitare de todos ustedes, dejo el tema abierto por lo que necesitare mas adelante o le doy solucionado por estar listo el temporizado del led??.