Metall Doctor Who Sonic skruvmejsel med Arduino (10 / 13 steg)
Steg 10: Arduino skiss plockade isär
/*
* Version 2.5 M
* För ATTiny85 16Mhz
*/
#include "pitches.h"
Den här raden innehåller fliken pitch i koden. Fliken pitch.h innehåller olika tonhöjd - vi kallar dem "Observera" från nu på.
int melodi [] = {
NOTE_F7, NOTE_G4, NOTE_A2};
Denna array "melodi" innehar de anteckningar som kommer att spelas och den ordning som de spelas i. Jag experimenterade med 2 till 5 noterar. För mitt projekt kändes 3 anteckningar gjorde en bra kvittrande eller kvittrar buller för sonics jag gjorde. Jag hade en musiker buddy analysera verkliga ljudet från TV-show och han berättade den dominerande noteringen var i G-skala. Vänligen röra med denna matris genom att lägga till och ta bort anteckningar, ändra anteckningar och arrangera ordern tills du får det ljud som du.
int noteDurations [] = {9,12,7};
Notera varaktighet. Musiknoter är vanligtvis full Obs, halv Obs, fjärdedelsnot och 8: e not. Denna representeras i koden som 1,2,4,8 vilket innebär 1 sekund dividerat med 1,2,4, eller 8. Men gör vi musik. Vi gör en warbly, chirpy buller. Så spelade jag med icke-konventionella Obs varaktigheter som noterar varaktighet 1/15: e för en andra lång eller 1/6th eller 1/12th. Matrisen "noteDuration" nedan anges att NOTE_F7 kommer att spelas på 1/9th varaktighet, NOTE_G4 spelar för 1/12th, och NOTE_A2 på 1/7th. En anmärkning varaktighet måste anges för varje anteckning i matrisen "melodi". Spela med noteDuration att få rätt rytm för din sonic.
int x = 0;
Detta är bara en variabel som ska användas som en räknare
int led1 = 3;
int led2 = 2;
void setup() {
pinMode (led1, produktionen);
pinMode (led2, produktionen);
}
Här två variabler definierar pin-koder för våra LED utgång. Om du verkligen ville kan du lägga till två mer lysdioder eftersom inte alla stiften på ATTiny85 används. Men jag tror två räcker.
void loop() {
Huvudloop. Med varje körning genom huvudsakliga öglan spelas bara en anmärkning på den angivna längd följt av en paus (mer om pauser nedan).
om (x < 5) {
digitalWrite (led1, hög);
digitalWrite (led2, låg);
x = x ++;
}
annars om (x < 7) {
digitalWrite (led1, hög);
digitalWrite (led2, hög);
x = x ++;
}
annars om (x < 9) {
digitalWrite (led1, låg);
digitalWrite (led2, hög);
x = x ++;
}
annat {
x = 0;
}
Detta avsnitt anger LED blinkar mönstret. Använda någon logik du vilja blink mönstret du. Mina användningsområden "x" som en räknare med ett intervall från 0-10. På det lägre intervallet LED1 är på och LED2 är avstängd. Då i mitt urval av "x" både lysdioder är på. På övre utbud av "x" LED1 är avstängd och LED2 är på.
för (int thisNote = 0; thisNote < 3; thisNote ++) {
int noteDuration = 1000/noteDurations [thisNote];
Ovanstående kod går igenom och spelar noterna i melodi array en ton i taget. Den delen där det står "thisNote < 3" värdet måste vara lika med antalet sedlar i matrisen. Så om "melodi" har fyra anteckningar sedan "thisNote < 4". Resten av koden siffror Obs varaktighet i millisekunder.
tonen (4, melody[thisNote],noteDuration);
Det är där tonen är faktiskt outputed till högtalaren. I detta exempel är utdata på pinne 4.
int pauseBetweenNotes = noteDuration *. 14.
Delay(pauseBetweenNotes);
noTone(4);
En paus mellan tonerna måste sättas annars noterar köra tillsammans och det låter som en dålig skrikande ljud. Pausa längd får inte vara ett fast belopp av tid (som 1/4 sekund mellan varje ton) men måste baseras på Obs varaktighet till låter rätt. Koden nedan anger paus tid som en procentandel av notera varaktighet. Spela med decimalvärdet att få en bra paus tid mellan anteckningar. Jag hittade ett värde mellan.09-.21 vara en bra mängd paus. Den sista raden "noTone(4)" stänger av utdata till pinne 4.
}
}
SLUTET av koden