Isi kandungan:

Potensiometer Dual Digital DS1803 Dengan Arduino: 5 Langkah
Potensiometer Dual Digital DS1803 Dengan Arduino: 5 Langkah

Video: Potensiometer Dual Digital DS1803 Dengan Arduino: 5 Langkah

Video: Potensiometer Dual Digital DS1803 Dengan Arduino: 5 Langkah
Video: Почтовый мешок! Цифровой потенциометр DS1803 и другой кремний 2024, November
Anonim
Potensiometer Dual Digital DS1803 Dengan Arduino
Potensiometer Dual Digital DS1803 Dengan Arduino

Saya ingin berkongsi penggunaan potmeter digital DS1803 dengan Arduino. IC ini mengandungi dua potmeters digital yang dapat dikendalikan melalui antara muka dua wayar, untuk ini saya menggunakan library wire.h.

IC ini boleh menggantikan potmeter analog biasa. Dengan cara ini anda dapat mengawal misalnya penguat atau bekalan kuasa.

Dalam arahan ini saya mengawal kecerahan dua LED untuk menunjukkan yang berfungsi.

Arduino mengira denyutan pengekod putar dan meletakkan nilainya dalam periuk berubah [0] dan periuk [1]. Apabila anda menekan suis pengekod, anda boleh beralih antara periuk [0] dan periuk [1].

Nilai sebenar pot dibaca kembali dari DS1803 dan diletakkan dalam variabel potValue [0] dan potValue [1] dan dipaparkan pada LCD.

Langkah 1: Sambungan DS1803

Sambungan DS1803
Sambungan DS1803

Di sini anda dapat melihat sambungan DS1803. H adalah sisi tinggi potensiometer, L sisi rendah dan W pengelap. SCL dan SDA adalah sambungan bas.

Dengan sambungan A0, A1 dan A2 anda dapat memberikan alamat DS1803 itu sendiri, dengan cara ini anda dapat mengendalikan lebih banyak peranti melalui satu bas. Dalam contoh saya, saya telah memberikan iklan DS1803 0 dengan menghubungkan semua pin ke tanah.

Langkah 2: Bait Perintah

Bait Perintah
Bait Perintah

Cara DS1803 beroperasi boleh digunakan dalam bait arahan. Apabila anda memilih "tulis potensiometer-0" kedua potensiometer dipilih, apabila anda hanya mahu menyesuaikan potensiometer-0, anda hanya perlu menghantar bait data pertama. "Tulis potensiometer-1" hanya sesuaikan potmeter-1. "Tulis ke kedua potensiometer" memberikan nilai yang sama kepada kedua-dua potensiometer.

Langkah 3: Kawalan DS1803

Kawalan DS1803
Kawalan DS1803

Byte kawalan (gambar 3) mempunyai pengecam peranti, ini tetap sama. Dalam contoh saya A0, A1 dan A2 adalah 0 kerana kami memilih adres dengan meletakkan semua pin A ke tanah. R / W bit terakhir akan ditetapkan ke 0 atau 1 dengan perintah "Wire.beginTransmission" dan "Wire.requestFrom" di Arduino. Pada gambar 5 anda dapat melihat keseluruhan telegram. Telegram yang dibaca ditunjukkan pada gambar 4.

Langkah 4: Sediakan

Sediakan
Sediakan

Litar ini menunjukkan cara menghubungkan semuanya. LCD Nokia tersedia dengan sambungan yang berbeza, pastikan anda menyambungkan dengan betul. Juga pengekod putar versi yang berbeza, beberapa mempunyai persamaan pada pin tengah yang lain tidak. Saya telah meletakkan sedikit rangkaian penapis (470 Ohm perintang dengan topi 100nF) untuk menapis isyarat output A dan B pengekod. Saya memerlukan penapis ini kerana outputnya mempunyai banyak bunyi. Saya juga meletakkan pemasa debounce dalam program saya untuk membatalkan sedikit bunyi. Selebihnya saya rasa litarnya jelas. LCD boleh dipesan melalui Adafruit

Langkah 5: Program

Untuk penggunaan bas 2 wayar saya sertakan perpustakaan Wire.h. Untuk menggunakan LCD saya sertakan perpustakaan Adafruit yang boleh anda muat turun dari https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library juga perpustakaan Adafruit_GFX.h terdapat di sini https:// github. com / adafruit / Adafruit-GFX-Perpustakaan.

#sertakan

#sertakan

#sertakan

Paparan Adafruit_PCD8544 = Adafruit_PCD8544 (7, 6, 5, 4, 3);

Di sini anda dapat melihat semua pemboleh ubah. Bait kawalan dan bait arahan seperti yang dijelaskan sebelumnya. DeBounceTime dapat disesuaikan bergantung pada kebisingan pada pengekod anda.

pot bait [2] = {1, 1}; byte controlByte = B0101000; // 7 bit, perintah byteByte = B10101001; // 2 bit terakhir adalah pemilihan potmeter. bait potValue [2]; int i = 0; int deBounceTime = 10; // Laraskan nilai ini bergantung pada noise const int encoder_A = 8; const int encoder_B = 9; const int buttonPin = 2; newDebounceTime panjang yang tidak ditandatangani = 0; lama lama yang tidak ditandatangani; boolean ditekan = 0; kiraan boolean = 1;

Dalam persediaan saya menentukan pin yang betul dan meletakkan teks statik pada LCD

batal persediaan () {Wire.begin (); Serial.begin (9600); pinMode (encoder_A, INPUT); pinMode (encoder_B, INPUT); pinMode (buttonPin, INPUT); newDebounceTime = milis ();

display.begin ();

display.setContrast (50); display.clearDisplay (); display.setTextSize (1); display.setTextColor (HITAM); display.setCursor (0, 10); display.println ("POT 1 ="); display.setCursor (0, 22); display.println ("POT 2 ="); paparan.display ();

}

Dalam gelung saya mula-mula memeriksa apakah selang waktu lebih dari 500ms, jika ya LCD dikemas kini. Sekiranya tidak, butang pada pengekod diperiksa. Sekiranya ditekan toggleBuffer dipanggil. Selepas ini pengekod diperiksa. Sekiranya input 0 rendah (putaran dikesan) saya periksa input B, jika input B adalah 0 I kenaikan pot , yang lain saya tolak. Selepas ini nilainya akan dihantar ke DS1803 melalui wire.write.

gelung kosong () {

selang ();

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

if (digitalRead (encoder_A) == 0 && count == 0 && (millis () - newDebounceTime> deBounceTime)) {if (digitalRead (encoder_B) == 0) {pot ++; if (pot > 25) {pot = 25;}} lain {pot -; if (pot <1) {pot = 1;}} kiraan = 1; newDebounceTime = milis ();

Wire.beginTransmission (controlByte); // mula menghantar

Wire.write (commandByte); // pemilihan potmeters Wire.write (pot [0] * 10); // hantar byte pertama data potmeter Wire.write (pot [1] * 10); // hantar byte data potmeter ke-2 Wire.endTransmission (); // berhenti menghantar} lain jika (digitalRead (encoder_A) == 1 && digitalRead (encoder_B) == 1 && count == 1 && (millis () - newDebounceTime> deBounceTime)) {count = 0; newDebounceTime = millis (); }}

batal toggleBuffer () {ditekan = 1; jika (i == 0) {i = 1;} lain {i = 0;}}

Mula-mula saya membersihkan kawasan di mana saya harus menulis perbezaannya. Saya melakukan ini untuk melukis sebuah segi empat tepat di kawasan ini. Selepas itu saya menulis pemboleh ubah ke skrin.

batal writeToLCD () {Wire.requestFrom (controlByte, 2); potValue [0] = Wire.read (); // baca potmeter byte potValue pertama [1] = Wire.read (); // baca paparan byte potmeter kedua.fillRect (40, 0, 40, 45, WHITE); // skrin pemboleh ubah yang jelas pada paparan LCD.setCursor (40, 10); display.print (potValue [0]); // tulis nilai potmeter pertama ke paparan LCD.setCursor (40, 22); display.print (potValue [1]); // tulis nilai potmeter ke-2 ke paparan LCD.setCursor (60, (10 + i * 12)); display.print ("<"); paparan.display (); }

selang kekosongan () {// pemasa selang untuk menulis data ke LCD jika ((milis () - lamaTime)> 500) {writeToLCD (); oldTime = millis (); }}

Disyorkan: