Πίνακας περιεχομένων:

DS1803 Διπλό ψηφιακό ποτενσιόμετρο με Arduino: 5 βήματα
DS1803 Διπλό ψηφιακό ποτενσιόμετρο με Arduino: 5 βήματα

Βίντεο: DS1803 Διπλό ψηφιακό ποτενσιόμετρο με Arduino: 5 βήματα

Βίντεο: DS1803 Διπλό ψηφιακό ποτενσιόμετρο με Arduino: 5 βήματα
Βίντεο: «Έχε γειά καημένε κόσμε...», συρτό -καλαματιανό (Πανελλήνιο) ~ Λευκοθέα Φιλιππίδη (2021) 2024, Ιούλιος
Anonim
DS1803 Διπλό ψηφιακό ποτενσιόμετρο με Arduino
DS1803 Διπλό ψηφιακό ποτενσιόμετρο με Arduino

Μου αρέσει να μοιράζομαι τη χρήση ενός ψηφιακού δοχείου μετρητή DS1803 με ένα Arduino. Αυτό το IC περιέχει δύο ψηφιακά δοχεία που μπορούν να ελεγχθούν μέσω διεπαφής δύο καλωδίων, για αυτό χρησιμοποιώ τη βιβλιοθήκη wire.h.

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

Σε αυτό το οδηγό ελέγχω τη φωτεινότητα δύο LED για να δείξω τη λειτουργία.

Το arduino μετρά τους παλμούς ενός περιστροφικού κωδικοποιητή και τοποθετεί την τιμή σε μεταβλητό δοχείο [0] και δοχείο [1]. Όταν πιέζετε το διακόπτη στον κωδικοποιητή, μπορείτε να κάνετε εναλλαγή μεταξύ ποτ [0] και ποτ [1].

Η πραγματική τιμή των δοχείων διαβάζεται από το DS1803 και τοποθετείται σε μεταβλητό potValue [0] και potValue [1] και εμφανίζεται σε οθόνη LCD.

Βήμα 1: Συνδέσεις του DS1803

Συνδέσεις του DS1803
Συνδέσεις του DS1803

Εδώ μπορείτε να δείτε τις συνδέσεις του DS1803. H είναι η ψηλή πλευρά του ποτενσιόμετρου, L η χαμηλή πλευρά και W ο υαλοκαθαριστήρας. SCL και SDA είναι οι συνδέσεις διαύλου.

Με τη σύνδεση A0, A1 και A2 μπορείτε να δώσετε τη δική του διεύθυνση DS1803, με αυτόν τον τρόπο μπορείτε να ελέγχετε περισσότερες συσκευές μέσω ενός διαύλου. Στο παράδειγμά μου έχω δώσει τη διεύθυνση DS1803 0 συνδέοντας όλες τις ακίδες στη γείωση.

Βήμα 2: Byte εντολών

Byte εντολής
Byte εντολής

Ο τρόπος λειτουργίας του DS1803 μπορεί να χρησιμοποιηθεί στο byte εντολών. Όταν επιλέγετε "εγγραφή ποτενσιόμετρου-0" επιλέγονται και τα δύο ποτενσιόμετρα, όταν θέλετε μόνο να ρυθμίσετε το ποτενσιόμετρο-0, πρέπει να στείλετε μόνο το πρώτο byte δεδομένων. "Γράψτε ποτενσιόμετρο-1" ρυθμίστε μόνο το μετρητή-1. "Γράψτε και στα δύο ποτενσιόμετρα" δίνει στα δύο ποτενσιόμετρα την ίδια τιμή.

Βήμα 3: Έλεγχος του DS1803

Έλεγχος του DS1803
Έλεγχος του DS1803

Το byte ελέγχου (εικόνα 3) έχει ένα αναγνωριστικό συσκευής, αυτό παραμένει πάντα το ίδιο. Στο παράδειγμά μου A0, A1 και A2 είναι 0 επειδή επιλέγουμε διεύθυνση βάζοντας όλες τις ακίδες Α στη γείωση. Το τελευταίο bit R/W θα οριστεί σε 0 ή 1 με τις εντολές "Wire.beginTransmission" και "Wire.requestFrom" στο Arduino. Στο σχήμα 5 μπορείτε να δείτε ολόκληρο το τηλεγράφημα. Το τηλεγράφημα ανάγνωσης φαίνεται στο σχήμα 4.

Βήμα 4: Ρύθμιση

Στήνω
Στήνω

Αυτό το κύκλωμα δείχνει πώς να συνδέσετε τα πάντα. Το Nokia LCD διατίθεται με διαφορετικές συνδέσεις, βεβαιωθείτε ότι έχετε συνδέσει σωστά τη δική σας. Επίσης ο περιστροφικός κωδικοποιητής τις διαφορετικές εκδοχές του, άλλοι έχουν το κοινό στη μεσαία καρφίτσα άλλοι όχι. Έχω βάλει ένα μικρό δίκτυο φίλτρων (αντίσταση 470 Ohm με καπάκι 100nF) για να φιλτράρει τα σήματα εξόδου Α και Β του κωδικοποιητή. Χρειάζομαι αυτό το φίλτρο γιατί η έξοδος είχε πολύ θόρυβο. Έβαλα επίσης ένα χρονόμετρο αποκοπής στο πρόγραμμα μου για να ακυρώσω λίγο θόρυβο. Για τα υπόλοιπα νομίζω ότι το κύκλωμα είναι καθαρό. Η οθόνη LCD μπορεί να παραγγελθεί μέσω του Adafruit

Βήμα 5: Το πρόγραμμα

Για τη χρήση του διαύλου 2-καλωδίων συμπεριλαμβάνω τη βιβλιοθήκη Wire.h. Για τη χρήση της οθόνης LCD συμπεριλαμβάνω τη βιβλιοθήκη Adafruit την οποία μπορείτε να κατεβάσετε από τη διεύθυνση https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library επίσης η βιβλιοθήκη Adafruit_GFX.h είναι διαθέσιμη εδώ https:// github. com/adafruit/Adafruit-GFX-Library.

#περιλαμβάνω

#περιλαμβάνω

#περιλαμβάνω

Adafruit_PCD8544 εμφάνιση = Adafruit_PCD8544 (7, 6, 5, 4, 3).

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

byte pot [2] = {1, 1}; byte controlByte = B0101000; // 7 bits, byte commandByte = B10101001; // τα τελευταία 2 bits είναι επιλογή potmeter. byte potValue [2]; int i = 0; int deBounceTime = 10; // Προσαρμόστε αυτήν την τιμή ανάλογα με τον θόρυβο const int encoder_A = 8; const int encoder_B = 9; const int buttonPin = 2; ανυπόγραφο μακρύ newDebounceTime = 0; ανυπόγραφο πολύ oldTime? boolean pressed = 0; boolean count = 1;

Στη ρύθμιση ορίζω τους σωστούς πείρους και τοποθετώ το στατικό κείμενο στην οθόνη LCD

void setup () {Wire.begin (); Serial.begin (9600); pinMode (κωδικοποιητής_Α, ΕΙΣΟΔΟΣ); pinMode (κωδικοποιητής_Β, ΕΙΣΟΔΟΣ); pinMode (buttonPin, INPUT); newDebounceTime = millis ();

display.begin ();

display.setContrast (50); display.clearDisplay (); display.setTextSize (1); display.setTextColor (ΜΑΥΡΟ); display.setCursor (0, 10); display.println ("POT 1 ="); display.setCursor (0, 22); display.println ("POT 2 ="); display.display ();

}

Στον βρόχο, πρώτα ελέγχω αν το διάστημα είναι μεγαλύτερο από 500ms, αν ναι, η οθόνη LCD ενημερώνεται. Εάν όχι, το κουμπί στον κωδικοποιητή είναι επιλεγμένο. Αν πατήσετε το κουμπί toggleBuffer καλέστε. Μετά από αυτό, ελέγχεται ο κωδικοποιητής. Εάν η είσοδος 0 είναι χαμηλή (ανιχνεύεται περιστροφή) ελέγχω την είσοδο Β, εάν η είσοδος Β είναι 0 I pot potment , άλλες μειώνω. Μετά από αυτό, η τιμή θα σταλεί στο DS1803 μέσω wire.write.

void loop () {

διάστημα();

if (digitalRead (buttonPin) == 1 && (pressed == 0)) {toggleBuffer ();} if (digitalRead (buttonPin) == 0) {pressed = 0;}

if (digitalRead (encoder_A) == 0 && count == 0 && (millis () - newDebounceTime> deBounceTime)) {if (digitalRead (encoder_B) == 0) {pot ++; εάν (δοχείο > 25) {pot = 25;}} else {pot -; αν (κατσαρόλα <1) {κατσαρόλα = 1;}} μετράει = 1; newDebounceTime = millis ();

Wire.beginTransmission (controlByte); // ξεκινήστε τη μετάδοση

Wire.write (commandByte); // επιλογή potmeters Wire.write (δοχείο [0] * 10); // αποστολή 1ου byte δεδομένων potmeter Wire.write (δοχείο [1] * 10); // αποστολή 2ο byte δεδομένων potmeter Wire.endTransmission (); // σταματήστε τη μετάδοση} αλλιώς αν (digitalRead (encoder_A) == 1 && digitalRead (encoder_B) == 1 && count == 1 && (millis () - newDebounceTime> deBounceTime)) {count = 0; newDebounceTime = millis (); }}

void toggleBuffer () {pressed = 1; εάν (i == 0) {i = 1;} άλλο {i = 0;}}

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

void writeToLCD () {Wire.requestFrom (controlByte, 2); potValue [0] = Wire.read (); // διαβάστε το πρώτο potmeter byte potValue [1] = Wire.read (); // διαβάστε το δεύτερο byte μετρητή byte display.fillRect (40, 0, 40, 45, ΛΕΥΚΟ); // διαγραφή μεταβλητής οθόνης στην οθόνη LCD.setCursor (40, 10); display.print (potValue [0]); // γράψτε την πρώτη τιμή του μετρητή στην οθόνη LCD.setCursor (40, 22); display.print (potValue [1]); // γράψτε την τιμή 2ου μετρητή στην οθόνη LCD.setCursor (60, (10 + i * 12)); display.print ("<"); display.display (); }

void interval () {// interval timer για εγγραφή δεδομένων σε LCD εάν ((millis () - oldTime)> 500) {writeToLCD (); oldTime = millis (); }}

Συνιστάται: