2025 Autor: John Day | [email protected]. Modificat ultima dată: 2025-01-13 06:58
Pentru acest proiect vom realiza o casetă de puzzle care funcționează cu muzică. Esența de bază este că atunci când apăsați un buton eliberează un ton și Arduino calculează ce butoane sunt apăsate, astfel încât să știe ce este corect și care este răspunsul greșit.
Provizii
1 x Arduino uno
Rezistor 1 x 1k Ohm
Rezistențe de 5 x 220 Ohm
1 xPiezo Buzzer
5 x buton 6x6 mm
1 x set Jumper fire
1 x bord perf / strip
1 x solder
1 x balama
1 x clemă
1 x comoda mica / lemn
1x pistol de adeziv fierbinte + lipici
1 x baterie de 9v + suport
un pic de worbla
a picta
Pasul 1:
Pentru a începe, trebuie să apăsați pinii în panoul de testare. Acum conectați analogul 2 cu un fir la colțul plăcii. Vom conecta la acesta două rezistențe într-o linie. Primul este un rezistor de 10k Ohm. La celălalt capăt al acestui rezistor conectăm firul la pământul analogic. Al doilea rezistor este un rezistor de 220 Ohm pe care îl conectăm la primul buton. Utilizați un alt rezistor de aceeași valoare pentru a conecta a doua parte deschisă a butonului cu al doilea buton. Continuați să conectați butoanele astfel până la ultimul. La ultima apucați un fir și îl conectați la o parte închisă corespunzătoare a butonului și îl conectați la următorul din linie. Acum repetați procesul pe care l-ați făcut cu rezistențele cunoscute doar cu fire simple. Conectați primul buton la portul analogic 3, 3V de pe Arduino. În general, veți obține un fel de patern încrucișat așa cum este descris mai jos.
Pasul 2:
Apoi conectați buzzer-ul la placa de siguranță și fixați o parte de solul digital și cealaltă de portul 12. Este inteligent să încărcați deja următorul cod în Arduino, astfel încât să puteți testa dacă totul funcționează corect. Dacă este, puteți începe să lipiți componentele împreună. Faceți acest lucru scoțându-le din panou și lipind direct firele și conexiunile. Dacă credeți că aveți nevoie de mai multă lungime între butoane, puteți adăuga un fir suplimentar între rezistențe. Panoul de verificare nu mai este necesar în acest moment.
Pasul 3:
După ce totul este lipit, este timpul să faceți cutia în sine. Am folosit un set de sertare ieftine ca bază pentru a mea. Pur și simplu am tăiat pe jumătate pe lungime și am îndepărtat spatele și latura pe care am tăiat-o. Ar trebui să aveți două piese în formă de c acum. Tăiați o parte a uneia dintre ele pentru a o folosi ca capac. Acum rotiți una dintre piesele rămase astfel încât să se potrivească împreună ca o cutie fără capac și lipiți-le împreună. Odată ce lipiciul a fost stabilit corect, găuriți o gaură mică în fiecare parte a cutiei pentru butoane și una mai mare pentru buzzerul din capac.
Pasul 4:
Acum puteți începe să pictați cutia. Am făcut-o pe a mea cu un design de flori bazat pe BOTW, dar puteți alege cu adevărat orice design doriți. După ce ați terminat, puteți pune butoanele în interiorul găurilor și puteți pune un glob de adeziv pe spatele butonului și lemnul din jur. Același principiu se aplică buzzerului, dar al meu se potrivește perfect în gaură, făcându-l inutil. Apoi apucați niște worbla și încălziți-o și tăiați-o pentru a face niște butoane mici. Lipiți-le cu atenție pe butoane, dar asigurați-vă că nu utilizați prea mult lipici, deoarece s-ar putea să blocați accidental butoanele. Acum le puteți vopsi pentru a le face să se amestece mai mult cu cutia.
Pasul 5:
În cele din urmă lipiți sau înșurubați, clema și balamalele de pe cutie și capac care leagă cele două.
Pasul 6:
Acum, când cutia dvs. este completă, tot ce trebuie să faceți este să puneți Arduino și bateria în interior și să închideți capacul.
Pasul 7: Cod
// Acesta este codul pentru o casetă de puzzle / muzică tematică Zelda.
// acesta vă conectează codul la lista de note din cealaltă filă
#include "pitches.h"
// această variabilă se va asigura că Arduino vede o apăsare mai lungă a butonului ca o singură apăsare
int same = 0;
// de aici vă va citi intrarea
int k = 2;
// acesta este pinul dvs. de ieșire
difuzor int = 12;
// mai jos sunt melodiile finale
int Zelda = {NOTE_B4, NOTE_D5, NOTE_A4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_D5, NOTE_A4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_D5, NOTE_A5, NOTE_G5, NOTE_D5, NOTE_C5, NOTE_B4, NOTE_A5}
int ZeldaTime = {2, 4, 2, 4, 4, 2, 2, 2, 4, 4, 2, 4, 2, 2, 2, 4, 4, 2};
int Epona = {NOTE_D5, NOTE_B4, NOTE_A4, NOTE_D5, NOTE_B4, NOTE_A4, NOTE_D5, NOTE_B4, NOTE_A4, NOTE_B4, NOTE_A4};
int EponaTime = {4, 4, 1.5, 4, 4, 1.5, 4, 4, 2, 2, 1};
int Saria = {NOTE_F4, NOTE_A4, NOTE_B4, NOTE_F4, NOTE_A4, NOTE_B4, NOTE_F4, NOTE_A4, NOTE_B4, NOTE_E5, NOTE_D5, NOTE_B4, NOTE_C5, NOTE_B4, NOTE_G4, NOTE_E4, NOTE_D4, NOTE_E4, NOTE_E, int SariaTime = {8, 8, 4, 8, 8, 4, 8, 8, 8, 8, 4, 8, 8, 8, 8, 3, 8, 8, 8, 2, 1};
// durata normală a unei note
int BEATTIME = 300;
// ghișeul pe care urmează să îl urmărim dacă suntem în soluție
casier int = 0;
configurare nulă () {
Serial.begin (9600);
pinMode (2, INPUT);
pinMode (1, INPUT);
}
bucla nulă () {
// citește intrarea din pini
k = analogRead (2);
int p = analogRead (1);
// dacă nu este apăsat niciun buton, nu ar trebui să existe niciun ton
if (casier == 0) {
noTone (12);
}
// dacă datele citite corespund parametrilor rulați bitul de cod descris
if (k> 320 && k <350) {
rechts ();
}
//""
altfel dacă (k 290) {
link-uri ();
}
//""
altfel dacă (k> 260 && k <280) {
boven ();
}
//""
altfel dacă (k> 240 && k <260) {
onder ();
}
//""
altfel dacă (k> 220 && k <240) {
A();
}
// dacă nu (când nu este apăsat niciun buton), rulați acest cod
altceva {
// Resetați același lucru, astfel încât să poată fi utilizat la următoarea apăsare a unui buton
la fel = 0;
// dacă contorul este de până la un anumit număr rulați bitul de cod descris
if (casier == 166) {
zelda ();
}
//""
altfel if (casier == 386) {
saria ();
}
//""
altfel if (casier == 266) {
epona ();
}
//""
altfel if (casier == 999) {
// redați acest ton pentru a marca eroarea
ton (difuzor, NOTE_C3, BEATTIME);
// resetați contorul la 0
casier = 0;
}
}
// întârzierea între intrare și ieșire
întârziere (100);
// imprimă valorile intrării dvs. pe monitorul serial
Serial.println (k);
}
// aceasta este prima melodie
void zelda () {
// setează un contor care se actualizează pe sine în timp ce redă melodia, astfel încât să poată citi și opri când ar trebui
for (int i = 0; i <sizeof (Zelda); i ++) {
// spune cât trebuie să dureze o notă
int ZTime = 1000 / ZeldaTime ;
// generează tonurile
ton (difuzor, Zelda , ZTime);
// creează întârzierea corectă
int pauză = ZTime * 1,30;
întârziere (pauză);
// resetează contorul
casier = 0;
// imprimă valorile intrării dvs. pe monitorul serial
Serial.println (casier);
}
}
//""
void epona () {
for (int i = 0; i <sizeof (Epona); i ++) {
int ETime = 1000 / EponaTime ;
ton (difuzor, Epona , ETime);
int pauză = ETime * 1,30;
întârziere (pauză);
casier = 0;
Serial.println (casier);
}
}
//""
void saria () {
for (int i = 0; i <sizeof (Saria); i ++) {
int STime = 1000 / SariaTime ;
ton (difuzor, Saria , STime);
int pauză = STime * 1,30;
întârziere (pauză);
casier = 0;
Serial.println (casier);
}
}
anularea rec
hts () {
// dacă acest lucru nu a fost deja apăsat
if (la fel == 0) {
// dacă contorul are în prezent una dintre aceste valori, adăugați-l
if (teller == 0 || teller == 132 || teller == 165 || teller == 232 || teller == 265 || teller == 331 || teller == 374) {
casier = casier + 1;
}
// în caz contrar, setați-l la 999, astfel încât să auziți zgomotul de eroare
altceva {
casier = 999;
}
// setați același lucru la unul astfel încât Arduino să nu citească o apăsare prelungită ca apăsări multiple
la fel = 1;
}
// redă tonul
altceva {
ton (difuzor, NOTE_A4, BEATTIME);
}
// imprimă valorile intrării dvs. pe monitorul serial
Serial.println (casier); }
//""
linkuri nule () {
if (la fel == 0) {
if (teller == 133 || teller == 254 || teller == 244 || teller == 332 || teller == 375 || teller == 221) {
teller = teller + 11;
}
altfel if (teller == 0) {
casier = 111;
}
altceva {
casier = 999;
}
la fel = 1;
} altceva {
ton (difuzor, NOTE_B4, BEATTIME);
} Serial.println (casier);
}
//""
void boven () {
if (same == 0) {if (teller == 111 || teller == 144 || teller == 233) {
teller = teller + 21;
}
altfel if (teller == 0) {
casier = 221;
}
altceva {
casier = 999;
}
la fel = 1;
}
altceva {
ton (difuzor, NOTE_D5, BEATTIME);
Serial.println (casier);
}
}
//""
void onder () {
if (la fel == 0) {
if (casier == 343) {
teller = teller + 31;
}
altfel if (teller == 0) {
casier = 331;
} altceva {
casier = 999;
} la fel = 1;
} altceva {
ton (difuzor, NOTE_F4, BEATTIME);
Serial.println (casier);
}
}
//""
anulați un () {
if (la fel == 0) {
if (casier == 0) {
casier = 461;
}
altceva {
casier = 999;
}
la fel = 1;
}
ton (difuzor, NOTE_D4, BEATTIME);
Serial.println (casier);
}