Infraröd varvräknare med Arduino (3 / 4 steg)
Steg 3: Skriva koden
Koden är ganska mycket liknar den här: http://playground.arduino.cc/Learning/Tachometer, faktum är att jag skrev baserat på koden. Bara i stället för att räkna hur många gånger sensorerna säger Hej till varandra varje viss tid, jag räknar hur länge tills de ser andra igen efter det senaste mötet. Jag tycker också, att använda micros(), som returnerar microcontroller tid i mikrosekunder, ger ett betydligt mer exakt resultat än om jag använde millis() på samma plats.
Här är koden:
int sensorvalue;
int state1 = hög;
int state2;
float rps;
float varvtal.
lång prevMillis = 0;
långa intervall = 200.
långa currentTime;
lång prevTime = 1;
lång diffTime;
int sensorthreshold = 30.
Detta värde anger gräns mellan mörka och ljusa,
Det måste provas som kan komma att ändras enligt de
avståndet lysdioderna placeras.
för att se vilket nummer är bra, kolla sensorvalue variabelvärdet
som skrivs ut i den seriella monitorn
void setup()
{
Serial.BEGIN(9600);
pinMode(13,OUTPUT); tilldela stift 13 ledde som indikator eftersom vi inte kan se IR-ljus
}
void loop()
{
sensorvalue = analogRead(0); läsa från stift 0
IF(sensorvalue < sensorthreshold)
state1 = hög;
annat
state1 = låg;
digitalWrite(13,state1); som iR är ljus osynligt för oss, det ledde på stiftet 13
Ange status för kretsen.
IF(state2!=state1) {//counts när staten ändrar, som är från (mörk till ljus) eller
från (ljus till mörk), kom ihåg att IR-ljus är osynligt för oss.
om (state2 > state1) {
currentTime = micros(); Får arduino tid i mikrosekunder
diffTime = currentTime - prevTime; beräkna tid diff från den senaste möta upp
RPS = 1000000/diffTime; beräkna hur många rev per andra, bra att veta
RPM = 60000000/diffTime; beräkna hur många rev per minut
osignerade långa currentMillis = millis();
skriva ut till serial varje intervall - definieras vid variabler deklaration
om (currentMillis - prevMillis > intervall) {/ / se om nu redan ett intervall lång
prevMillis = currentMillis;
Serial.Print(RPS); Serial.Print ("rps"); Serial.Print(rpm); Serial.println ("rpm");
}
prevTime = currentTime;
}
state2 = state1;
}
/*
endast för test för att bestämma sensorthreshold
Delay(500);
Serial.println(sensorvalue);
*/
}
Knepig sak var på att definiera det sensorthreshold värdet. Jag gjorde detta: kommentera den viktigaste rutinen, och ta bort kommentar avsnittet tester som kan ses i nedanstående koder. Den sätt Arduinoen kommer att skriva till seriell övervaka och uppdatera sensor värdet i skärmen varje 500 ms. kompilera och ladda upp din kod till din styrelse, sedan öppna seriell bildskärmen. Vända och stoppa hjulet så att sensorerna är blockerade och ser vilket nummer visas i följetong monitor (i mitt fall runt 37-40), sedan vända och stoppa där sensorerna kan se varandra genom fönstret och ser vad nummer på skärmen nu (i mitt fall 14-19). Ange sedan ett tal som sensorthreshold variabelvärde som du nu vet vad är en bra nummer att skilja mellan "se" eller "ser inte" (jag in 30 i mitt fall, eftersom min "ser" är 37-40 och "se" 14-19, inställningen mellan 20-36 kan göra samma funktion också, men inte riktigt säkra eftersom värdet kan ibland vara 35 eller 21 på grund av störningar från miljö-lampor i de elektriska anslutningarna, eller andra saker som ärligt talat inte förstår jag riktigt om). Så, för kort, kolla numret när IR-sensorer kan se varandra och kolla det när sensorerna är blockerade, sedan hitta en rad i mellan att du är säker på att det kommer att skilja mellan "ser" och "ser".
Nedan är den kod modifieringen för att kontrollera hur bra många för sensorthreshold variabel:
...
void loop()
{
sensorvalue = analogRead(0); läsa från stift 0
/*
IF(sensorvalue < sensorthreshold)
...
state2 = state1;
}
*/
endast för test för att bestämma sensorthreshold
Delay(500);
Serial.println(sensorvalue);
}