Campanas para mi Iglesia.

Siempre que recurro a Uds. recibo gran ayuda desinteresada y esta vez de nuevo necesito de los que más saben que me ayuden.
Tengo dos campanas que quiero tocar de forma automatizada con unos mazos con electroimanes.
Necesito ayuda (GRAN AYUDA)en software para arduino nano si es posible.
Dos salidas con rele ( para las dos campanas) y 10 o 15 programas que se puedan memorizar y llamar según necesidad. Visualizado con un display de 2x16.
Como se puede enfocar y si ....alguna persona del foro me da la solución... se lo agradezco muchísimo.
Que quede constancia que no es para mi...es para mi pequeña y modesta comunidad. ( Con lo poco que se pueda siempre me gusta ayudar.).

Lo primero que debes plantearte, son las secuencias a cumplir, o sea, toques de cada campana y tiempo de pausa entre cada uno de ellos, para cada uno de los 10 o 15 "programas". No me sirven 10 o 15. Hay que tener claro desde un principio el número total de secuencias, y cómo deben ser.

Lo segundo, es cómo tienes pensado decirle al arduino, que ejecute cada una de esas secuencias. Entiendo que si es para una iglesia, debe de ser algo sencillo de usar. A mi se me ocurre crear un panel con tantos botones como secuencias haya. El arduino nano, no tiene tantas entradas, pero le podríamos dar el número, con combinaciones en binario. Usando 4 pines, puedes conseguir decirle 15 secuencias distintas.

Piensa en todo esto y nos comentas.

Hola,
ahí van algunas ideas ideas que se me ocurren poniéndome en el caso de que lo tuviera que hacerlo yo (no es el caso, porque en el pueblo hay una señora que las toca de maravilla jeje)

  • Pienso que los electromazos serán de un consumo considerable (tal vez próximo a los 10A), hará falta relés que aguanten bien eso, y tendrás que pensar cómo controlar esos relés (transitsor, tiristor). Además, mira las características de esos martillos eléctricos, si necesitan continua o alterna. Y el tiempo de accionamiento del martillo, que creo que tendrá que ser muy breve. Supongo que todo eso lo tienes más o menos controlado.

  • para elaborar los distintos programas, yo haría lo siguiente: conectaría a arduino un pequeño buzzer o altavoz, y con la librería tone
    tone() - Arduino Reference

definiría dos notas (que más o menos se correspondan con las campanas) e iría completando las melodías con las dos notas, tin-ton tin-ton, ya sabes, si son las fiestas tin-ton-ton, tin-ton-ton y si es para difunto tiiinnnn-taaannnn-tiiinnnn-taaannnn...

  • para el control, puede valer lo que te ha sugerido carmeloco, un panel con tantos botones como programas. Otra solución más sofisticada sería usar un LCD 1602 con botonera, como este

    en ebay los tienes por menos de 5 euros. Con esos botones puedes ir recorriendo una lista que aparece en la LCD y seleccionar una opción (hay librerías para eso).

  • lo más sencillo teniendo la LCD 1602: utilizar solo dos botones, uno para que se presenten sucesivamente los nombres de los programas, el otro para seleccionar el que está en la pantalla.

Creo que serian como secuencial alto/bajo para cada una de las dos campanas y estas secuencias estar en la memoria.
Como leer una secuencia de la memoria y que salga para la campana 1 y/o la campana 2.
Como poner las secuencias en la memoria para llamarlas después.
Gracias...estoy perdidito......

Las secuencias, hay muchas formas de almacenarlas, desde guardarlas en un array, hasta hace una sub-rutina por cada secuencia.

Gracias...pero...necesito mas ayuda...tengo un nivel muy bajo
Salu2

Hola,
Para empezar podrías conectar dos led a los pines de campana, y practicar.
la forma más sencilla sería utilizar digitalWrite() para dar un impulso al relé que controla el martillo, tendrías que ajustar la duración, yo he puesto una décima de segundo (100 milisegundos), y la duración intervalo entre campanas (he puesto 1 segundo)

int campana1Pin = 2;          
int campana2Pin = 3;                

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

}


// tocar dos campanas sucesivamente  n numero de veces
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);  
   } 
}

void loop()
{

   if(boton1)  
      toque_de_campanas_numero1(33)   //ejecutar el toque con 33 campanadas
}

Muchas gracias.....ya me voy "aclarado" .....un poco......bueno voy a probar. Si ves como profundizar algo más te lo agradecería.
No tengo nada claro de como hacer....:
Al pulsar boton1 que suene una secuencia
Al pulsar boton2 que suene otra secuencia
.....etc.
Con 10 ó 15 serían sufucientes.
Salu2
(Ya se que pido mucho......pero bueno.....me es necesario.)

Hola de nuevo al compilar me dan estos errores:

sketch_dec09a:13: error: ISO C++ forbids declaration of 'toque_de_campanas_numero1' with no type
sketch_dec09a.cpp: In function 'void loop()':
sketch_dec09a:33: error: 'boton1' was not declared in this scope
sketch_dec09a:34: error: expected ;' at end of input sketch_dec09a:34: error: expected }' at end of input

Gracias por su ayuda

const byte campana1Pin = 2;          
const byte campana2Pin = 3;                
const byte boton1Pin     = 4;

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

// demas botones

}

void loop(){

   int boton1 = digitalRead(boton1Pin);
   if(boton1 == HIGH)  
      toque_de_campanas_numero1(33)   //ejecutar el toque con 33 campanadas
}

// 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);  
   } 
}

Sois unos GENIOS……
No llevo sombrero pero si lo llevase .....me lo quitaría ante Ustedes.
Bueno ahora hacer pruebas ....es lo que toca…..les comentaré mis pequeños avances y Grades tropiezos.
Pregunta:
Cuantos pulsadores puedo poner SURBYTE...?

Salu2

SURBITE al compilar me da este error..:

sketch_dec09a.ino: In function 'void loop()':
sketch_dec09a:19: error: expected `;' before '}' token

Gracias de nuevo.

cuenta 19 lineas y veras que le falta un ;

Según entiendo primero toca la campana1 y despues la campana2.....:

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);

Que debo hacer para que toquen las dos a la vez.
No puedo simular por los errores que me da al compilar.

Gracias.

Ahí va mi sugerencia:

int seq = 0; //Variable para pulsadores
//Secuencias. Primero el numero de campara, 1 ó 2
//luego la pausa en milisegundos
int s01 [] = {1, 1000, 2, 1000, 1, 1000, 2, 1000};
int s02 [] = {2, 1000, 1, 1000, 2, 1000, 1, 1000};
int s03 [] = {2, 1, 1, 1000, 2, 1, 1, 1000};
int s04 [] = {1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50};
int s05 [] = {2, 50, 2, 50, 2, 50, 2, 50, 2, 50, 2, 50, 2, 50, 2, 50};
void setup() {
  pinMode (2, OUTPUT);//pin campana 1
  pinMode (3, OUTPUT);//Pin Campana 2
  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);
  pinMode (4, INPUT_PULLUP);//Pulsador secuencia 1
  pinMode (5, INPUT_PULLUP);//Pulsador secuencia 2
  pinMode (6, INPUT_PULLUP);//Pulsador secuencia 3
  pinMode (7, INPUT_PULLUP);//Pulsador secuencia 4
  pinMode (8, INPUT_PULLUP);//Pulsador secuencia 5
}

void loop() {
  //Pulsaciones
  if (digitalRead (4) == LOW) {
    seq = 1;
  }
  if (digitalRead (5) == LOW) {
    seq = 2;
  }
  if (digitalRead (6) == LOW) {
    seq = 3;
  }
  if (digitalRead (7) == LOW) {
    seq = 4;
  }
  if (digitalRead (8) == LOW) {
    seq = 5;
  }

  //Ejecución de secuencia según la pulsación
  //En cada bucle for, el parametro de "test" tiene que ser equivalente
  //a la longitud del array de la secuencia
  switch (seq) {
    case 1:
      for (int x = 0; x < 8; x = x + 2) {
        digitalWrite (s01[x] + 1 , LOW);//Rele UP
        delay (50);
        digitalWrite (s01[x] + 1 , HIGH);//Rele DOWN
        delay (s01[x + 1]);
      }
      seq = 0;
      break;
    case 2:
      for (int x = 0; x < 8; x = x + 2) {
        digitalWrite (s02[x] + 1 , LOW);
        delay (50);
        digitalWrite (s02[x] + 1 , HIGH);
        delay (s02[x + 1]);
      }
      seq = 0;
      break;
    case 3:
      for (int x = 0; x < 8; x = x + 2) {
        digitalWrite (s03[x] + 1 , LOW);
        delay (50);
        digitalWrite (s03[x] + 1 , HIGH);
        delay (s03[x + 1]);
      }
      seq = 0;
      break;
    case 4:
      for (int x = 0; x < 16; x = x + 2) {
        digitalWrite (s04[x] + 1 , LOW);
        delay (50);
        digitalWrite (s04[x] + 1 , HIGH);
        delay (s04[x + 1]);
      }
      seq = 0;
      break;
    case 5:
      for (int x = 0; x < 16; x = x + 2) {
        digitalWrite (s05[x] + 1 , LOW);
        delay (50);
        digitalWrite (s05[x] + 1 , HIGH);
        delay (s05[x + 1]);
      }
      seq = 0;
      break;
  }
}

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:

  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);

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.

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.

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)

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:

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

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