Daftar Isi:

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

Video: DS1803 Potensiometer Digital Ganda Dengan Arduino: 5 Langkah

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

Saya ingin berbagi penggunaan potmeter digital DS1803 dengan Arduino. IC ini berisi dua potmeter digital yang dapat dikontrol melalui antarmuka dua kabel, untuk ini saya menggunakan perpustakaan wire.h.

IC ini dapat menggantikan potmeter analog biasa. Dengan cara ini Anda dapat mengontrol misalnya amplifier atau catu daya.

Dalam instruksi ini saya mengontrol kecerahan dua LED untuk menunjukkan cara kerja.

Arduino menghitung pulsa dari rotary encoder dan menempatkan nilainya dalam variabel pot[0] dan pot[1]. Saat Anda menekan sakelar pada encoder, Anda dapat beralih antara pot[0] dan pot[1].

Nilai sebenarnya dari pot dibaca kembali dari DS1803 dan ditempatkan dalam variabel potValue[0] dan potValue[1] dan ditampilkan pada LCD.

Langkah 1: Koneksi DS1803

Koneksi DS1803
Koneksi DS1803

Di sini Anda dapat melihat koneksi DS1803. H adalah sisi tinggi potensiometer, L sisi rendah dan W wiper. SCL dan SDA adalah koneksi bus.

Dengan koneksi A0, A1 dan A2 Anda dapat memberikan DS1803 alamatnya sendiri, dengan cara ini Anda dapat mengontrol lebih banyak perangkat melalui satu bus. Dalam contoh saya, saya telah memberikan alamat DS1803 0 dengan menghubungkan semua pin ke ground.

Langkah 2: Perintah Byte

Perintah Byte
Perintah Byte

Cara DS1803 beroperasi dapat digunakan dalam byte perintah. Ketika Anda memilih "tulis potensiometer-0" kedua potensiometer dipilih, bila Anda hanya ingin menyesuaikan potensiometer-0, Anda hanya perlu mengirim byte data pertama. "Tulis potensiometer-1" hanya menyesuaikan potmeter-1. "Tulis ke kedua potensiometer" memberikan nilai yang sama pada kedua potensiometer.

Langkah 3: Kontrol DS1803

Kontrol DS1803
Kontrol DS1803

Byte kontrol (gambar 3) memiliki pengenal perangkat, ini tetap selalu sama. Dalam contoh saya A0, A1 dan A2 adalah 0 karena kami memilih alamat dengan meletakkan semua A-pin ke ground. Bit terakhir R/W akan diatur ke 0 atau 1 dengan perintah "Wire.beginTransmission" dan "Wire.requestFrom" di Arduino. Pada gambar 5 Anda dapat melihat seluruh telegram. Baca telegram ditunjukkan pada gambar 4.

Langkah 4: Siapkan

Mempersiapkan
Mempersiapkan

Sirkuit ini menunjukkan bagaimana menghubungkan semuanya. LCD Nokia tersedia dengan koneksi yang berbeda, pastikan Anda menghubungkannya dengan benar. Rotary encoder nya juga beda versi, ada yg punya kesamaan di tengah pin yg lain tidak. Saya telah memasang jaringan filter kecil (resistor 470 Ohm dengan tutup 100nF) untuk menyaring sinyal keluaran A dan B dari encoder. Saya membutuhkan filter ini karena outputnya memang memiliki banyak noise. Saya juga menempatkan timer debounce di program saya untuk membatalkan beberapa kebisingan. Selebihnya saya pikir sirkuitnya jelas. LCD dapat dipesan melalui Adafruit

Langkah 5: Program

Untuk penggunaan bus 2-kawat saya menyertakan perpustakaan Wire.h. Untuk menggunakan LCD saya sertakan perpustakaan Adafruit yang dapat Anda unduh dari https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library juga perpustakaan Adafruit_GFX.h tersedia di sini https://github. com/adafruit/Adafruit-GFX-Library.

#termasuk

#termasuk

#termasuk

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

Di sini Anda dapat melihat semua variabel. Kontrol byte dan perintah byte seperti yang dijelaskan sebelumnya. DeBounceTime dapat disesuaikan tergantung pada noise pada encoder Anda.

byte pot[2] = {1, 1};byte controlByte = B0101000; // 7 bit, byte commandByte = B10101001; // 2 bit terakhir adalah pemilihan potmeter. byte potValue[2]; int saya = 0; int deBounceWaktu = 10; // Sesuaikan nilai ini tergantung pada noise const int encoder_A = 8; const int encoder_B = 9; const int buttonPin = 2; unsigned long newDebounceTime = 0; lama waktu lama yang tidak ditandatangani; boolean ditekan = 0; jumlah boolean = 1;

Dalam pengaturan saya menentukan pin yang tepat dan meletakkan teks statis pada LCD

void setup() { Wire.begin(); Serial.begin(9600); pinMode(encoder_A, INPUT); pinMode(encoder_B, INPUT); pinMode(tombolPin, INPUT); newDebounceTime = milis();

tampilan.mulai();

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

}

Dalam loop pertama-tama saya memeriksa apakah intervalnya lebih dari 500ms, jika ya, LCD diperbarui. Jika tidak tombol pada encoder dicentang. Jika ditekan toggleBuffer dipanggil. Setelah ini encoder diperiksa. Jika input 0 rendah (rotasi terdeteksi) saya memeriksa input B, jika input B adalah 0 saya menambah pot, yang lain saya kurangi. Setelah ini nilai akan dikirim ke DS1803 melalui wire.write.

lingkaran 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;} }else{ pot--; if(pot < 1){pot = 1;} } count = 1; newDebounceTime = milis();

Wire.beginTransmission(controlByte); // mulai mentransmisikan

Wire.write(commandByte); // pemilihan potmeter Wire.write(pot[0] * 10); // kirim byte pertama data potmeter Wire.write(pot[1] * 10); // kirim byte ke-2 data potmeter Wire.endTransmission(); // hentikan transmisi }else if (digitalRead(encoder_A) == 1 && digitalRead(encoder_B) == 1 && count == 1 && (millis() - newDebounceTime > deBounceTime)){ count = 0; newDebounceTime = milis(); } }

void toggleBuffer(){ ditekan = 1; if (i == 0){i = 1;}else{i = 0;} }

Pertama saya membersihkan area di mana saya harus menulis variabel. Saya melakukan ini untuk menggambar persegi panjang di area ini. Setelah itu saya menulis variabel ke layar.

void writeToLCD(){ Wire.requestFrom(controlByte, 2); potValue[0] = Wire.read(); // baca byte potmeter pertama potValue[1] = Wire.read(); // membaca byte potmeter kedua display.fillRect(40, 0, 40, 45, WHITE); // hapus layar variabel pada layar LCD.setCursor(40, 10); display.print(potValue[0]); // tulis nilai potmeter pertama ke layar LCD.setCursor(40, 22); display.print(potValue[1]); // tulis nilai potmeter ke-2 ke layar LCD.setCursor(60, (10 + i * 12)); tampilan.print("<"); tampilan.tampilan(); }

void interval(){ // timer interval untuk menulis data ke LCD if ((millis() - oldTime) > 500) { writeToLCD(); waktu lama = milis(); } }

Direkomendasikan: