Go Down

Topic: (Solucionado) Mantener un led encendido y al combiar cierto  (Read 8593 times) previous topic - next topic

1sebastian

Hola que tal, recién comienzo con la programación para arduino y bueno como mencionaba en el titulo lo que hago es que tengo 4 entradas (botones) y 4 salidas (leds), lo que trato de hacer es que el led1 al momento de presionar el botón se active y se mantenga encendido hasta que se activen al mismo tiempo las 3 entradas restantes. hasta el momento solo he conseguido que el primer led se mantenga encendido y lo que no logro hacer es que cuando active los tres led restantes el primero se apague. agradecería mucho de su ayuda o consejos. gracias


1sebastian

Este es el codigo que llevo hecho. uso arduino uno

Code: [Select]

#define LED    10
#define BOTON     5

#define LED1      11
#define BOTON1    7

#define LED2      12
#define BOTON2    8

#define LED3      13
#define BOTON3    9




void setup () {
  pinMode(10, OUTPUT);
  pinMode(5, INPUT);
 
  pinMode(11, OUTPUT);
  pinMode(7, INPUT);

  pinMode(12, OUTPUT);
  pinMode(8, INPUT);

  pinMode(13, OUTPUT);
  pinMode(9, INPUT);

}

void loop () {
  if (digitalRead (5) == HIGH) {
    digitalWrite(10, HIGH);
    if ((digitalRead (7) == HIGH) && (digitalRead (8)== HIGH) && (digitalRead (9) == HIGH)) {
      digitalWrite(10, LOW);
    }
    else {
      digitalWrite(10, HIGH);
    }
  }

  if (digitalRead (7) == HIGH) {
    digitalWrite(11, HIGH);
  }
  else {
    digitalWrite(11, LOW);
  }

  if (digitalRead (8) == HIGH) {
    digitalWrite(12, HIGH);
  }
  else {
    digitalWrite(12, LOW);
  }

  if (digitalRead (9) == HIGH) {
    digitalWrite(13, HIGH);
  }
  else {
    digitalWrite(13, LOW);
  }
}




rodripelto

Hola,

El botón ¿es un pulsador? de ser así, ten en cuenta que solo estará HIGH cuando esta pulsado, por lo que el código del primer if solo se ejecuta si esta pulsado, por lo tanto para que se ejecute el código del segundo if el aparte de la condición de las otras tres líneas en HIGH también tiene que estar el botón pulsado.
Para resolverlo el código tendría que ser así.
Code: [Select]

void loop () {
  if (digitalRead (5) == HIGH)
  {
    digitalWrite(10, HIGH);
  }
   if ((digitalRead (7) == HIGH) && (digitalRead (8)== HIGH) && (digitalRead (9) == HIGH))
    {
      digitalWrite(10, LOW);
    }
    else
    {
      digitalWrite(10, HIGH);
    }

Si el botón es un interruptor y queda pulsado, el problema es que el led se enciende en cada vuelta del loop, por lo que si lo apagas se vuelve a encender, este ciclo es tan rápido que lo único que ves es que el led esta encendido.
Para solucionarlo tendrías que hacer otra cosa, si es tu caso coméntalo y lo vemos.

Otra cosa es que en tu código defines pines véase
Code: [Select]
#define LED    10
#define BOTON     5

#define LED1      11
#define BOTON1    7

#define LED2      12
#define BOTON2    8

#define LED3      13
#define BOTON3    9

Pero no lo usas
Code: [Select]

void setup () {
  pinMode(10, OUTPUT);
  pinMode(5, INPUT);
 
  pinMode(11, OUTPUT);
  pinMode(7, INPUT);

  pinMode(12, OUTPUT);
  pinMode(8, INPUT);

  pinMode(13, OUTPUT);
  pinMode(9, INPUT);

}

Si defines pines usaló
Code: [Select]

void setup () {
  pinMode(LED, OUTPUT);
  pinMode(BOTON, INPUT);
 
  pinMode(LED1, OUTPUT);
  pinMode(BOTON1, INPUT);

  pinMode(LED2, OUTPUT);
  pinMode(BOTON2, INPUT);

  pinMode(LED3, OUTPUT);
  pinMode(BOTON3, INPUT);

}

Lo mismo en el loop
Si alguna respuesta ha solucionado tu problema, da las gracias marcándola como solucionada.

1sebastian

rodripelto

Hola, recién cambie los pulsadores por un Dip switch ya que se me hacía mas fácil que mantener pulsado los botones, y si definí los pines pero yo en un intento desesperado para que funcionara supuse que si ponía los pines por numero funcionaría jajaja

rodripelto

Vale, entonces lo que necesitas es recordar el estado anterior. Por ejemplo
Code: [Select]

#define LED    10
#define BOTON     5

#define LED1      11
#define BOTON1    7

#define LED2      12
#define BOTON2    8

#define LED3      13
#define BOTON3    9

bool estadoanterior=false; // Uso false apagado y true encendido pero creo que podria usar HIGH y LOW

void setup () {
  pinMode(LED, OUTPUT);
  pinMode(BOTON, INPUT);
 
  pinMode(LED1, OUTPUT);
  pinMode(BOTON1, INPUT);

  pinMode(LED2, OUTPUT);
  pinMode(BOTON2, INPUT);

  pinMode(LED3, OUTPUT);
  pinMode(BOTON3, INPUT);

}

void loop () {
  if (digitalRead (5) == HIGH && estadoanterior=false) // Si esta conectado y ademas antes no esta conectado
  {
    digitalWrite(10, HIGH);
    estadoanterior=true;
  }
  else if (digitalRead (5) == LOW) // Si esta desconectado
  {
    digitalWrite(10, LOW);
    estadoanterior=false;
  }
   if ((digitalRead (7) == HIGH) && (digitalRead (8)== HIGH) && (digitalRead (9) == HIGH))
    {
      digitalWrite(10, LOW);
    }
    else
    {
      digitalWrite(10, HIGH);
    }
Si alguna respuesta ha solucionado tu problema, da las gracias marcándola como solucionada.

Adrian_E

hola te paso un ejemplo de prender y apagar un led con un solo pulsador, lo tome de alguien en su momento y me sirvio para aprender a
Code: [Select]
programar botones. Hoy si necesitousar varios botones con este ejemplo me sirve.
Code: [Select]
//  Se declaran las variables
// const = constante int= integer (Entero)
const int LED =13; // LED conectado al   pin digital 13
const int BOTON = 7; // pin de entrada donde se  conecta el boton
int val = 0;   //val se emplea para almacenar el estado  del boton
int estado = 0;  // 0 LED apagado, mientras que 1  encendido

int old_val = 0; // almacena el antiguo valor de val
void setup()    // definir si la variable es de entrada
                // o salida.
{
  //Serial.begin(9600);
  pinMode(LED,OUTPUT); // establecer que el pin  digital es una señal de salida
  pinMode(BOTON,INPUT); // y BOTON como señal de entrada
}

void loop()    // loop = realice un lazo continuamente
{
   val= digitalRead(BOTON); // lee el estado del Boton chequear si el boton esta presionado o no  y cambia el estado a encendido u apagado
//Serial.println(val);
  if ((val == HIGH) && (old_val == LOW)){
    estado=1-estado;
    delay(10);
   }
    old_val = val;  // val es ahora viejo, vamos a almacenarlo
   
   if (estado==1){
      digitalWrite(LED, HIGH); // enciende el LED
   } else{
    digitalWrite(LED,LOW);   // apagar el LED
   }

}

1sebastian

rodripelto

excelente eso es lo que quería que hiciera solo que ahora el led1 se activa automáticamente y no cuando yo activo su entrada, si me pudieras ayudar con eso de igual manera estoy tratando de solucionarlo. muchas gracias!

rodripelto

En las entradas de los pulsadores/interruptores tienes puesto (resistencia de pull-down, pull-up o nada?

Resistencia pull-up pull-down

Es importante asegurar el estado logico de las entradas.
Si alguna respuesta ha solucionado tu problema, da las gracias marcándola como solucionada.

1sebastian

si están en configuración pull down y gracias por la liga desconocía esas configuraciones ya que para hacer el circuito me base en un ejemplo

rodripelto

Pues no sabría decirte, el código me parece que está correcto. ¿ Puedes medir el pin 7 con un multímetro?. ¿Nos puedes poner el código tal y como lo tengas ahora?
Si alguna respuesta ha solucionado tu problema, da las gracias marcándola como solucionada.

1sebastian

Corrección es el pin 5

cuando esta activado el voltaje en la salida del pin 5 que viene siendo el led 10 es de 1.92 y al desactivarlo 1.57v


Code: [Select]
#define LED    10
#define BOTON     5

#define LED1      11
#define BOTON1    7

#define LED2      12
#define BOTON2    8

#define LED3      13
#define BOTON3    9

bool estadoanterior = false; // Uso false apagado y true encendido pero creo que podria usar HIGH y LOW

void setup() {


  pinMode(BOTON, INPUT);
  pinMode(BOTON1, INPUT);
  pinMode(BOTON2, INPUT);
  pinMode(BOTON2, INPUT);

  pinMode(LED, OUTPUT);
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);

}

void loop() {
  if (digitalRead (BOTON) == HIGH && estadoanterior == true)
  {
    digitalWrite(LED, LOW);
    estadoanterior = true;
  }
  else if (digitalRead (BOTON) == LOW) //
  {
    digitalWrite(LED, LOW);
    estadoanterior = false;
  }
  if ((digitalRead (BOTON1) == HIGH) && (digitalRead (BOTON2) == HIGH) && (digitalRead (BOTON3) == HIGH))
  {
    digitalWrite(LED, LOW);
  }
  else
  {
    digitalWrite(LED, HIGH);
  }
  if (digitalRead (BOTON1) == HIGH) {
    digitalWrite(LED1, HIGH);
  }
  else {
    digitalWrite(LED1, LOW);
  }

  if (digitalRead (BOTON2) == HIGH) {
    digitalWrite(LED2, HIGH);
  }
  else {
    digitalWrite(LED2, LOW);
  }
  if (digitalRead (BOTON3) == HIGH) {
    digitalWrite(LED3, HIGH);
  }
  else {
    digitalWrite(LED3, LOW);
  }
}



rodripelto

Aaaaaaa ya, no lo vi antes.
Code: [Select]
if ((digitalRead (BOTON1) == HIGH) && (digitalRead (BOTON2) == HIGH) && (digitalRead (BOTON3) == HIGH))
  {
    digitalWrite(LED, LOW);
  }
  else
  {
    digitalWrite(LED, HIGH);
  }

Esto lo encenderá siempre que no estén los 3 botones presionados.
Prueba así
Code: [Select]
if ((digitalRead (BOTON1) == HIGH) && (digitalRead (BOTON2) == HIGH) && (digitalRead (BOTON3) == HIGH))
  {
    digitalWrite(LED, LOW);
  }
  else if (estadoanterior==true)
  {
    digitalWrite(LED, HIGH);
  }

Además en el primer if tienes estadoanterior=true cuando tiene que ser falsedad, para que solo entre sí hay un cambio en el interruptor.
Si alguna respuesta ha solucionado tu problema, da las gracias marcándola como solucionada.

1sebastian

rodripelto

Quedo listo con el ultimo ajuste de código, gracias por la ayuda! la verdad aprendí mucho ya que como mencionaba voy comenzando con la programación en arduino. saludos y suerte

Go Up