Parpadeo sin delay y botones

Hola, quisiera ayuda con un codigo ya que no tengo idea de como hacerlo; consiste en un programa que prenda y apague dos LEDs, un LED enciende al minuto y apaga el otro y asi cada minuto, adicional a esto entre cada minuto puedo encender el otro led y dejarlo en esta posicion, es decir esta encendido LED1 hasta el minuto, pero presione el boton1 para encender LED2 si lo quiero regresar presiono boton2, pero al momento que pase el minuto este va a la posicion que debe ser es decir como estaba prendido LED1 va a LED2
No se si me pudieran ayudar ya que con delay no se puede por las instrucciones

Aquí hay un proyecto similar. Puedes seguir esto: Blink two LEDs with Arduino

Moderador:
Por favor, lee las Normas del foro
Edita tu título, usa uno que no tenga justamente lo que se considera un título inútil.
Ver en las normas (punto 5) como poner títulos adecuados.
"Ayuda con un código" es lo mas genérico que puedes poner. Se mas específico.
Retira la palabra "Ayuda..."

El ejemplo Blink y el ejemplo que te recomiendo BlinkWithoutDelay.ino hace exactamente eso con un led. Si lo ves con un led supongo que podrás hacerlo con dos.

Si entiendo el hecho de perder y apagar leds pero para el problema planteado no me sirve mucho por los delays ya que el codigo se para en el delay para el parpadeo y no me hace nada con los botones

¿Esto se relaciona con

?

Me cambiaron eso, es por ello que vine a preguntar de nuevo

Como hacías en ese código tienes que usar millis().
Quita todo lo referido a los servos y ya tienes algo sobre lo que trabajar.
También puedes guiarte viendo el ejemplo "Blink without delays" de la IDE.

Al momento lo llevo asi respeta el pulso que manda el p2, pero al momento que hace el cambio en automatico ahora no manda el pulso del p1 y se queda encendido el led en automatico

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

LiquidCrystal_I2C lcd(0x3F,16,2);
unsigned long tiempo1 = 0;
unsigned long tiempo2 = 0;
unsigned long tiempoSegundos = 0;
int led2 = 8;
int led = 2;
int p1 = 6;
int p2 = 7;
Servo myservo;

void setup() {
  myservo.attach(9);
  Serial.begin(9600);
  tiempo1 = millis();
  lcd.init();
  lcd.backlight();
  lcd.print("La jaz fuandora ");
  pinMode(led,OUTPUT);
  pinMode(led2,OUTPUT);
  pinMode(p1,INPUT);
}

void loop() {
//myservo.write(45);
  //delay(10);
  if(tiempoSegundos == 4294967295 ){
    tiempoSegundos = tiempoSegundos*0;
    tiempo2 = tiempo2*0;
    tiempo1 = tiempo1*0;
  }
  tiempo2 = millis();
  if(tiempo2 > (tiempo1+1000)){  //Si ha pasado 1 segundo ejecuta el IF
    tiempo1 = millis(); //Actualiza el tiempo actual
    tiempoSegundos = tiempo1/60000;
    tiempoSegundos = 1 - tiempoSegundos; //Configuracion de tiempo en minutos
    Serial.print("Ha transcurrido: "); 
    Serial.print(tiempoSegundos); 
    Serial.println(" desde que se encendio el Arduino"); 
    Serial.println(tiempo2);
    lcd.setCursor(0,1); 
    lcd.print(tiempoSegundos); 
    lcd.print(" minutos"); 
  }
  
  if(tiempo2 < 30000){
   digitalWrite(led2,HIGH);
   digitalWrite(led,LOW);
   myservo.write(55);
   delay(1000);
 }
 if(tiempo2 > 30000){
   digitalWrite(led,HIGH);
   digitalWrite(led2,LOW);
   myservo.write(15);
   delay(1000);
 }if(digitalRead(p2)==HIGH){
   Serial.println("bad");
   myservo.write(15);
   digitalWrite(led,HIGH);
   digitalWrite(led2,LOW);
   delay(1000);
 }if(digitalRead(p1)==HIGH){
   Serial.println("nice");
   myservo.write(15);
   digitalWrite(led,LOW);
   digitalWrite(led2,HIGH);
   delay(1000);
 }
}

Vamos a ir por partes...
¿Qué intentas hacer con esto?

if(tiempoSegundos == 4294967295 ){
  tiempoSegundos = tiempoSegundos*0;
  tiempo2 = tiempo2*0;
  tiempo1 = tiempo1*0;
}
tiempo2 = millis(); 

Veamos

if(tiempoSegundos == 4294967295 ){

El máximo valor que puede almacenar una variable unsigned long es 4294967295 y al incrementarse automáticamente se pone en 0.
¿Por qué?
Porque el valor 429496295 en binario son 32 bits en 1, al incrementarlo pasaría a 429496296 que tiene 1 bit en 1 y 32 bits en 0 (33 bits en total), pero como el unsigned long tiene 32 bits, solo "ve" los 0 y el 1 se descarta.
Entonces no tiene sentido que lo hagas "manualmente", además le estás "robando" 1 mseg a tiempoSegundos porque la reseteas 1 milisegundo antes de lo debido.
Para reiniciar las otras variables, si acaso es necesario, hazlo cuando tiempoSegundos sea igual a 0.

tiempoSegundos = tiempoSegundos*0;

Si cualquier valor multiplicado por 0 da como resultado 0, ¿por qué no hacer directamente

tiempoSegundos = 0;

en lugar de esa multiplicación absurda?
Después haces

tiempo2 = tiempo2*0; // otra vez esta multiplicación...

pero inmediatamente salir del if()

tiempo2 = millis();

Entonces ¿para qué ponerla a 0 si luego le cargas el valor de millis()?

En el otro tema te dije

Pero sigues con la tuya

if(tiempo2 > (tiempo1+1000)){ //Si ha pasado 1 segundo ejecuta el IF 

Así es difícil ayudarte, se te dice como hacer las cosas correctamente y tu no modificas nada.

mejor dicho intentaba reiniciar la variable de este bloque

tiempo1 = millis(); //Actualiza el tiempo actual
    tiempoSegundos = tiempo1/60000;
    tiempoSegundos = 1 - tiempoSegundos;

para que una vez que el valor llega a 0 vuelva a hacer el conteo e "inicie" el codigo de nuevo, no se si este mejor hacer esto

if(tiempoSegundos == 4294967295 ){
    tiempo1 = millis(); //Actualiza el tiempo actual
    tiempoSegundos = tiempo1/60000;
    tiempoSegundos = 1 - tiempoSegundos;
  }

Esto para que LED1 se prende un minuto despues apaga y prende LED2, entonces una vez con esto se queda encendido LED2, pero el conteo va regresivo entonces no se si se pueda que cuando unsigned long llega al maximo reinicie el bucle y encienda de nuevo LED1 y repita el minuto

Por otro lado, el tiempo transcurrido ya lo he cambiado

Te repito

Creo que mi explicación fue clara, ¿o no? :thinking: