Go Down

Topic: Campanas para mi Iglesia. (Read 10448 times) previous topic - next topic

carmeloco

Inicialmente, lo de usar solo 4 pines para 15 botones diferentes, en mi cabeza sonaba mejor que en la práctica. Si usas un arduino Nano, puedes usar para botones los pines digitales del 4 al 12 (el 13 lo descarto por que el led hace que no se pueda usar el pullup interno) y los pines analógicos del 0 al 7, con lo que da un total de 17 botones.

Si se necesitasen 18, se puede conectar el pin 13 con una pulldown física y configurarlo como input normal.

Las salidas las hago como LOW y HIGH porque normalmente, los módulos de relés que se venden por ahí, funcionan con paso por low, esto también hace que, en el reset del arduino, no se activen los relés (siempre y cuando tengamos la precaución de hacer esto en el setup:

Code: [Select]
  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);

curro92

Perdona porque envié el código sin probar.

Ahora creo que no te dará errores.

Para tocar a la vez tienes un ejemplo al final del código, quitando el delay entre las dos campanas y poniéndolo después, para nuestro oído funciona como si fuera simultáneo.



Code: [Select]

int campana1Pin = 2;         
int campana2Pin = 3;               
int buttonPin   = 4;



void setup()
{
   pinMode(campana1Pin, OUTPUT);      // pin digital como salida
   pinMode(campana2Pin, OUTPUT);      // pin digital como salida

}


// tocar dos campanas sucesivamente  n numero de veces
void toque_de_campanas_numero1(int n)
{
    int c;
    for(c=0; c< n;c++)
    {
       digitalWrite(campana1Pin , HIGH); 
       delay(100);   
       digitalWrite(campana1Pin , LOW);
       delay(1000);   

       digitalWrite(campana2Pin , HIGH); 
       delay(100);   
       digitalWrite(campana2Pin , LOW);
       delay(1000); 
   }
}


int mirar_boton_pulsado()
{
  int b;
  // mirar qué boton esta pulsado
   b = digitalRead(buttonPin);
  return b;
}



int boton;

void loop()
{
   boton = mirar_boton_pulsado();
   
   if(boton == HIGH) 
      toque_de_campanas_numero1(33);   //ejecutar el toque con 33 campanadas
}


/*
// para tocar a la vez
  digitalWrite(campana1Pin , HIGH); 
  digitalWrite(campana2Pin , HIGH);   
   delay(100);
  digitalWrite(campana1Pin , LOW); 
  digitalWrite(campana2Pin , LOW);   
  delay(1000);   
*/



Mi consejo es que montes un botón y dos led, practiques con un único programa (no 16!). Sería más realista que usaras un pequeño altavoz en vez de los led, y con la librería tone, hicieras sonar dos tonos.





francisco2v

Muchas GRACIAS.... por vuestra ayuda y esfuerzo. Aunque soy pobre de mente estoy intentando asimilar el/los programas.
Voy a simularlos y a familiarizarme con ellos.
Gracias por los consejos .....que me vienen muy bien.... para ir asimilando vuestra gran capacidad.
Les mantengo informado de mis pequeños avances y "Grandes errores".
"Les ruego tengan paciencia conmigo para sucesivas consultas"

Salu2....desde....

(Tenerife-España)

francisco2v

#18
Dec 10, 2014, 10:44 am Last Edit: Dec 10, 2014, 10:55 am by francisco2v
Intente con dos pulsadores y dos secuencias pero no funciona bien. Me da errores. Soy un negado. Con un pulsador y una secuencia...todo perfecto:

Code: [Select]
int campana1Pin = 2;         
int campana2Pin = 3;               
int button1Pin   = 4;
int button2Pin   = 5;



void setup()
{
   pinMode(campana1Pin, OUTPUT);      // pin digital como salida
   pinMode(campana2Pin, OUTPUT);      // pin digital como salida

}


// tocar dos campanas sucesivamente  n numero de veces
void toque_de_campanas_numero1(int n)
{
    int c;
    for(c=0; c< n;c++)
    {
       digitalWrite(campana1Pin , HIGH); 
       delay(100);   
       digitalWrite(campana1Pin , LOW);
       delay(1000);   

       digitalWrite(campana2Pin , HIGH); 
       delay(100);   
       digitalWrite(campana2Pin , LOW);
       delay(1000); 
   }
}


int mirar_boton_pulsado()
{
  int b;
  // mirar qué boton esta pulsado
   b = digitalRead(button1Pin);
  return b;
}



int boton;

void loop()
{
   boton = mirar_boton_pulsado();
   
   if(boton == HIGH) 
      toque_de_campanas_numero1(6);   //ejecutar el toque con 6 campanadas
}
void toque_de_campanas_numero1(int n)
{
    int c;
    for(c=0; c< n;c++)
    {
       digitalWrite(campana1Pin , HIGH); 
       delay(100);   
       digitalWrite(campana1Pin , LOW);
       delay(1000);   

       digitalWrite(campana2Pin , HIGH); 
       delay(100);   
       digitalWrite(campana2Pin , LOW);
       delay(1000); 
   }
}


int mirar_boton_pulsado()
{
  int b;
  // mirar qué boton esta pulsado
   b = digitalRead(button2Pin);
  return b;
}



int boton;

void loop()
{
   boton = mirar_boton_pulsado();
   
   if(boton == HIGH) 
      toque_de_campanas_numero1(6);   //ejecutar el toque con 6 campanadas
}



errores que me da :
campanas2.ino: In function 'void toque_de_campanas_numero1(int)':
campanas2:54: error: redefinition of 'void toque_de_campanas_numero1(int)'
campanas2:17: error: 'void toque_de_campanas_numero1(int)' previously defined here
campanas2.ino: In function 'int mirar_boton_pulsado()':
campanas2:72: error: redefinition of 'int mirar_boton_pulsado()'
campanas2:35: error: 'int mirar_boton_pulsado()' previously defined here
campanas2.ino: At global scope:
campanas2:82: error: redefinition of 'int boton'
campanas2:45: error: 'int boton' previously declared here
campanas2.ino: In function 'void loop()':
campanas2:84: error: redefinition of 'void loop()'
campanas2:47: error: 'void loop()' previously defined here

curro92

Hola,
te da error porque has duplicado todas la funciones.

Para usar dos botones, prueba cambiando un poco  esta función


int mirar_boton_pulsado2(int botonPin)
{
  int b;
  // mirar si el boton esta pulsado
   b = digitalRead(botonPin);
  return b;
}


Le deberás llamar dos veces en el loop()



void loop()
{
   boton = mirar_boton_pulsado2(button1Pin );
   if(boton == HIGH) 
      toque_de_campanas_numero1(6);   //ejecutar el toque con 6 campanadas

   boton = mirar_boton_pulsado2(button2Pin );
   
   if(boton == HIGH) 
      toque_de_campanas_numero1(3);   //ejecutar el toque con 3 campanadas

}


venga, que no es tan difícil




francisco2v

#20
Dec 10, 2014, 01:49 pm Last Edit: Dec 10, 2014, 02:15 pm by francisco2v
Como podrás observar ya tengo poca materia GRIS.
Voy ha seguir destrozando el programa...je...je.....
(Tengo 55 años y ya voy hacia tras.....y más con arduino que es nuevo para mi.
Tengo un lío mental de no te menes, como no tengo claro la estructura del programa....pero... poco a poco....SUPONGO.).

Gracias de nuevo.

surbyte

Francisco yo veo mucho entusiamo en ti pero lo que no entiendo es porque no das los pasos lógicos de todo aquel que quiere aprender.
Porque no aprendes?

Te pones con cosas complejas y cometes los mismos errores una y otra vez.
Deberías tomar un libro de arduino y devorarlo, consumiendo cada letra y cada programa hasta entenderlos.

Y luego retomar todo esto que haces.

Te lo digo con la mejor intención, que es tu crecimiento en este mundo de Arduino.
Detente.
Lee, estudia, aprende y luego regresa.

Si no ves que una rutina duplicada dará error y luego SI NO VES que los errores que te da el compilador justamente INDICAN que es una rutina DUPLICADA es porque te falta conocimiento.

Este es un foro de ayuda, no para resolverle los problemas a todos. Claro que muchos al igual que yo mismo lo hacemos de tanto en tanto.
Pero con la sana intención que la persona del otro lado CREZCA internamente.
Si no lo hace, debemos ORIENTARLO para que logre ese objetivo, si de verdad lo busca.

Se que entenderas lo que digo.

Yo tengo 53 asi que la edad no es excusa.

francisco2v

#22
Dec 10, 2014, 05:28 pm Last Edit: Dec 10, 2014, 05:59 pm by francisco2v
SURBYTE....sobre tu comentario debo indicar...que tienes toda la razón.
Como siempre mi AGRADECIMIENTO.
Se que pido...y lo que pido esta fuera de mi conocimiento.......por ello debo esforzarme para adquirirlo.
Casi nunca pido para mi siempre es para los demás. Quizás.. .......sea hora de pensar algo en mi para ir creciendo en este mundo de Arduíno.
(Pido disculpas si con mi proceder he molestado).
"Espero poder terminar el programa para las campanas"
Con toda mi sinceridad.
Salu2

francisco2v

#23
Dec 10, 2014, 06:55 pm Last Edit: Dec 10, 2014, 06:57 pm by francisco2v
Bueno...he intentado hacer el programa con 10 pulsadores y que lean campanas_numero1 con distinto numero de toques.
Me da este error:
sketch_dec10a.ino: In function 'int mirar_boton_pulsado10(int)':
sketch_dec10a:49: error: 'buttonPin' was not declared in this scope

Code: [Select]
int campana1Pin = 2;         
int campana2Pin = 3;               
int button1Pin  = 4;
int button2Pin  = 5;
int button3Pin  = 6;
int button4Pin  = 7;
int button5Pin  = 8;
int button6Pin  = 9;
int button7Pin  = 10;
int button8Pin  = 11;
int button9Pin  = 12;
int button10Pin  = 13;
;



void setup()
{
   pinMode(campana1Pin, OUTPUT);      // pin digital como salida
   pinMode(campana2Pin, OUTPUT);      // pin digital como salida

}


// tocar dos campanas sucesivamente  n numero de veces
void toque_de_campanas_numero1(int n)
{
    int c;
    for(c=0; c< n;c++)
    {
       digitalWrite(campana1Pin , HIGH); 
       delay(100);   
       digitalWrite(campana1Pin , LOW);
       delay(1000);   

       digitalWrite(campana2Pin , HIGH); 
       delay(100);   
       digitalWrite(campana2Pin , LOW);
       delay(1000); 
   }
}


int mirar_boton_pulsado10(int botonPin)
{
  int b;
  // mirar qué boton esta pulsado
   b = digitalRead(buttonPin);
  return b;
}



int boton;

void loop()
{
   boton = mirar_boton_pulsado10(button1Pin );
   if(boton == HIGH) 
      toque_de_campanas_numero1(6);   //ejecutar el toque con 6 campanadas

   boton = mirar_boton_pulsado10(button2Pin );
   
   if(boton == HIGH) 
      toque_de_campanas_numero1(3);   //ejecutar el toque con 3 campanadas

 boton = mirar_boton_pulsado10(button3Pin );
   if(boton == HIGH) 
      toque_de_campanas_numero1(8);   //ejecutar el toque con 8 campanadas

   boton = mirar_boton_pulsado10(button4Pin );
   
   if(boton == HIGH) 
      toque_de_campanas_numero1(4);   //ejecutar el toque con 4 campanadas

boton = mirar_boton_pulsado10(button5Pin );
   if(boton == HIGH) 
      toque_de_campanas_numero1(10);   //ejecutar el toque con 10 campanadas

   boton = mirar_boton_pulsado10(button6Pin );
   
   if(boton == HIGH) 
      toque_de_campanas_numero1(2);   //ejecutar el toque con 2 campanadas

 boton = mirar_boton_pulsado10(button7Pin );
   if(boton == HIGH) 
      toque_de_campanas_numero1(12);   //ejecutar el toque con 12 campanadas

   boton = mirar_boton_pulsado10(button8Pin );
   
   if(boton == HIGH) 
      toque_de_campanas_numero1(14);   //ejecutar el toque con 14 campanadas

 boton = mirar_boton_pulsado10(button9Pin );
   if(boton == HIGH) 
      toque_de_campanas_numero1(16);   //ejecutar el toque con 16 campanadas

   boton = mirar_boton_pulsado10(button10Pin );
   
   if(boton == HIGH) 
      toque_de_campanas_numero1(20);   //ejecutar el toque con 20 campanadas


}


Agradecería me indiquen como poner toques distintos:
de  toque_de_campanas_numero1 a toque_de_campanas_numero10 para distintas secuencias de toques.

Gracias

surbyte

Y que te parece que indica el mensaje del compilador?
Porque no lo analizas en lugar de pedir que todo te lo hagan.
Entiendeme bien, no tengo nada contra tu persona, pero debes poner algo de tu parte.

Me da este error:
sketch_dec10a.ino: In function 'int mirar_boton_pulsado10(int)':
sketch_dec10a:49: error: 'buttonPin' was not declared in this scope

que dice aca "linea 49 error: 'buttonPin' was not declared in this scope

buttonPin no esta declarado en el programa =>>>> ENTONCES???

carmeloco

Yo no es por desmerecer el trabajo de los demás pero, ¿has probado el código que te puse yo?

francisco2v

No da errores..pero no me funciona:

Code: [Select]
int campana1Pin = 2;         
int campana2Pin = 3;               
int button1Pin  = 4;
int button2Pin  = 5;
int button3Pin  = 6;
int button4Pin  = 7;
int button5Pin  = 8;
int button6Pin  = 9;
int button7Pin  = 10;
int button8Pin  = 11;
int button9Pin  = 12;
int button10Pin  = 13;
;



void setup()
{
   pinMode(campana1Pin, OUTPUT);      // pin digital como salida
   pinMode(campana2Pin, OUTPUT);      // pin digital como salida

}


// tocar dos campanas sucesivamente  n numero de veces
void toque_de_campanas_numero1(int n)
{
    int c;
    for(c=0; c< n;c++)
    {
       digitalWrite(campana1Pin , HIGH); 
       delay(100);   
       digitalWrite(campana1Pin , LOW);
       delay(1000);   

       digitalWrite(campana2Pin , HIGH); 
       delay(100);   
       digitalWrite(campana2Pin , LOW);
       delay(1000); 
   }
}


int mirar_boton_pulsado10(int botonPin)
{
  int b;
  // mirar qué boton esta pulsado
   b = digitalRead(button1Pin);
    return b;
   b = digitalRead(button2Pin);
     return b;
   b = digitalRead(button3Pin);
     return b;
   b = digitalRead(button4Pin);
     return b;
   b = digitalRead(button5Pin);
     return b;
   b = digitalRead(button6Pin);
     return b;
   b = digitalRead(button7Pin);
     return b;
   b = digitalRead(button8Pin);
     return b;
   b = digitalRead(button9Pin);
     return b;
   b = digitalRead(button10Pin);
  return b;


 
  }

int boton;

void loop()
{
   boton = mirar_boton_pulsado10(button1Pin );
   if(boton == HIGH) 
      toque_de_campanas_numero1(6);   //ejecutar el toque con 6 campanadas

   boton = mirar_boton_pulsado10(button2Pin );
   
   if(boton == HIGH) 
      toque_de_campanas_numero1(3);   //ejecutar el toque con 3 campanadas

 boton = mirar_boton_pulsado10(button3Pin );
   if(boton == HIGH) 
      toque_de_campanas_numero1(8);   //ejecutar el toque con 8 campanadas

   boton = mirar_boton_pulsado10(button4Pin );
   
   if(boton == HIGH) 
      toque_de_campanas_numero1(4);   //ejecutar el toque con 4 campanadas

boton = mirar_boton_pulsado10(button5Pin );
   if(boton == HIGH) 
      toque_de_campanas_numero1(10);   //ejecutar el toque con 10 campanadas

   boton = mirar_boton_pulsado10(button6Pin );
   
   if(boton == HIGH) 
      toque_de_campanas_numero1(2);   //ejecutar el toque con 2 campanadas

 boton = mirar_boton_pulsado10(button7Pin );
   if(boton == HIGH) 
      toque_de_campanas_numero1(12);   //ejecutar el toque con 12 campanadas

   boton = mirar_boton_pulsado10(button8Pin );
   
   if(boton == HIGH) 
      toque_de_campanas_numero1(14);   //ejecutar el toque con 14 campanadas

 boton = mirar_boton_pulsado10(button9Pin );
   if(boton == HIGH) 
      toque_de_campanas_numero1(16);   //ejecutar el toque con 16 campanadas

   boton = mirar_boton_pulsado10(button10Pin );
   
   if(boton == HIGH) 
      toque_de_campanas_numero1(20);   //ejecutar el toque con 20 campanadas


}

francisco2v

#27
Dec 10, 2014, 09:13 pm Last Edit: Dec 10, 2014, 09:35 pm by francisco2v
CARMELOCO...si lo probé pero se encienden y apagan las salidas todo el tiempo sin atender los pulsadores.
Lo simule con Proteus.
Gracias de nuevo....creo que no salgo de esta.....lo que es la ignorancia.
Revisando de nuevo......:
Creo que tengo las resistencias de los pulsadores puestas a tierra y dan un LOW fijo a las entradas
.....groso error.
Ya te cuento...
Lo tenia mal en el simulador....lo siento...pero llevo un lío....inmenso.
Como podría tocar las dos campanas a la vez y como repetir toques...no se si sera correcto.
Yo soy novato y tu muy adelantado....no se si puedo seguirte. A duras penas....ni me aclaro con el programa más "sencillo"....sigo necesitando ayuda...y no porque no haya trabajado....pero es lo que me dice Surbyte...si no hay base no hay nada....bueno espero salir de esta con ayuda.
Salu2

carmeloco

Buenas, te dejo el esquema de conexionado de mi código. Con él, verás siempre encendidos los leds, y se apagan en cada toque de campana. Esto es así, porque normalmente, los módulos de relé, funcionan con esta lógica.

francisco2v

#29
Dec 11, 2014, 11:20 am Last Edit: Dec 11, 2014, 11:40 am by francisco2v
Muchas gracias...lo simule y va perfecto.
Como podría tocar las dos campanas a la vez y como repetir toques..."para variar no se como hacerlo..."
Por ejemplo:
1.- Campana1+2,Campana1+2,Campana1+2,Campana1+2,campana1,campana1 campana1
2.- (Campana1+2,Campana1+2,Campana1+2,Campana1+2)repetir 6 veces y a continuación Campan1+campana1+campana1

Podrías ampliar información de:
En cada bucle for, el parametro de "test" tiene que ser equivalente
a la longitud del array de la secuencia.
Acuérdate que es para torpes.
Nota me faltaría ampliarlo a 10 pulsadores y 10 secuencias distintas.
"Espero que con todas las ayudas de una forma u otra pueda salir de esta".
Los dos relés son módulos de 5v para arduíno con optoacopladores ...serían de Ebay. Yo no puedo permitirme mucho.






Go Up