Paso 9: código
Control del multiplexor
Descargar el código desde el Repositorio de GitHub ScoreKeep, o desde el archivo adjunto más abajo.
Para resumir, el segmento es controlado mediante un multiplexor que a un segmento diferente cada milisegundo. Usé una interrupción de temporizador para que el momento fue preciso. Una interrupción de timer hace exactamente lo que dice. Interrumpe el código en intervalos de tiempo precisos para ejecutar comandos en el acompañamiento rutina de servicio de interrupción (ISR). Aquí encontrarás un buen tutorial sobre interrupciones de timer de Arduino.
La interrupción de temporizador en este código las salidas a un solo segmento con el multiplexor. En la siguiente iteración de la ISR, el código de salida a otro segmento y así sucesivamente. Por lo tanto, si quisiéramos mostrar el número 22 (segmentos A, B, D, E y G de los dígitos de decenas y unidades), el código sería salida al segmento A de los dígitos en la primera iteración, entonces al segmento B, luego segmento D, luego el segmento E, luego segmento G, todos los dígitos. En la siguiente iteración, la salida al segmento A de los diez dígitos, luego segmento B, luego segmento D, luego el segmento E, luego segmento G. posteriormente, partimos del segmento A de la cifra de los otra vez y repita hasta que el número que necesitamos mostrar cambios.
//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; } }
Detectar una puntuación
Utilice el código de sensor de distancia, utilizar la distancia regresada y compruebe si está por debajo de un "scoreThreshold". Si la distancia hasta el objeto más cercano siguiente obtiene muy cerca, entonces debe ser una bola pasando por el aro. Además, he añadido un período refractario para la detección de un tiro. Esto significa que cuando se detecta un disparo en el tiempo t, y luego otro disparo no pueden registrarse hasta un cierto tiempo t. Creo que opté por 2 segundos, pero puede aumentar o disminuir esto como mejor parezca. Esto se hace porque la función loop() de Arduino corre tan rápido que registraría el mismo disparó más de una vez como la bola se mueve a través del aro.
//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 }
Puntaje de incremento
Incrementos de puntuación por un punto cuando se detecta una puntuación.
//void incrementScore() //Increments the score variable by 1. void incrementScore() { score += 1; }