Show Posts
|
|
Pages: 1 [2] 3
|
|
17
|
International / Scandinavia / Re: RPM måler
|
on: January 05, 2013, 02:31:32 pm
|
|
Hensigten er: der foretages et valg på forhånd med up/down "Profil". alt efter hvor hurtigt "hjulet" kører (rpm) skal der ske forskellige aktiviteter alt efter hvordan kobinationen af profil og rpm er. Der er 10 "profiler" hvor der er 2 muligeder pr. profil. Switch case Serial.println skal i virkeligheden inderholder koder der aktivere film/programmer via GoBeTwino.
Det hele er bygget ind i en kondicykel. Arduinoen skal motiverer børn til at motionerer. Profiler vælges ud fra hvilken film/musik/programmer børnene er interesseret i, og værdien på (rpm) bestemmer om børnene kan se filmen ( højt rpm) eller ikke kan se den (lavt rpm).
|
|
|
|
|
18
|
International / Scandinavia / Re: RPM måler
|
on: January 05, 2013, 12:06:22 pm
|
Hej Msquare Nu fungerer koden. Jeg valgte den sidste kode jeg sendte, af en eller grund virker den første ikke. Det er lige meget hvor præcist rmpcount er, da jeg skal bruge variablen i et senere switch case , hvor jeg så justerer tallet så det passer. Nu er problemmet så at mine Serial.println i switch case'ene bliver ved med at "løbe" på Serial monitoren. De skal kun vises 1 gang, for hvert case skifte. Kan du se hvad det er jeg koder forkert???? const int UP = 13; const int DOWN = 12; volatile int rpm; unsigned long timeold; unsigned long timenew; unsigned long timediff; volatile byte rpmcount;
const int HURTIG = 10; const int LANGSOM = 20; int lastState;
boolean lastbuttonUP = HIGH; // debounce// boolean currbuttonUP = HIGH; boolean lastbuttonDOWN = HIGH; boolean currbuttonDOWN = HIGH;
int PushCounter = 0;
void setup() { pinMode(UP, INPUT); digitalWrite(UP, HIGH); pinMode(DOWN , INPUT); digitalWrite(DOWN, HIGH); Serial.begin(9600); attachInterrupt(0, rpm_fun, RISING); // Interrupt triggers on rising edge; when the sensor turns off. digitalWrite(2, HIGH); rpmcount = 0; rpm = 0; timeold = 0; } boolean debounceUP(boolean lastUP) //debounce UP/ { boolean currentUP = digitalRead(UP); if (lastUP != currentUP) { delay(50); currentUP = digitalRead(UP); } return currentUP;
}
boolean debounceDOWN(boolean lastDOWN) //debounce DOWN/ { boolean currentDOWN = digitalRead(DOWN); if (lastDOWN != currentDOWN) { delay(50); currentDOWN = digitalRead(DOWN); } return currentDOWN;
} void loop() { currbuttonUP = debounceUP(lastbuttonUP); // up // if(lastbuttonUP == HIGH && currbuttonUP == LOW) { PushCounter++; PushCounter = min(PushCounter, 10); Serial.print("PROFIL:"); Serial.println(PushCounter);
} lastbuttonUP = currbuttonUP;
currbuttonDOWN= debounceDOWN(lastbuttonDOWN); //DOWN// if(lastbuttonDOWN == HIGH && currbuttonDOWN == LOW) { PushCounter--; PushCounter = max(PushCounter, 1); Serial.print("PROFIL"); Serial.println(PushCounter); } lastbuttonDOWN = currbuttonDOWN; if (rpmcount==1) timeold=millis();
else if (rpmcount >= 15) { //Update RPM every 20 counts, increase this for better RPM resolution, //decrease for faster update rpm = 30000L/(millis() - timeold)*(rpmcount-1); //timeold = millis(); rpmcount = 0; Serial.println(rpm); }
if ( rpm >= 130 && lastState!=HURTIG) switch (PushCounter) { case 1 : Serial.println("HURTIG 1"); break; case 2 : Serial.println("HURTIG 2"); break; case 3: Serial.println("HURTIG 3"); break; case 4: Serial.println("HURTIG 4"); break; case 5: Serial.println("HURTIG 5"); break; case 6: Serial.println("HURTIG 6"); break; case 7: Serial.println("HURTIG 7"); break; case 8: Serial.println("HURTIG 8"); break; case 9: Serial.println("HURTIG 9"); break; case 10: Serial.println("HURTIG 10"); break;
}
lastState = HURTIG;
if ( rpm <= 129 && lastState!=LANGSOM) switch (PushCounter) { case 1 : Serial.println("LANGSOM 1"); break; case 2 : Serial.println("LANGSOM 2"); break; case 3: Serial.println("LANGSOM 3"); break; case 4: Serial.println("LANGSOM 4"); break; case 5: Serial.println("LANGSOM 5"); break; case 6: Serial.println("LANGSOM 6"); break; case 7: Serial.println("LANGSOM 7"); break; case 8: Serial.println("LANGSOM 8"); break; case 9: Serial.println("LANGSOM 9"); break; case 10: Serial.println("LANGSOM 10"); break;
}
lastState = LANGSOM; } void rpm_fun() { rpmcount++; //Each rotation, this interrupt function is run twice } Venlig hilsen LYDANGER
|
|
|
|
|
19
|
International / Scandinavia / Re: RPM måler
|
on: December 29, 2012, 05:59:21 pm
|
Hej Mspuare Du er jo næsten blevet en "tro følgesvend" i mit forsøg på at erober Arduino verdenen.  Nå...jeg ændrede variablerne, og aktiverede den indbyggede pullup. og det hjalp rigtig meget. Dog kunne jeg stadig godt tænke mig at serial.print af "rpm" bliver opdateret ved hvert "interrupt". Har du nogle forslag ud fra den nye sketch??? volatile int rpm; unsigned long timeold; unsigned long timenew; unsigned long timediff; volatile byte rpmcount;
void setup() { Serial.begin(9600); attachInterrupt(0, rpm_fun, CHANGE); digitalWrite(2, HIGH); rpmcount = 0; rpm = 0; timeold = 0; } void loop() { if (rpmcount==1) timeold=millis(); else if (rpmcount >= 20) { //Update RPM every 20 counts, increase this for better RPM resolution, //decrease for faster update rpm = 30000/(millis() - timeold)*(rpmcount-1); //timeold = millis(); rpmcount = 0; Serial.println(rpm); } } void rpm_fun() { rpmcount++; //Each rotation, this interrupt function is run twice } VH Lydfanger
|
|
|
|
|
20
|
International / Scandinavia / LØST RPM måler
|
on: December 29, 2012, 04:35:50 pm
|
Hej Jeg forsøger at bruge nedenstående sketch til at måler omdrejninger/min. Jeg får dog kun en masse 5 cifrede tal ud på Serial monitoren, og tallene kommer hurtigt, uanset om der har været interrupt eller ej. Jeg bruger en magnetføler til Interrupt. Jeg vil gerne have at at serial.print af "rpm" bliver opdateret hver gang magnetføleren "interrupter". Grunden til dette er at "hjulet" drejer med kun max 150 omdrejninger/min. unsigned int rpm; unsigned long timeold; unsigned long timenew; unsigned long timediff;
void setup() { Serial.begin(9600); attachInterrupt(0, rpm_fun, LOW); rpmcount = 0; rpm = 0; timeold = 0; } void loop() { if (rpmcount==1) timeold=millis(); rpm = 60000/(millis() - timeold)*(rpmcount-1); //timeold = millis(); rpmcount = 0; Serial.println(rpm,DEC); } } void rpm_fun() { rpmcount++; //Each rotation, this interrupt function is run twice }
|
|
|
|
|
21
|
International / Scandinavia / "LØST" Måling af tid mellem tilstande
|
on: December 07, 2012, 05:36:28 am
|
Så er jeg her igen. Jeg har brug for at måle tiden mellem skift af 2 tilstande. Jeg skal bruge "tiden" som variabel til definere forskellige hændelder alt efter værdien. Jeg har prøvet med "pulseIn" men det har indvirkning på hele loopet og giver store forsinkelser og tilfældige. Er der nogen der har et bud???? val = analogRead(mag);
if(val < 300 && lstState!=TAET) { Serial.println("TAET");
lstState = TAET; }
if(val >= 300 && lstState!=LANG) { Serial.println("LANGT");
lstState = LANG; } delay(5); }
Vh Lydfanger
|
|
|
|
|
23
|
International / Scandinavia / Re: rotary encoder og trykknap
|
on: November 04, 2012, 04:31:47 pm
|
Hej igen tak for din ide. Det fungerer godt. dog har jeg et lille problem. Efter skiftet til Switch Case skriver Serial.println flere gange, uvilkårligt. Jeg SKAL kun have Serial.println til at skrive 1 gang,(for hvert tryk på knap) fordi den skal aktivere en fil på computer via Gobetwino. Hvis Serial.println skriver mere end en gang, starter Gobetwino'en filen flere gange. I sketch'en er "rotary-emneskift-delen" udskiftet med "trykknap op/ned-emneskift-del". const int KonUP = 13; //up & down// const int KonDO = 12;
int buttonPushCounter = 0; int buttonState = 0; int buttonState2 = 0; int lastButtonState = 0; int lastButtonState2 = 0;
const int kon1 = 2; //knapper// const int kon2 = 3;
int currState1; int prevState1; int currState2; int prevState2;
void setup() {
pinMode(KonUP, INPUT); // Up & down// digitalWrite(KonUP, HIGH); pinMode(KonDO, INPUT); digitalWrite(KonDO, HIGH);
pinMode(kon1, INPUT); // knapper// digitalWrite(kon1, HIGH); pinMode(kon2, INPUT); digitalWrite(kon2, HIGH);
Serial.begin(9600); }
void loop()
{
buttonState = digitalRead(KonUP);
if (buttonState != lastButtonState) {
if (buttonState == LOW) {
buttonPushCounter++;
Serial.print("emne: "); Serial.println(buttonPushCounter);
} }
lastButtonState = buttonState;
{
buttonState2 = digitalRead(KonDO);
if (buttonState2 != lastButtonState2) {
if (buttonState2 == LOW) {
buttonPushCounter--;
Serial.print("emne: "); Serial.println(buttonPushCounter);
} }
lastButtonState2 = buttonState2;
}
//kontakter koder//
{ currState1 = digitalRead(kon1); currState2 = digitalRead(kon2);
if (currState1 !=prevState1) //trykknap 1// switch (buttonPushCounter) { case 1 : Serial.println("1"); break; case 2 : Serial.println("11"); break; case 3: Serial.println("21"); break; } prevState1=currState1 ; }
if (currState2 !=prevState2) //trykknap 2// switch (buttonPushCounter) { case 1 : Serial.println("2"); break; case 2 : Serial.println("12"); break; case 3: Serial.println("22"); break; } prevState2=currState2 ; }
|
|
|
|
|
24
|
International / Scandinavia / Re: rotary encoder og trykknap
|
on: October 29, 2012, 04:17:26 pm
|
Hej igen Nu virker det. Mit projekt har 8 trukknapper(currState 1-8) og en "variations vælger--rotary encoder" ,som skal virker for alle 8 knapper,(number x) Hvis jeg har forstået det rigtigt, skal jeg først sætte prevState1 = currState1;
når alle if(currState1 == LOW && number == x)
er læst.
|
|
|
|
|
25
|
International / Scandinavia / Re: rotary encoder og trykknap
|
on: October 27, 2012, 05:14:44 pm
|
|
Hej
Monitoren viser 1 ved første step på rotary'en, 2 ved næste step, osv. osv. virker i begge retninger. Den har på intet tidspunkt været ustabil. (det er en "potmeter type") Første gang jeg vælger step 3 (number == 3) og trykker på trykknapen skriver monitoren "udsagn 1" som jeg gerne vil have. Går jeg videre op i step'ene og trykke på knappen sker der ikke noget, med andre ord virker if(currState1 == LOW && number == 3) kun den ene gang og if(currState1 == LOW && number == 4) kommer aldrig til at virke. Monitoren viser stadig nye værdier når jeg drejer på rotary'en.
|
|
|
|
|
26
|
International / Scandinavia / LØST rotary encoder og trykknap
|
on: October 25, 2012, 11:20:41 am
|
Hej Jeg prøver at få en rotary encoder til at virke som "bank selector" for en gruppe trykknapper. Encoder delen virker, jeg får et brugbart tal ud "number". Jeg vil så indsætte "number" i forskellige if statements (for trykknap) som så bestemmer handlingen for trykknappen. Men det virker bare ikke. Er der nogen der kan se hvor det går galt??????? (har selv en formodning om det er "number" der ikke bliver "husket"...) Vh LYDFANGER volatile int number = 0; //encoder
int oldnumber = number;
volatile boolean halfleft = false; volatile boolean halfright = false;
int kon=8; //Kontakt int currState1; int prevState1;
void setup(){ Serial.begin(9600); pinMode(2, INPUT); digitalWrite(2, HIGH); pinMode(3, INPUT); digitalWrite(3, HIGH); attachInterrupt(0, isr_2, FALLING); attachInterrupt(1, isr_3, FALLING);
pinMode(kon, INPUT); digitalWrite(kon, HIGH);
}
void loop(){ //encoder "koder" if(number != oldnumber){ Serial.println(number); oldnumber = number; //denne værdi jeg gerne vil bruge } }
void isr_2(){ delay(1); if(digitalRead(2) == LOW){ if(digitalRead(3) == HIGH && halfright == false){ halfright = true; } if(digitalRead(3) == LOW && halfleft == true){ halfleft = false; number--; } } } void isr_3(){ delay(1); if(digitalRead(3) == LOW){ if(digitalRead(2) == HIGH && halfleft == false){ halfleft = true; } if(digitalRead(2) == LOW && halfright == true){ halfright = false; number++; } }
{ currState1 = digitalRead(kon);
if(currState1 !=prevState1) //tryk på knap "koder" { if(currState1 == LOW && number == 3) { Serial.println("UDSAGN 1"); } } prevState1 = currState1;
if(currState1 !=prevState1) { if(currState1 == LOW && number == 4) { Serial.println("UDSAGN 2"); } } prevState1 = currState1;
} }
|
|
|
|
|
27
|
International / Scandinavia / Re: Magnet føler
|
on: October 14, 2012, 11:34:30 am
|
Hej Msquare Tak for dit hint. Det gjorde at jeg fandt frem til at bruge pulseIn(). Den måler tiden mellem to puls-input, og ud kommer et, for mig, brugbart tal jeg kan lege videre med. int sens = 2;
unsigned long duration;
void setup() { pinMode(sens, INPUT); digitalWrite(sens, HIGH); Serial.begin(9600); }
void loop() { duration = pulseIn(sens, HIGH); Serial.println(duration/1500);
}
endnu en gang tak for hjælpen
|
|
|
|
|
28
|
International / Scandinavia / "LØST" Magnet føler
|
on: October 08, 2012, 03:35:16 pm
|
|
Hej der ude.
Jeg kunne godt bruge hints til, hvordan jeg får impuls fra en magnetføler(som cykelcomputer) omsat til val 0-512. Hvordan får jeg den tid der går mellem hver impuls omsat til val.
Vh Lydfanger
|
|
|
|
|
30
|
Using Arduino / Audio / Re: playing sound from computer
|
on: July 29, 2012, 03:17:35 pm
|
Hello try this : Gobetwino http://mikmo.dk/gobetwino.htmlThis software makes it possible to send Serial.println from the Arduino, starting up files and/or programs on your PC. See also the Post "Starting the Windows media Player from the UNO" under "Interfacing w/ Software on the Computer " Regards LYDFANGER
|
|
|
|
|