Pages: [1]   Go Down
Author Topic: selector de funciones con pulsadores  (Read 1031 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buenas tardes a todos, he adquirido un Arduino Nano v3.0 para un pequeño proyecto con una matriz de LED de 8x40 en la que se mostrarán distintas figuras animadas, textos en movimiento, etc.

Me gustaría combinar las 5 funciones que tengo en distintos archivos .ino en una sola, y poder cambiar entre cada una de ellas con 5 pequeños pulsadores. He estado dándole vueltas al coco pero no se me ocurre ninguna forma de hacerlo. ¿Podría alguien iluminarme un poco con ideas o códigos similares que sirvan de ejemplo?

Un saludo y gracias de antemano.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Lo que yo haria en ese caso, es en un archivo solo, integrar las funciones setup de los 5 archivos diferentes, fijandome que no se repitan los pines y luego las funciones void de cada archivo las nombraria como 5 funciones void en el archivo principal. Luego con unos simples if haces que con cada boton se inicie cada funcion.
Por ejemplo:
tenes: void 1, void 2, void 3, void 4, void 5, void principal.
En el void principal haces lo siguiente:
if(boton1 = HIGH)
     1();
if(boton2 = HIGH)
   2();
y asi sucesivamente.
Espero haberme hecho entender!
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Lo que comentas podría funcionar, sin embargo sería necesario mantener pulsado el botón para que se ejecutase la función, me interesa mas pulsarlo una sola vez y que se ejecute hasta que se pulse otro botón, no se si me he explicado correctamente.
Logged

Alicante (España)
Offline Offline
Full Member
***
Karma: 12
Posts: 224
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Puedes usar un Flag, es decir, una variable bandera que le vas asignando el número del botón pulsado.
Esa variable la vas comprobando y solo varia con nuevas pulsaciones.

Jopapa
www.jopapa.me
Logged

Vilalba, Lugo, Spain
Offline Offline
Sr. Member
****
Karma: 23
Posts: 327
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Otra idea mas...
 
Un solo pulsador que va sumando 1 al valor de una variable, que al pasar de 5 retorna a 1
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Muchas gracias a los participantes por las ideas, me pondré manos a la obra con lo poco que se para ver si consigo sacar algo en claro.

Puedes usar un Flag, es decir, una variable bandera que le vas asignando el número del botón pulsado.
Esa variable la vas comprobando y solo varia con nuevas pulsaciones.

Jopapa
www.jopapa.me


Este es precisamente el funcionamiento que me gustaría conseguir, ¿podrías especificar un poco más la manera de hacerlo?

Gracias de antemano
Logged

Alicante (España)
Offline Offline
Full Member
***
Karma: 12
Posts: 224
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

if boton1==HIGH { flag=1}
if boton2==HIGH { flag=2}
if boton3==HIGH { flag=3}

switch (flag) {
  case 1:
   funcion1();
   break;
  case 2:
   funcion2();
   break;
  case 3:
   funcion3();
   break;
}

Mas o menos

Jopapa
www.jopapa.me
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Finalmente he tenido que utilizar la opción que citaba el primer compañero, ya que me termino resultando menos complicada y mas adecuada en algunos aspectos. He comprado unos interruptores muy muy pequeños similares a pulsadres y todo funciona mas o menos como tenía pensado.

Muchísimas gracias a los participantes por la ayuda prestada.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Me he encontrado con un pequeño error de funcionamiento que no consigo solucionar por falta de conocimientos.

Tengo los interruptores conectados, cada uno a una entrada digital y en función de cual este HIGH ejecutará una función u otra. El problema viene que cuando los desactivo todos, si se trata de una función larga, esta se continuará ejecutando hasta que llegue a su final, me gustaría que al detectar todas las entradas a nivel bajo se detuviese todo lo que se está ejecutando y en su lugar entre en funcionamiento un pequeño código que apaga toda la matriz, es decir, que se apague la matriz instantáneamente  cuando desactive todos los interruptores.
Logged

Vilalba, Lugo, Spain
Offline Offline
Sr. Member
****
Karma: 23
Posts: 327
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Tengo algo similar ya hecho, pero funciona con un solo pulsador

http://forum.arduino.cc/index.php?topic=201162.0
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Lo siento pero no alcanzo a ver lo que dices, recuerda que mis conocimientos son bastante básicos ya que hace años que no toco el C++

Edito:acabo de probar a utilizar interrupciones pero no me ha servido de mucho, ya que cuando esta se deja de cumplir continua la funcion por donde la dejó
« Last Edit: December 03, 2013, 06:21:17 pm by manup1192 » Logged

Vilalba, Lugo, Spain
Offline Offline
Sr. Member
****
Karma: 23
Posts: 327
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ponle el pin del pulsador que uses
tienes instrucción para pul up y pull down
Entiende que hay 5 secuencias, se las puedes cambiar añadiendo los case necesarios
Inicia en la secuencia cero que no hace nada o lo que le indiques tu, y va cambiando cada vez que pulsas
cuando acaba las secuencias empieza en la primera, lo puedes cambiar para pasar a la secuencia  cero o lo que quieras
si mantienes el pulsador pulsado durante T_Apagar mili segundos, pasa a secuencia cero
prueba a ver si te va todo bien


Code:
byte Pulsador  =23;           // Pines usado para el pulsador
 
boolean Estado_Pulsador;      // Para almacenar el estado del pulsador low o high
boolean Estado_Anterior;      // Usada para saver cundo soltamos el pulsador

byte Secuencia = 0;           // Para manejar la secuencia de salidas
byte Total_Secuencias=5;      // Cambia aquipara limitar ell numero de secuencias

unsigned long T_Apagar=3000;  // Tiempo a mantener pulsado el boton para apagar
unsigned long T_Pulsado=0;    // Auxiliar para controlar tiempo de boton pulsado

void setup()
{
  pinMode(Pulsador, INPUT);   // Configuramos pin como entrada
  Estado_Anterior = false;    // Iniciamos elproceso con el boton sin pulsar
}

void loop()
{
  // Estado_Pulsador = !digitalRead(Pulsador); // Lee el estado del botón pull up.
  Estado_Pulsador = !digitalRead(Pulsador);    // Lee el estado del botón pull down.
 
  if (Estado_Pulsador && !Estado_Anterior)     // Si pulsador pasa de low a high (entra al pulsar pero no al mantener pulsado)
  {
    T_Pulsado=millis()+T_Apagar;               // Para controlar el timpo que pasa pulsado
    Estado_Anterior=true;                      // No enta en el if hasta q pulsador pase de high a low
    Secuencia++;                               // Pasamos a siguiente secuencia
  }
 
  if (!Estado_Pulsador && Estado_Anterior)     // Si pulsador pasa de high a low (entra al soltar pulsador pero no al mantener despulsado)
  {
    Estado_Anterior=false;                     // No enta en el if hasta q pulsador pase de low a high
    T_Pulsado=0;                               // Al soltar pulsador ya no controlamos el tiempo que permanece pulsado
  }
 
  if (T_Pulsado>0 && Estado_Pulsador && millis()>T_Pulsado) 
  {                                        // Si hay tiempo cargado para controlar el fin y esta pulsado y ha transcurrido el tiempo para apagarlo
    T_Pulsado=0;                           // Ya no controlamos tiempo de pulsado
    Secuencia=0;                           // Secuencia 0, todo apagado
  } 
 
  if (Secuencia>Total_Secuencias)          // Si se han acabado las secuencias
  {Secuencia=1;}                                    // Regresamos a la primera (podrias poner T_Pulsado=0; para finalizar aqui)
 
 switch (Secuencia)
 {
    case 0:
          //No hay secuencia, apagar o hacer lo que necesites
      break;   
   case 1:
      Proceso1();
      break;
    case 2:
      Proceso2();
      break;
    case 3:
      Proceso3();
      break;
    case 4:
      Proceso4();
      break;
    case 5:
      Proceso5();
      break;     
  }
}

void Proceso1()
{
}
void Proceso2()
{
}
void Proceso3()
{
}
void Proceso4()
{
}
void Proceso5()
{
}
Logged

Pages: [1]   Go Up
Jump to: