Arduino hem basket Hoop poäng Detection System aka ScoreKeeper (9 / 10 steg)
Steg 9: kod
Kontrollera den Multiplexer
Ladda ner koden från ScoreKeep GitHub databaseller från den bifogade filen nedan.
För att sammanfatta, styrs segmentet med en multiplexer som utgångar till ett annat segment varje millisekund. Jag använde en timer avbryta för tidpunkten var exakt. En timer avbryta gör exakt vad den säger. Det avbryter koden på exakt tid intervallerna köra kommandon skrivna i den medföljande avbrottstjänstens rutinen (ISR). En bra tutorial på Arduino timer avbrott kan hittas här.
Timer-avbrott i denna kod utgångar till ett segment med hjälp av multiplexorn. På nästa iteration av ISR utgångar koden till ett annat segment och så vidare. Så, om vi vill visa nummer 22 (segment A, B, D, E och G av både tio och de siffran), koden skulle utgång till segmentet A av sådana siffran på den första iterationen, sedan till segmentet B, då D-segmentet, då segmentet E, sedan segment G, alla av dem siffran. På nästa iteration, den vi utgång till segmentet A av TEN siffra, sedan segmentet B, sedan segment D och segment E, sedan segmentera G. därefter, vi börjar från segmentet A av sådana siffran igen och upprepa tills siffran behöver vi Visa ändringar.
Avbryta rutin
Visar siffrorna för poäng på 7-segment display.
Den lyser ett segment varje 1 ms uppräkning segmentet indexera varje iteration.
ISR(TIMER1_COMPA_vect)
{
Sådana siffror
om (index < 8) {
om (bitRead (HEXvalues [poäng 10] %, index))
{
myMux.open(index);
}
index ++;
}
Tens siffra
annars om (index > = 8 & & index < 16) {
om (bitRead(HEXvalues[score/10],index-8))
{
myMux.open(index);
}
index ++;
}
återställer index
annat {
index = 0;
}
}
Upptäcka en poäng
Med hjälp av avstånd sensor kod, använder avstånd återvände vi och kolla om den ligger under en "scoreThreshold". Om avståndet till nästa närmaste objektet blir riktigt nära, måste då det vara en boll som går igenom hoop. Dessutom har jag lagt en eldfasta period för att upptäcka ett skott. Detta innebär, när ett skott upptäcks vid tiden t, och sedan en annan skott inte kan registreras förrän en viss tid efter annan t. Jag tror att jag valde 2 sekunder, men du kan välja att öka eller minska detta som du tycker passar. Detta görs eftersom funktionen loop() av Arduino går så snabbt att det skulle registrera samma skott mer än en gång som bollen rör sig genom bågen.
Boolean detectScore()
sant om skott upptäcks, falskt om annars
//
Identifierar huruvida ett skott gjordes genom att kontrollera om den
avståndet från ultraljud avstånd sensorn till nästa närmaste
objektet är under "tröskeln" används för att avgöra när ett skott
gjordes.
Boolean detectScore()
{
Return (distance() < = scoreThreshold);
}
Dubbelrum distance()
avståndet i centimeter (cm)
Beräknar avståndet från sensorn till nästa närmaste
objekt.
Dubbelrum distance()
{
dubbel längd = 0;
digitalWrite (trigPin, hög); skicka ut puls
delayMicroseconds(50); ge puls tid
digitalWrite (trigPin, låg); stänga av puls
längd = pulseIn (echoPin, hög); Läs echo pin
tillbaka (längd/2) / 29,1; i cm
}
Increment poäng
Steg om poäng efter en punkt när en poäng upptäcks.
void incrementScore()
Delar variabeln poäng i 1.
void incrementScore()
{
poäng + = 1;
}