Mục lục:

Chiết áp kỹ thuật số kép DS1803 với Arduino: 5 bước
Chiết áp kỹ thuật số kép DS1803 với Arduino: 5 bước

Video: Chiết áp kỹ thuật số kép DS1803 với Arduino: 5 bước

Video: Chiết áp kỹ thuật số kép DS1803 với Arduino: 5 bước
Video: Mailbag! DS1803 Digital Pot and Other Silicon 2024, Tháng bảy
Anonim
Chiết áp kỹ thuật số kép DS1803 với Arduino
Chiết áp kỹ thuật số kép DS1803 với Arduino

Tôi muốn chia sẻ cách sử dụng nồi kế số DS1803 với Arduino. IC này chứa hai nồi kế kỹ thuật số có thể được điều khiển qua giao diện hai dây, đối với điều này, tôi sử dụng thư viện wire.h.

IC này có thể thay thế một nồi kế tương tự bình thường. Bằng cách này, bạn có thể điều khiển bộ khuếch đại hoặc nguồn điện.

Trong hướng dẫn này, tôi kiểm soát độ sáng của hai đèn LED để hiển thị hoạt động.

Arduino đếm các xung của bộ mã hóa quay và đặt giá trị vào biến pot [0] và pot [1]. Khi nhấn nút trên bộ mã hóa, bạn có thể chuyển đổi giữa nồi [0] và nồi [1].

Giá trị thực của các bình được đọc lại từ DS1803 và được đặt trong biến potValue [0] và potValue [1] và hiển thị trên màn hình LCD.

Bước 1: Kết nối của DS1803

Các kết nối của DS1803
Các kết nối của DS1803

Tại đây bạn có thể thấy các kết nối của DS1803. H là cạnh cao của chiết áp, L là cạnh thấp và W của cần gạt nước. SCL và SDA là các kết nối xe buýt.

Với kết nối A0, A1 và A2, bạn có thể cung cấp cho DS1803 địa chỉ riêng của nó, bằng cách này, bạn có thể điều khiển nhiều thiết bị hơn thông qua một bus. Trong ví dụ của tôi, tôi đã cho DS1803 tuân theo 0 bằng cách kết nối tất cả các chân với đất.

Bước 2: Lệnh Byte

Lệnh Byte
Lệnh Byte

Cách hoạt động của DS1803 có thể được sử dụng trong byte lệnh. Khi bạn chọn "ghi chiết áp-0" cả hai chiết áp đều được chọn, khi bạn chỉ muốn điều chỉnh chiết áp-0, bạn chỉ phải gửi byte dữ liệu đầu tiên. "Ghi chiết áp-1" chỉ điều chỉnh chiết áp-1. "Ghi cho cả hai chiết áp" cho cả hai chiết áp cùng một giá trị.

Bước 3: Kiểm soát DS1803

Kiểm soát DS1803
Kiểm soát DS1803

Byte điều khiển (hình 3) có một mã định danh thiết bị, điều này luôn giữ nguyên. Trong ví dụ của tôi A0, A1 và A2 là 0 vì chúng tôi chọn các vị trí bằng cách đặt tất cả các chân A xuống đất. Bit cuối cùng R / W sẽ được đặt thành 0 hoặc 1 bằng lệnh "Wire.beginTransmission" và "Wire.requestFrom" trong Arduino. Trong hình 5, bạn có thể thấy toàn bộ bức điện. Bức điện đã đọc được thể hiện trong hình 4.

Bước 4: Thiết lập

Thiết lập
Thiết lập

Mạch này chỉ ra cách kết nối mọi thứ. Nokia LCD có sẵn với các kết nối khác nhau, hãy đảm bảo rằng bạn kết nối đúng. Ngoài ra, bộ mã hóa quay phiên bản khác nhau của anh ấy, một số có điểm chung ở chân giữa, số khác thì không. Tôi đã đặt một mạng bộ lọc nhỏ (điện trở 470 Ohm với nắp 100nF) để lọc tín hiệu đầu ra A và B của bộ mã hóa. Tôi cần bộ lọc này vì đầu ra có rất nhiều tiếng ồn. Tôi cũng đặt một bộ đếm thời gian gỡ lỗi trong chương trình của mình để loại bỏ một số tiếng ồn. Đối với phần còn lại, tôi nghĩ rằng mạch là rõ ràng. Bạn có thể đặt hàng màn hình LCD qua Adafruit

Bước 5: Chương trình

Để sử dụng bus 2 dây, tôi đưa vào thư viện Wire.h. Để sử dụng màn hình LCD, tôi bao gồm thư viện Adafruit mà bạn có thể tải xuống từ https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library cũng có thư viện Adafruit_GFX.h tại đây https://github. com / adafruit / Adafruit-GFX-Thư viện.

#bao gồm

#bao gồm

#bao gồm

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

Ở đây bạn có thể xem tất cả các biến. Điều khiển byte và byte lệnh như đã mô tả trước đây. Thời gian deBounceTime có thể được điều chỉnh tùy thuộc vào tiếng ồn trên bộ mã hóa của bạn.

byte pot [2] = {1, 1}; byte controlByte = B0101000; // 7 bit, byte commandByte = B10101001; // 2 bit cuối cùng là lựa chọn potmeter. byte potValue [2]; int i = 0; int deBounceTime = 10; // Điều chỉnh giá trị này tùy thuộc vào nhiễu const int encoder_A = 8; const int encoder_B = 9; const int buttonPin = 2; unsigned long newDebounceTime = 0; oldTime dài không dấu; boolean được ép = 0; số lượng boolean = 1;

Trong thiết lập, tôi xác định các chân bên phải và đặt văn bản tĩnh trên màn hình LCD

void setup () {Wire.begin (); Serial.begin (9600); pinMode (mã hóa_A, INPUT); pinMode (encoder_B, INPUT); pinMode (buttonPin, INPUT); newDebounceTime = millis ();

display.begin ();

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

}

Trong vòng lặp, đầu tiên tôi kiểm tra xem khoảng thời gian có nhiều hơn 500ms hay không, nếu có thì màn hình LCD sẽ được cập nhật. Nếu không chọn nút trên bộ mã hóa. Nếu được nhấn, bộ đệm chuyển đổi sẽ được gọi. Sau khi bộ mã hóa này được kiểm tra. Nếu đầu vào 0 ở mức thấp (phát hiện vòng quay), tôi kiểm tra đầu vào B, nếu đầu vào B là 0, tôi tăng giá trị , các đầu vào khác tôi giảm. Sau đó, giá trị sẽ được gửi đến DS1803 qua wire.write.

void loop () {

khoảng ();

if (digitalRead (buttonPin) == 1 && (được nhấn == 0)) {toggleBuffer ();} if (digitalRead (buttonPin) == 0) {được nhấn = 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 = millis ();

Wire.beginTransmission (controlByte); // bắt đầu truyền

Wire.write (commandByte); // lựa chọn potmeters Wire.write (pot [0] * 10); // gửi byte thứ nhất của dữ liệu potmeter Wire.write (pot [1] * 10); // gửi byte thứ 2 của dữ liệu potmeter Wire.endTransmission (); // dừng truyền} else if (digitalRead (encoder_A) == 1 && digitalRead (encoder_B) == 1 && count == 1 && (millis () - newDebounceTime> deBounceTime)) {count = 0; newDebounceTime = millis (); }}

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

Đầu tiên, tôi xóa khu vực mà tôi phải viết các biến thể. Tôi làm điều này để vẽ một hình chữ nhật trong khu vực này. Sau đó, tôi ghi các biến ra màn hình.

void writeToLCD () {Wire.requestFrom (controlByte, 2); potValue [0] = Wire.read (); // đọc byte potmeter đầu tiên potValue [1] = Wire.read (); // đọc byte potmeter thứ hai display.fillRect (40, 0, 40, 45, WHITE); // xóa màn hình biến trên LCD display.setCursor (40, 10); display.print (potValue [0]); // ghi giá trị potmeter thứ nhất vào LCD display.setCursor (40, 22); display.print (potValue [1]); // ghi giá trị potmeter thứ 2 vào LCD display.setCursor (60, (10 + i * 12)); display.print ("<"); display.display (); }

void khoảng () {// bộ định thời gian để ghi dữ liệu lên LCD if ((millis () - oldTime)> 500) {writeToLCD (); oldTime = millis (); }}

Đề xuất: