Stap 4: programmeren
U kunt de "schets" voor het programma hieronder downloaden.
De rpm_fun functie is de interrupt-functie die wordt aangeroepen wanneer de gegevens op pin 2 gewijzigd van hoog naar laag (een vallende puls). Het werkt de globale rpmcount, dan schakelt de status-LED.
void rpm_fun() { //Each rotation, this interrupt //function is run twice, so take //that into consideration for //calculating RPM //Update count rpmcount++; //Toggle status LED if (status == LOW) { status = HIGH; } else { status = LOW; } digitalWrite(statusPin, status);}
Setup initialiseert de variabelen, configureert de seriële parameters ingesteld van de pin-modi en de interrupt-functie is ingesteld.
void setup() { Serial.begin(9600); //Interrupt 0 is digital pin 2, so that is where //the IR detector is connected //Triggers on FALLING (change from HIGH to LOW) attachInterrupt(0, rpm_fun, FALLING); //Turn on IR LED pinMode(ledPin, OUTPUT); digitalWrite(ledPin, HIGH); //Use statusPin to flash along with interrupts pinMode(statusPin, OUTPUT); rpmcount = 0; rpm = 0; timeold = 0; status = LOW; }
De loop-functie, is zoals de naam al impliceert, de belangrijkste verwerking lus die "voor eeuwig" loopt terwijl de Raad van bestuur is ingeschakeld. De eerste verklaring vertragingen gedurende één seconde (1000 milliseconden), maar merk op dat de interrupt-functie breken zal in elke keer de waarde van pin 2 verandert en de rpm_fun functie uitvoert. Nadat de 1 seconde vertraging, de interrupt is tijdelijk uitgeschakeld (dit kan niet nodig, maar schijnt veiliger) dan de RPM is berekend op basis van het aantal interrupts en de verstreken tijd tussen nu en de laatste keer dat de berekening is opgetreden. Het resultaat wordt teruggestuurd naar de computer via de seriële poort, en vervolgens de interrupt wordt hersteld.
void loop() { //Update RPM every second delay(1000); //Don't process interrupts during calculations detachInterrupt(0); rpm = 30*1000/(millis() - timeold)*rpmcount; timeold = millis(); rpmcount = 0; //Write it out to serial port Serial.println(rpm,DEC); //Restart the interrupt processing attachInterrupt(0, rpm_fun, FALLING); }
Merk op dat de manier waarop de motor en de IR-detector is geconfigureerd, elke één beurt van de spoel zal resulteren in twee overgangen, dus de berekening die in werking duurt. Hetzelfde zou optreden voor een twee blads fan of propeller. Als er slechts een lichte pauze per omwenteling voorgedaan, zoals een swingende arm, zou de berekening:
rpm = 60*1000/(millis() - timeold)*rpmcount;
Voor een drie blads fan zou de berekening:
rpm = 20*1000/(millis() - timeold)*rpmcount;