Rotary telefon ringa + Arduino + osynligt bläck = födelsedag nuvarande
Jag börjar med detta instructable
När jag slutade, har jag ett objekt som fungerar som följer:
-något nummer eller sekvens av nummer
-Tryck på den stora röda knappen testa den sekvensen.
-arduino kommer att spela en låt baserad på den första siffran i den sekvens som rings upp.
- Men om rätt sekvens rings upp, i detta fall min döttrar namn, arduino kommer att spela "Happy Birthday song", snurra skärmen metall och ljus UV-lysdioder. Detta kommer att avslöja "Grattis på födelsedagen meddelandet jag skrev på skärmen med osynligt bläckpenna.
video för att följa
Så i princip är vad jag har:
Arduinoen registrerar ingång rotary telefon som en sträng och sedan koden kontrollerar för en viss sträng.
Om det inte är strängen, sedan spelar en av 5 låtar som är kodade i skissen.
Om det är rätt sträng sedan arduino instruerar servo att vända och lyser i UV-ljus och spelar låten födelsedag.
Koden följer:
Jag hittade bitar av det här och där. Testton-funktionen används tillsammans med en pitches.h fil.
/ * 3/21/12 - började göra projekt med vredet
-att användas för födelsedagspresent för Christine
-idén:
ringer upp nummer kommer att spela en annan sång
ringer upp hennes namn lyser lysdioder som visar födelsedagen messgae
eller den glada aniversity för Harrie och Riek
-börjar med koden för batphonev1
-behöver göra många ändringar
-v2 - börja titta på watys har många låtar eller anteckningar
*/
#include < Servo.h >
#include "pitches.h"
Grattis på födelsedagen
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;
aniversary
Här kommer bruden
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};
Observera varaktigheter: 4 = fjärdedelsnot, 8 = åttondelen noterar, 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. två bitar sak
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 pop går vessla
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;
4 batman
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 kända klassiska
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};
Observera varaktigheter: 4 = fjärdedelsnot, 8 = åttondelen noterar, 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 antal;
Mine
CONST int try_it = 3;
CONST int in_from_dial = 2;
CONST int lightOn = 11;
int buttonState = 0; variabel för att läsa tryckknapp status
int firstnum = 0;
char spelade = 'N';
slutet gruva
int lastState = låg;
int trueState = låg;
lång lastStateChangeTime = 0;
int rensat = 0;
konstanter
int dialHasFinishedRotatingAfterMs = 100;
int debounceDelay = 10;
strängar
Sträng newstring;
char Carrie [] = "227743";
char Daniel [] = "326435";
char Big50 [] = "1";
char Harrie [] = "2".
servo
Servo myservo; skapa objekt för att styra en servo servo
int pos = 0; variabel att lagra servo position
// --------------------------------------------
void setup()
{
Serial.BEGIN(9600);
pinMode (in_from_dial, ingång); 2
pinMode (try_it, ingång); 3
pinMode (Benny, produktionen); 11
pinMode (13, OUTPUT); 12
myservo.attach(6); tillmäter objektet servo servo på stift 6
}
void loop() {
digitalWrite 13, hög. ställa in lysdioden på
/*
användaren kommer att slå nummer tills de träffar på "prova" buttonb
så måste skapa sträng tills knappen trycks
*/
Läs statligt av knappen tryit
digitalWrite (Benny, låg);
buttonState = digitalRead(try_it);
try_it = hög;
om (buttonState == låg) {
int läsa = digitalRead(in_from_dial);
om ((millis()-lastStateChangeTime) > dialHasFinishedRotatingAfterMs) {
ratten är inte som rings eller har precis avslutat som rings.
om (needToPrint) {
om det är just färdigt som rings, måste vi sända ner följetongen
linje och återställa räkningen. Vi mod räkningen vid 10 eftersom '0' skickar 10 pulser.
Serial.println (antal % 10, DEC).
nu måste lägga räkningen till teststrängen och sedan testa den mot den
krävs sträng att få en träff
NewString.concat(Count);
needToPrint = 0;
Count = 0;
rensat = 0;
}
}
om (läsa! = lastState) {
lastStateChangeTime = millis();
}
om ((millis()-lastStateChangeTime) > debounceDelay) {
Debounce - detta händer när det är stabiliserats
om (läsa! = trueState) {
Detta innebär att växeln har antingen bara gått från stängda -> Öppna eller vice versa.
trueState = behandlingen.
om (trueState == hög) {
öka antalet pulser om det är gått hög.
greve ++;
needToPrint = 1; Vi kommer att behöva skriva ut detta nummer (när ratten är klar roterande)
}
}
}
lastState = behandlingen.
}
annat
{
användaren vill nu testa hans uppringning
//
spelade = 'N';
Serial.println(NewString);
test_it();
NewString = "";
}
}
// --------------------- my functions -------------------------
// ------------------------------------------------------------
slå på lysdioder
void turnon_Leds()
{
digitalWrite (Benny, hög);
}
// --------------------------------------------------
testa strängen
void test_it()
{
Serial.println(NewString);
Serial.println(firstnum);
Delay(2000);
/*
om "BIG50" sedan spela Happy Birthday, stänga servo, slå på lysdioder
om "HARRIE" spelar sedan anv låt, trun servo aktivera lysdioder
*/
om (newstring.equals(Carrie)) {
Aktivera servo
för (pos = 0; pos < 180; pos + = 1) / / går från 0 grader till 180 grader
{/ / i steg om 1 grad
myservo.write(POS); berätta servo gå för att placera i variabel "pos"
Delay(15); Waits 15 MS för servo att nå ställning
}
turnon_Leds();
för (int thisNote = 0; thisNote < numNotesbd; thisNote ++) {
int noteDuration = 1000/noteDurationsbd [thisNote];
tonen (8, melodybd[thisNote],noteDuration);
Ange en minsta tid mellan dem för att skilja anteckningar.
tonens längd + 30% verkar fungera bra:
int pauseBetweenNotes = noteDuration * 1.4;
Delay(pauseBetweenNotes);
stoppa tonen uppspelningen:
noTone(8);
}
spelade = "Y";
Delay(2000);
}
//-----------------------------------------
om (newstring.equals(Daniel)) {
Aktivera servo
för (pos = 180, pos > = 15; pos-= 1) / / går från 0 grader till 180 grader
{/ / i steg om 1 grad
myservo.write(POS); berätta servo gå för att placera i variabel "pos"
Delay(15); Waits 15 MS för servo att nå ställning
}
turnon_Leds();
för (int thisNote = 0; thisNote < numNotesbd; thisNote ++) {
int noteDuration = 1000/noteDurationsbd [thisNote];
tonen (8, melodybd[thisNote],noteDuration);
int pauseBetweenNotes = noteDuration * 1.4;
Delay(pauseBetweenNotes);
stoppa tonen uppspelningen:
noTone(8);
}
spelade = "Y";
NewString = "";
Delay(2000);
}
Serial.println fick ("here1");
Delay(500);
behöver första difgit och sedan använda fallet för att spela låten
Serial.println("here2");
Serial.println(NewString);
Delay(1000);
om (spelade == 'N') {
1 0or 9
om ((newstring.startsWith("1")) || (newstring.startsWith("9"))) {
iterera över tonerna i melodin:
för (int thisNote = 0; thisNote < numNotes1; thisNote ++) {
int noteDuration = 1000/noteDurations1 [thisNote];
tonen (8, melody1[thisNote],noteDuration);
int pauseBetweenNotes = noteDuration * 1,30;
Delay(pauseBetweenNotes);
stoppa tonen uppspelningen:
noTone(8);
}
spelade = "Y";
Delay(500);
NewString = "";
}
börjar med 2 eller 8
om ((newstring.startsWith("2")) || (newstring.startsWith("8")))
{
iterera över tonerna i melodin:
för (int thisNote = 0; thisNote < numNotes2; thisNote ++) {
int noteDuration = 1000/noteDurations2 [thisNote];
tonen (8, melody2[thisNote],noteDuration);
int pauseBetweenNotes = noteDuration * 1,30;
Delay(pauseBetweenNotes);
stoppa tonen uppspelningen:
noTone(8);
}
spelade = "Y";
Delay(500);
NewString = "";
}
börjar med 3 eller 7
om ((newstring.startsWith("3")) || (newstring.startsWith("7")))
{
iterera över tonerna i melodin:
för (int thisNote = 0; thisNote < numNotes3; thisNote ++) {
int noteDuration = 1000/noteDurations3 [thisNote];
tonen (8, melody3[thisNote],noteDuration);
int pauseBetweenNotes = noteDuration * 1,30;
Delay(pauseBetweenNotes);
stoppa tonen uppspelningen:
noTone(8);
}
spelade = "Y";
Delay(500);
}
börjar with4 eller 6
om ((newstring.startsWith("4")) || (newstring.startsWith("6")))
{
iterera över tonerna i melodin:
för (int thisNote = 0; thisNote < numNotes4; thisNote ++) {
int noteDuration = 1000/noteDurations4 [thisNote];
tonen (8, melody4[thisNote],noteDuration);
int pauseBetweenNotes = noteDuration * 1,30;
Delay(pauseBetweenNotes);
stoppa tonen uppspelningen:
noTone(8);
}
spelade = "Y";
Delay(500);
}
börjar med 5 eller 0
om ((newstring.startsWith("5")) || (newstring.startsWith("0")))
{
iterera över tonerna i melodin:
för (int thisNote = 0; thisNote < numNotes5; thisNote ++) {
int noteDuration = 1000/noteDurations5 [thisNote];
tonen (8, melody5[thisNote],noteDuration);
int pauseBetweenNotes = noteDuration * 1,30;
Delay(pauseBetweenNotes);
stoppa tonen uppspelningen:
noTone(8);
}
spelade = "Y";
Delay(500);
}
}
slutet av loop
}