Stap 9: Code
Beheersing van de Multiplexer
Download de code vanuit de ScoreKeep GitHub Repositoryof vanuit het bijgevoegde bestand hieronder.
Om samen te vatten, is het segment gecontroleerd met behulp van een multiplexer die elke milliseconde-uitgang van een ander segment. Ik gebruikte een timer onderbreken om dat de timing nauwkeurig was. Een timer-interrupt doet precies wat het zegt. Het Hiermee onderbreekt u de code op precieze tijdstippen uit te voeren opdrachten die zijn geschreven in de begeleidende interrupt service routine (ISR). Een goede tutorial over Arduino timer interrupts kan hier worden gevonden.
De timer onderbreken in deze code uitgangen aan een enkel segment met behulp van de multiplexer. Op de volgende iteratie van de ISR uitgangen de code naar het andere segment, enzovoort. Dus, als wij zou willen tonen de nummer 22 (segmenten A, B, D, E en G van het trans-Europese netwerken en degenen cijfer), de code zou de uitgang naar deel A van het cijfer van de enen op de eerste iteratie, vervolgens naar segment B en D segment en segment E, vervolgens G, alle van de enen cijfer segment. Op de volgende iteratie, we uitvoer naar deel A van de tientallen cijfer, dan segment B, dan segment D, dan segment E, vervolgens segment G. daarna, starten we weer uit segment A van het cijfer van de enen en herhalen tot het nummer we moeten wijzigingen worden weergegeven.
//Interrupt Service Routine //Displays the numbers for the score on the 7-segment display. //It lights a single segment every 1 ms incrementing the segment index every iteration. ISR(TIMER1_COMPA_vect) { //Ones digit if (index < 8) { if (bitRead(HEXvalues[score%10],index)) { myMux.open(index); } index++; } //Tens digit else if (index >= 8 && index < 16) { if (bitRead(HEXvalues[score/10],index-8)) { myMux.open(index); } index++; } //resets index else { index = 0; } }
Opsporen van een score
Met behulp van de code van de sensor afstand, we gebruiken de afstand keerde terug en controleer of het is hieronder een "scoreThreshold." Als de afstand tot de volgende dichtstbijzijnde object echt dicht bij elkaar, krijgt dan moet het een bal gaan door de hoepel. Bovendien, heb ik toegevoegd een refractaire periode voor het opsporen van een schot. Dit betekent dat, wanneer een schot is waargenomen op tijdstip t, dan nog een schot tot een bepaalde hoeveelheid tijd na tijd t kan niet worden geregistreerd. Ik denk dat ik koos 2 seconden, maar u kunt verhogen of verlagen dit zoals u goeddunkt. Dit is gedaan omdat de functie van de loop van de Arduino zo snel loopt dat het hetzelfde schot meer dan eens als de bal beweegt door de hoepel zou registreren.
//boolean detectScore() // true if shot is detected, false if otherwise // //Detects whether or not a shot was made by checking if the //distance from the ultrasonic distance sensor to the next closest //object is under the "threshold" used to determine when a shot //was made. boolean detectScore() { return (distance() <= scoreThreshold); } //double distance() // the distance in centimeters (cm) //Calculates the distance from the sensor to the next closest //object. double distance() { double duration = 0; digitalWrite(trigPin, HIGH); //send out pulse delayMicroseconds(50); //give the pulse time digitalWrite(trigPin, LOW); //turn off pulse duration = pulseIn(echoPin, HIGH); //read echo pin return (duration/2) / 29.1; //in cm }
Increment score
Stappen van de score voor een punt wanneer een score wordt gedetecteerd.
//void incrementScore() //Increments the score variable by 1. void incrementScore() { score += 1; }