Arduino Forum

International => Español => Software => Topic started by: francisco2v on Apr 15, 2014, 09:11 am

Title: Ayuda para un novato mayor en programa simple.Gracias
Post by: francisco2v on Apr 15, 2014, 09:11 am

Agradecería su ayuda.....
Encender 4 led con 4 pulsadores y con otro pulsador apagar los 4 leds  si  hay alguno encendido...es como un reset.
Pulsado1     enciende led 1
Pulsador2   enciende led2
pulsador3   enciende led3
pulsador4  enciende led4

pulsador5   apaga los led 1,2,3 y 4 si están encendidos.

Intento programar y tengo muchos errores por mi poca experiencia.
Muchas gracias por ayudarme.
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: Dabauza on Apr 15, 2014, 11:16 am
Hola francisco,

No te preocupes, todos hemos empezado igual, nadie nace sabiendo ;)

Te recomiendo que leas mucho y que trates de comprender los códigos de los demás ya que si te dedicas a hacer copia/pega no aprenderás.

Aquí te dejo el código, esta sin probar

Code: [Select]
boolean estadoActual=0; //Guarda el estado actual del botón
boolean estadoUltimo=0; //Guarda el último estado del botón
boolean contador=0;     //Guarda las veces que se pulsa el botón

void setup()
{
  pinMode(4, OUTPUT); //Donde esta conectado el LED
  pinMode(8, INPUT);  //Donde esta conectado el pulsador
}

void loop()
{
//Leo el nuevo estado actual del botón
  estadoActual=digitalRead(8);
 
//Si este cambia respecto al estado justo anterior... 
  if (estadoActual != estadoUltimo)
    {
      if (estadoActual == HIGH)
        {
          contador = contador +1;
        }
    }
//Guardo el estado actual para la siguiente comprobación 
  estadoUltimo=estadoActual;
  if (contador % 2 == 0)
    {
      digitalWrite (4,LOW);
    } 
  else
    {
      digitalWrite(4,HIGH);
    }
}



Es para un pulsador, a ver si consigues sacar tu los otros 3 y el apagado general ;)

Un saludo
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: francisco2v on Apr 15, 2014, 04:51 pm
Muchas gracias por tu ayuda.
Tengo 55 años y soy técnico en electrónica...pero en microcontroladores...nada de nada. (Ya empieza a ser hora...je...je...).
Necesito documentarme, es cierto, pero me puedes indicar algún manual con el cual pueda empezar......por ejemplo los de la página oficial de arduíno......etc. He intentado localizar ejemplos de esta necesidad y nada de nada....ó...no se encontrarlos. He intentado programar pero me hago un lío con las llaves ....je...je.....y demás.....claro que poco a poco como todo.
Salu2
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: Dabauza on Apr 15, 2014, 06:47 pm
Hola de nuevo,

Tampoco te creas que yo llevo mucho tiempo con Arduino, empece hace unos tres meses. Pero a base de mucho leer, rebanarme los sesos y pedir socorro en algún momento dado XD me voy defendiendo.

Yo me compre el libro del que aquí se habla:

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

La verdad es que va bastante bien ya que empieza desde 0 (con decirte que empieza desde la ley de Ohm XD). Ademas, hay un ejemplo como el código que yo te he puesto.

El único "pero" que le encuentro al libro es que los ejemplos suelen ser solo de lo que se esta explicando en ese momento, no hay ejemplos de "miniproyectos" por así decirlo.

Y si no en youtube hay bastantes tutoriales que también empiezan desde 0.

Yo te recomiendo las dos cosas XD

Las llaves son como las paréntesis de las ecuaciones en matemáticas (por verlo de alguna manera) siempre que abres una tienes que cerrarla, yo lo que hago para no liarme es siempre que abro una llave la cierro también y escribo en el medio así seguro que no me la dejo sin poner jejejeje.

En cuanto a tu código si quieres controlar cuatro luces con cuatro pulsadores es escribir cuatro veces lo mismo, y para el apagado general lo que puedes hacer es poner a 0 el contador:

Code: [Select]
boolean estadoActual1=0; //Guarda el estado actual del botón1
boolean estadoUltimo1=0; //Guarda el último estado del botón1
boolean contador1=0;     //Guarda las veces que se pulsa el botón1

boolean estadoActual2=0; //Guarda el estado actual del botón2
boolean estadoUltimo2=0; //Guarda el último estado del botón2
boolean contador2=0;     //Guarda las veces que se pulsa el botón2

boolean estadoActual3=0; //Guarda el estado actual del botón3
boolean estadoUltimo3=0; //Guarda el último estado del botón3
boolean contador3=0;     //Guarda las veces que se pulsa el botón3

boolean estadoActual4=0; //Guarda el estado actual del botón4
boolean estadoUltimo4=0; //Guarda el último estado del botón4
boolean contador4=0;     //Guarda las veces que se pulsa el botón4

void setup()
{
  pinMode(4, OUTPUT); //Donde esta conectado el LED1
  pinMode(5, OUTPUT); //Donde esta conectado el LED2
  pinMode(6, OUTPUT); //Donde esta conectado el LED3
  pinMode(7, OUTPUT); //Donde esta conectado el LED4
 
  pinMode(8, INPUT);  //Donde esta conectado el pulsador1
  pinMode(9, INPUT);  //Donde esta conectado el pulsador2
  pinMode(10, INPUT);  //Donde esta conectado el pulsador3
  pinMode(11, INPUT);  //Donde esta conectado el pulsador4
  pinMode(12, INPUT);  //Donde esta conectado el pulsador5
}

void loop()
{
//Leo el nuevo estado actual del botón1
  estadoActual1=digitalRead(8);
 
//Si este cambia respecto al estado justo anterior... 
  if (estadoActual1 != estadoUltimo1){
      if (estadoActual1 == HIGH){
          contador1 = contador1 +1;
        }
    }
//Guardo el estado actual para la siguiente comprobación 
  estadoUltimo1=estadoActual1;
  if (contador1 % 2 == 0)
    {
      digitalWrite (4,LOW);
    } 
  else
    {
      digitalWrite(4,HIGH);
    }

//Leo el nuevo estado actual del botón2
  estadoActual2=digitalRead(9);
 
//Si este cambia respecto al estado justo anterior... 
  if (estadoActual2 != estadoUltimo2){
      if (estadoActual2 == HIGH){
          contador2 = contador2 +1;
        }
    }
//Guardo el estado actual para la siguiente comprobación 
  estadoUltimo2=estadoActual2;
  if (contador2 % 2 == 0)
    {
      digitalWrite (5,LOW);
    } 
  else
    {
      digitalWrite(5,HIGH);
    }   

//Leo el nuevo estado actual del botón3
  estadoActual2=digitalRead(10);
 
//Si este cambia respecto al estado justo anterior... 
  if (estadoActual3 != estadoUltimo3){
      if (estadoActual3 == HIGH){
          contador3 = contador3 +1;
        }
    }
//Guardo el estado actual para la siguiente comprobación 
  estadoUltimo3=estadoActual3;
  if (contador3 % 2 == 0)
    {
      digitalWrite (6,LOW);
    } 
  else
    {
      digitalWrite(6,HIGH);
    } 

//Leo el nuevo estado actual del botón4
  estadoActual2=digitalRead(11);
 
//Si este cambia respecto al estado justo anterior... 
  if (estadoActual4 != estadoUltimo4){
      if (estadoActual4 == HIGH){
          contador4 = contador4 +1;
        }
    }
//Guardo el estado actual para la siguiente comprobación 
  estadoUltimo4=estadoActual4;
  if (contador4 % 2 == 0)
    {
      digitalWrite (7,LOW);
    } 
  else
    {
      digitalWrite(7,HIGH);
    }

  if(digitalRead(12)==HIGH){
    contador1 == 0;
    contador2 == 0;
    contador3 == 0;
    contador4 == 0;   
  }
}


Se podría simplificar usando algún que otro "for", pero te lo dejo así por que se vera mas claro.

(Por cierto esta sin probar)

Un saludo
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: francisco2v on Apr 16, 2014, 11:40 am
Gracias de nuevo....voy ha estudiar como lo has hecho...linea por linea ., anotare mis comentarios larguísimos para comprender y  asimilar.....je...je...con tu ayuda un pasito más.
Salu2

Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: francisco2v on Apr 16, 2014, 11:48 am
...ABUSANDO de tu tiempo y ayuda, sería de gran interés para mi idea, acoplar una salida nueva para un relé que se active tres veces y se pare, cuando se encienda alguno  de los 4 leds.......más lío.........lo siento.....je...je..... (no se si será posible...?)
Salu2
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: francisco2v on Apr 16, 2014, 11:54 am
Otra vez yo...que plomo.
Mi salen estos errores:

conserje1_pde_pde:0: error: function definition does not declare parameters
conserje1_pde_pde.cpp: In function 'void loop()':
conserje1_pde_pde:34: error: 'estadoActual1' was not declared in this scope
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: francisco2v on Apr 16, 2014, 11:56 am
PERDON....si me compila bien, ahora lo aplicaré al simulador de Proteus.....para ver como furula.
Salu2
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: Dabauza on Apr 16, 2014, 12:05 pm
Perdona, pero no acabo de entender lo del relé. ¿Es que genere impulsos? ¿Cada cuanto tiempo?

Saludos
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: francisco2v on Apr 16, 2014, 12:48 pm
Lo de el relé es para conectar un buzzer/sirena pequeña. Es para oir cuando uno led de los 4 esta encendido/activo. Cuando uno de los 4 leds esta encendido  el relé tendría que activarse tres veces y pararse aunque el led siga encendido. El tiempo podría ser 2 segundos activo 1 segundo apagado( aproximadamente). La utilización es para saber cuando han pulsado algún pulsador y oírlo por medio de una sirenita sin tener que estar mirando constantemente si hay algún led encendido.
Espero expresarme mejor.
Salu2
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: Dabauza on Apr 16, 2014, 12:56 pm
Ok, esta tarde a ver si me pongo y te mando el código, que ahora estoy desde el móvil y es un poco rollo escribir desde aquí.

Un saludo
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: Dabauza on Apr 17, 2014, 09:43 pm
Hola,

Perdona, pero estoy liado con varios asuntos y no me da tiempo a todo, aquí te dejo el código. Esta hecho con delays, lo ideal seria usar millis() ya que el delay te pausa la programacion (por asi decirlo) y mientras esta en marcha el delay no puedes hacer nada mas, por eso he acortado los tiempos del timbre.

Esta sin probar

Code: [Select]
boolean estadoActual1=0; //Guarda el estado actual del botón1
boolean estadoUltimo1=0; //Guarda el último estado del botón1
boolean contador1=0;     //Guarda las veces que se pulsa el botón1

boolean estadoActual2=0; //Guarda el estado actual del botón2
boolean estadoUltimo2=0; //Guarda el último estado del botón2
boolean contador2=0;     //Guarda las veces que se pulsa el botón2

boolean estadoActual3=0; //Guarda el estado actual del botón3
boolean estadoUltimo3=0; //Guarda el último estado del botón3
boolean contador3=0;     //Guarda las veces que se pulsa el botón3

boolean estadoActual4=0; //Guarda el estado actual del botón4
boolean estadoUltimo4=0; //Guarda el último estado del botón4
boolean contador4=0;     //Guarda las veces que se pulsa el botón4

void setup()
{
  pinMode(4, OUTPUT); //Donde esta conectado el LED1
  pinMode(5, OUTPUT); //Donde esta conectado el LED2
  pinMode(6, OUTPUT); //Donde esta conectado el LED3
  pinMode(7, OUTPUT); //Donde esta conectado el LED4
  pinMode(13,OUTPUT); //Donde esta conectado el timbre
 
  pinMode(8, INPUT);  //Donde esta conectado el pulsador1
  pinMode(9, INPUT);  //Donde esta conectado el pulsador2
  pinMode(10, INPUT);  //Donde esta conectado el pulsador3
  pinMode(11, INPUT);  //Donde esta conectado el pulsador4
  pinMode(12, INPUT);  //Donde esta conectado el pulsador5
}

void loop()
{
//Leo el nuevo estado actual del botón1
  estadoActual1=digitalRead(8);
 
//Si este cambia respecto al estado justo anterior... 
  if (estadoActual1 != estadoUltimo1){
      if (estadoActual1 == HIGH){
          contador1 = contador1 +1;
        }
    }
//Guardo el estado actual para la siguiente comprobación 
  estadoUltimo1=estadoActual1;
  if (contador1 % 2 == 0)
    {
      digitalWrite (4,LOW);
    } 
  else
    {
      digitalWrite(4,HIGH);
      timbre();    //LLamada a funcion timbre
    }

//Leo el nuevo estado actual del botón2
  estadoActual2=digitalRead(9);
 
//Si este cambia respecto al estado justo anterior... 
  if (estadoActual2 != estadoUltimo2){
      if (estadoActual2 == HIGH){
          contador2 = contador2 +1;
        }
    }
//Guardo el estado actual para la siguiente comprobación 
  estadoUltimo2=estadoActual2;
  if (contador2 % 2 == 0)
    {
      digitalWrite (5,LOW);
    } 
  else
    {
      digitalWrite(5,HIGH);
      timbre();    //LLamada a funcion timbre
    }   

//Leo el nuevo estado actual del botón3
  estadoActual2=digitalRead(10);
 
//Si este cambia respecto al estado justo anterior... 
  if (estadoActual3 != estadoUltimo3){
      if (estadoActual3 == HIGH){
          contador3 = contador3 +1;
        }
    }
//Guardo el estado actual para la siguiente comprobación 
  estadoUltimo3=estadoActual3;
  if (contador3 % 2 == 0)
    {
      digitalWrite (6,LOW);
    } 
  else
    {
      digitalWrite(6,HIGH);
      timbre();    //LLamada a funcion timbre     
    } 

//Leo el nuevo estado actual del botón4
  estadoActual2=digitalRead(11);
 
//Si este cambia respecto al estado justo anterior... 
  if (estadoActual4 != estadoUltimo4){
      if (estadoActual4 == HIGH){
          contador4 = contador4 +1;
        }
    }
//Guardo el estado actual para la siguiente comprobación 
  estadoUltimo4=estadoActual4;
  if (contador4 % 2 == 0)
    {
      digitalWrite (7,LOW);
    } 
  else
    {
      digitalWrite(7,HIGH);
      timbre();    //LLamada a funcion timbre     
    }

  if(digitalRead(12)==HIGH){
    contador1 == 0;
    contador2 == 0;
    contador3 == 0;
    contador4 == 0;   
  }
}

void timbre(){
digitalWrite(13,HIGH);
delay(1000);
digitalWrite(13,LOW);
delay(500);
digitalWrite(13,HIGH);
delay(1000);
digitalWrite(13,LOW);
delay(500);
digitalWrite(13,HIGH);
delay(1000);
digitalWrite(13,LOW);
delay(500);
}


Espero que te sirva

Un saludo
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: francisco2v on Apr 18, 2014, 12:01 pm
Muchísimas gracias por tu amabilidad y ayuda. Estaremos en contacto y yo aprendiendo.
Salu2.....desde Tenerife... y.... feliz Semana Santa.
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: Dabauza on Apr 18, 2014, 12:27 pm
No hay de que,

Saludos
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: francisco2v on Apr 19, 2014, 12:10 pm
Siento molestar de nuevo. Al realizar la simulación me pasa lo siguiente:
Al pulsar P1 se enciende el led1 y el timbre se pone intermitente y no se para.  Reset no funciona.  (será por el timbre funcionando...?)
Al pulsar P2 se enciende el le2 y el timbre se pone intermitente y no se para. Reset no funciona.
Al pulsar P3 no se enciende el le3 ni el timbre.
Al pulsar P4 no se enciende el led4 ni el timbre.

Te pido socorro de nuevo para cuando tengas un poco de tiempo.
Salu2
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: francisco2v on Apr 19, 2014, 12:36 pm
Con mi pobre capacidad he rectificado unas lineas en que el número a leer estaba mal P3 y P4 ( creo que es le suerte del principiante).
Ahora encienden correctamente:
Al pulsar P1, el led1 enciende. Timbre siempre con intermitencia no se para.
Al pulsar P2 el led2 enciende.Timbre siempre con intermitencia no se para.
Al pulsar P3 el led3 enciende.Timbre siempre con intermitencia no se para.
alpulsar P4 el led4 enciende.Timbre siempre con intermitencia no se para.

Creo que al estar intermitente la sirena sin parar no puedo aplicar la función de Reset.
Bueno maestro ya dirás yo sigo investigando a paso tortuga....je...je
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: Dabauza on Apr 19, 2014, 12:51 pm
Hola de nuevo,

Prueba a ver si con el segundo código funciona el reset y así descartamos que sea del timbre o que el código este mal.

Me da a mi que no se para por que cuando hay una pulsación "par" esta constantemente haciendo la llamada a la función timbre.

Eso de "maestro" es discutible XD, como puedes ver yo aun estoy en fase prueba/error XD

Cuando tenga un rato simplificare un poco el código y lo montare en la placa board y a ver que pasa.

Un saludo
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: francisco2v on Apr 19, 2014, 02:24 pm
Gracias por atenderme....con el "segundo código" no funciona el reset. Hace correctas todas las funciones excepto el timbre que queda intermitente constantemente.
Me imagino que no resetea  al estar la sirena continuamente de forma intermitente activada y la función delay bloquea la orden de resetar.
Salu2
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: Dabauza on Apr 19, 2014, 03:56 pm
No hay de que hombre,

Aqui te dejo el codigo (sin la salida para el rele):

Code: [Select]
#define boton1 9
#define LED1 4
boolean estadoActual1=0; //Guarda el estado actual del botón1
boolean estadoUltimo1=0; //Guarda el último estado del botón1
boolean contador1=0;     //Guarda las veces que se pulsa el botón1

#define boton2 10
#define LED2 5
boolean estadoActual2=0; //Guarda el estado actual del botón2
boolean estadoUltimo2=0; //Guarda el último estado del botón2
boolean contador2=0;     //Guarda las veces que se pulsa el botón2

#define LED3 6
#define boton3 11
boolean estadoActual3=0; //Guarda el estado actual del botón3
boolean estadoUltimo3=0; //Guarda el último estado del botón3
boolean contador3=0;     //Guarda las veces que se pulsa el botón3

#define LED4 7
#define boton4 12
boolean estadoActual4=0; //Guarda el estado actual del botón4
boolean estadoUltimo4=0; //Guarda el último estado del botón4
boolean contador4=0;     //Guarda las veces que se pulsa el botón4

#define botonRST 13

void setup()
{
  pinMode(LED1, OUTPUT); //Donde esta conectado el LED1
  pinMode(LED2, OUTPUT); //Donde esta conectado el LED2
  pinMode(LED3, OUTPUT); //Donde esta conectado el LED3
  pinMode(LED4, OUTPUT); //Donde esta conectado el LED4
 
  pinMode(boton1, INPUT);  //Donde esta conectado el pulsador1
  pinMode(boton2, INPUT);  //Donde esta conectado el pulsador2
  pinMode(boton3, INPUT);  //Donde esta conectado el pulsador3
  pinMode(boton4, INPUT);  //Donde esta conectado el pulsador4
  pinMode(botonRST, INPUT);  //Donde esta conectado el pulsador5
}

void loop(){

 
      //****** ENCENDIDO LED 1 ******//
 
//Leo el nuevo estado actual del botón1
  estadoActual1=digitalRead(boton1);
 
//Si este cambia respecto al estado justo anterior... 
  if (estadoActual1 != estadoUltimo1){
      if (estadoActual1 == HIGH){
          contador1 = contador1 +1;
        }
    }
   
//Guardo el estado actual para la siguiente comprobación 
  estadoUltimo1=estadoActual1;
  if (contador1 % 2 == 0)
    {
      digitalWrite (LED1,LOW);
    } 
  else
    {
      digitalWrite(LED1,HIGH);
    }
   

   
      //****** ENCENDIDO LED 2 ******//   

//Leo el nuevo estado actual del botón2
  estadoActual2=digitalRead(boton2);
 
//Si este cambia respecto al estado justo anterior... 
  if (estadoActual2 != estadoUltimo2){
      if (estadoActual2 == HIGH){
          contador2 = contador2 +1;
        }
    }
//Guardo el estado actual para la siguiente comprobación 
  estadoUltimo2=estadoActual2;
  if (contador2 % 2 == 0)
    {
      digitalWrite (LED2,LOW);
    } 
  else
    {
      digitalWrite(LED2,HIGH);
    }   



      //****** ENCENDIDO LED 3 ******//

//Leo el nuevo estado actual del botón3
  estadoActual3=digitalRead(boton3);
 
//Si este cambia respecto al estado justo anterior... 
  if (estadoActual3 != estadoUltimo3){
      if (estadoActual3 == HIGH){
          contador3 = contador3 +1;
        }
    }
//Guardo el estado actual para la siguiente comprobación 
  estadoUltimo3=estadoActual3;
  if (contador3 % 2 == 0)
    {
      digitalWrite (LED3,LOW);
    } 
  else
    {
      digitalWrite(LED3,HIGH);
    } 



      //****** ENCENDIDO LED 4 ******//

//Leo el nuevo estado actual del botón4
  estadoActual4=digitalRead(boton4);
 
//Si este cambia respecto al estado justo anterior... 
  if (estadoActual4 != estadoUltimo4){
      if (estadoActual4 == HIGH){
          contador4 = contador4 +1;
        }
    }
//Guardo el estado actual para la siguiente comprobación 
  estadoUltimo4=estadoActual4;
  if (contador4 % 2 == 0)
    {
      digitalWrite (LED4,LOW);
    } 
  else
    {
      digitalWrite(LED4,HIGH);
    }




      //****** RESET LEDS ******//

  if(digitalRead(botonRST)==HIGH){
    contador1 = 0;
    contador2 = 0;
    contador3 = 0;
    contador4 = 0;   
  }
}


Como puedes apreciar, no hacia el reset por que en vez de poner "== 0" hay que poner "= 0" (fallo mio)

== quiere decir que si contador1 es igual a 0 (se usa para hacer comparaciones)
= lo que te hace es igualar lo que hay antes del igual al valor que hay después.

Voy a ponerme con lo del rele y ahora te lo subo

Un saludo
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: Dabauza on Apr 19, 2014, 05:36 pm
En este código si que funciona el rele del timbre, lo malo es que también funciona cuando se apagan los leds siempre que quede alguno encendido, míralo a ver si lo terminas de apañar.

Code: [Select]
#define LED1 4             //Donde esta conectado el LED1
#define boton1 9           //Donde esta conectado el boton 1
boolean estadoActual1 = 0; //Guarda el estado actual del botón1
boolean estadoUltimo1 = 0; //Guarda el último estado del botón1
boolean contador1 = 0;     //Guarda las veces que se pulsa el botón1

#define LED2 5             //Donde esta conectado el LED 1
#define boton2 10          //Donde esta conectado el boton 2
boolean estadoActual2 = 0; //Guarda el estado actual del botón2
boolean estadoUltimo2 = 0; //Guarda el último estado del botón2
boolean contador2=0;       //Guarda las veces que se pulsa el botón2

#define LED3 6             //Donde esta conectado el LED 3
#define boton3 11          //Donde esta conectado el boton 3
boolean estadoActual3 = 0; //Guarda el estado actual del botón3
boolean estadoUltimo3 = 0; //Guarda el último estado del botón3
boolean contador3=0;       //Guarda las veces que se pulsa el botón3

#define LED4 7             //Donde esta conectado el LED4
#define boton4 12          //Donde esta conectado el boton 4
boolean estadoActual4 = 0; //Guarda el estado actual del botón4
boolean estadoUltimo4 = 0; //Guarda el último estado del botón4
boolean contador4 = 0;     //Guarda las veces que se pulsa el botón4

#define botonRST 13        //Donde esta conectado el boton RESET

#define releTimbre 8       //Donde esta conectado el rele del timbre
byte contadorTimbre = 0;

void setup()
{
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  pinMode(releTimbre, OUTPUT);
 
  pinMode(boton1, INPUT);
  pinMode(boton2, INPUT);
  pinMode(boton3, INPUT);
  pinMode(boton4, INPUT);
  pinMode(botonRST, INPUT);
  Serial.begin(9600);
}

void loop(){

 
      //****** ENCENDIDO LED 1 ******//
 
//Leo el nuevo estado actual del botón1
  estadoActual1=digitalRead(boton1);
 
//Si este cambia respecto al estado justo anterior... 
  if (estadoActual1 != estadoUltimo1){
      if (estadoActual1 == HIGH){
          contador1 = contador1 +1;
        }
    }
   
//Guardo el estado actual para la siguiente comprobación 
  estadoUltimo1=estadoActual1;
  if (contador1 % 2 == 0)
    {
      digitalWrite (LED1,LOW);   
    } 
  else
    {
      digitalWrite(LED1,HIGH);
      timbre();    //Llama a la funcion timbre
    }
   

   
      //****** ENCENDIDO LED 2 ******//   

//Leo el nuevo estado actual del botón2
  estadoActual2=digitalRead(boton2);
 
//Si este cambia respecto al estado justo anterior... 
  if (estadoActual2 != estadoUltimo2){
      if (estadoActual2 == HIGH){
          contador2 = contador2 +1;
        }
    }
//Guardo el estado actual para la siguiente comprobación 
  estadoUltimo2=estadoActual2;
  if (contador2 % 2 == 0)
    {
      digitalWrite (LED2,LOW);
    } 
  else
    {
      digitalWrite(LED2,HIGH);
      timbre();    //Llama a la funcion timbre     
    }   



      //****** ENCENDIDO LED 3 ******//

//Leo el nuevo estado actual del botón3
  estadoActual3=digitalRead(boton3);
 
//Si este cambia respecto al estado justo anterior... 
  if (estadoActual3 != estadoUltimo3){
      if (estadoActual3 == HIGH){
          contador3 = contador3 +1;
        }
    }
//Guardo el estado actual para la siguiente comprobación 
  estadoUltimo3=estadoActual3;
  if (contador3 % 2 == 0)
    {
      digitalWrite (LED3,LOW);
    } 
  else
    {
      digitalWrite(LED3,HIGH);
      timbre();    //Llama a la funcion timbre
    } 



      //****** ENCENDIDO LED 4 ******//

//Leo el nuevo estado actual del botón4
  estadoActual4=digitalRead(boton4);
 
//Si este cambia respecto al estado justo anterior... 
  if (estadoActual4 != estadoUltimo4){
      if (estadoActual4 == HIGH){
          contador4 = contador4 +1;
        }
    }
//Guardo el estado actual para la siguiente comprobación 
  estadoUltimo4=estadoActual4;
  if (contador4 % 2 == 0)
    {
      digitalWrite (LED4,LOW);
    } 
  else
    {
      digitalWrite(LED4,HIGH);
      timbre();    //Llama a la funcion timbre
    }



      //****** RESET LEDS ******//

  if(digitalRead(botonRST)==HIGH){
    contador1 = 0;
    contador2 = 0;
    contador3 = 0;
    contador4 = 0;   
  }
}

void timbre(){
  if(contadorTimbre < 3){
    digitalWrite(releTimbre,HIGH);
    delay(1000);
    digitalWrite(releTimbre,LOW);
    contadorTimbre ++;
    Serial.println(contadorTimbre);
    delay(500);
    digitalWrite(releTimbre,HIGH);
    delay(1000);
    digitalWrite(releTimbre,LOW);
    contadorTimbre ++;
    Serial.println(contadorTimbre);
    delay(500);
    digitalWrite(releTimbre,HIGH);
    delay(1000);
    digitalWrite(releTimbre,LOW);
    contadorTimbre ++;
    Serial.println(contadorTimbre);
    delay(500);
  }
  else if((digitalRead(boton1))||(digitalRead(boton2))||(digitalRead(boton3))||(digitalRead(boton4))){
   contadorTimbre = 0;
  }
}


Un saludo
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: francisco2v on Apr 19, 2014, 07:22 pm
Lo he pasado a hex y lo simulo con Proteus:
El primero que me indicas rectificado, no funciona bien . Si aprecio que al pulsar P1 enciende led1 y si pulso de nuevo P1 lo apaga.  Como me dices Reset no funciona.
El segundo rectificado con timbre...no funcionan los pulsadores ni la campana...hay algun bichito raro...je...je....
Salu2
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: Dabauza on Apr 19, 2014, 07:35 pm
El Proteus lo estuve usando yo al principio hasta que me llegaron los componentes, ahora lo monto directamente en la placa board.

Yo lo he montado con un arduino pro mini  con leds y pulsadores y el primer código que te he mandado hoy (el que no lleva el rele) si que funciona bien. Y el segundo el problema que tiene es que al apagar también se activa el rele.

He cambiado la distribución de los pines, igual por eso no te funciona.

Saludos
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: francisco2v on Apr 19, 2014, 07:49 pm
Gracias....a investigar , monteré un mini como tienes tu.....ya será la proxima semana...... te comento resultado.
Lo de el timbre o relé cuando están los leds apagados..no lo entiendo. Agradecería ampliar explicación para TORPES.
Salu2
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: francisco2v on Apr 19, 2014, 07:55 pm
Tengo una duda , quizas por no explicarme bien.
La función tendría que ser :
(Lo mismo para los 4 pulsadores y los 4 leds correspondientes):
Al pulsar P1 enciende Led1, pero si pulso de nuevo P1 el led1 tiene que continuar encendido y no apagarse. Solo led1,led2,led3 y led4 (los que estén encendidos) se apagarán cuando pulse el boton RESET.
Salu2
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: Dabauza on Apr 19, 2014, 07:58 pm
El rele tiene que activarse cada vez que se enciende un led, esto funciona bien.

El problema esta en que si hay varios leds encendidos (imaginemos que son tres los leds encendidos), cuando pulsamos el boton1 para apagar el led1 el rele se activa, cuando pulsamos el boton2 para apagar el led2 el rele se activa, pero cuando pulsamos el boton3 para apagar el led3, el rele ya no se activa. El fallo esta en que mientras tengas dos (o mas) leds encendidos cuando apagues uno de ellos el rele se activara.

En definitiva, no se activa cuando se apaga el ultimo de todos los leds que tenias encendidos.

Esto habría que revisarlo para que al apagar algún led, y mientras queden otros en marcha, no se encendiera el rele.

Un saludo
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: Dabauza on Apr 19, 2014, 08:00 pm
Vale... entendí que se podian encender/apagar con cada pulsador correspondiente y ademas poder apagarlos con un reset general
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: Dabauza on Apr 19, 2014, 09:36 pm
Aquí lo tienes:

Code: [Select]
#define LED1 4             //Donde esta conectado el LED 1
#define boton1 9           //Donde esta conectado el boton 1

#define LED2 5             //Donde esta conectado el LED 2
#define boton2 10          //Donde esta conectado el boton 2

#define LED3 6             //Donde esta conectado el LED 3
#define boton3 11          //Donde esta conectado el boton 3

#define LED4 7             //Donde esta conectado el LED 4
#define boton4 12          //Donde esta conectado el boton 4

#define botonRST 13        //Donde esta conectado el boton RESET

#define releTimbre 8       //Donde esta conectado el rele del timbre
byte contadorTimbre = 0;


void setup(){
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  pinMode(releTimbre, OUTPUT);
 
  pinMode(boton1, INPUT);
  pinMode(boton2, INPUT);
  pinMode(boton3, INPUT);
  pinMode(boton4, INPUT);
  pinMode(botonRST, INPUT);
}


void loop(){

      //****** ENCENDIDO LEDS ******//
 
  if(digitalRead(boton1)) {digitalWrite(LED1,HIGH);}
  if(digitalRead(boton2)) {digitalWrite(LED2,HIGH);} 
  if(digitalRead(boton3)) {digitalWrite(LED3,HIGH);} 
  if(digitalRead(boton4)) {digitalWrite(LED4,HIGH);}

      //****** APAGAGO LEDS ******//

  if(digitalRead(botonRST)){
    digitalWrite(LED1,LOW);
    digitalWrite(LED2,LOW);
    digitalWrite(LED3,LOW);
    digitalWrite(LED4,LOW);   
  }     
 
      //****** ENCENDIDO SIRENA ******// 
     
  if((contadorTimbre < 3)&&((digitalRead(boton1)) || (digitalRead(boton2)) || (digitalRead(boton3)) || (digitalRead(boton4)))){
    digitalWrite(releTimbre,HIGH);
    delay(1000);
    digitalWrite(releTimbre,LOW);
    contadorTimbre ++;
    delay(500);
    digitalWrite(releTimbre,HIGH);
    delay(1000);
    digitalWrite(releTimbre,LOW);
    contadorTimbre ++;
    delay(500);
    digitalWrite(releTimbre,HIGH);
    delay(1000);
    digitalWrite(releTimbre,LOW);
    contadorTimbre ++;
    delay(500);
  }
  else if((digitalRead(boton1)) || (digitalRead(boton2)) || (digitalRead(boton3)) || (digitalRead(boton4))){
  contadorTimbre = 0; 
  }
}


Así a sido mucho mas fácil XD

Esta compilado y probado en la placa board.

Edito: Ahora lo interesante seria hacer sonar la sirena con millis en vez de con delay para que así no se te detenga la programación.

Un saludo.
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: francisco2v on Apr 20, 2014, 12:00 pm
Michísimas GRACIAS....esta perfecto.
Ahora me toca analizar una por una las instrucciones que  has puesto......
Estamos en contacto...
Salu2
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: Dabauza on Apr 20, 2014, 02:14 pm
Muchísimas de nadas ;)
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: francisco2v on Apr 22, 2014, 05:21 pm
Agradecería tu email...el mio es :
   fvallverdu@gmail.com

Salu2
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: Dabauza on Apr 23, 2014, 11:46 pm
Hola Francisco,

Si no te importa mejor tratar las dudas o problemas en el foro así queda registrado de forma publica y todos podemos aprender ellos.

Un saludo.
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: francisco2v on Apr 24, 2014, 10:29 am
Si es lo correcto.....lo que quería es mandarte un programa un poco largo( por email ) y que me indicases ......... por el foro, de como poner un scroll al empezar ó al ser conectado.
Salu2
Title: Re: Ayuda para un novato mayor en programa simple.Gracias
Post by: Dabauza on Apr 24, 2014, 11:33 am
Si quieres adjuntar un código largo que no cabe en el texto, abajo de donde se esta escribiendo el comentario pone "aditional options", si pinchas se desplega un menú y en seleccionar un archivo seleccionas el archivo que quieres mandar. Si no te deja adjuntarlo lo comprimes en .zip o .rar y listo.

Un saludo