Κάντε ένα παιχνίδι Buzz Wire με ένα Arduino

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

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

Σε αυτό το διασκεδαστικό έργο, θα μάθουμε πώς να κάνουμε ένα παιχνίδι καλωδίων buzz με το Arduino. Πολλά από τα εξαρτήματα που χρειάζεστε μπορούν να βρεθούν σε ένα κιτ εκκίνησης (What's Included in a Starter Kit) [Το MakeUseOf Εξηγεί] Τι Περιλαμβάνεται σε ένα Κιτ Starter Arduino [MakeUseOf Εξηγεί] Έχω εισαγάγει προηγουμένως το Arduino open- πηγαίο υλικό εδώ στο MakeUseOf, αλλά θα χρειαστείτε κάτι περισσότερο από το πραγματικό Arduino για να χτίσετε κάτι από αυτό και να ξεκινήσετε. Αρτίνιο "αρχικά κιτ" είναι ... Διαβάστε περισσότερα;) και γύρω από το σπίτι. Αυτό το πρόγραμμα χρησιμοποιεί ένα Arduino, αν και θα μπορούσατε να χρησιμοποιήσετε σχεδόν οποιοδήποτε μικροελεγκτή που έχετε γύρω (ρίξτε μια ματιά σε αυτή τη σύγκριση μεταξύ $ 5 μικροελεγκτών $ 5 Μικροελεγκτές: Arduino, Raspberry Pi Zero, Ή NodeMCU; $ 5 Μικροελεγκτές: Arduino, Raspberry Pi Zero, Or NodeMCU; Κάποτε υπήρχε η υπόθεση ότι αν θελήσατε να αποκτήσετε έναν ηλεκτρονικό υπολογιστή, θα έπρεπε να εξοφλήσετε το σπίτι σας για να το πληρώσετε. Τώρα, μπορείτε να πάρετε ένα για έναν Αβραάμ Λίνκολν (Διαβάστε περισσότερα για κάποια έμπνευση).

Ελέγξτε το τελικό αποτέλεσμα - ακούγεται μουσική:

Ο, τι χρειάζεσαι

Εδώ είναι τα βασικά μέρη που θα χρειαστείτε για να ολοκληρώσετε αυτό το έργο:

  • 1 x Arduino UNO ή παρόμοια.
  • 1 x μεταλλική κρεμάστρα.
  • 2 x 220 ohm αντιστάσεις.
  • 1 x Breadboard.
  • 1 x Piezo buzzer.
  • 2 κλιπ Crocodile.
  • Ποικιλία σωλήνων συρρίκνωσης θερμότητας.
  • Συρμάτινα συρματόσχοινα αρσενικού-ανδρικού.

Elenco TL-6 Σετ μολύβδου αλλιγάτορας, 10 τεμαχίων, 14 ίντσες Elenco TL-6 Σετ μολύβδου αλλιγάτορας, 10 τεμαχίων, 14 ίντσες Αγοράστε τώρα στο Amazon $ 5.59

Εδώ είναι μερικά προαιρετικά εξαρτήματα για την ενίσχυση της κατασκευής:

  • 1 x Επιπλέον πιεζοηλεκτρικός βομβητής.
  • 1 x ράβδος ράβδων.
  • 1 x οθόνη επτά τμημάτων Quad.
  • 1 x 220 ohm αντίσταση.
  • 1 στιγμιαίο κουμπί.
  • Συρμάτινα συρματόσχοινα αρσενικού-θηλυκού.
  • Ξύλινη σανίδα (για θήκη).
  • Ποικιλία ξύλινες βίδες.

Σχεδόν κάθε Arduino θα δουλέψει, εφόσον έχει αρκετά καρφίτσες. Ρίξτε μια ματιά σε αυτόν τον οδηγό αγορών Arduino Οδηγός αγοράς: Ποιο συμβούλιο πρέπει να πάρετε; Arduino Οδηγός αγοράς: Ποιο συμβούλιο πρέπει να πάρετε; Υπάρχουν τόσα πολλά διαφορετικά είδη σανίδων Arduino εκεί έξω, θα συγχωρεθήκατε για σύγχυση. Ποια θα πρέπει να αγοράσετε για το έργο σας; Ας βοηθήσουμε, με αυτόν τον οδηγό αγοράς Arduino! Διαβάστε περισσότερα αν δεν είστε σίγουροι για το τι χρειάζεστε.

Το σχέδιο κατασκευής

Arduino Buzzwire Ολοκληρώθηκε

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

Ο μηχανισμός πυρήνα αποτελείται από ένα σχήμα σύρματος και ένα βρόχο σε μια λαβή. Ο παίκτης πρέπει να καθοδηγήσει τον βρόχο γύρω από την πορεία χωρίς τα δύο αγγίζοντας. Εάν τα δύο άγγιγμα, το κύκλωμα έχει ολοκληρωθεί και ακούγεται ο βομβητής. Είναι βέβαια δυνατό να οικοδομήσουμε αυτό το κύκλωμα χωρίς μικροελεγκτή, αλλά πού είναι η διασκέδαση για αυτό (και πώς αλλιώς θα ακούσετε το τραγούδι "Flying Circus" του Monty Python);

Το μάθημα

Μάθημα Arduino Buzzwire

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

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

Η μόνωση Buduwire Arduino

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

Τώρα προσαρτήστε ένα καλώδιο στο ένα άκρο του μαθήματος. Έχετε δύο επιλογές εδώ: μπορείτε είτε να κολλήσετε είτε να χρησιμοποιήσετε ένα κλιπ κροκοδείλου. Ένα κλιπ κροκοδείλου είναι η πιο εύκολη επιλογή, αλλά η συγκόλληση είναι μια πιο αξιόπιστη και μακροπρόθεσμη επιλογή. Βεβαιωθείτε ότι "τραβάτε" την επιφάνεια της κρεμάστρας πρώτα με γυαλόχαρτο και χρησιμοποιείτε αρκετή ροή. (Ποτέ δεν έχει κολλήσει πριν; Μάθετε πώς να κάνετε εδώ Μάθετε πώς να κολλήσετε με αυτές τις απλές συμβουλές και έργα Μάθετε πώς να κολλήσετε με αυτές τις απλές συμβουλές και έργα Είστε λίγο εκφοβισμένοι από τη σκέψη ενός ζεστού σιδήρου και λιωμένου μετάλλου; για να αρχίσετε να εργάζεστε με ηλεκτρονικά, θα πρέπει να μάθετε να κολλήσετε.

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

Arduino Twisted Wire
Χρησιμοποιώντας ένα τρυπάνι για να το κάνετε αυτό βοηθά πολύ:

Βιδώστε τη συστροφή του σύρματος τσοκ

Η βάση

Θήκη Arduino Buzzwire

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

Κόψτε τρία κομμάτια για να σχηματίσουν ένα σχήμα "n". Απλά βιδώστε (ή κολλήστε) αυτά τα τρία κομμάτια μαζί. Μην ξεχνάτε να βγάζετε πρώτα μια τρύπα πιλότου στα πλευρικά κομμάτια για να μην τους χωρίσετε. Ίσως θελήσετε να χτυπήσετε τις βίδες (ειδικά αν γεμίζετε και στη συνέχεια ζωγραφίζετε), και συνιστώ ανεπιφύλακτα ένα τρυπάνι τρυπήματος. Εάν δεν διαθέτετε ένα εργαλείο ή ένα τρυπάνι, ένα τρυπάνι μεγαλύτερης διαμέτρου θα κάνει το τέχνασμα.

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

Το χερούλι

Arduino Buzzwire Λαβή
Τώρα είναι ώρα να κάνετε τον βρόχο / ελεγκτή. Περιστρέψτε ένα μικρό κομμάτι της κρεμάστρας στο ένα άκρο για να δημιουργήσετε ένα βρόχο με μια μικρή μεταλλική λαβή. Βεβαιωθείτε ότι έχετε αρχειοθετήσει την άκρη κοπής και, στη συνέχεια, καλύψτε με ταινία / αφρό, εάν είναι απαραίτητο.

Arduino Buzzwire Loop
Αυτό θα σχηματίσει το άλλο μισό του κυκλώματος - όταν αυτός ο βρόχος αγγίζει την πορεία θα ολοκληρώσει το κύκλωμα (ακριβώς όπως ένας διακόπτης). Συγκολλήστε (ή χρησιμοποιήστε ένα κλιπ κροκοδείλου) ένα άλλο σύρμα στο κατώτατο σημείο, ακριβώς όπως συνέβαινε προηγουμένως για το μάθημα.

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

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

Arduino Buzzwire λαβή τρύπα
Αυτό είναι δυνατό να γίνει σε ένα τρυπάνι πυλώνα, αν και είναι δύσκολο. Ένας τόρνος θα κάνει τέλεια τη δουλειά:

Δακτύλιος Λαβή Buzzwire Λαβή

Ναι, γνωρίζω πολύ καλά ότι πρόκειται για ένα μεταλλικό τόρνο (για όποιον ενδιαφέρεται, είναι ένας τόρνος Boley από τη δεκαετία του 1930. Νομίζω ότι είναι 3C, αλλά θα ήθελα να σας ακούσω αν ξέρεις περισσότερα για αυτό).

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

Τέλος, χρησιμοποιήστε ζεστή κόλλα για να ασφαλίσετε το καλώδιο και το βρόχο στη λαβή. Η θερμή κόλλα θα προσφέρει ένα ισχυρό (αλλά όχι μόνιμο) εξάρτημα, γι 'αυτό είναι ιδανικό για αυτό.

Τερματισμός τερματισμού

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

Arduino Buzzwire Κόλληση

Το κύκλωμα

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

Πλήρες κύκλωμα Arduino Buzzwire
Πρώτον, συνδέστε τα δύο πιεζοηλεκτρικά στοιχεία στις ψηφιακές ακίδες 10 και 11. Η πολικότητα δεν έχει σημασία:

Piezo Circuit του Αρτούνο
Δεν χρειάζεται να χρησιμοποιείτε δύο piezos - ο μόνος λόγος που το έχω κάνει είναι να ακούγεται πολύ δυνατός όταν τα καλώδια αγγίζουν. Συνδέστε τη μία πλευρά με τον ψηφιακό πείρο και την άλλη με τη γείωση.

Τώρα συνδέστε τη μεταλλική πορεία και τη λαβή:

Κύκλωμα Arduino Buzzwire
Και πάλι, δεν έχει σημασία πόσο στρογγυλά είναι αυτά τα δύο. Αυτό το τμήμα του κυκλώματος είναι ακριβώς όπως ένα κουμπί ή ένας διακόπτης - ο παίκτης ολοκληρώνει το κύκλωμα όταν ο βρόχος αγγίζει την πορεία. Βεβαιωθείτε ότι έχετε συμπεριλάβει και τους δύο αντιστάτες.

Ένας αντιστάτης συνδέει το κύκλωμα με τη γείωση (που ονομάζεται αντίσταση τραβήγματος προς τα κάτω), διασφαλίζοντας ότι δεν είναι "επιπλέουσα" (αυτό επιτρέπει στο Arduino να ανιχνεύει την αλλαγή του κυκλώματος). Η άλλη αντίσταση προστατεύει το Arduino. Όταν τα δύο μέρη αγγίξουν, το + 5V εισέρχεται στον ψηφιακό πείρο. Αν αυτή η αντίσταση δεν ήταν παρούσα, θα υπήρχε ένα νεκρό σύντομο χρονικό διάστημα - ο υπολογιστής σας θα αποσυνδέσει την υποδοχή USB για να τραβήξει υπερβολικό ρεύμα αν είστε τυχεροί .

Συνδέστε το καλώδιο σήματος (μοβ, στο διάγραμμα) στον ψηφιακό ακροδέκτη 9.

Στη συνέχεια, συνδέστε ένα κουμπί ώθησης στην ψηφιακή ακίδα 2:

Κύκλωμα κουμπιού Arduino Piezo

Τέλος, συνδέστε την οθόνη LED επτά τμημάτων:

Seven Sedu Circuit του Arduino
Το συγκεκριμένο μοντέλο είναι από το Seeed. Αυτό χρησιμοποιεί ένα TM1637 για να οδηγήσει τέσσερις οθόνες - αυτό σημαίνει ότι χρειάζονται μόνο δύο ψηφιακές ακίδες. Συνδέστε το GND στο έδαφος Arduino και το VCC στο Arduino + 5V. Συνδέστε το D10 με τον ψηφιακό ακροδέκτη Arduino 13 και CLK με τον ψηφιακό πείρο 12.

Ο κώδικας

Για να γίνει αυτό το έργο, θα χρειαστείτε δύο πρόσθετα αρχεία. Το πρώτο ονομάζεται pitches.h . Αυτό το αρχείο απλά χαρτογραφεί τα ονόματα σημειώσεων στην πιεζοηλεκτική αξία τους. Αυτό καθιστά πολύ πιο εύκολο να γράψετε μια μελωδία, όπως μπορείτε να πείτε απλά "NOTE_C3" και όχι "31", για παράδειγμα. Αυτό είναι στον δημόσιο τομέα και είναι διαθέσιμο στην ιστοσελίδα του Arduino εδώ. Ακολουθήστε τις οδηγίες για να δημιουργήσετε ένα νέο αρχείο που ονομάζεται pitches.h (εναλλακτικά, επικολλήστε τον κώδικα στο υπάρχον script σας).

Στη συνέχεια, χρειάζεστε μια μέθοδο για να παίζετε νότες / μελωδίες στην πιεζοηλεκτρική ταινία. Αυτό το περιεχόμενο από τον Anthony DiGirolamo στο Github περιέχει τον κώδικα που χρειάζεστε. Αντιγράψτε τα πάντα μεταξύ "void buzz" και "}}" και επικολλήστε το στο κύριο αρχείο σας. Για αναφορά, εδώ είναι:

 void buzz(int targetPin, long frequency, long length) { /* Buzzer example function by Rob Faludi http://www.faludi.com https://gist.github.com/AnthonyDiGirolamo/1405180 */ long delayValue = 1000000/frequency/2; // calculate the delay value between transitions //// 1 second's worth of microseconds, divided by the frequency, then split in half since //// there are two phases to each cycle long numCycles = frequency * length/ 1000; // calculate the number of cycles for proper timing //// multiply frequency, which is really cycles per second, by the number of seconds to //// get the total number of cycles to produce for (long i=0; i< numCycles; i++){ // for the calculated length of time... digitalWrite(targetPin, HIGH); // write the buzzer pin high to push out the diaphragm delayMicroseconds(delayValue); // wait for the calculated delay value digitalWrite(targetPin, LOW); // write the buzzer pin low to pull back the diaphragm delayMicroseconds(delayValue); // wait again for the calculated delay value } } 

Η τελευταία βιβλιοθήκη που χρειάζεστε είναι να ελέγξετε την εμφάνιση επτά τμημάτων - μπορείτε να παραλείψετε αυτό το βήμα, εάν δεν το χρησιμοποιείτε. Αυτή η βιβλιοθήκη ονομάζεται TM1637 και δημιουργήθηκε από την Seeed, την ίδια εταιρεία που δημιούργησε το board οδηγού.

Στο IDE του Arduino, μεταβείτε στο "Διαχείριση Βιβλιοθηκών" ( Σκίτσο > Συμπερίληψη Βιβλιοθήκης > Διαχείριση Βιβλιοθηκών ). Αυτό θα φέρει τον διευθυντή της βιβλιοθήκης. Αφήστε το μερικά δευτερόλεπτα για ενημέρωση και, στη συνέχεια, αναζητήστε στο πάνω δεξιά πλαίσιο αναζήτησης "TM1637". Δύο βιβλιοθήκες θα βρεθούν - θέλετε "TM1637" και όχι "TM1637Display". Επιλέξτε και έπειτα κάντε κλικ στην επιλογή "install".

Μια τελευταία εργασία με αυτή τη βιβλιοθήκη - δεν είναι πλήρης! Ως έχει, η βιβλιοθήκη μπορεί να εμφανίζει μόνο τους αριθμούς 0-9 και τα γράμματα A-F. Εάν αυτό καλύπτει όλα όσα θέλετε να εμφανίσετε, τότε μπορείτε να παραλείψετε αυτό το βήμα. Εάν όχι, θα χρειαστεί να τροποποιήσετε τον κώδικα. Χαλαρώστε! Αυτό δεν είναι τόσο σκληρό όσο ακούγεται, και αν μπορείτε να γράψετε κώδικα χρησιμοποιώντας το IDE του Arduino, μπορείτε να το κάνετε αυτό.

Αρχικά, ανοίξτε το φάκελο της βιβλιοθήκης σας. Αυτό θα είναι στο φάκελο Arduino σας. Σε Mac OS X, αυτό είναι στο /Users/Joe/Documents/Arduino/Libraries . Ανοίξτε το φάκελο που ονομάζεται TM1637 . Θα χρειαστεί να επεξεργαστείτε το αρχείο που ονομάζεται TM1637.cpp - μπορείτε με ασφάλεια να αγνοήσετε το άλλο αρχείο με την επέκταση .h . Ανοίξτε αυτό το αρχείο στον αγαπημένο σας επεξεργαστή κειμένου (για μένα, αυτό είναι το Sublime Text 3), το Σημειωματάριο ή το IDE του Arduino.

Τροποποιήστε την τρίτη γραμμή κώδικα από αυτό:

 static int8_t TubeTab[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};//0~9, A, b, C, d, E, F 

Σ 'αυτό:

 static int8_t TubeTab[] = { /* defaults */ 0x3f, // 0 0x06, // 1 0x5b, // 2 0x4f, // 3 0x66, // 4 0x6d, // 5 0x7d, // 6 0x07, // 7 0x7f, // 8 0x6f, // 9 0x77, // A -- 10 0x7c, // b -- 11 0x39, // C -- 12 0x5e, // d -- 13 0x79, // E -- 14 0x71, // F -- 15 /* additional */ 0x174, // h -- 16 0x176, // H -- 17 0x138, // L -- 18 0x15, // M -- 19 0x137, // n -- 20 0x73, // P -- 21 0x67, // q -- 22 0x131, // r -- 23 0x78, // t -- 24 0x240 // - 25 }; 

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

Ήρθε η ώρα για τον πραγματικό κώδικα. Πρώτον, συμπεριλάβετε τις δύο βιβλιοθήκες που αναφέρθηκαν προηγουμένως:

 #include #include 

Τώρα δημιουργήστε το αντικείμενο οθόνης:

 TM1637 *_display = new TM1637(12, 13); 

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

Το τραγούδι αποθηκεύεται σε melody και tempo . Αυτά περιέχουν όλες τις σημειώσεις και τη διάρκεια της σημείωσης για τη μουσική. Αν θέλετε να αλλάξετε τη μουσική, αλλάξτε αυτές τις συστοιχίες (αν και δεν είναι τόσο απλή όσο η επικόλληση στις τιμές των σημειώσεων, ο συγχρονισμός είναι ένα πολύ σημαντικό κομμάτι της μουσικής). Η μεταβλητή songState αποθηκεύει απλώς τη θέση της τελευταίας νότας που παίζεται. Αυτό εξασφαλίζει ότι η μελωδία παίζεται από την αρχή μέχρι το τέλος, αντί να πηδάει ασυνεπώς:

 int songState = 0; int melody[] = { NOTE_F4, ...} int tempo[] = { 8, ...} 

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

Αυτός ο κωδικός δεν εμποδίζει - αυτό σημαίνει ότι το Arduino μπορεί να εκτελεί ταυτόχρονα πολλαπλές εργασίες. Ρίξτε μια ματιά σε αυτήν την εξήγηση Arduino καθυστέρηση Λειτουργία, και γιατί δεν πρέπει να το χρησιμοποιήσετε Arduino καθυστέρηση Λειτουργία, και γιατί δεν πρέπει να το χρησιμοποιήσετε Ενώ καθυστέρηση () είναι βολικό για βασικές διαδηλώσεις για το πώς λειτουργεί Arduino, δεν πρέπει πραγματικά να χρησιμοποιώντας τον στον πραγματικό κόσμο. Εδώ γιατί και τι πρέπει να χρησιμοποιήσετε αντ 'αυτού. Διαβάστε περισσότερα για περισσότερες πληροφορίες. Έτσι ρυθμίζονται οι χρονομετρητές:

 unsigned long previousMillis1 = 0; const long interval1 = 1500; 

Η μεταβλητή previousMillis1 θα ενημερωθεί αργότερα για να αποθηκεύσει την τρέχουσα ώρα. Η μεταβλητή interval1 αποθηκεύει το χρονικό διάστημα αναμονής μεταξύ εκτέλεσης κώδικα - στην περίπτωση αυτή 1, 5 δευτερόλεπτα. Ορίζεται ως const, που σημαίνει ότι είναι σταθερή και δεν θα αλλάξει ποτέ - αυτό επιτρέπει στο Arduino να βελτιστοποιήσει περαιτέρω τον κώδικα.

Μέσα στη συνάρτηση setup() υπάρχουν μερικά πράγματα που συμβαίνουν. Αρχικά, οι είσοδοι και οι έξοδοι είναι ρυθμισμένες. Αυτό πρέπει να γίνει, οπότε ο Arduino ξέρει τι συνδέεται με κάθε καρφίτσα του:

 pinMode(9, INPUT); // setup circuit pinMode(10, OUTPUT); // setup buzzer 1 pinMode(11, OUTPUT); // setup buzzer 2 pinMode(2, INPUT); // setup button 

Τώρα η οθόνη πρέπει να ρυθμίσει:

 _display->set(5); // set brightness _display->point(false); // remove colon _display->init(); // start display 

Οι μέθοδοι set, το point και το init συμπεριλαμβάνονται στο αντικείμενο _display . Αντί μιας κουκκίδας, χρησιμοποιείται ένας δείκτης ("->") για την πρόσβαση σε αυτά. Και πάλι, μην ανησυχείτε για τη σύνταξη (αν και, αν θέλετε να μάθετε περισσότερα, αναζητήστε C ++ δείκτες).

Ο κύριος βρόχος έχει δύο τρόπους παιχνιδιού: πρόκληση και ελεύθερο παιχνίδι. Το ελεύθερο παιχνίδι επιτρέπει στον παίκτη να παίζει απεριόριστο χρόνο. Η λειτουργία πρόκλησης θέτει χρονοδιακόπτη για 20 δευτερόλεπτα χρησιμοποιώντας τη μέθοδο showCountdown . Χρησιμοποιεί το κουμπί για να ξεκινήσει και να σταματήσει το χρονόμετρο. Σήμερα, ο μόνος τρόπος για να αλλάξετε τους τρόπους παιχνιδιού είναι να επεξεργαστείτε χειροκίνητα τη μεταβλητή που ονομάζεται mode . Δείτε εάν μπορείτε να προσθέσετε ένα άλλο κουμπί για να το κάνετε αυτό και να τροποποιήσετε σωστά τον κώδικα.

Η μέθοδος buzz παίζει τις σημειώσεις που της δίδονται. Αυτό χρησιμοποιείται σε συνδυασμό με sing . Η μέθοδος τραγουδιού περνά κάθε νότα και παίζει. Αυτή η μέθοδος ονομάζεται τακτικά, αν και θα αναπαράγει μόνο την επόμενη νότα όταν έχει παρέλθει αρκετός χρόνος από την τελευταία αναπαραγωγή. Αφού το τραγούδι φτάσει στο τέλος, επαναφέρει το τραγούδι στο στίχο 1 ( songState = 14 ). Θα μπορούσατε να το θέσετε σε μηδέν για να ξεκινήσετε το τραγούδι στην αρχή, ωστόσο ο λόγος για να γίνει αυτό είναι να παραλείψετε την εισαγωγή. Η εισαγωγή παίζεται μία φορά μετά την ενεργοποίηση του Arduino και, στη συνέχεια, δεν παίζεται ξανά.

Οι showFree και showPlay απλά γράψτε τις λέξεις "FrEE" και "PLAY" στην οθόνη. Παρατηρήστε πως το "r" είναι δωρεάν, όταν όλοι οι άλλοι χαρακτήρες είναι κεφαλαίοι. Αυτός είναι ένας από τους περιορισμούς των οθονών επτά τμημάτων. Δεν μπορούν να εμφανίσουν κάθε γράμμα του αλφαβήτου και κάποιοι από τους χαρακτήρες που μπορούν να εμφανιστούν πρέπει να είναι σε μικτή περίπτωση.

Η μέθοδος toggleFreePlay αναβοσβήνει στην οθόνη μεταξύ "ΔΩΡΕΑΝ" και "PLAY". Και πάλι, το κάνει αυτό με τρόπο που δεν εμποδίζει.

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

Arduino Buzzwire Display

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

Η τελική μέθοδος που χρησιμοποιείται ονομάζεται showCountdown . Αυτό ξεκινά ένα μετρητή στα 20 και το μειώνει κατά ένα κάθε δευτερόλεπτο. Αν αυτό φτάσει στο μηδέν, το buzzes τρεις φορές, για να υποδείξει ότι ο χρόνος έχει λήξει.

Εδώ είναι όλος ο κώδικας που συνθέτουν:

 #include // include display library #include // include pitches TM1637 *_display = new TM1637(12, 13); // create display object, 12 = CLK (clock), 13 = D10 (data) // music int songState = 0; int melody[] = { NOTE_F4, NOTE_E4, NOTE_D4, NOTE_CS4, NOTE_C4, NOTE_B3, NOTE_AS3, NOTE_A3, NOTE_G3, NOTE_A3, NOTE_AS3, NOTE_A3, NOTE_G3, NOTE_C4, 0, NOTE_C4, NOTE_A3, NOTE_A3, NOTE_A3, NOTE_GS3, NOTE_A3, NOTE_F4, NOTE_C4, NOTE_C4, NOTE_A3, NOTE_AS3, NOTE_AS3, NOTE_AS3, NOTE_C4, NOTE_D4, 0, NOTE_AS3, NOTE_G3, NOTE_G3, NOTE_G3, NOTE_FS3, NOTE_G3, NOTE_E4, NOTE_D4, NOTE_D4, NOTE_AS3, NOTE_A3, NOTE_A3, NOTE_A3, NOTE_AS3, NOTE_C4, 0, NOTE_C4, NOTE_A3, NOTE_A3, NOTE_A3, NOTE_GS3, NOTE_A3, NOTE_A4, NOTE_F4, NOTE_F4, NOTE_C4, NOTE_B3, NOTE_G4, NOTE_G4, NOTE_G4, NOTE_G4, 0, NOTE_G4, NOTE_E4, NOTE_G4, NOTE_G4, NOTE_FS4, NOTE_G4, NOTE_D4, NOTE_G4, NOTE_G4, NOTE_FS4, NOTE_G4, NOTE_C4, NOTE_B3, NOTE_C4, NOTE_B3, NOTE_C4, 0 }; int tempo[] = { 8, 16, 8, 16, 8, 16, 8, 16, 16, 16, 16, 8, 16, 8, 3, 12, 16, 16, 16, 8, 16, 8, 16, 8, 16, 8, 16, 8, 16, 4, 12, 12, 16, 16, 16, 8, 16, 8, 16, 8, 16, 8, 16, 8, 16, 4, 12, 12, 16, 16, 16, 8, 16, 8, 16, 8, 16, 8, 16, 8, 16, 4, 16, 12, 17, 17, 17, 8, 12, 17, 17, 17, 8, 16, 8, 16, 8, 16, 8, 1 }; // non blocking setup // free play unsigned long previousMillis1 = 0; // time words last changed const long interval1 = 1500; // interval between changing // music unsigned long previousMillis2 = 0; // time last changed const long interval2 = 100; // interval between notes int displayStatus = 0; // keep track of what's displayed int mode = 0; // keep track of game mode -- change to 0 or 1 for different modes bool countdown = false; unsigned long previousMillis3 = 0; // time last changed const long interval3 = 1000; // interval between countdown int count = 20; // challenge mode timer void setup() { // put your setup code here, to run once: pinMode(9, INPUT); // setup circuit pinMode(10, OUTPUT); // setup buzzer 1 pinMode(11, OUTPUT); // setup buzzer 2 pinMode(2, INPUT); // setup button _display->set(5); // set brightness _display->point(false); // remove colon _display->init(); // start display } void loop() { // put your main code here, to run repeatedly: if(mode == 0) { // challenge mode if(digitalRead(2) == HIGH) { delay(25); if(digitalRead(2) == HIGH) { countdown = true; // stop the countdown } else { countdown = false; // stop the countdown } } if(countdown) { showCountdown(); // advance countdown } } else { // free play toggleFreePlay(); } if(digitalRead(10) == HIGH) { delay(25); if(digitalRead(10) == HIGH) { while(digitalRead(10) == HIGH) { buzz(11, NOTE_B0, 1000/24); } } } else sing(); } void showCountdown() { // countdown the time remaining unsigned long currentMillis = millis(); // current time if (currentMillis - previousMillis3>= interval3) { previousMillis3 = currentMillis; --count; showNumber(count); if(count == 0) { // game over countdown = false; count = 20; // reset countdown // buzz 3 times buzz(11, NOTE_B0, 1000/24); delay(100); buzz(11, NOTE_B0, 1000/24); delay(100); buzz(11, NOTE_B0, 1000/24); } } } void showNumber(int number) { // show numbers (maximum 99) on display _display->display(0, 25); // write - to segment 1 _display->display(3, 25); // write - to segment 4 // write number to middle of display if(number == 10) { _display->display(1, 1); _display->display(2, 0); } else if(number>9) { _display->display(1, 1); int newVal = number - 10; _display->display(2, newVal); } else { _display->display(1, 0); _display->display(2, number); } } void toggleFreePlay() { // scroll between words without blocking unsigned long currentMillis = millis(); // current time if (currentMillis - previousMillis1>= interval1) { previousMillis1 = currentMillis; if(displayStatus == 1) showPlay(); else showFree(); } } void showPlay() { // write "PLAY" to the display _display->display(0, 21); // write P to segment 1 _display->display(1, 18); // write L to segment 2 _display->display(2, 10); // write A to segment 3 _display->display(3, 4); // write Y to segment 4 displayStatus = 2; } void showFree() { // write "Free" to the display _display->display(0, 15); // write F to segment 1 _display->display(1, 23); // write r to segment 2 _display->display(2, 14); // write E to segment 3 _display->display(3, 14); // write E to segment 4 displayStatus = 1; } void buzz(int targetPin, long frequency, long length) { /* Buzzer example function by Rob Faludi http://www.faludi.com https://gist.github.com/AnthonyDiGirolamo/1405180 */ long delayValue = 1000000/frequency/2; // calculate the delay value between transitions //// 1 second's worth of microseconds, divided by the frequency, then split in half since //// there are two phases to each cycle long numCycles = frequency * length/ 1000; // calculate the number of cycles for proper timing //// multiply frequency, which is really cycles per second, by the number of seconds to //// get the total number of cycles to produce for (long i=0; i = interval2) { previousMillis2 = currentMillis; int noteDuration = 1000 / tempo[songState]; buzz(10, melody[songState], noteDuration); int pauseBetweenNotes = noteDuration; delay(pauseBetweenNotes); // stop the tone playing: buzz(10, 0, noteDuration); ++songState; // start song again if finished if(songState>79) { songState = 14; // skip intro } } } 

Αποθηκεύστε αυτό το αρχείο ως "buzzwire" ( Αρχείο> Αποθήκευση ως ) και στη συνέχεια μεταφορτώστε το στο σκάφος σας ( Αρχείο> Μεταφόρτωση ). Αν δεν είστε σίγουροι για το πώς μπορείτε να ανεβάσετε το Arduino ή ότι αυτός ο κώδικας φαίνεται λίγο τρομακτικός, ρίξτε μια ματιά στον οδηγό μας για αρχάριους Arduino Ξεκινώντας με τον Arduino: Οδηγός για αρχάριους Ξεκινώντας με το Arduino: Οδηγός για αρχάριους Το Arduino είναι ένα open source πλατφόρμα πρωτοτύπων ηλεκτρονικών υπολογιστών που βασίζεται σε ευέλικτο και εύχρηστο υλικό και λογισμικό. Πρόκειται για καλλιτέχνες, σχεδιαστές, χομπίστες και όσους ενδιαφέρονται να δημιουργήσουν διαδραστικά αντικείμενα ή περιβάλλοντα. Διαβάστε περισσότερα . Όλα είναι καλά, τώρα θα πρέπει να έχετε το δικό σας παιχνίδι καλωδίων buzz - δροσερό!

Εάν κάνατε κάτι δροσερό μετά την ανάγνωση αυτού, θα ήθελα πολύ να δω - επιτρέψτε μου να ξέρω στα παρακάτω σχόλια!

In this article