Control de led, servomotor, mediante pulsador

buen dia comunidad , lo que trato de realizar es que al presionar el push botton en automatico me activen los dos leds y el buzzer por 30 segundos y que el servomotor realize un giro de 90° y que ese angulo giro permanezca mientras transcurren los 30 segundos pasado ese tiempo se desactiva todo, hasta que se presione de nuevo el push

#include <Servo.h>
const int buzzer = 8; // PIN DEL BUZZER
const int botonPin = 2; // PIN DEL BOTON
const int led1Pin = 3; // PIN DEL PRIMER LED
const int led2Pin = 4; // Pin DEL SEGUNDO LED
const int tiempoParpadeo = 30000; // 30 segundos en milisegundos
const int tiempoParpadeoIndividual = 500; // Tiempo de parpadeo individual (500 ms)
Servo myservo;
bool parpadeando = false;
unsigned long tiempoInicioParpadeo = 0;

void setup() {
  myservo.attach(9);
  pinMode(botonPin, INPUT_PULLUP); // CONFIGURANDO BOTON COMO UNA ENTRADA
  pinMode(led1Pin, OUTPUT); // // CONFIGURANDO LEDS COMO SALIDA
  pinMode(led2Pin, OUTPUT); // // CONFIGURANDO LEDS COMO SALIDA
  pinMode(buzzer, OUTPUT); // // CONFIGURANDO BUZZER COMO SALIDA

}

void loop() {
  if (digitalRead(botonPin) == LOW) { // Si el botón está presionado
    if (!parpadeando) {
      parpadeando = true;
      tiempoInicioParpadeo = millis();
    }
    myservo.write(90);  // botón pulsado -> servo a 90°
  } else {
    myservo.write(0);  // botón no pulsado -> servo a 0°
  }

  if (parpadeando) {
    if (millis() - tiempoInicioParpadeo < tiempoParpadeo) { // Si ha pasado menos de 30 segundos
      if (millis() % tiempoParpadeoIndividual < tiempoParpadeoIndividual / 2) { // Parpadeo individual (500 ms)
        digitalWrite(led1Pin, HIGH);
        digitalWrite(led2Pin, HIGH);
        digitalWrite(buzzer, HIGH);
        //myservo.write(90);
      } else {
        digitalWrite(led1Pin, LOW);
        digitalWrite(led2Pin, LOW);
        digitalWrite(buzzer, LOW);
       // myservo.write(0);
      }
    } else {
      parpadeando = false;
      digitalWrite(led1Pin, LOW);
      digitalWrite(led2Pin, LOW);
      digitalWrite(buzzer, LOW);
      //myservo.write(0);
    }
  } else {
    digitalWrite(led1Pin, LOW);
    digitalWrite(led2Pin, LOW);
    digitalWrite(buzzer, LOW);
    //myservo.write(0);
  }
}

Ante todo edita tu post y adjunta el código de acuerdo a las normas del foro (entre etiquetas <CODE/>). Debe verse como el que adjuntó.


Lo que quieres es algo así?

#include <Servo.h>
const int buzzer = 8; // PIN DEL BUZZER
const int botonPin = 2; // PIN DEL BOTON
const int led1Pin = 3; // PIN DEL PRIMER LED
const int led2Pin = 4; // Pin DEL SEGUNDO LED
const int tiempoParpadeo = 30000; // 30 segundos en milisegundos
const int tiempoParpadeoIndividual = 500; // Tiempo de parpadeo individual (500 ms)
Servo myservo;
bool parpadeando = false;
unsigned long tiempoInicioParpadeo = 0;

void setup() {
  myservo.attach(9);
  pinMode(botonPin, INPUT_PULLUP); // CONFIGURANDO BOTON COMO UNA ENTRADA
  pinMode(led1Pin, OUTPUT); // // CONFIGURANDO LEDS COMO SALIDA
  pinMode(led2Pin, OUTPUT); // // CONFIGURANDO LEDS COMO SALIDA
  pinMode(buzzer, OUTPUT); // // CONFIGURANDO BUZZER COMO SALIDA

}

void loop() {
  if (digitalRead(botonPin) == LOW) { // Si el botón está presionado
    if (!parpadeando) {
      parpadeando = true;
      tiempoInicioParpadeo = millis();
    }
    myservo.write(90);  // botón pulsado -> servo a 90°
  } else {
    myservo.write(0);  // botón no pulsado -> servo a 0°
  }

  if (parpadeando) {
    if (millis() - tiempoInicioParpadeo < tiempoParpadeo) { // Si ha pasado menos de 30 segundos
      if (millis() % tiempoParpadeoIndividual < tiempoParpadeoIndividual / 2) { // Parpadeo individual (500 ms)
        digitalWrite(led1Pin, HIGH);
        digitalWrite(led2Pin, HIGH);
        digitalWrite(buzzer, HIGH);
        //myservo.write(90);
      } else {
        digitalWrite(led1Pin, LOW);
        digitalWrite(led2Pin, LOW);
        digitalWrite(buzzer, LOW);
       // myservo.write(0);
      }
    } else {
      parpadeando = false;
      digitalWrite(led1Pin, LOW);
      digitalWrite(led2Pin, LOW);
      digitalWrite(buzzer, LOW);
      //myservo.write(0);
    }
  } else {
    digitalWrite(led1Pin, LOW);
    digitalWrite(led2Pin, LOW);
    digitalWrite(buzzer, LOW);
    //myservo.write(0);
  }
}

Entendiste que tienes que editar el post #1?

También edita #3 y borra la cita a mi código, no es necesaria (la cita).


No es lo mismo que dijiste en #1.

Mueve el servo a 90° cuando pones la variable parpadeando en true y a 0° cuando la pones en false.

me podrias guiar en esta ultima parte , Mueve el servo a 90° cuando pones la variable parpadeando en true y a 0° cuando la pones en false , segun yo realize la modificacion y sin antes de apretar el boton este ya realizo un giro , se que no es excusa apenas me voy agarrando en este mundo del arduino

Porque el servo inicia centrado (o sea a 90°) , tienes que moverlo a 0° en setup() luego del attach().

Luego lo mueves a 90° solo donde pones la variable parpadeando en true y a 0° solo donde la pones en false.

#include <Servo.h>
const int buzzer = 8; // PIN DEL BUZZER
const int botonPin = 2; // PIN DEL BOTON
const int led1Pin = 3; // PIN DEL PRIMER LED
const int led2Pin = 4; // Pin DEL SEGUNDO LED
const int tiempoParpadeo = 30000; // 30 segundos en milisegundos
const int tiempoParpadeoIndividual = 500; // Tiempo de parpadeo individual (500 ms)
Servo myservo;
bool parpadeando = false;
unsigned long tiempoInicioParpadeo = 0;

void setup() {
  myservo.attach(9);
  myservo.write(0);
  
  pinMode(botonPin, INPUT_PULLUP); // CONFIGURANDO BOTON COMO UNA ENTRADA
  pinMode(led1Pin, OUTPUT); // // CONFIGURANDO LEDS COMO SALIDA
  pinMode(led2Pin, OUTPUT); // // CONFIGURANDO LEDS COMO SALIDA
  pinMode(buzzer, OUTPUT); // // CONFIGURANDO BUZZER COMO SALIDA

}

void loop() {
  if (digitalRead(botonPin) == LOW) { // Si el botón está presionado
    if (!parpadeando) {
      parpadeando = true; 
      tiempoInicioParpadeo = millis();
    }
    myservo.write(90);  // botón pulsado -> servo a 90°
  } else {
    myservo.write(0);  // botón no pulsado -> servo a 0°
  }

  if (parpadeando) {
    if (millis() - tiempoInicioParpadeo < tiempoParpadeo) { // Si ha pasado menos de 30 segundos
      if (millis() % tiempoParpadeoIndividual < tiempoParpadeoIndividual / 2) { // Parpadeo individual (500 ms)
        digitalWrite(led1Pin, HIGH);
        digitalWrite(led2Pin, HIGH);
        digitalWrite(buzzer, HIGH);
        
        //myservo.write(90);
      } else {
        digitalWrite(led1Pin, LOW);
        digitalWrite(led2Pin, LOW);
        digitalWrite(buzzer, LOW);
       // myservo.write(0);
      }
    } else {
      parpadeando = false;
      digitalWrite(led1Pin, LOW);
      digitalWrite(led2Pin, LOW);
      digitalWrite(buzzer, LOW);
      //myservo.write(0);
    }
  } else {
    digitalWrite(led1Pin, LOW);
    digitalWrite(led2Pin, LOW);
    digitalWrite(buzzer, LOW);
    //myservo.write(0);
  }
}

ya realize la modificacion despues del attach y lo otro que me comentaste ya quedo

Ay, ay, ay... Mirá que te la había dejado fácil.

#include <Servo.h>
const int buzzer = 8; // PIN DEL BUZZER
const int botonPin = 2; // PIN DEL BOTON
const int led1Pin = 3; // PIN DEL PRIMER LED
const int led2Pin = 4; // Pin DEL SEGUNDO LED
const int tiempoParpadeo = 30000; // 30 segundos en milisegundos
const int tiempoParpadeoIndividual = 500; // Tiempo de parpadeo individual (500 ms)
Servo myservo;
bool parpadeando = false;
unsigned long tiempoInicioParpadeo = 0;

void setup() {
  myservo.attach(9);
  pinMode(botonPin, INPUT_PULLUP); // CONFIGURANDO BOTON COMO UNA ENTRADA
  pinMode(led1Pin, OUTPUT); // // CONFIGURANDO LEDS COMO SALIDA
  pinMode(led2Pin, OUTPUT); // // CONFIGURANDO LEDS COMO SALIDA
  pinMode(buzzer, OUTPUT); // // CONFIGURANDO BUZZER COMO SALIDA
  myservo.write(0);
}

void loop() {
  if (digitalRead(botonPin) == LOW) { // Si el botón está presionado
    if (!parpadeando) {
      parpadeando = true;
      tiempoInicioParpadeo = millis();
      myservo.write(90);
    }
  } 

  if (parpadeando) {
    if (millis() - tiempoInicioParpadeo < tiempoParpadeo) { // Si ha pasado menos de 30 segundos
      if (millis() % tiempoParpadeoIndividual < tiempoParpadeoIndividual / 2) { // Parpadeo individual (500 ms)
        digitalWrite(led1Pin, HIGH);
        digitalWrite(led2Pin, HIGH);
        digitalWrite(buzzer, HIGH);
      } else {
        digitalWrite(led1Pin, LOW);
        digitalWrite(led2Pin, LOW);
        digitalWrite(buzzer, LOW);
      }
    } else {
      parpadeando = false;
      digitalWrite(led1Pin, LOW);
      digitalWrite(led2Pin, LOW);
      digitalWrite(buzzer, LOW);
      myservo.write(0);
    }
  } else {
    digitalWrite(led1Pin, LOW);
    digitalWrite(led2Pin, LOW);
    digitalWrite(buzzer, LOW);
  }
}

En la simulación bajé el tiempo a 5 segundos sino se hace interminable :wink:

1 Like

te agradezco MaximoEsfuerzo

Hola @jor1ge
Te añado una pequeña "variante-tonteria" que hace parpadear alternativamente los leds.

Un saludo !!! ...:cocktail_glass:... :cocktail_glass:

 if (parpadeando) {
    if (millis() - tiempoInicioParpadeo < tiempoParpadeo) { // Si ha pasado menos de 30 segundos
      if (millis() % tiempoParpadeoIndividual < tiempoParpadeoIndividual / 2) { // Parpadeo individual (500 ms)
        digitalWrite(led1Pin, HIGH);
        digitalWrite(led2Pin, LOW); // Cambio !!!
        digitalWrite(buzzer, HIGH);
      } else {
        digitalWrite(led1Pin, LOW);
        digitalWrite(led2Pin, HIGH); // Cambio !!
        digitalWrite(buzzer, LOW);