Con un botón hacer dos funciones

Hola necesito ayuda para hacer que con un mismo botón que al apretarlo 1 seg prenda un led y al apretarlo 1 seg lo apague pero si lo apretó 2 seg o más que me active otro led y si apretó 2 o más de nuevo que lo vuelva apagar el led

El segundo led sería un servo luego pero primero quiero saber cómo hacer lo que dije anteriormentemente porque probé hacerlo con un for pero supongo que no lo hice bien y estuve viendo mucho vídeo pero no lo logré hacer.Es para un proyecto en miniatura que con el mismo botón enciendo una luz y también poder abrir una mini ventana con un servo
Si me pueden dar una mano estaría agradecido

unsigned long tiempo1;
const int led1 = 13;  //led 1
const int led2 = 12;  //led 2
int boton = 2;        // pin del boton
int estadoboton1 = 0; //estado del led1
int estadoboton2 = 0; //estado del led2
void setup() {
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(boton, INPUT);
  Serial.begin(9600);
}

void loop() {
  if (digitalRead(2) == HIGH) { //INICIALIZAR EL MILLIS
    tiempo1 = millis();

    Serial.println(tiempo1);
  }
  if ((tiempo1 <= 1500) && (tiempo1 >= 30)) {  //SI PRESIONE ESO SE ENCIENDE O APAGA EL LED 1
    estadoboton1 = digitalRead(led1);
    digitalWrite(led1, !estadoboton1);
    tiempo1 = 0;
  }
  if (tiempo1 >= 1501) {                       //SI PRESIONE ESO SE ENCIENDE O APAGA EL LED 2
    estadoboton2 = digitalRead(led2);
    digitalWrite(led2, !estadoboton2);
    tiempo1 = 0;
  }
  Serial.println(tiempo1);
}

Te recomiendo que leas los temas "Como No leer un botón..." y "Entender millis()..." de la sección Documentación.
Después pensamos juntos una solución.

Saludos

PD: Por favor edita tu post, selecciona todo el código y pulsa </> en la barra del editor para que el código se muestre como corresponde. Es para tu beneficio.

Okey muchas gracias,soy medio nuevo en esto.
Ahí edite el programa pero la variable tiempo1(del millis) sigue sumando a infinito. Eso fue lo que pude maso menos plantear

La idea más o menos la tienes, el problema es que usaste mal millis(), o mejor dicho, lo usaste a medias.
millis() te dice cuantos milisegundos lleva encendido el arduino, entonces necesitas hacer un cálculo para poder medir los tiempos desde que haces la pulsación.

Si entiendo bien cuando pulsas el pin se pone en HIGH, entonces

unsigned long tiempo1;
const int led1 = 13;  //led 1
const int led2 = 12;  //led 2
const int boton = 2;        // pin del boton
bool estadoled1 = false; //estado del led1
bool estadoled2 = false; //estado del led2
bool pulsado = false;

void setup() {
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(boton, INPUT);
  digitalWrite(led1, estadoled1);
  digitalWrite(led2, estadoled2);
  Serial.begin(9600);
}

void loop() {
  if(pulsado == false) {
    if (digitalRead(boton) == HIGH) { //INICIALIZAR EL MILLIS
      tiempo1 = millis();
      pulsado = true;

      Serial.println(tiempo1);
    }
  }
  else { // si ya esta pulsado
    if (digitalRead(boton) == LOW) { // cuando se deja de pulsar
      if ((millis() - tiempo1 <= 1500UL) && (millis() - tiempo1 >= 30UL)) {  //SI  PRESIONE ESO SE ENCIENDE O APAGA EL LED 1
        estadoled1 = !estadoled1 ;
        digitalWrite(led1, estadoled1);
//     tiempo1 = 0;
      }
      if (millis() - tiempo1 >= 1501UL) {                       //SI PRESIONE ESO SE ENCIENDE O APAGA EL LED 2
        estadoled2 = !estadoled2;
        digitalWrite(led2, estadoled2);
//    tiempo1 = 0;
      }
//  Serial.println(tiempo1);
      pulsado = false;
    }
  }
}

Ten en cuenta que solo modifiqué tu código por lo tanto no tiene antirrebote y, como habrás leído, no es la mejor manera de leer pulsadores, pero te sirve de guía a mejorar.
Si cambié estadobotonX por estadoledX y le di un uso más lógico (ya que usas una variable, usala bien :wink: )

El "UL" detrás de los intervalos le indica al compilador que el número es unsigned long (como el resultado de millis() y tiempo1)

Saludos

1 Like

Me funciona perfecto muchas gracias por tu ayuda con el tiempo voy a ir mejorando el programa a medida que valla aprendiendo nuevas cosas

Me alegro que te sirva y te sugiero que trates de entenderlo así lo puedes mejorar y/o añadirle más funciones.

Saludos

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