Nativity computer Arduino

Belén navideño animado con Arduino

Hola Yonkis de la robótica!

¿Cansado de los típicos belenes navideños? Con tu placa de Arduino puedes animarlo y sorprender a todos tus invitados.

Objetivo:

Animar un Belén navideño con luces, música y mensajes en pantalla LCD.

Características:

  • Tres tonos musicales que suenan aleatoriamente desde un buzzer pasivo.
  • Pantalla LCD 16×2 que muestra mensajes y los títulos de los tonos musicales que estan sonando.
  • Sensor de ultrasonidos que detecta proximidad para iniciar los tonos musicales.
  • Tiras de luces LED que se encienden al ritmo de los tonos musicales.

Materiales:

  • Placa Arduino Uno
  • Sensor de distancia por ultrasonidos
  • Pantalla LCD Azul 16×2
  • Adaptador IIC/I2C (no es necesario, pero ayuda a simplificar la instalación)
  • Tira de leds 12v
  • Fuente de alimentación DC 12V
  • Transistor NPN PN2222
  • Cables de conexión.

Índice

  1. Melodías navideñas con buzzer pasivo.
  2. Pantalla LCD 16X2
  3. Sensor de distancia ultrasónico
  4. Iluminación LED al ritmo de la música.

1. Melodías navideñas con buzzer pasivo.

Con este código suenan aleatoriamente tres melodías navideñas: Jingle Bells, Santa Claus is coming to town y We wish you a Merry Christmas.

Si abrimos el monitor serie veremos el título de la melodía que está sonando y el numeral de cada melodía.

Conexiones:

Conectar el Buzzer a la salida digital 9 y a GND.



Código melodías navideñas

Es necesaria la librería pitches.h

[code] /* Arduino Christmas Songs Based on a project and code by Dipto Pratyaksa, updated on 31/3/13 Modified for Christmas by Joshi, on Dec 17th, 2017. Modified for Nativity project by Victor Gago, on Dec 2018. */ #include "pitches.h" #define melodyPin 9 // Jingle Bells int melody[] = { NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_G5, NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_F5, NOTE_F5, NOTE_F5, NOTE_F5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_D5, NOTE_D5, NOTE_E5, NOTE_D5, NOTE_G5 }; int tempo[] = { 8, 8, 4, 8, 8, 4, 8, 8, 8, 8, 2, 8, 8, 8, 8, 8, 8, 8, 16, 16, 8, 8, 8, 8, 4, 4 }; // We wish you a merry Christmas int wish_melody[] = { NOTE_B3, NOTE_F4, NOTE_F4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_E4, NOTE_E4, NOTE_A4, NOTE_A4, NOTE_B4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_D4, NOTE_B3, NOTE_B3, NOTE_D4, NOTE_G4, NOTE_E4, NOTE_F4 }; int wish_tempo[] = { 4, 4, 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, 4, 4, 8, 8, 4, 4, 4, 2 }; // Santa Claus is coming to town int santa_melody[] = { NOTE_G4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, NOTE_C5, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_F4, NOTE_E4, NOTE_G4, NOTE_C4, NOTE_E4, NOTE_D4, NOTE_F4, NOTE_B3, NOTE_C4 }; int santa_tempo[] = { 8, 8, 8, 4, 4, 4, 8, 8, 4, 4, 4, 8, 8, 4, 4, 4, 8, 8, 4, 2, 4, 4, 4, 4, 4, 2, 4, 1 }; int switchOne = 0; int switchTwo = 0; int switchThree = 0; void setup(void) { pinMode(9, OUTPUT); // Buzzer pinMode(13, OUTPUT); // Led indicador con notas musicales Serial.begin (9600); // Iniciar el monitor serie } void loop() { int maleatoria = random(1,4); // Elige aleotariamente una melodía de entre las 3 que hay Serial.println(maleatoria); // Muestra la melodía seleccionada sing(maleatoria); // Llama a la melodía aleatoria } int song = 0; void sing(int s) { // Elegir la melodía según el valor de song. song = s; if (song == 3) { Serial.println(" ‘We wish you a Merry Christmas’"); int size = sizeof(wish_melody) / sizeof(int); for (int thisNote = 0; thisNote < size; thisNote++) { // para calcular la duración de la nota, coge un segundo // dividido por el tipo de nota. //e.g. cuarto de nota = 1000 / 4, octava nota = 1000/8, etc. int noteDuration = 1000 / wish_tempo[thisNote]; buzz(melodyPin, wish_melody[thisNote], noteDuration); // para ditinguir las notas, configura un minimo de tiempo entre ellas. // la duración de la nota + 30% parece que va bien: int pauseBetweenNotes = noteDuration * 1.30; delay(pauseBetweenNotes); // paramos la reproducción del tono: buzz(melodyPin, 0, noteDuration); } } else if (song == 2) { Serial.println(" ‘Santa Claus is coming to town’"); int size = sizeof(santa_melody) / sizeof(int); for (int thisNote = 0; thisNote < size; thisNote++) { // para calcular la duración de la nota, coge un segundo // dividido por el tipo de nota. //e.g. cuarto de nota = 1000 / 4, octava nota = 1000/8, etc. int noteDuration = 900 / santa_tempo[thisNote]; buzz(melodyPin, santa_melody[thisNote], noteDuration); // para ditinguir las notas, configura un minimo de tiempo entre ellas. // la duración de la nota + 30% parece que va bien: int pauseBetweenNotes = noteDuration * 1.30; delay(pauseBetweenNotes); // paramos la reproducción del tono: buzz(melodyPin, 0, noteDuration); } } else { Serial.println(" ‘Jingle Bells’"); int size = sizeof(melody) / sizeof(int); for (int thisNote = 0; thisNote < size; thisNote++) { // para calcular la duración de la nota, coge un segundo // dividido por el tipo de nota. //e.g. cuarto de nota = 1000 / 4, octava nota = 1000/8, etc. int noteDuration = 1000 / tempo[thisNote]; buzz(melodyPin, melody[thisNote], noteDuration); // para ditinguir las notas, configura un minimo de tiempo entre ellas. // la duración de la nota + 30% parece que va bien: int pauseBetweenNotes = noteDuration * 1.30; delay(pauseBetweenNotes); // paramos la reproducción del tono: buzz(melodyPin, 0, noteDuration); } } } void buzz(int targetPin, long frequency, long length) { digitalWrite(13, HIGH); //activa el led 13 long delayValue = 1000000 / frequency / 2; // cálculo el retardo entre transiciones //// 1 segundo en microsegundos, dividido por la frecuencia, luego se divide por la mitad //// hay dos pases para el ciclo. long numCycles = frequency * length / 1000; // calculo del numero de ciclos para el tiempo apropiado //// multiplicado por la frecuencia, que en realidad son ciclos por segundo, por el numero de segundos //// para obtener el numero de ciclos a producir. for (long i = 0; i < numCycles; i++) { // para el tiempo calculado… digitalWrite(targetPin, HIGH); // activa el pin del buzzer para que suba el diafragma delayMicroseconds(delayValue); // espera el tiempo calculado digitalWrite(targetPin, LOW); // desactiva el pin del buzzer para que baje el diafragma delayMicroseconds(delayValue); // espera de nuevo el tiempo calculado } digitalWrite(13, LOW); //apaga el led 13 } [/code]

2. Pantalla LCD 16X2

Una vez configurada la parte de los tonos, pasamos a la pantalla LCD.

En ella mostraremos el título de la canción que está sonando y en la segunda línea mostraremos un mensaje de “Felices Fiestas!”

He usado el controlador I2C para controlar la pantalla a través de únicamente 4 hilos (5v, GND, SDA, SCL).

Incluimos las librerías para la pantalla y configuramos la dirección al inicio del programa: LiquidCrystal_I2C.h y Wire.h

[code] //**Librerías para LCD** #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3F, 16, 2); // Inicia el LCD en la dirección 0x3F, con 16 caracteres y 2 líneas [/code]

En el Setup incluimos un mensaje de bienvenida

[code] //***Configurar pantalla LCD**** lcd.begin(); lcd.backlight(); //encendemos la pantalla lcd.setCursor(0, 0); lcd.print("Belen 2.0"); //imprimimos Belen 2.0 en la primera linea lcd.setCursor(0, 1); lcd.print("Arduino");//imprimimos Arduino en la segunda linea delay(2500); //esperamos 2,5 segundos y borramos la pantalla. lcd.clear(); [/code]

Añadimos el código del LCD después de cada serial.println (“título del tono”)

[code] if (song == 3) { Serial.println(" ‘We wish you a Merry Christmas’"); //***LCD mostramos el titulo de la canción y un mensaje lcd.setCursor(0, 0); lcd.print("Merry Christmas"); lcd.setCursor(0, 1); lcd.print("Felices Fiestas!"); [/code]

Así nos iría quedando el código:

[code] /* Arduino Christmas Songs Based on a project and code by Dipto Pratyaksa, updated on 31/3/13 Modified for Christmas by Joshi, on Dec 17th, 2017. Modified for Nativity project by Victor Gago, on Dec 2018. */ #include "pitches.h" #define melodyPin 9 //**Librerías para LCD** #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3F, 16, 2); // Inicia el LCD en la dirección 0x3F, con 16 caracteres y 2 líneas // Jingle Bells int melody[] = { NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_G5, NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_F5, NOTE_F5, NOTE_F5, NOTE_F5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_D5, NOTE_D5, NOTE_E5, NOTE_D5, NOTE_G5 }; int tempo[] = { 8, 8, 4, 8, 8, 4, 8, 8, 8, 8, 2, 8, 8, 8, 8, 8, 8, 8, 16, 16, 8, 8, 8, 8, 4, 4 }; // We wish you a merry Christmas int wish_melody[] = { NOTE_B3, NOTE_F4, NOTE_F4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_E4, NOTE_E4, NOTE_A4, NOTE_A4, NOTE_B4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_D4, NOTE_B3, NOTE_B3, NOTE_D4, NOTE_G4, NOTE_E4, NOTE_F4 }; int wish_tempo[] = { 4, 4, 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, 4, 4, 8, 8, 4, 4, 4, 2 }; // Santa Claus is coming to town int santa_melody[] = { NOTE_G4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, NOTE_C5, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_F4, NOTE_E4, NOTE_G4, NOTE_C4, NOTE_E4, NOTE_D4, NOTE_F4, NOTE_B3, NOTE_C4 }; int santa_tempo[] = { 8, 8, 8, 4, 4, 4, 8, 8, 4, 4, 4, 8, 8, 4, 4, 4, 8, 8, 4, 2, 4, 4, 4, 4, 4, 2, 4, 1 }; int switchOne = 0; int switchTwo = 0; int switchThree = 0; void setup(void) { pinMode(9, OUTPUT); // Buzzer pinMode(13, OUTPUT); // Led indicador con notas musicales Serial.begin (9600); // Iniciar el monitor serie //***Configurar pantalla LCD**** lcd.begin(); lcd.backlight(); //encendemos la pantalla lcd.setCursor(0, 0); lcd.print("Belen 2.0"); //imprimimos Belen 2.0 en la primera linea lcd.setCursor(0, 1); lcd.print("Arduino");//imprimimos Arduino en la segunda linea delay(2500); //esperamos 2,5 segundos y borramos la pantalla. lcd.clear(); } void loop() { int maleatoria = random(1,4); // Elige aleotariamente una melodía de entre las 3 que hay Serial.println(maleatoria); // Muestra la melodía seleccionada sing(maleatoria); // Llama a la melodía aleatoria lcd.clear(); //limpiamos los mensajes de la pantalla } int song = 0; void sing(int s) { // Elegir la melodía según el valor de song. song = s; if (song == 3) { Serial.println(" ‘We wish you a Merry Christmas’"); //***LCD mostramos el titulo de la canción y un mensaje lcd.setCursor(0, 0); lcd.print("Merry Christmas"); lcd.setCursor(0, 1); lcd.print("Felices Fiestas!"); int size = sizeof(wish_melody) / sizeof(int); for (int thisNote = 0; thisNote < size; thisNote++) { // para calcular la duración de la nota, coge un segundo // dividido por el tipo de nota. //e.g. cuarto de nota = 1000 / 4, octava nota = 1000/8, etc. int noteDuration = 1000 / wish_tempo[thisNote]; buzz(melodyPin, wish_melody[thisNote], noteDuration); // para ditinguir las notas, configura un minimo de tiempo entre ellas. // la duración de la nota + 30% parece que va bien: int pauseBetweenNotes = noteDuration * 1.30; delay(pauseBetweenNotes); // paramos la reproducción del tono: buzz(melodyPin, 0, noteDuration); } } else if (song == 2) { Serial.println(" ‘Santa Claus is coming to town’"); //***LCD mostramos el titulo de la canción y un mensaje lcd.setCursor(0, 0); lcd.print("Santa is coming"); lcd.setCursor(0, 1); lcd.print("Felices Fiestas!"); int size = sizeof(santa_melody) / sizeof(int); for (int thisNote = 0; thisNote < size; thisNote++) { // para calcular la duración de la nota, coge un segundo // dividido por el tipo de nota. //e.g. cuarto de nota = 1000 / 4, octava nota = 1000/8, etc. int noteDuration = 900 / santa_tempo[thisNote]; buzz(melodyPin, santa_melody[thisNote], noteDuration); // para ditinguir las notas, configura un minimo de tiempo entre ellas. // la duración de la nota + 30% parece que va bien: int pauseBetweenNotes = noteDuration * 1.30; delay(pauseBetweenNotes); // paramos la reproducción del tono: buzz(melodyPin, 0, noteDuration); } } else { Serial.println(" ‘Jingle Bells’"); //***LCD mostramos el titulo de la canción y un mensaje lcd.setCursor(0, 0); lcd.print("Jingle Bells"); lcd.setCursor(0, 1); lcd.print("Felices Fiestas!"); int size = sizeof(melody) / sizeof(int); for (int thisNote = 0; thisNote < size; thisNote++) { // para calcular la duración de la nota, coge un segundo // dividido por el tipo de nota. //e.g. cuarto de nota = 1000 / 4, octava nota = 1000/8, etc. int noteDuration = 1000 / tempo[thisNote]; buzz(melodyPin, melody[thisNote], noteDuration); // para ditinguir las notas, configura un minimo de tiempo entre ellas. // la duración de la nota + 30% parece que va bien: int pauseBetweenNotes = noteDuration * 1.30; delay(pauseBetweenNotes); // paramos la reproducción del tono: buzz(melodyPin, 0, noteDuration); } } } void buzz(int targetPin, long frequency, long length) { digitalWrite(13, HIGH); //activa el led 13 long delayValue = 1000000 / frequency / 2; // cálculo el retardo entre transiciones //// 1 segundo en microsegundos, dividido por la frecuencia, luego se divide por la mitad //// hay dos pases para el ciclo. long numCycles = frequency * length / 1000; // calculo del numero de ciclos para el tiempo apropiado //// multiplicado por la frecuencia, que en realidad son ciclos por segundo, por el numero de segundos //// para obtener el numero de ciclos a producir. for (long i = 0; i < numCycles; i++) { // para el tiempo calculado… digitalWrite(targetPin, HIGH); // activa el pin del buzzer para que suba el diafragma delayMicroseconds(delayValue); // espera el tiempo calculado digitalWrite(targetPin, LOW); // desactiva el pin del buzzer para que baje el diafragma delayMicroseconds(delayValue); // espera de nuevo el tiempo calculado } digitalWrite(13, LOW); //apaga el led 13 } [/code]

Conexiones:

He de reconocer que tuve bastantes problemas a la hora de configurar el LCD con el controlador I2C. No me mostraban caracteres, solo se encendía la pantalla con bloques blancos. El I2C tiene un potenciómetro para regular el contraste, pero aún así no mostraba mas que bloques.

Usé este escáner para comprobar la dirección de mi I2C. Me marcaba que no reconocía ningún I2C. Intercambie las conexiónes de sda con scl y me detectó enseguida la dirección. La 0x3F.

[code] // ————————————– // i2c_scanner // // Version 1 // This program (or code that looks like it) // can be found in many places. // For example on the Arduino.cc forum. // The original author is not know. // Version 2, Juni 2012, Using Arduino 1.0.1 // Adapted to be as simple as possible by Arduino.cc user Krodal // Version 3, Feb 26 2013 // V3 by louarnold // Version 4, March 3, 2013, Using Arduino 1.0.3 // by Arduino.cc user Krodal. // Changes by louarnold removed. // Scanning addresses changed from 0…127 to 1…119, // according to the i2c scanner by Nick Gammon // http://www.gammon.com.au/forum/?id=10896 // Version 5, March 28, 2013 // As version 4, but address scans now to 127. // A sensor seems to use address 120. // Version 6, November 27, 2015. // Added waiting for the Leonardo serial communication. // // // This sketch tests the standard 7-bit addresses // Devices with higher bit address might not be seen properly. // #include <Wire.h> void setup() { Wire.begin(); Serial.begin(9600); while (!Serial); // Leonardo: wait for serial monitor Serial.println("\nI2C Scanner"); } void loop() { byte error, address; int nDevices; Serial.println("Scanning…"); nDevices = 0; for(address = 1; address < 127; address++ ) { // The i2c_scanner uses the return value of // the Write.endTransmisstion to see if // a device did acknowledge to the address. Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { Serial.print("I2C device found at address 0x"); if (address<16) Serial.print("0"); Serial.print(address,HEX); Serial.println(" !"); nDevices++; } else if (error==4) { Serial.print("Unknown error at address 0x"); if (address<16) Serial.print("0"); Serial.println(address,HEX); } } if (nDevices == 0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); delay(5000); // wait 5 seconds for next scan } [/code]

3. Sensor de distancia ultrasónico

Por último, a nuestro código tenemos que añadirle el ingrediente final. Será un disparador que hará que arranque la fiesta.

La librería para el sensor: SR04.h

[code] //**Librerías y configuración del sensor ultrasónico #include "SR04.h" #define TRIG_PIN 12 #define ECHO_PIN 11 SR04 sr04 = SR04(ECHO_PIN,TRIG_PIN); long a; //variable que almacena la longitud detectada por el sensor [/code]

Añadir en el bucle un condicional para que se active la música cuando se detecte una distancia inferior a 20cm, es decir cuando pongas un obstaculo, como una mano por ejemplo, delante del sensor ultrasónico.

[code] void loop() { //Medimos distancia con el sensor y lo imprimimos: a=sr04.Distance(); Serial.print(a); Serial.println("cm"); lcd.noBacklight(); //apagamos la pantalla LCD if (a <=20){ //condición para activar las melodías si se detecta menos distancia de 20 cm lcd.backlight(); //encendemos el LCD int maleatoria = random(1,4); // Elige aleotariamente una melodía de entre las 3 que hay Serial.println(maleatoria); // Muestra la melodía seleccionada sing(maleatoria); // Llama a la melodía aleatoria lcd.clear(); //limpiamos los mensajes de la pantalla } delay(500); //retardo entre lecturas de distancia } [/code]

El código quedaría así definitivamente:

[code] /* Arduino Christmas Songs Based on a project and code by Dipto Pratyaksa, updated on 31/3/13 Modified for Christmas by Joshi, on Dec 17th, 2017. Modified for Nativity project by Victor Gago, on Dec 2018. */ #include "pitches.h" #define melodyPin 9 //**Librerías para LCD** #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3F, 16, 2); // Inicia el LCD en la dirección 0x3F, con 16 caracteres y 2 líneas //**Librerías y configuración del sensor ultrasónico #include "SR04.h" #define TRIG_PIN 12 #define ECHO_PIN 11 SR04 sr04 = SR04(ECHO_PIN,TRIG_PIN); long a; //variable que almacena la longitud detectada por el sensor // Jingle Bells int melody[] = { NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_G5, NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_F5, NOTE_F5, NOTE_F5, NOTE_F5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_D5, NOTE_D5, NOTE_E5, NOTE_D5, NOTE_G5 }; int tempo[] = { 8, 8, 4, 8, 8, 4, 8, 8, 8, 8, 2, 8, 8, 8, 8, 8, 8, 8, 16, 16, 8, 8, 8, 8, 4, 4 }; // We wish you a merry Christmas int wish_melody[] = { NOTE_B3, NOTE_F4, NOTE_F4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_E4, NOTE_E4, NOTE_A4, NOTE_A4, NOTE_B4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_D4, NOTE_B3, NOTE_B3, NOTE_D4, NOTE_G4, NOTE_E4, NOTE_F4 }; int wish_tempo[] = { 4, 4, 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, 4, 4, 8, 8, 4, 4, 4, 2 }; // Santa Claus is coming to town int santa_melody[] = { NOTE_G4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5, NOTE_C5, NOTE_C5, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_F4, NOTE_E4, NOTE_G4, NOTE_C4, NOTE_E4, NOTE_D4, NOTE_F4, NOTE_B3, NOTE_C4 }; int santa_tempo[] = { 8, 8, 8, 4, 4, 4, 8, 8, 4, 4, 4, 8, 8, 4, 4, 4, 8, 8, 4, 2, 4, 4, 4, 4, 4, 2, 4, 1 }; int switchOne = 0; int switchTwo = 0; int switchThree = 0; void setup(void) { pinMode(9, OUTPUT); // Buzzer pinMode(13, OUTPUT); // Led indicador con notas musicales Serial.begin (9600); // Iniciar el monitor serie //***Configurar pantalla LCD**** lcd.begin(); lcd.backlight(); //encendemos la pantalla lcd.setCursor(0, 0); lcd.print("Belen 2.0"); //imprimimos Belen 2.0 en la primera linea lcd.setCursor(0, 1); lcd.print("Arduino");//imprimimos Arduino en la segunda linea delay(2500); //esperamos 2,5 segundos y borramos la pantalla. lcd.clear(); } void loop() { //Medimos distancia con el sensor y lo imprimimos: a=sr04.Distance(); Serial.print(a); Serial.println("cm"); lcd.noBacklight(); //apagamos la pantalla LCD if (a <=20){ //condición para activar las melodías si se detecta menos distancia de 20 cm lcd.backlight(); //encendemos el LCD int maleatoria = random(1,4); // Elige aleotariamente una melodía de entre las 3 que hay Serial.println(maleatoria); // Muestra la melodía seleccionada sing(maleatoria); // Llama a la melodía aleatoria lcd.clear(); //limpiamos los mensajes de la pantalla } delay(500); //retardo entre lecturas de distancia } int song = 0; void sing(int s) { // Elegir la melodía según el valor de song. song = s; if (song == 3) { Serial.println(" ‘We wish you a Merry Christmas’"); //***LCD mostramos el titulo de la canción y un mensaje lcd.setCursor(0, 0); lcd.print("Merry Christmas"); lcd.setCursor(0, 1); lcd.print("Felices Fiestas!"); int size = sizeof(wish_melody) / sizeof(int); for (int thisNote = 0; thisNote < size; thisNote++) { // para calcular la duración de la nota, coge un segundo // dividido por el tipo de nota. //e.g. cuarto de nota = 1000 / 4, octava nota = 1000/8, etc. int noteDuration = 1000 / wish_tempo[thisNote]; buzz(melodyPin, wish_melody[thisNote], noteDuration); // para ditinguir las notas, configura un minimo de tiempo entre ellas. // la duración de la nota + 30% parece que va bien: int pauseBetweenNotes = noteDuration * 1.30; delay(pauseBetweenNotes); // paramos la reproducción del tono: buzz(melodyPin, 0, noteDuration); } } else if (song == 2) { Serial.println(" ‘Santa Claus is coming to town’"); //***LCD mostramos el titulo de la canción y un mensaje lcd.setCursor(0, 0); lcd.print("Santa is coming"); lcd.setCursor(0, 1); lcd.print("Felices Fiestas!"); int size = sizeof(santa_melody) / sizeof(int); for (int thisNote = 0; thisNote < size; thisNote++) { // para calcular la duración de la nota, coge un segundo // dividido por el tipo de nota. //e.g. cuarto de nota = 1000 / 4, octava nota = 1000/8, etc. int noteDuration = 900 / santa_tempo[thisNote]; buzz(melodyPin, santa_melody[thisNote], noteDuration); // para ditinguir las notas, configura un minimo de tiempo entre ellas. // la duración de la nota + 30% parece que va bien: int pauseBetweenNotes = noteDuration * 1.30; delay(pauseBetweenNotes); // paramos la reproducción del tono: buzz(melodyPin, 0, noteDuration); } } else { Serial.println(" ‘Jingle Bells’"); //***LCD mostramos el titulo de la canción y un mensaje lcd.setCursor(0, 0); lcd.print("Jingle Bells"); lcd.setCursor(0, 1); lcd.print("Felices Fiestas!"); int size = sizeof(melody) / sizeof(int); for (int thisNote = 0; thisNote < size; thisNote++) { // para calcular la duración de la nota, coge un segundo // dividido por el tipo de nota. //e.g. cuarto de nota = 1000 / 4, octava nota = 1000/8, etc. int noteDuration = 1000 / tempo[thisNote]; buzz(melodyPin, melody[thisNote], noteDuration); // para ditinguir las notas, configura un minimo de tiempo entre ellas. // la duración de la nota + 30% parece que va bien: int pauseBetweenNotes = noteDuration * 1.30; delay(pauseBetweenNotes); // paramos la reproducción del tono: buzz(melodyPin, 0, noteDuration); } } } void buzz(int targetPin, long frequency, long length) { digitalWrite(13, HIGH); //activa el led 13 long delayValue = 1000000 / frequency / 2; // cálculo el retardo entre transiciones //// 1 segundo en microsegundos, dividido por la frecuencia, luego se divide por la mitad //// hay dos pases para el ciclo. long numCycles = frequency * length / 1000; // calculo del numero de ciclos para el tiempo apropiado //// multiplicado por la frecuencia, que en realidad son ciclos por segundo, por el numero de segundos //// para obtener el numero de ciclos a producir. for (long i = 0; i < numCycles; i++) { // para el tiempo calculado… digitalWrite(targetPin, HIGH); // activa el pin del buzzer para que suba el diafragma delayMicroseconds(delayValue); // espera el tiempo calculado digitalWrite(targetPin, LOW); // desactiva el pin del buzzer para que baje el diafragma delayMicroseconds(delayValue); // espera de nuevo el tiempo calculado } digitalWrite(13, LOW); //apaga el led 13 } [/code]

Conexiones:

Trig a D12; Echo a D11

4. Iluminación LED al ritmo de la música

En el código de las melodías está incluido el parpadeo del led 13, por lo tanto, en el pin 13 tenemos 5v a ritmo de la música. Yo he usado una tira de led de 12v, por lo que necesitamos instalar un transistor que nos alimente los led cuando haya un HIGH en el pin 13. He usado un transistor NPN PN2222 que me venía en el kit de elegoo.

La función del transistor es que cuando activemos la base 2 con el pin 13 del Arduino, tendremos paso de corriente entre el colector 3 y el emisor 1

"Trackback" Enlace desde tu web.

Yonkisdelarobotica

Técnico de sistemas informáticos y telecomunicaciones

Deja un comentario