Yo a partir de este instructable
Cuando terminé, tengo un elemento que funciona como sigue:
-marcar cualquier número o secuencia de números
-Presione el botón rojo grande para probar esa secuencia.
-arduino reproducirá una canción basada en el primer dígito de la secuencia de marcado.
- Pero si se marca la secuencia correcta, en este caso el nombre de mis hijas, el arduino hará tocar la canción de"feliz cumpleaños", girar la rejilla metálica y los leds de UV de la luz. Esto revelará el "mensaje de feliz cumpleaños que escribió en la pantalla con el lápiz de tinta invisible.
video para seguir
Así que básicamente lo que tengo es:
El Arduino graba la entrada de teléfono rotatorio como una cadena y luego el código comprueba si una cadena determinada.
Si no es esa cadena, luego juega una de 5 canciones que están codificados en el bosquejo.
Si es la cadena correcta entonces arduino manda el servo para girar y enciende las luces de UV y toca la canción de cumpleaños.
El código siguiente:
He encontrado aquí y allá pedazos de él. La función de tono se utiliza junto con un fichero pitches.h.
/ * 21/03/12 - comenzó a hacer proyecto con dial giratorio
-para ser utilizado para el regalo de cumpleaños para Christine
-idea:
los números que marcan reproducirá una canción diferente
marcar su nombre encenderá el LED que muestra el messgae feliz cumpleaños
o la feliz aniversity Harrie y Riek
-a partir del código para el batphonev1
-necesario realizar muchos cambios
-v2 - comenzar mirando watys muchas canciones o notas
*/
#include < Servo.h >
#include "pitches.h"
Feliz cumpleaños
int melodybd [] = {NOTE_C4, NOTE_C4, NOTE_D4, NOTE_C4, NOTE_F4, NOTE_E4, NOTE_C4, NOTE_C4,
NOTE_D4, NOTE_C4, NOTE_G4, NOTE_F4, NOTE_C4, NOTE_C4,
NOTE_C5, NOTE_A4, NOTE_F4, NOTE_E4, NOTE_D4, NOTE_B4, NOTE_B4, NOTE_A4,
NOTE_F4, NOTE_G4, NOTE_F4};
int noteDurationsbd [] = {3, 16, 4, 4, 4, 2, 3, 16, 4, 4, 4, 2, 3, 16, 4,4,4,4,4,3,16,4,4,4,2};
int numNotesbd = 25;
aniversario
Aquí viene la novia
int melodyanv [] = {NOTE_A3, NOTE_C4, NOTE_C4, NOTE_C4, NOTE_A3, NOTE_D4, NOTE_B3, NOTE_C4, NOTE_A3, NOTE_C4, NOTE_F4, NOTE_F4, NOTE_E4, NOTE_D4, NOTE_C4, NOTE_B3, NOTE_C4, NOTE_D4};
Tenga en cuenta las duraciones: 4 = cuarto nota, 8 = corchea, etc..:
int noteDurationsanv [] = {2,3,8,1,2,3,8,1,2,3,8,2,3,8,2,3,8,1};
int numNotesanv = 18;
1, starwars
int melody1 [] = {NOTE_G5, NOTE_G5, NOTE_G5, NOTE_DS5, NOTE_AS5, NOTE_G5, NOTE_DS5, NOTE_AS5, NOTE_G5};
int noteDurations1 [] = {3, 3, 3, 4, 8, 3, 4, 8, 2};
int numNotes1 = 9;
// 2. cosa de dos bits
int melody2 [] = {NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4};
int noteDurations2 [] = {4,8,8, 4,4,4,4,4};
int numNotes2 = 8;
3 estallido va la comadreja
int melody3 [] = {}
NOTE_C4, NOTE_C4, NOTE_D4, NOTE_D4, NOTE_E4,
NOTE_G4, NOTE_E4, NOTE_C4, NOTE_C4, NOTE_C4,
NOTE_D4, NOTE_D4, NOTE_D4, NOTE_E4, NOTE_C4, 0,
NOTE_C4, NOTE_C4, NOTE_D4, NOTE_D4, NOTE_E4,
NOTE_G4, NOTE_E4, NOTE_C4, 0, NOTE_A4,
NOTE_D4, NOTE_F4, NOTE_E4, NOTE_C4, 0};
int noteDurations3 [] = {4, 8, 4, 8, 8, 8, 8, 4, 8, 4, 8, 4, 8, 3, 4, 8, 4, 8, 4, 8, 8, 8, 8, 4, 4, 2, 4, 4, 4, 4, 4};
int numNotes3 = 31;
batman 4
int melody4 [] = {NOTE_A3, NOTE_A3, NOTE_GS3, NOTE_GS3, NOTE_G3, NOTE_G3, NOTE_GS3, NOTE_GS3, NOTE_A3, NOTE_A3, NOTE_GS3, NOTE_GS3, NOTE_G3, NOTE_G3, NOTE_GS3, NOTE_GS3, NOTE_A3, NOTE_A3, NOTE_GS3, NOTE_GS3, NOTE_G3, NOTE_G3, NOTE_GS3, NOTE_GS3, NOTE_A3, NOTE_A3, NOTE_GS3, NOTE_GS3, NOTE_G3, NOTE_G3 NOTE_GS3, NOTE_GS3, NOTE_E4, NOTE_E4};
int noteDurations4 [] = {8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 4,8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 4};
int numNotes4 = 32;
5 familiar clásico
int melody5[]= {NOTE_E4,NOTE_E4,NOTE_F4,NOTE_G4,NOTE_G4,NOTE_F4,NOTE_E4,NOTE_D4,NOTE_C4,NOTE_C4,NOTE_D4,NOTE_E4,NOTE_E4,NOTE_D4,NOTE_D4,NOTE_E4,NOTE_E4,NOTE_F4,NOTE_G4,NOTE_G4,NOTE_F4,NOTE_E4,NOTE_D4,NOTE_C4,NOTE_C4,NOTE_D4,NOTE_E4,NOTE_D4,NOTE_C4,NOTE_C4 ,NOTE_D4,NOTE_D4,NOTE_E4,NOTE_C4,NOTE_D4,NOTE_E4,NOTE_F4,NOTE_E4,NOTE_C4,NOTE_D4,NOTE_E4,NOTE_F4,NOTE_E4,NOTE_D4,NOTE_C4,NOTE_D4,NOTE_G3,NOTE_E4,NOTE_E4,NOTE_F4,NOTE_G4,NOTE_G4,NOTE_F4,NOTE_E4,NOTE_D4,NOTE_C4,NOTE_C4,NOTE_D4,NOTE_E4,NOTE_D4,NOTE_C4 NOTE_C4};
Tenga en cuenta las duraciones: 4 = cuarto nota, 8 = corchea, etc..:
int noteDurations5 [] = {4,4,4,4,4,4,4,4,4,4,4,4,2,8,2,4,4,4,4,4,4,4,4,4,4,4,4,2, 4,4,4,4,4,8,8,4,4,4,8,8,4,4,4,4,2,4,4,4,4,4,4,4,4,4,4,4,4,2,8,2};
int numNotes5 = 62;
int needToPrint = 0;
int cuenta;
mina
const int try_it = 3;
const int in_from_dial = 2;
const int lightOn = 11;
int buttonState = 0; variable para lectura del estado del pulsador
int firstnum = 0;
jugado char = ' n ';
mina de final
int lastState = bajo;
int trueState = bajo;
lastStateChangeTime largo = 0;
borrados int = 0;
constantes
int dialHasFinishedRotatingAfterMs = 100;
int debounceDelay = 10;
cadenas
Cadena de reemplazos;
Char [Carrie] = "227743";
Char [] Daniel = "326435";
Char [] Big50 = "1";
Char [] Harrie = "2";
servo
Servo myservo; crear objeto servo para controlar un servo
int pos = 0; variable para almacenar la posición del servo
// --------------------------------------------
void setup()
{
Serial.Begin(9600);
pinMode (in_from_dial, entrada); 2
pinMode (try_it, entrada); 3
pinMode (lightOn, salida); 11
pinMode (13, salida); 12
myservo.Attach(6); se fija el servo en el pin 6 al objeto servo
}
void loop() {}
digitalWrite (13, HIGH); prende el LED
/*
usuario Marque números hasta que el buttonb de "probarlo"
tan necesario crear la cadena hasta que se presiona el botón
*/
leer el estado del botón tryit
digitalWrite (lightOn, LOW);
buttonState = digitalRead(try_it);
try_it = alto;
Si (buttonState == LOW) {}
lectura de int = digitalRead(in_from_dial);
Si ((millis()-lastStateChangeTime) > dialHasFinishedRotatingAfterMs) {}
el disco no está marcado, o acaba siendo marcado.
Si (needToPrint) {}
apenas ha terminado siendo marcado, es necesario enviar el número de abajo el serial
línea y restablecer la cuenta. Que mod la cuenta por 10 porque '0' enviará 10 impulsos.
Serial.println (% de la cuenta 10, DEC);
Ahora necesitamos agregar la cuenta a la secuencia de la prueba y luego probarlo contra el
cadena necesaria para obtener un éxito
newstring.concat(Count);
needToPrint = 0;
cuenta = 0;
borra = 0;
}
}
Si (leer! = lastState) {}
lastStateChangeTime = millis();
}
Si ((millis()-lastStateChangeTime) > debounceDelay) {}
Debounce - esto ocurre una vez es stablized
Si (leer! = trueState) {}
Esto significa que el interruptor ha pasado apenas de cerrado -> abrir o viceversa.
trueState = lectura;
Si (trueState == HIGH) {}
incrementar el número de pulsos si se ha ido alta.
cuenta ++;
needToPrint = 1; Necesitamos imprimir este número (una vez finalizada la esfera giratoria)
}
}
}
lastState = lectura;
}
otra cosa
{
ahora el usuario quiere probar su marcación
//
jugado = ' n ';
Serial.println(newstring);
test_it();
reemplazos = "";
}
}
// --------------------- my functions -------------------------
// ------------------------------------------------------------
encender leds
void turnon_Leds()
{
digitalWrite (lightOn, HIGH);
}
// --------------------------------------------------
la cadena de prueba
void test_it()
{
Serial.println(newstring);
Serial.println(firstnum);
Delay(2000);
/*
Si "BIG50" entonces jugar feliz cumpleaños, servo, girar a LEDs
Si "HARRIE" entonces reproducir canción de anv, trun servo encender leds
*/
Si (newstring.equals(Carrie)) {}
girar el servo
para (pos = 0; pos < 180; pos += 1) / / va desde 0 grados a 180 grados
{/ / en pasos de 1 grado
myservo.Write(POS); Dile el servo a la posición en la variable 'pos'
Delay(15); espera 15ms para el servo a la posición
}
turnon_Leds();
para (int thisNote = 0; thisNote < numNotesbd; thisNote ++) {}
int noteDuration = 1000/noteDurationsbd [thisNote];
tono (8, melodybd[thisNote],noteDuration);
para distinguir las notas, establecer un tiempo mínimo entre ellos.
duración + 30% de la nota parece que funciona bien:
int pauseBetweenNotes = noteDuration * 1.4;
Delay(pauseBetweenNotes);
detener la reproducción de tono:
noTone(8);
}
jugado = 'Y';
Delay(2000);
}
//-----------------------------------------
Si (newstring.equals(Daniel)) {}
girar el servo
para (pos = 180; pos > = 15; pos-= 1) / / va desde 0 grados a 180 grados
{/ / en pasos de 1 grado
myservo.Write(POS); Dile el servo a la posición en la variable 'pos'
Delay(15); espera 15ms para el servo a la posición
}
turnon_Leds();
para (int thisNote = 0; thisNote < numNotesbd; thisNote ++) {}
int noteDuration = 1000/noteDurationsbd [thisNote];
tono (8, melodybd[thisNote],noteDuration);
int pauseBetweenNotes = noteDuration * 1.4;
Delay(pauseBetweenNotes);
detener la reproducción de tono:
noTone(8);
}
jugado = 'Y';
reemplazos = "";
Delay(2000);
}
Serial.println ("got here1");
Delay(500);
necesita primero difgit y luego usar caso a reproducir la canción
Serial.println("here2");
Serial.println(newstring);
Delay(1000);
Si (jugado == ' n ') {}
1 0or 9
Si ((newstring.startsWith("1")) || (newstring.startsWith("9"))) {
iterar sobre las notas de la melodía:
para (int thisNote = 0; thisNote < numNotes1; thisNote ++) {}
int noteDuration = 1000/noteDurations1 [thisNote];
tono (8, melody1[thisNote],noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
Delay(pauseBetweenNotes);
detener la reproducción de tono:
noTone(8);
}
jugado = 'Y';
Delay(500);
reemplazos = "";
}
comienza con 2 o 8
Si ((newstring.startsWith("2")) || (newstring.startsWith("8")))
{
iterar sobre las notas de la melodía:
para (int thisNote = 0; thisNote < numNotes2; thisNote ++) {}
int noteDuration = 1000/noteDurations2 [thisNote];
tono (8, melody2[thisNote],noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
Delay(pauseBetweenNotes);
detener la reproducción de tono:
noTone(8);
}
jugado = 'Y';
Delay(500);
reemplazos = "";
}
comienza con 3 o 7
Si ((newstring.startsWith("3")) || (newstring.startsWith("7")))
{
iterar sobre las notas de la melodía:
para (int thisNote = 0; thisNote < numNotes3; thisNote ++) {}
int noteDuration = 1000/noteDurations3 [thisNote];
tono (8, melody3[thisNote],noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
Delay(pauseBetweenNotes);
detener la reproducción de tono:
noTone(8);
}
jugado = 'Y';
Delay(500);
}
comienza with4 o 6
Si ((newstring.startsWith("4")) || (newstring.startsWith("6")))
{
iterar sobre las notas de la melodía:
para (int thisNote = 0; thisNote < numNotes4; thisNote ++) {}
int noteDuration = 1000/noteDurations4 [thisNote];
tono (8, melody4[thisNote],noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
Delay(pauseBetweenNotes);
detener la reproducción de tono:
noTone(8);
}
jugado = 'Y';
Delay(500);
}
comienza con 5 o 0
Si ((newstring.startsWith("5")) || (newstring.startsWith("0")))
{
iterar sobre las notas de la melodía:
para (int thisNote = 0; thisNote < numNotes5; thisNote ++) {}
int noteDuration = 1000/noteDurations5 [thisNote];
tono (8, melody5[thisNote],noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
Delay(pauseBetweenNotes);
detener la reproducción de tono:
noTone(8);
}
jugado = 'Y';
Delay(500);
}
}
fin del bucle
}