Δημιουργία αυτόματου χρονόμετρου για δρομείς, αθλητές και αθλητές

Δοκιμάστε Το Όργανο Μας Για Την Εξάλειψη Των Προβλημάτων





Σε αυτήν την ανάρτηση πρόκειται να δημιουργήσουμε ένα χρονόμετρο που ξεκινά αυτόματα το χρονόμετρο όταν ο δρομέας αρχίζει να τρέχει και ο χρονοδιακόπτης σταματά όταν ο δρομέας φτάσει στο τέλος. Ο χρόνος που έχει παρέλθει μεταξύ του σημείου έναρξης και λήξης εμφανίζεται σε LCD 16 x 2.

Αρχικά ας ξεκινήσουμε μαθαίνοντας πώς να διαμορφώσουμε ένα απλό και εξαιρετικά ακριβές κύκλωμα διακοπής Arduino.



Ένα χρονόμετρο είναι μια χειροκίνητα ελεγχόμενη συσκευή ρολογιού χρόνου που έχει σχεδιαστεί για τη μέτρηση του χρονικού διαστήματος που μπορεί να έχει παρέλθει ξεκινώντας από μια συγκεκριμένη χρονική στιγμή όταν ενεργοποιήθηκε και από τη στιγμή που τελικά απενεργοποιήθηκε. Μια μεγαλύτερη παραλλαγή της ίδιας συσκευής ονομάζεται το χρονόμετρο που χρησιμοποιείται για την παρακολούθηση της δράσης από απόσταση και βρίσκεται συνήθως σε αθλητικό γήπεδο κ.λπ.

Μηχανική εναντίον Ηλεκτρονικού χρονόμετρου

Νωρίτερα το παραδοσιακό μηχανικό χρονόμετρο χειρός ήταν πιο συνηθισμένο και χρησιμοποιήθηκε από όλους για το σκοπό αυτό.



Στο μηχανικό σύστημα είχαμε δύο κουμπιά για την εκτέλεση των λειτουργιών του χρονόμετρου. Ένα για την εκκίνηση του ρολογιού διακοπής πατώντας μία φορά και για διακοπή του χρόνου πατώντας το ίδιο κουμπί για άλλη μια φορά για την εγγραφή του παρελθόντος χρόνου .... το δεύτερο κουμπί χρησιμοποιήθηκε για την επαναφορά του ρολογιού στο μηδέν.

Το μηχανικό χρονόμετρο ουσιαστικά λειτούργησε μέσω της ισχύος του ελατηρίου, η οποία απαιτούσε χρονική περίοδο εκκαθάρισης χειροκίνητα περιστρέφοντας το δεδομένο κοχλία στο πάνω μέρος της συσκευής ρολογιού.

Ωστόσο, σε σύγκριση με τα σύγχρονα ψηφιακά χρονόμετρα, οι μηχανικοί τύποι μπορούν να θεωρηθούν σημαντικά πρωτόγονοι και ανακριβείς στο εύρος των χιλιοστών του δευτερολέπτου.

Χρησιμοποιώντας ένα Arduino

Και σήμερα με την έλευση του μικροελεγκτή, αυτά τα χρονόμετρα έχουν γίνει εξαιρετικά ακριβή και αξιόπιστα στη σειρά μικροδευτερολέπτων.

Το κύκλωμα ρολογιού Arduino που παρουσιάζεται εδώ είναι ένας από αυτούς τους σύγχρονους σχεδιασμούς που τροφοδοτούνται με μικροελεγκτή, ο οποίος είναι πιο ακριβής, αναμένεται να είναι ο ίδιος με τα εμπορικά σύγχρονα gadget.

Ας μάθουμε πώς να φτιάχνουμε το προτεινόμενο κύκλωμα χρονισμού Arduino:

Θα χρειαστείτε τον ακόλουθο λογαριασμό υλικών για την κατασκευή:

Απαιτείται υλικό

Ένα Arduino LCD KeyPad Shield (SKU: DFR0009)

Ένα Arduino LCD KeyPad Shield (SKU: DFR0009)

Ένας πίνακας Arduino ONE

Arduino UNO

Ένα καλώδιο USB Arduino

καλώδιο arduino usb

Μόλις αποκτήσετε το παραπάνω υλικό και τα συνδέσετε μεταξύ τους, πρόκειται απλώς για τη διαμόρφωση του ακόλουθου κώδικα σκίτσων στον πίνακα Arduino και να παρακολουθήσετε τη μαγεία των λειτουργιών του χρονόμετρου.

Ο κώδικας

/*
Standalone Arduino StopWatch
By Conor M - 11/05/15
Modified by Elac - 12/05/15
*/
// call the necessary libraries
#include
#include
// these are the pins used on the shield for this sketch
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7)
// variables used on more than 1 function need to be declared here
unsigned long start, finished, elapsed
boolean r = false
// Variables for button debounce time
long lastButtonPressTime = 0 // the last time the button was pressed
long debounceDelay = 50 // the debounce time keep this as low as possible
void setup()
{
lcd.begin(16, 2) // inicialize the lcd (16 chars, 2 lines)
// a little introduction :)
lcd.setCursor(4, 0) // set the cursor to first character on line 1 - NOT needed (it sets automatically on lcd.begin()
lcd.print('Arduino')
lcd.setCursor(3, 1) // set the cursor to 4th character on line 2
lcd.print('StopWatch')
delay(2000) // wait 2 seconds
lcd.clear() // clear the display
lcd.print('Press select for')
lcd.setCursor(2, 1) // set the cursor to 3rd character on line 2
lcd.print('Start & Stop')
}
void loop()
{
CheckStartStop()
DisplayResult()
}
void CheckStartStop()
{
int x = analogRead (0) // assign 'x' to the Arduino's AnalogueInputs (Shield's buttons)
if (x 600 ) // if the button is SELECT
{
if ((millis() - lastButtonPressTime) > debounceDelay)
{
if (r == false)
{
lcd.clear()
lcd.setCursor(2, 0) // needed
lcd.print('Elapsed Time')
start = millis() // saves start time to calculate the elapsed time
}
else if (r == true)
{
lcd.setCursor(2, 0) // needed
lcd.print(' Final Time ')
}
r = !r
}
lastButtonPressTime = millis()
}
}
void DisplayResult()
{
if (r == true)
{
finished = millis() // saves stop time to calculate the elapsed time
// declare variables
float h, m, s, ms
unsigned long over
// MATH time!!!
elapsed = finished - start
h = int(elapsed / 3600000)
over = elapsed % 3600000
m = int(over / 60000)
over = over % 60000
s = int(over / 1000)
ms = over % 1000
// display the results
lcd.setCursor(0, 1)
lcd.print(h, 0) // display variable 'h' - the 0 after it is the
number of algorithms after a comma (ex: lcd.print(h, 2) would print
0,00
lcd.print('h ') // and the letter 'h' after it
lcd.print(m, 0)
lcd.print('m ')
lcd.print(s, 0)
lcd.print('s ')
if (h <10)
{
lcd.print(ms, 0)
lcd.print('ms ')
}
}
}

Προσθήκη οθόνης 7 τμημάτων

Τώρα ας προχωρήσουμε με τις λεπτομέρειες σχετικά με την κατασκευή ενός κυκλώματος χρονόμετρου χρησιμοποιώντας οθόνη LED 7 τμημάτων και Arduino. Θα διερευνήσουμε τις έννοιες που σχετίζονται με τις διακοπές και τα IC του προγράμματος οδήγησης οθόνης που είναι ζωτικής σημασίας για την κατανόηση αυτού του έργου. Αυτό το έργο προτάθηκε από τον κ. Abu-Hafss, ο οποίος είναι ένας από τους άπληστους αναγνώστες αυτής της ιστοσελίδας.

Όπως ήδη γνωρίζουμε ότι το χρονόμετρο είναι μια συσκευή που βοηθά στην παρακολούθηση σύντομης χρονικής περιόδου από ώρες έως χιλιοστά του δευτερολέπτου (κυρίως). Σχεδόν όλα τα φθηνά ψηφιακά ρολόγια χειρός που είναι εξοπλισμένα με λειτουργίες χρονόμετρου, αλλά κανένα από τα ρολόγια δεν μπορεί να δώσει την επιθυμία να φτιάξει ένα για τον εαυτό μας και επίσης να βρούμε ένα χρονόμετρο με οθόνη LED 7 τμημάτων.

Ο κ. Abu-Hafss μας πρότεινε να σχεδιάσουμε ένα χρονόμετρο με 4 οθόνες, δύο για λεπτά και δύο για δευτερόλεπτα (MM: SS). Αλλά για τους περισσότερους από εμάς μπορεί να μην είναι εφικτός σχεδιασμός, οπότε προσθέσαμε δύο ακόμη οθόνη για εύρος χιλιοστών του δευτερολέπτου, οπότε τώρα ο προτεινόμενος σχεδιασμός θα είναι σε διαμόρφωση MM: SS: mS.

Εάν χρειάζεστε απλώς διαμόρφωση MM: SS για κάποιο λόγο, δεν χρειάζεται να συνδέσετε τις ενδείξεις τμημάτων της σειράς χιλιοστών του δευτερολέπτου και τα IC του οδηγού, η όλη λειτουργία του κυκλώματος εξακολουθεί να μην επηρεάζεται.

Το κύκλωμα:

Το προτεινόμενο χρονόμετρο αποτελείται από έξι IC 4026 που είναι επτά τμήματα οδηγού οθόνης, έξι οθόνες LED 7 τμημάτων, μία πλακέτα Arduino, δύο μπουτόν και δύο αντιστάσεις 10K.

Τώρα ας καταλάβουμε πώς να συνδέσουμε την οθόνη IC 4026 σε 7 τμήματα.

Η οθόνη 7 τμημάτων μπορεί να είναι οποιαδήποτε κοινή οθόνη καθόδου οποιουδήποτε χρώματος. Η οθόνη 7 τμημάτων μπορεί να σκοτωθεί εύκολα από την τροφοδοσία 5V, οπότε μια αντίσταση 330 ohm είναι υποχρεωτική σε κάθε τμήμα της οθόνης.

Τώρα ας δούμε το διάγραμμα ακίδων του IC 4026:

  • Ο πείρος # 1 είναι είσοδος ρολογιού.
  • Ο πείρος # 2 είναι απενεργοποίηση ρολογιού, απενεργοποιεί τον αριθμό στην οθόνη εάν αυτός ο πείρος είναι υψηλός.
  • Ο πείρος # 3 είναι ενεργοποιημένος στην οθόνη εάν αυτός ο πείρος είναι χαμηλός, η οθόνη θα συντονιστεί και το αντίστροφο.
  • Ο πείρος # 5 είναι εκτεταμένος, ο οποίος γίνεται υψηλός όταν το IC μετράει 10.
  • Οι ακίδες 6, 7, 9, 10, 11, 12, 13 είναι έξοδοι οθόνης.
  • Ο πείρος # 8 είναι GND.
  • Ο πείρος # 16 είναι Vcc.
  • Ο ακροδέκτης # 15 επαναφέρεται, αν ανεβάζουμε αυτόν τον πείρο, ο αριθμός μετατρέπεται στο μηδέν.
  • Οι ακίδες # 4 και # 14 δεν χρησιμοποιούνται.

Διάγραμμα σύνδεσης οθόνης:

Διάγραμμα σύνδεσης οθόνης LCD:

Οποιοσδήποτε από τον ακροδέκτη GND της οθόνης 7 τμημάτων μπορεί να συνδεθεί στη γείωση. Το IC πρέπει να τροφοδοτείται από τροφοδοσία 5V ή τον πείρο εξόδου 5V του Arduino.

Το παραπάνω σχηματικό για μία μόνο οθόνη, επαναλάβετε το ίδιο για πέντε άλλες οθόνες.

Εδώ είναι το υπόλοιπο σχηματικό:

Χρονόμετρο με χρήση του Arduino με οθόνη 7 τμημάτων

Το κύκλωμα μπορεί να τροφοδοτείται από μπαταρία 9V. Τα δύο κουμπιά παρέχονται εδώ ένα για να ξεκινήσει η ώρα και ένα άλλο για διακοπή. Πατώντας το κουμπί επαναφοράς στο Arduino, η ένδειξη του χρόνου θα μηδενιστεί στην οθόνη.

Τα δύο κουμπιά συνδέονται με τους ακροδέκτες # 2 και # 3 που είναι διακοπή υλικού του μικροελεγκτή Arduino / Atmega328P.

Ας καταλάβουμε τι είναι η διακοπή:

Υπάρχουν δύο τύποι διακοπών: διακοπή υλικού και διακοπή λογισμικού. Εδώ χρησιμοποιούμε μόνο τη διακοπή του υλικού.

Η διακοπή είναι ένα σήμα στον μικροελεγκτή, το οποίο θα κάνει τον μικροελεγκτή να ανταποκρίνεται αμέσως σε ένα συμβάν.

Υπάρχουν μόνο δύο καρφίτσες διακοπής υλικού στις πλακέτες Arduino με την καρφίτσα μικροελεγκτή ATmega328P # 2 και # 3. Το Arduino mega έχει περισσότερες από δύο καρφίτσες διακοπής υλικού.

Οι μικροελεγκτές δεν μπορούν να κάνουν δύο λειτουργίες ταυτόχρονα. Για παράδειγμα, έλεγχος για το πάτημα του κουμπιού και καταμέτρηση αριθμών.

Οι μικροελεγκτές δεν μπορούν να εκτελέσουν ταυτόχρονα δύο συμβάντα, εάν γράψουμε έναν κωδικό για τον έλεγχο του πάτημα των κουμπιών και την καταμέτρηση αριθμών, το πάτημα του κουμπιού θα εντοπιστεί μόνο όταν ο μικροελεγκτής διαβάζει το κομμάτι κωδικού ανίχνευσης πατήματος κουμπιού, το υπόλοιπο του χρόνου το κουμπί δεν λειτουργεί.

Επομένως, θα υπάρξει καθυστέρηση στην ανίχνευση του πατήματος του κουμπιού και για κάποιο λόγο εάν ο κώδικας σταματήσει προσωρινά, το πάτημα του κουμπιού μπορεί να μην εντοπιστεί ποτέ. Για την αποφυγή τέτοιων ζητημάτων εισάγεται η διακοπή.

Το σήμα διακοπής έχει πάντα την υψηλότερη προτεραιότητα, η κύρια λειτουργία (κύριες γραμμές κώδικα) θα σταματήσει και εκτελεί τη λειτουργία (ένα άλλο κομμάτι κώδικα) που έχει εκχωρηθεί για τη συγκεκριμένη διακοπή.

Αυτό είναι πολύ σημαντικό για κρίσιμες εφαρμογές όπως χρονόμετρο ή συστήματα ασφαλείας κ.λπ. όπου ο επεξεργαστής πρέπει να αναλάβει άμεση δράση ως απάντηση σε ένα συμβάν.

Στο Arduino ορίζουμε διακοπή υλικού ως:

attachInterrupt (0, έναρξη, RISING)

  • '0' σημαίνει τον αριθμό μηδενικής διακοπής (σε μικροελεγκτές όλα ξεκινούν από το μηδέν) που είναι ο πείρος # 2.
  • 'Start' είναι το όνομα της συνάρτησης διακοπής, μπορείτε να ονομάσετε οτιδήποτε εδώ.
  • 'RISING' εάν ο πείρος # 2 (που είναι μηδέν διακοπής) πηγαίνει ψηλά, εκτελείται η λειτουργία διακοπής.

attachInterrupt (1, Διακοπή, RISING)

  • '1' σημαίνει το νούμερο 1 διακοπής που είναι το pin # 3.
  • Το 'Stop' είναι το όνομα της διακοπής.

Μπορούμε επίσης να αντικαταστήσουμε το 'RISING' με το 'FALLING', τώρα όταν ο πείρος διακοπής πηγαίνει χαμηλά, εκτελείται η λειτουργία διακοπής.

Μπορούμε επίσης να αντικαταστήσουμε το 'RISING' με το 'CHANGE', τώρα όποτε ο πείρος διακοπής πηγαίνει από υψηλό σε χαμηλό ή χαμηλό σε υψηλό, η λειτουργία διακοπής εκτελείται.

Η συνάρτηση διακοπής μπορεί να ανατεθεί ως εξής:

void start () // start είναι το όνομα της διακοπής.

{

// πρόγραμμα εδώ

}

Η συνάρτηση διακοπής πρέπει να είναι όσο το δυνατόν συντομότερη και δεν μπορεί να χρησιμοποιηθεί η λειτουργία καθυστέρησης ().

Αυτό καταλήγει στο συμπέρασμα ότι η διακοπή λογισμικού διακοπής υλικού που σχετίζεται με το Arduino θα εξηγηθεί σε μελλοντικό άρθρο.

Τώρα ξέρετε γιατί συνδέσαμε τα κουμπιά έναρξης και διακοπής για διακοπή των καρφιτσών.

Συνδέστε το κύκλωμα σύμφωνα με το διάγραμμα, το υπόλοιπο κύκλωμα είναι αυτονόητο.

Πρόγραμμα:

//----------------Program Developed by R.GIRISH---------------//
int vmin = 0
int vsec = 0
int vms = 0
boolean Run = false
const int Min = 7
const int sec = 6
const int ms = 5
const int reset_pin = 4
void setup()
{
pinMode(Min, OUTPUT)
pinMode(sec, OUTPUT)
pinMode(ms, OUTPUT)
pinMode(reset_pin, OUTPUT)
digitalWrite(Min, LOW)
digitalWrite(sec, LOW)
digitalWrite(ms, LOW)
digitalWrite(reset_pin, HIGH)
digitalWrite(reset_pin, LOW)
attachInterrupt(0, start, RISING)
attachInterrupt(1, Stop, RISING)
}
void loop()
{
if (Run)
{
vms = vms + 1
digitalWrite(ms, HIGH)
delay(5)
digitalWrite(ms, LOW)
delay(5)
if (vms == 100)
{
vsec = vsec + 1
digitalWrite(sec, HIGH)
digitalWrite(sec, LOW)
vms = 0
}
if (vsec == 60)
{
vmin = vmin + 1
digitalWrite(Min, HIGH)
digitalWrite(Min, LOW)
digitalWrite(reset_pin, HIGH)
digitalWrite(reset_pin, LOW)
vsec = 0
}
}
}
void start()
{
Run = true
}
void Stop()
{
Run = false
}
//----------------Program Developed by R.GIRISH---------------//

Τώρα που καταλήγει στον κώδικα.

Χρονόμετρο ειδικά σχεδιασμένο για τους αθλητές

Τέλος, ας μάθουμε πώς οι παραπάνω ιδέες cam αναβαθμίζονται πραγματικά για αθλητές που επιθυμούν να αναπτύξουν τις ικανότητές τους σε λειτουργία χωρίς να εξαρτάται από άλλους για την απαραίτητη έναρξη και να σταματήσει το χρονόμετρο / χρονόμετρο. Είναι καλύτερα να ξεκινήσετε αυτόματα το χρονόμετρο ανιχνεύοντας την κίνησή σας από κάποιον που ξεκινά / σταματά το χρονόμετρο, κάτι που μπορεί να προσθέσει και τον χρόνο αντίδρασης.

ΣΗΜΕΙΩΣΗ: Αυτό το έργο έχει σχεδιαστεί για τη μέτρηση του χρόνου μεταξύ του σημείου «A» έως του σημείου «B» που καλύπτεται από έναν χρήστη κάθε φορά.

Η εγκατάσταση αποτελείται από δύο λέιζερ τοποθετημένα στο σημείο εκκίνησης και στο σημείο λήξης, δύο LDR τοποθετούνται επίσης απέναντι από δύο μονάδα λέιζερ. Όταν ο αθλητής διακόπτει το λέιζερ «εκκίνησης», ο χρόνος αρχίζει να υπολογίζεται και όταν ο αθλητής φτάσει στο τέλος, διακόπτει το λέιζερ «τερματισμού» και ο χρονοδιακόπτης σταματά και εμφανίζει τον χρόνο που έχει παρέλθει μεταξύ δύο σημείων. Αυτή είναι η μέθοδος που χρησιμοποιείται για τη μέτρηση του παρελθόντος χρόνου στην προτεινόμενη ιδέα.

Ας δούμε λεπτομερώς κάθε στοιχείο του κυκλώματος.

Στοιχεία εργασίας στοιχείων

Το κύκλωμα διατηρείται αρκετά απλό, αποτελείται από μονάδα LCD 16 x 2, λίγες αντιστάσεις, δύο LDR και ένα κουμπί.

Η διασύνδεση μεταξύ LCD και arduino είναι στάνταρ, μπορούμε να βρούμε παρόμοια σύνδεση σε πολλά άλλα έργα που βασίζονται σε LCD.

Δύο αναλογικοί ακροδέκτες Α0 και Α1 χρησιμοποιούνται για την ανίχνευση διακοπών λέιζερ. Ο αναλογικός πείρος Α2 συνδέεται με το κουμπί που χρησιμοποιείται για να οπλίσει το χρονόμετρο.

Τρεις αντιστάσεις, δύο 4,7K και μία 10K είναι pull-down αντιστάσεις που βοηθούν τους ακροδέκτες εισόδου να παραμείνουν στο χαμηλό.

Το ποτενσιόμετρο 10K παρέχεται για ρύθμιση της αντίθεσης στη μονάδα LCD για βέλτιστη ορατότητα.

Το προτεινόμενο κύκλωμα έχει σχεδιαστεί με μηχανισμό ανίχνευσης σφαλμάτων για λέιζερ. Εάν κάποιο από τα λέιζερ είναι λάθος ή δεν ευθυγραμμίζεται σωστά με το LDR, εμφανίζει ένα μήνυμα σφάλματος στην οθόνη LCD.

· Εάν το λέιζερ START δεν λειτουργεί, εμφανίζει το λέιζερ «εκκίνησης» δεν λειτουργεί »

· Εάν το λέιζερ STOP δεν λειτουργεί, εμφανίζει το λέιζερ 'stop' δεν λειτουργεί '

· Εάν και τα δύο λέιζερ δεν λειτουργούν, εμφανίζεται η ένδειξη 'Και τα δύο λέιζερ δεν λειτουργούν'

· Εάν και τα δύο λέιζερ λειτουργούν σωστά, εμφανίζεται η ένδειξη 'Και τα δύο λέιζερ λειτουργούν καλά'

Το μήνυμα σφάλματος εμφανίζεται έως ότου η μονάδα λέιζερ σταθεροποιηθεί ή η ευθυγράμμιση γίνει σωστά με το LDR.

Μόλις αυτό το βήμα δεν έχει πρόβλημα, το σύστημα μεταβαίνει σε κατάσταση αναμονής και εμφανίζει την ένδειξη '-αναμονή συστήματος'. Σε αυτό το σημείο ο χρήστης μπορεί να οπλίσει την εγκατάσταση πατώντας το κουμπί ανά πάσα στιγμή.

Μόλις πατηθεί το κουμπί, το σύστημα είναι έτοιμο να ανιχνεύσει κίνηση από τον χρήστη και εμφανίζει 'Το σύστημα είναι έτοιμο'.

Ο δρομέας μπορεί να απέχει λίγες ίντσες από το λέιζερ «start».

Εάν το λέιζερ 'εκκίνησης' διακοπεί, ο χρόνος αρχίζει να μετρά και οι ενδείξεις 'Ο χρόνος υπολογίζεται ......' Ο χρόνος υπολογίζεται στο πίσω έδαφος.

Ο χρόνος που έχει παρέλθει δεν θα εμφανίζεται έως ότου ο δρομέας φτάσει / διακόψει το λέιζερ «διακοπής». Αυτό συμβαίνει επειδή η εμφάνιση του χρόνου που παρέλθει στην οθόνη LCD όπως συμβαίνει με το παραδοσιακό χρονόμετρο, απαιτεί την εκτέλεση αρκετών πρόσθετων οδηγιών στον μικροελεγκτή, γεγονός που επιδεινώνει σημαντικά την ακρίβεια της εγκατάστασης.

ΣΗΜΕΙΩΣΗ: Πατήστε το κουμπί επαναφοράς στο arduino για να διαγράψετε τις ενδείξεις.

Πώς να ρυθμίσετε το κύκλωμα σε τροχιά λειτουργίας:

Χρησιμοποιήστε παχιά καλώδια για να συνδεθείτε μεταξύ LDR και κύκλου arduino καθώς η απόσταση μεταξύ αυτών των δύο μπορεί να είναι αρκετά μέτρα μεταξύ τους και η τάση δεν πρέπει να πέσει σημαντικά. Η απόσταση μεταξύ LDR1 και LDR2 μπορεί να είναι μερικές εκατοντάδες μέτρα το πολύ.

Πώς να προσαρτήσετε το LDR:

Το LDR πρέπει να τοποθετηθεί μέσα σε κοίλο αδιαφανές σωλήνα και το μπροστινό μέρος πρέπει επίσης να είναι καλυμμένο και μόνο μια τρύπα με διάμετρο λίγων χιλιοστών είναι κατασκευασμένη για να επιτρέπεται η είσοδος της δέσμης λέιζερ.

Το LDR πρέπει να προστατεύεται από το άμεσο ηλιακό φως, καθώς δεν μπορεί να διαφοροποιηθεί από τη δέσμη λέιζερ και άλλη πηγή φωτός και ενδέχεται να μην καταγράφει κίνηση από το χρήστη.

Κωδικός προγράμματος:

//-------- Program developed by R.GIRISH-------//
#include
LiquidCrystal lcd(12,11,5,4,3,2)
int strt = A0
int stp = A1
int btn = A2
int M = 0
int S = 0
int mS = 0
float dly = 10.0
void setup()
{
lcd.begin(16,2)
pinMode(strt,INPUT)
pinMode(stp,INPUT)
pinMode(btn,INPUT)
}
void loop()
{
if(digitalRead(strt)==HIGH && digitalRead(stp)==HIGH)
{
lcd.setCursor(0,0)
lcd.print('Both lasers are')
lcd.setCursor(0,1)
lcd.print(' working fine')
delay(4000)
{
while(digitalRead(btn)==LOW)
{
lcd.clear()
lcd.print('-System Standby-')
lcd.setCursor(0,1)
lcd.print('Press Start btn')
delay(100)
}
lcd.clear()
lcd.setCursor(0,0)
lcd.print('System is ready')
lcd.setCursor(0,1)
lcd.print('----------------')
while(digitalRead(strt)==HIGH)
{
delay(1)
}
lcd.clear()
lcd.setCursor(0,0)
lcd.print('Time is being')
lcd.setCursor(0,1)
lcd.print('Calculated......')
while(digitalRead(stp)==HIGH)
{
delay(dly)
mS = mS+1
if(mS==100)
{
mS=0
S = S+1
}
if(S==60)
{
S=0
M = M+1
}
}
while(true)
{
lcd.clear()
lcd.setCursor(0,0)
lcd.print(M)
lcd.print(':')
lcd.print(S)
lcd.print(':')
lcd.print(mS)
lcd.print(' (M:S:mS)')
lcd.setCursor(0,1)
lcd.print('Press Reset')
delay(1000)
}
}
}
if(digitalRead(strt)==HIGH && digitalRead(stp)==LOW)
{
lcd.setCursor(0,0)
lcd.print(''Stop' laser is')
lcd.setCursor(0,1)
lcd.print(' not working')
delay(100)
}
if(digitalRead(strt)==LOW && digitalRead(stp)==HIGH)
{
lcd.setCursor(0,0)
lcd.print(''Start' laser is')
lcd.setCursor(0,1)
lcd.print(' not working')
delay(100)
}
if(digitalRead(strt)==LOW && digitalRead(stp)==LOW)
{
lcd.setCursor(0,0)
lcd.print('Both lasers are')
lcd.setCursor(0,1)
lcd.print(' not working')
delay(100)
}
lcd.clear()
}
//-------- Program developed by R.GIRISH-------//

Πρωτότυπο συγγραφέα:

Αναβάθμιση με δυνατότητα Split Timer

Το προτεινόμενο αυτόματο κύκλωμα χρονόμετρου με διαχωριστή χρονοδιακόπτη είναι μια επέκταση του αυτόματου κυκλώματος χρονόμετρου, όπου το χρονόμετρο παρακολουθεί αυτόματα τον χρόνο μόλις ο σόλο δρομέας φύγει από το σημείο εκκίνησης και ο χρονοδιακόπτης σταματά και εμφανίζει τον χρόνο που έχει παρέλθει καθώς ο δρομέας φτάνει στο τελικό σημείο.

Εισαγωγή

Αυτό το έργο προτάθηκε από έναν από τους άπληστους αναγνώστες αυτής της ιστοσελίδας κ. Andrew Walker.

Σε αυτό το έργο παρουσιάζουμε 4 ακόμη LDR για τη μέτρηση του χρόνου διάσπασης του σόλο δρομέα. Υπάρχουν 6 LDR συνολικά, όλα αυτά μπορούν να τοποθετηθούν στην πίστα με ομοιόμορφη απόσταση μεταξύ τους ή ανάλογα με τις περιστάσεις και την επιλογή του χρήστη.

Το μεγαλύτερο μέρος του υλικού διατηρείται αμετάβλητο εκτός από την προσθήκη 4 LDR, αλλά ο κώδικας έχει υποστεί τεράστια τροποποίηση.

Σχηματικό διάγραμμα που δείχνει χρόνο διάσπασης:

Αυτόματο χρονόμετρο με χωριστό χρόνο

Το παραπάνω κύκλωμα αποτελείται από λίγα εξαρτήματα και φιλικό για αρχάριους. Δεν απαιτείται περαιτέρω εξήγηση, απλώς σύρμα σύμφωνα με το διάγραμμα κυκλώματος.

Πώς να συνδέσετε LDR:

Το LDR 2 εμφανίζεται στο διάγραμμα κύριου κυκλώματος συνδέστε 4 ακόμη LDR παράλληλα όπως φαίνεται στο παραπάνω διάγραμμα.

Διάγραμμα διάταξης:

Τα παραπάνω είναι η βασική ρύθμιση για το πώς να τοποθετήσετε το λέιζερ. Λάβετε υπόψη ότι η απόσταση μεταξύ των LDR μπορεί να είναι επιλογή του χρήστη ανάλογα με το μήκος του κομματιού.

Πρόγραμμα:

//------------Developed By R.Girish-------//
#include
LiquidCrystal lcd(12,11,5,4,3,2)
const int start = A2
const int strt = A0
const int END = A1
boolean y = true
boolean x = true
unsigned int s1 = 0
unsigned int s2 = 0
unsigned int s3 = 0
unsigned int s4 = 0
unsigned int s5 = 0
unsigned int m1 = 0
unsigned int m2 = 0
unsigned int m3 = 0
unsigned int m4 = 0
unsigned int m5 = 0
unsigned int ms1 = 0
unsigned int ms2 = 0
unsigned int ms3 = 0
unsigned int ms4 = 0
unsigned int ms5 = 0
unsigned int S = 0
unsigned int M = 0
unsigned int mS = 0
unsigned int count = 0
void setup()
{
lcd.begin(16,2)
pinMode(start, INPUT)
pinMode(strt, INPUT)
pinMode(END, INPUT)
if(digitalRead(strt) == LOW)
{
while(true)
{
lcd.clear()
lcd.setCursor(0,0)
lcd.print('Start Laser is')
lcd.setCursor(0,1)
lcd.print(' not working')
delay(2500)
lcd.clear()
lcd.setCursor(0,0)
lcd.print('Please align the')
lcd.setCursor(0,1)
lcd.print('lasers properly')
delay(2500)
lcd.clear()
lcd.setCursor(0,0)
lcd.print('and press reset.')
delay(2500)
}
}
if(digitalRead(END) == LOW)
{
while(true)
{
lcd.clear()
lcd.setCursor(0,0)
lcd.print('All 5 lasers')
lcd.setCursor(0,1)
lcd.print('are misaligned')
delay(2500)
lcd.clear()
lcd.setCursor(0,0)
lcd.print('Please align the')
lcd.setCursor(0,1)
lcd.print('lasers properly')
delay(2500)
lcd.clear()
lcd.setCursor(0,0)
lcd.print('and press reset.')
delay(2500)
}
}
lcd.clear()
lcd.setCursor(0,0)
lcd.print('-System Standby-')
lcd.setCursor(0,1)
lcd.print('Press Start btn')
if(digitalRead(start) == LOW)
{
while(x)
{
if(digitalRead(start) == HIGH)
{
x = false
}
}
}
lcd.clear()
lcd.setCursor(0,0)
lcd.print('System is ready')
lcd.setCursor(0,1)
lcd.print('----------------')
while(y)
{
if(digitalRead(strt) == LOW)
{
y = false
}
}
lcd.clear()
lcd.setCursor(0,0)
lcd.print('Time is being')
lcd.setCursor(0,1)
lcd.print('Calculated....')
mS = 12
}
void loop()
{
delay(1)
mS = mS + 1
if(mS==1000)
{
mS=0
S = S+1
}
if(S==60)
{
S=0
M = M+1
}
if(digitalRead(END) == LOW)
{
count = count + 1
if(count == 1)
{
ms1 = mS
s1 = S
m1 = M
delay(500)
}
if(count == 2)
{
ms2 = mS
s2 = S
m2 = M
delay(500)
}
if(count == 3)
{
ms3 = mS
s3 = S
m3 = M
delay(500)
}
if(count == 4)
{
ms4 = mS
s4 = S
m4 = M
delay(500)
}
if(count == 5)
{
ms5 = mS
s5 = S
m5 = M
Display()
}
}
}
void Display()
{
ms1 = ms1 + 500
ms2 = ms2 + 500
ms3 = ms3 + 500
ms4 = ms4 + 500
ms5 = ms5 + 500
if(ms1 >= 1000)
{
ms1 = ms1 - 1000
s1 = s1 + 1
if(s1 >= 60)
{
m1 = m1 + 1
}
}
if(ms2 >= 1000)
{
ms2 = ms2 - 1000
s2 = s2 + 1
if(s2 >= 60)
{
m2 = m2 + 1
}
}
if(ms3 >= 1000)
{
ms3 = ms3 - 1000
s3 = s3 + 1
if(s3 >= 60)
{
m3 = m3 + 1
}
}
if(ms4 >= 1000)
{
ms4 = ms4 - 1000
s4 = s4 + 1
if(s4 >= 60)
{
m4 = m4 + 1
}
}
if(ms5 >= 1000)
{
ms5 = ms5 - 1000
s5 = s5 + 1
if(s5 >= 60)
{
m5 = m5 + 1
}
}
while(true)
{
lcd.clear()
lcd.setCursor(0,0)
lcd.print('Spilt 1)')
lcd.print(m1)
lcd.print(':')
lcd.print(s1)
lcd.print(':')
lcd.print(ms1)
lcd.setCursor(0,1)
lcd.print('Split 2)')
lcd.print(m2)
lcd.print(':')
lcd.print(s2)
lcd.print(':')
lcd.print(ms2)
delay(2500)
lcd.clear()
lcd.setCursor(0,0)
lcd.print('Split 3)')
lcd.print(m3)
lcd.print(':')
lcd.print(s3)
lcd.print(':')
lcd.print(ms3)
lcd.setCursor(0,1)
lcd.print('Split 4)')
lcd.print(m4)
lcd.print(':')
lcd.print(s4)
lcd.print(':')
lcd.print(ms4)
delay(2500)
lcd.clear()
lcd.setCursor(0,0)
lcd.print('Split 5)')
lcd.print(m5)
lcd.print(':')
lcd.print(s5)
lcd.print(':')
lcd.print(ms5)
lcd.setCursor(0,1)
lcd.print('---Press Reset--')
delay(2500)
}
}
//------------Developed By R.Girish-------//

Πώς να χρησιμοποιήσετε αυτό το αυτόματο χρονόμετρο:

• Με την ολοκλήρωση της εγκατάστασης, ενεργοποιήστε πρώτα τα λέιζερ και μετά ενεργοποιήστε το κύκλωμα Arduino στη συνέχεια.
• Εάν όλα τα λέιζερ είναι σωστά ευθυγραμμισμένα με LDR, η οθόνη δεν θα εμφανιστεί με μηνύματα σφάλματος. Εάν υπάρχει, ευθυγραμμίστε τα σωστά.
• Τώρα το κύκλωμα εμφανίζει 'Το σύστημα είναι σε αναμονή'. Τώρα πατήστε το κουμπί 'Έναρξη' και θα εμφανιστεί 'Το σύστημα είναι έτοιμο'.
• Σε αυτό το σημείο όταν ο σόλο παίκτης διακόπτει τη φωτεινή δέσμη LDR 1, ο χρονοδιακόπτης ξεκινά και εμφανίζει 'Ο χρόνος υπολογίζεται…'.
• Μόλις η συσκευή αναπαραγωγής φτάσει στο τελικό σημείο, δηλαδή LDR 6, ο χρονοδιακόπτης σταματά και εμφανίζει τον 5 χρόνο διάσπασης που καταγράφεται από το κύκλωμα.
• Ο χρήστης πρέπει να πατήσει το κουμπί επαναφοράς στο arduino για να επαναφέρει το χρονόμετρο.
Γιατί αυτό το Αυτόματο χρονόμετρο δεν μπορεί να εμφανίσει ζωντανό χρόνο στην οθόνη όπως συμβαίνει με το παραδοσιακό χρονόμετρο (αλλά μάλλον εμφανίζει ένα στατικό κείμενο 'Ο υπολογισμός του χρόνου….');
Για να εμφανιστεί ο συγχρονισμός σε πραγματικό χρόνο, το Arduino πρέπει να εκτελέσει πρόσθετες οδηγίες στην οθόνη LCD. Αυτό θα προσθέσει λίγα μικροδευτερόλεπτα σε λίγα χιλιοστά του δευτερολέπτου καθυστέρηση στο κύριο κομμάτι παρακολούθησης χρόνου, το οποίο θα οδηγήσει σε ανακριβή αποτελέσματα.

Εάν έχετε περαιτέρω απορίες, παρακαλώ εκφράστε την ενότητα σχολίων.




Προηγούμενο: Arduino LCD KeyPad Shield (SKU: DFR0009) Δελτίο δεδομένων Επόμενο: Arduino Random RGB Light Generator Circuit