Autor Tema: Secuencial de leds con 1 boton  (Leído 217 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ronny22

  • PIC10
  • *
  • Mensajes: 13
Secuencial de leds con 1 boton
« en: 27 de Marzo de 2021, 00:11:35 »
Saludos, hace poco retome parte de mi hobby con arduino, y comenzando haciendo tareas sencillas como prender y apagar un led. Ahora quisiera hacer un secuencial de leds con un botón de los que quedan retenidos pero e probado varias formas sin un buen resultado, cualquier opinión o sugerencia que me pudieran hacer estaria agradecido.

el código es el siguiente, en este caso solo enciende el Led1 y Led2 pero no agregue los otros desastres de código debido a que no me funcionan  :lol:

Edito: al oprimir una segunda vez el botón quisiera prender el Led3 y al dejarlo de oprimir encender el Led4 y comenzar el ciclo.

Código: [Seleccionar]
// --- Declaración de constantes, nº de puertos
const int boton = 8;
const int led1 = 9;
const int led2 = 10;
const int led3 = 11;
const int led4 = 12;
// --- Variables de trabajo
bool estadoboton = true ;
// --- Configuración general
void setup() {
  // --- Activacion de los estados de los puertos
  pinMode(boton, INPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  // --- Apago los led
  digitalWrite(led1 , false);
  digitalWrite(led2 , false);
  digitalWrite(led3 , false);
  digitalWrite(led4 , false);
}
// --- Ciclo
void loop() {
  // --- Pregunto el estado del boton
  estadoboton = digitalRead(boton);
  // ---Si pulso boton enciende led 1 y apaga (led 2, 3 y 4)
  if (estadoboton == false) {
    // --- Elimino rebote
    delay(50);
    // --- Si pulso boton enciende led 1 y apaga (led 2, 3 y 4)
    if (estadoboton == false) {
      digitalWrite(9, true);
      digitalWrite(10, false);
      digitalWrite(11, false);
      digitalWrite(12, false);
      // --- Pregunto el estado del boton
      estadoboton = digitalRead(boton);
      // --- Si dejo de pulsar boton apaga (led 1, 3 y 4) y enciende led 2
      if (estadoboton == true) {
        // --- Elimino rebote
        delay(50);
        // --- Si dejo de pulsar boton apaga (led 1, 3 y 4) y enciende led 2
        if (estadoboton == true) {
          digitalWrite(9, false);
          digitalWrite(10, true);
          digitalWrite(11, false);
          digitalWrite(12, false);
        }
      }
    }
  }
}

De antemano gracias, cualquier ayuda sera buena en este aprendizaje.
« Última modificación: 27 de Marzo de 2021, 02:05:04 por ronny22 »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5530
Re:Secuencial de leds con 1 boton
« Respuesta #1 en: 27 de Marzo de 2021, 06:44:23 »
Lo mejor es programarlo con una máquina de estados.
Tienes 4 estados diferentes (encendido de cada uno de los ledes).
Programa algo así:

setup:
  estado = 0;


loop:
  if (estado == 0) apaga todos los ledes;
  if (estado == 1) enciende led 1 apaga los demás;
  if (estado == 2) enciende led 2 apaga los demás;
  etc...


  if (estado == 0  && botón presionado)
     estado = 1;

  if (estado == 1  && botón no presionado)
     estado = 2;

  etc...


Saludos.

Desconectado Robert76

  • PIC18
  • ****
  • Mensajes: 357
Re:Secuencial de leds con 1 boton
« Respuesta #2 en: 27 de Marzo de 2021, 12:27:04 »
Hola, en lo personal yo utilizaría una variable y luego aplico rotación de bits. Una vez rotado, ya sea a izq. o derecha, enviar esa variable al puerto dónde están conectados los LEDs.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8077
Re:Secuencial de leds con 1 boton
« Respuesta #3 en: 27 de Marzo de 2021, 12:42:54 »
Hola, en lo personal yo utilizaría una variable y luego aplico rotación de bits. Una vez rotado, ya sea a izq. o derecha, enviar esa variable al puerto dónde están conectados los LEDs.

Yo tambien... Pero Arduino con sus funciones...

Otra forma de hacerlo:

setup:
Código: C
  1.   salida = 9;


loop:


Código: C
  1.   if (!digitalRead(boton)) {
  2.     delay(50);
  3.     digitalWrite(9, false);
  4.     digitalWrite(10, false);
  5.     digitalWrite(11, false);
  6.     digitalWrite(12, false);
  7.     digitalWrite(salida, true);
  8.     if (++salida > 12) { salida = 9; }
  9.     while(digitalRead(boton));
  10.   }

Desconectado Eduardo2

  • PIC18
  • ****
  • Mensajes: 453
Re:Secuencial de leds con 1 boton
« Respuesta #4 en: 27 de Marzo de 2021, 14:37:46 »
Otra manera olvidándose de digitalWrite, digitalRead y pinMode.

Código: [Seleccionar]
#define BOTON (PINB&1)

// --- Variables de trabajo
uint8_t seq = 1;

void setup() {
  DDRB = 0b00011110 ;
  PORTB = 0 ; 
 }

void loop() {
    if( BOTON == 0) {         
if((seq<<=1) == 0x20) seq=2 ;  // Rota el led
        PORTB = seq ;
        while( BOTON == 0) delay(50);      // --- Elimino rebote
    }   
}
« Última modificación: 27 de Marzo de 2021, 15:47:40 por Eduardo2 »

Desconectado ronny22

  • PIC10
  • *
  • Mensajes: 13
Re:Secuencial de leds con 1 boton
« Respuesta #5 en: 27 de Marzo de 2021, 19:41:16 »
Gracias por todos los aportes, mañana sera dia libre y los estudiaré todos. diferentes maneras de llegar a un mismo resultado. esta super.  :-/


 

anything