Daftar Isi:
2025 Pengarang: John Day | [email protected]. Terakhir diubah: 2025-01-13 06:57
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
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
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
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
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(); } }