RepWrap - anordning för att hålla reda på längd och upprepningar för sjukgymnastik övningar (breadboarded prototyp) (1 / 2 steg)
Steg 1: Koden
Koden bygger Arduino dokumentation som
Knight Rider 2 för att använda matriser för pin uppställningar
Knappen var vad jag letade efter redan i början (not till mig själv: för v2 bör nog lägga ett motstånd mellan GND och de flygande leder...)
Hämta filen physio.pde (eller kopiera koden nedan) och ladda upp till din Arduino mikrokontroller på vanligt sätt.
/*
RepWrap v1
Nikki pugh | April 2011 | www.npugh.co.uk
Vibration motor kopplad till stift 12
LED bifogas stift 13
Upprepning stift 2-6
Längd stift 7-11
*/
variabler:
int repNumbers [5] = {//array lagra ett urval av upprepning värden
10,12,20,24,30}.
int repPins [] = {
2, 3, 4, 5, 6}; en matris med pin-koder som rep knappar är kopplad
int repPinCount = 5; antalet rep alternativ (dvs. längden på arrayen)
int durationLengths [5] = {//array lagra ett urval av varaktighet/håll värden i sekunder
10,12,15,20,30}.
int durationPins [] = {
7, 8, 9, 10, 11}; en matris med pin-koder till vilken varaktighet knappar är kopplade
int durationPinCount = 5; antalet varaktighet alternativ (dvs. längden på arrayen)
blinkar används som en indikation på att håll varar nästan över
int flashOn = 750; längden av tid countdown blinkar senast för
int flashOff = 250; lång tid countdown blinkar bort för
int flashRep = 3; ingen av blixtar
int flashTime = (flashRep*(flashOn+flashOff));
int övergången = 3000; längden av tid mellan reps, millisekunder
int repState = 0; variabel för att läsa selector status
int durationState = 0; variabel för att läsa selector status
int thisRepPin = 0; andra variabler
int thisDurationPin = 0;
int thisRepNumber = 0;
int thisDurationLength = 0;
int repNumber = 0;
int durationLength = 0;
int repStateFound = 0;
int durationStateFound = 0;
konstanter:
CONST int buzzPin = 12; numrera av summern pin
CONST int LEDPin = 13. antal LED stift
void setup() {
initiera pins som ett resultat:
pinMode (LEDPin, OUTPUT);
pinMode (buzzPin, produktionen);
int thisRepPin;
vektorelement numreras från 0 till (pinCount - 1).
använda en for-loop att initiera varje stift som en utgång:
för (int thisRepPin = 0; thisRepPin < repPinCount; thisRepPin ++) {
pinMode (repPins [thisRepPin], ingång); Ange PIN-kod till insatsen
digitalWrite (repPins [thisRepPin], hög); slå på inre pullup motstånd
pinMode (repPins [thisRepPin], produktionen); Ställ in pinkodsskydd att produktionen
}
int thisDurationPin;
vektorelement numreras från 0 till (pinCount - 1).
använda en for-loop att initiera varje stift som en utgång:
för (int thisDurationPin = 0; thisDurationPin < durationPinCount; thisDurationPin ++) {
pinMode (durationPins [thisDurationPin], ingång); Ange PIN-kod till insatsen
digitalWrite (durationPins [thisDurationPin], hög); slå på inre pullup motstånd
pinMode (durationPins [thisDurationPin], produktionen); Ställ in pinkodsskydd att produktionen
}
Serial.BEGIN(9600); Öppna den seriella porten på 9600 bps
} //end ställa in
void loop() {
Starta signal
för (int jag = 0; jag < flashRep; i ++) {
digitalWrite (LEDPin, låg);
Delay(flashOff);
digitalWrite (LEDPin, hög);
Delay(flashOn);
digitalWrite (LEDPin, låg);
}
digitalWrite (buzzPin, hög);
Delay(changeover);
digitalWrite (buzzPin, låg);
Läs Rep stift, när du hittar en som är låg, som är den som har valts
thisRepPin = 0;
repStateFound = 0;
While(repStateFound==0) {
repState=digitalRead(repPins[thisRepPin]);
om (repState == låg) {//has varit ansluten till marken
repStateFound = 1;
Serial.Print(thisRepPin);
Serial.println ("repStateFound = 1");
}
om (repState == hög) {
repStateFound = 0;
Serial.Print(thisRepPin);
Serial.println ("repStateFound = 0");
thisRepPin ++;
}
}
thisRepNumber = thisRepPin;
Serial.Print ("thisRepNumber:");
repNumber = repNumbers [thisRepNumber];
Serial.println(repNumbers[thisRepNumber]);
Läs varaktighet stiften, när du hittar en som är låg, som är den som har valts
thisDurationPin = 0;
durationStateFound = 0;
While(durationStateFound==0) {
durationState=digitalRead(durationPins[thisDurationPin]);
om (durationState == låg) {
durationStateFound = 1;
Serial.Print(thisDurationPin);
Serial.println ("durationStateFound = 1");
}
om (durationState == hög) {
durationStateFound = 0;
Serial.Print(thisDurationPin);
Serial.println ("durationStateFound = 0");
thisDurationPin ++;
}
}
thisDurationLength = thisDurationPin;
Serial.Print ("thisDurationLength:");
durationLength = durationLengths [thisDurationLength];
Serial.println(durationLength);
durationLength = durationLength * 1000;
thisDurationPin = 0;
stänga stift för att spara ström
för (int thisRepPin = 0; thisRepPin < repPinCount; thisRepPin ++) {
digitalWrite (repPins [thisRepPin], låg); Stäng av alla rep stift
}
Serial.println ("rep stift avstängd");
för (int thisDurationPin = 0; thisDurationPin < durationPinCount; thisDurationPin ++) {
digitalWrite (durationPins [thisRepPin], låg); Stäng av alla varaktighet stift
}
Serial.println ("varaktighet pins avstängd");
nu till övningar
för (int count = 0; räkna < repNumber; räkna ++) {//repeat denna cykel så många gånger som det finns upprepningar
Delay(durationLength-flashTime); vänta på den längd längden minus tiden för countown blinkar
för (int jag = 0; jag < flashRep; i ++) {//do nedräkningen blinkar
digitalWrite (LEDPin, låg);
Delay(flashOff);
digitalWrite (LEDPin, hög);
Delay(flashOn);
digitalWrite (LEDPin, låg);
att rep är nu klar
}
Serial.println(Count+1); Hur många reps har vi gjort?
Buzz motorn för en övergång
digitalWrite (buzzPin, hög);
Delay(changeover);
digitalWrite (buzzPin, låg);
} //end av set
långa buzz till slutet på uppsättningen
digitalWrite (buzzPin, hög);
Delay(7000);
digitalWrite (buzzPin, låg);
Flash LED signal så slutet av set - när du ser detta måste du stänga eller starta en annan uppsättning
medan (sant) {
digitalWrite (LEDPin, hög);
Delay(500);
digitalWrite (LEDPin, låg);
Delay(1000);
}
} //end loop