COI - Beat Keeper (3 / 4 steg)
Steg 3: Programmering/kod
Ladda ner filen i slutet av den instructable eller kopiera följande kod till din Arduino-Intel IDE (Integrated Development Environment). Ladda upp koden till Edison styrelsen. Observera att det finns flera anpassningsbara parametrar som visas i koden, viktigast av allt en sträng kallas slå med bokstäver som representerar sensorerna som utlöses på beat och en unitsPerBeat som berättar hur många tecken gå in i ett enda slag.
#include < br >
#include
#include
rgb_lcd
LCD;
#define
S_SENS A3
#define
T_SENS 8
#define
ROT_SENS A0
int
yellowPinNum = 3;
int
greenPinNum = 5;
int
redPinNum = 6;
int
thresholdSound = 400. Från 1024
minTime
och maxTime kan anpassas.
int
minTime = 250; //Corresponds till 240 slag/minut
int
maxTime = 1000; //Corresponds till 60 slag/minut
int
beatTime = maxTime;
lång
lång lastMillis = 0;
dubbel
poäng = 1,0; Detta är ett värde som hålls mellan 0 och 1 som påverkas
av de senaste prestanda.
dubbel
memoryPersistance =. 8; Detta värde är anpassningsbara och bör vara
mellan 0 och 1.
röding
touchCode = 'T';
röding
soundCode = s ';
röding
bothCode = "B";
röding
silentCode = '-';
Sträng
slå = "S-T-T - T-"; Detta är anpassningsbara att producera en ny
Beat. Slag kan vara av godtycklig längd.
int
unitsPerBeat = 2; Anpassningsbara, är antalet tecken i beat
per "beat"
int
beatIndex = 0;
Booleskt värde
touchedLastTime = false;
Booleskt värde
soundLastTime = false;
Booleskt värde
scoreIntegrated = false;
void
Setup() {
//
Se till att initiera stiften för utdata:
pinMode (yellowPinNum,
PRODUKTION);
pinMode (greenPinNum,
PRODUKTION);
pinMode (redPinNum,
PRODUKTION);
Ställa in
upp LCD skärm
LCD.BEGIN(16,2);
lcd.setRGB(255,255,255);
//
Ställa in pinMode av ingångarna
pinMode (S_SENS,
INPUT);
pinMode (T_SENS,
INPUT);
pinMode (ROT_SENS,
INPUT);
Säkerhet:
unitsPerBeat
= max (unitsPerBeat, 1);
}
void
loop() {
Kontrollera
för en slå överrullning
Booleskt värde
rollOver = false;
om (millis ()-lastMillis
> beatTime) {
lastMillis
= lastMillis + beatTime;
rollOver
= sant;
beatIndex
= (beatIndex + 1)%beat.length();
}
IF(Millis()
< lastMillis) {
lastMillis
= millis();
rollOver
= sant;
beatIndex
= (beatIndex + 1)%beat.length();
}
Läs
Speed preferens och display på LCD.
IF(rollOver) {
beatTime
= minTime+(int) (analogRead (ROT_SENS) / 1024.0 * (maxTime-minTime));
dubbel
BPM = 60.0*1000.0/beatTime;
lcd.setCursor(0,0);
LCD.Print("
"), //Clear skärm
lcd.setCursor(0,1);
LCD.Print("
");
lcd.setCursor(0,0);
LCD.Print ("BPM:
");
LCD.Print(BPM);
beatTime
= beatTime/unitsPerBeat;
}
Kontrollera
för att se om under första kvartalet. Så, slå på lämplig LED, och
Kontrollera för handen.
om (millis ()-lastMillis
< beatTime/3) {
scoreIntegrated
= false; Betyder soundLastTime, touchedLastTime har potentiellt nya
värden.
om (beatIndex
== 0){
analogWrite (yellowPinNum,
0); Full ljusstyrka på första taktdelen.
}
annat
om (beatIndex % unitsPerBeat == 0) {
analogWrite (yellowPinNum,
200). Lägre ljusstyrka.
} //End
om är första beat
om (slå [beatIndex] == touchCode
|| slå [beatIndex] == bothCode) {
analogWrite (greenPinNum,
0);
}
om (slå [beatIndex] == soundCode
|| Beat[beatIndex]==bothCode) {
analogWrite (redPinNum,
0);
}
IF(digitalRead(T_SENS)==1) {
touchedLastTime = sant;
}
IF(analogRead(S_SENS) > thresholdSound) {
soundLastTime = sant;
}
}
annat
om (millis ()-lastMillis > (beatTime * 2) / 3) {
scoreIntegrated
= false; Betyder soundLastTime, touchedLastTime har potentiellt nya
värden.
IF(digitalRead(T_SENS)==1) {
touchedLastTime = sant;
}
IF(analogRead(S_SENS) > thresholdSound) {
soundLastTime = sant;
}
}
annat {
analogWrite (yellowPinNum,
255); //Inverted av någon anledning.
analogWrite (greenPinNum,
255);
analogWrite (redPinNum,
255);
om (scoreIntegrated
== false) {
dubbel
korrekthet = 0;
om (slå [beatIndex] == bothCode
& & touchedLastTime & & soundLastTime) {
korrekthet = 1;
}
annat
om (slå [beatIndex] == touchCode & & touchedLastTime & &
! soundLastTime) {
korrekthet = 1;
}
annat
om (slå [beatIndex] == soundCode & &! touchedLastTime & &
soundLastTime) {
korrekthet = 1;
}
annat
om (slå [beatIndex] == silentCode & &! touchedLastTime & &
! soundLastTime) {
korrekthet = poäng;
}
poäng
= poäng * memoryPersistance + correctness*(1-memoryPersistance);
lcd.setRGB((int)(255*(1-score)),(int) (255
* poäng), 0);
lcd.setCursor(0,1);
LCD.Print((int)(score*100));
LCD.Print("%");
scoreIntegrated
= sant;
touchedLastTime = false;
soundLastTime = false;
}
}
}