Πίνακας περιεχομένων:
2025 Συγγραφέας: John Day | [email protected]. Τελευταία τροποποίηση: 2025-01-13 06:57
Κάθε φορά που βλέπω ένα πληκτρολόγιο, έρχεται με πολλές καρφίτσες, είναι μια μεγάλη σπατάλη των καρφιών σας Arduino, οπότε μπορούμε να εκτελέσουμε ένα πληκτρολόγιο με έναν και μόνο έναν πείρο;. Η απάντηση είναι εδώ.
Βήμα 1: Λογαριασμός Υλικών
Σκεύη, εξαρτήματα:
01 Arduino UNO
02 Breadboards
01 LCD με I2C
16 Πιέστε τα κουμπιά
04 αντιστάσεις 1,5 kΩ
04 αντιστάσεις 620 Ω
04 αντιστάσεις 220 Ω
08 αντιστάσεις 100 Ω
01 αντίσταση 1 kΩ
07 Σύρματα βραχυκυκλωτήρων
Λογισμικό:
Το Arduino IDE είναι εγκατεστημένο στον υπολογιστή σας
Βήμα 2: Σχηματικό και Cicruit
Όλη η ιδέα είναι ότι έχουμε 4*4 μήτρα κουμπιών πίεσης που συνδέονται κάθετα στο έδαφος με το σωστό καλώδιο και οριζόντια από το άλλο καλώδιο (το κουμπί) και αντιστάσεις 1,5 kΩ, 620Ω, 220Ω και 100Ω, τα άκρα του οι 4 σειρές συνδέονται με τέσσερις αντιστάσεις 100Ω όπως φαίνεται στο σχήμα.
Κάθε φορά που πατάτε ένα κουμπί κλείνετε το κύκλωμα και το ρεύμα περνάει από διαφορετική διαδρομή και διαφορετική αλυσίδα αντιστάσεων, γι 'αυτό το pin A0 λαμβάνει διαφορετική αναλογική ανάγνωση για κάθε κουμπί. Το μόνο που χρειάζεστε τώρα είναι η κωδικοποίηση.
Βήμα 3: Ο κώδικας
#περιλαμβάνω
#περιλαμβάνω
LiquidCrystal_I2C LCD (0x3f, 20, 4);
int Κουμπί = A0;
int readvalue?
void setup ()
{
Serial.begin (9600);
lcd.begin ();
pinMode (Κουμπί, ΕΙΣΟΔΟΣ);
lcd. backlight ();
lcd.print ("Hello World");
καθυστέρηση (2000).
lcd.clear ();
lcd.print ("Ένα pin 4*4 πληκτρολόγιο");
καθυστέρηση (2000). }
κενός βρόχος ()
{
readvalue = analogRead (Κουμπί);
Serial.println (readvalue);
if (readvalue == 852) {lcd.clear (); lcd.print ("A");}
else {if (readvalue == 763) {lcd.clear (); lcd.print ("B");}
else {if (readvalue == 685) {lcd.clear (); lcd.print ("C");}
else {if (readvalue == 965) {lcd.clear (); lcd.print ("D");}
else {if (readvalue == 565) {lcd.clear (); lcd.print ("9");}
else {if (readvalue == 614) {lcd.clear (); lcd.print ("6");}
else {if (readvalue == 360) {lcd.clear (); lcd.print ("3");}
else {if (readvalue == 335) {lcd.clear (); lcd.print ("#");}
else {if (readvalue == 396) {lcd.clear (); lcd.print ("8");}
else {if (readvalue == 349) {lcd.clear (); lcd.print ("5");}
else {if (readvalue == 235) {lcd.clear (); lcd.print ("2");}
else {if (readvalue == 279) {lcd.clear (); lcd.print ("0");}
else {if (readvalue == 452) {lcd.clear (); lcd.print ("7");}
else {if (readvalue == 271) {lcd.clear (); lcd.print ("4");}
else {if (readvalue == 170) {lcd.clear (); lcd.print ("1");}
else {if (readvalue == 92) {lcd.clear (); lcd.print ("*");} else {}}}}}}}}}}}}}}}}
Βήμα 4: Διόρθωση τιμών
Όταν ανοίξετε το σειριακό μόνιτορ, θα εμφανιστεί μια τιμή 1023, αν πατήσετε ένα κουμπί θα σας δώσει άλλη ανάγνωση, πρέπει να λάβετε αυτές τις τιμές και να κάνετε κάποιες αλλαγές στον κώδικα
Βήμα 5: Έργο μετά από κριτική και ανασκόπηση
Δεν υπάρχει αμφιβολία ότι όλοι είμαστε εδώ για να μάθουμε και να μοιραστούμε τις γνώσεις μας, χάρη σε κάποια σχόλια που άφησαν κάποιοι από την κοινότητα που ήταν πολύ χρήσιμα, αποφάσισα να κάνω κάποιες προσαρμογές και βελτιώσεις στο έργο μου:
Το υλικό:
Αποφάσισα να κολλήσω όλα τα εξαρτήματα σε ένα PCB για να αποφύγω το πρόβλημα της κακής σύνδεσης στις σανίδες ψωμιού.
Ο κώδικας:
Ένας φίλος με συμβούλεψε να χρησιμοποιήσω ένα λογισμικό αποσυναρμολόγησης και είναι απλώς ένας βρόχος (για παράδειγμα ο βρόχος "για") για να κάνει το πρόγραμμα να πάρει λίγο χρόνο για να διαβάσει, σημαίνει ότι διαβάζει πολλά (500 στην εξέτασή μου) αλλά διαρκεί μόνο το τελευταίο.
για (i = 1; i <= 500; i ++) {// πάρτε μόνο την 500η αναλογική ανάγνωση
value = analogRead (Κουμπί);} // αυτό θα σας βοηθήσει να αφιερώσετε λίγο χρόνο και να αποφύγετε κακές αναγνώσεις
Ένας άλλος φίλος χάρη σε αυτόν με συμβούλεψε να συγκρίνω το "readvalue" με ένα εύρος τιμών όχι μία επειδή η "readvalue" παίρνει πολλές τιμές για το ίδιο κουμπί. Το "A" για παράδειγμα δίνει μια ανάγνωση των: 849, 850, 851 852, 853, 854, 855 άρα είναι ένα εύρος 7 τιμών: ένα κατώφλι (852) και 3 τιμές αριστερά και δεξιά. αυτό που πρέπει να κάνουμε εδώ είναι να συγκρίνουμε την απόλυτη τιμή της διαφοράς μεταξύ "readvalue" και "852" με "3".
if (abs (readvalue-852) <= 8) {lcd.clear (); lcd.print ("A");}
Βήμα 6: Μετά από μερικές εργασίες συγκόλλησης
Βήμα 7: Η στιγμή της αλήθειας
Όπως μπορείτε να δείτε, το πρόγραμμα μερικές φορές μπερδεύει τα κουμπιά αλλά εξακολουθεί να λειτουργεί, θεωρητικά δεν υπάρχει τίποτα λάθος με το κύκλωμα, αλλά ο κώδικας χρειάζεται περισσότερη βαθμονόμηση.
Βήμα 8: Το τέλος
Ελπίζω να σας αρέσει αυτό το έργο και προσπαθείτε να το κάνετε, ίσως να κάνετε καλύτερα από μένα.
Ρωτήστε με εάν έχετε ερωτήσεις, αφήστε σχόλια και μην ξεχάσετε να με ψηφίσετε αν σας αρέσει αυτό.