Оглавление:

Двойной цифровой потенциометр DS1803 с Arduino: 5 шагов
Двойной цифровой потенциометр DS1803 с Arduino: 5 шагов

Видео: Двойной цифровой потенциометр DS1803 с Arduino: 5 шагов

Видео: Двойной цифровой потенциометр DS1803 с Arduino: 5 шагов
Видео: Почтовый мешок! Цифровой потенциометр DS1803 и другой кремний 2024, Ноябрь
Anonim
Двойной цифровой потенциометр DS1803 с Arduino
Двойной цифровой потенциометр DS1803 с Arduino

Мне нравится рассказывать об использовании цифрового потенциометра DS1803 с Arduino. Эта ИС содержит два цифровых потенциометра, которыми можно управлять по двухпроводному интерфейсу, для этого я использую библиотеку wire.h.

Эта ИС может заменить обычный аналоговый потенциометр. Таким образом вы можете управлять, например, усилителем или источником питания.

В этом руководстве я контролирую яркость двух светодиодов, чтобы показать работу.

Arduino считает импульсы поворотного энкодера и помещает значение в переменные pot [0] и pot [1]. Когда вы нажимаете переключатель на энкодере, вы можете переключаться между pot [0] и pot [1].

Фактическое значение горшков считывается обратно из DS1803 и помещается в переменные potValue [0] и potValue [1] и отображается на ЖК-дисплее.

Шаг 1: Подключения DS1803

Подключения DS1803
Подключения DS1803

Здесь вы можете увидеть подключения DS1803. H - это верхняя сторона потенциометра, L - нижняя сторона, а W - дворник. SCL и SDA - это автобусные соединения.

С подключением A0, A1 и A2 вы можете дать DS1803 собственный адрес, таким образом вы можете управлять несколькими устройствами через одну шину. В моем примере я дал DS1803 адрес 0, подключив все контакты к земле.

Шаг 2: командный байт

Командный байт
Командный байт

Способ работы DS1803 можно использовать в командном байте. Когда вы выбираете «записать потенциометр-0», выбираются оба потенциометра, когда вы хотите настроить только потенциометр-0, вам нужно отправить только первый байт данных. «Записать потенциометр-1» только регулировать потенциометр-1. «Запись в оба потенциометра» дает обоим потенциометрам одинаковое значение.

Шаг 3: Управление DS1803

Управление DS1803
Управление DS1803

Управляющий байт (рисунок 3) имеет идентификатор устройства, он всегда остается неизменным. В моем примере A0, A1 и A2 равны 0, потому что мы выбираем адрес, заземляя все контакты A. Последний бит R / W будет установлен в 0 или 1 командами «Wire.beginTransmission» и «Wire.requestFrom» в Arduino. На рисунке 5 вы можете увидеть телеграмму целиком. Прочитанная телеграмма показана на рисунке 4.

Шаг 4: настройка

Настраивать
Настраивать

Эта схема показывает, как все подключить. ЖК-дисплей Nokia доступен с различными подключениями, убедитесь, что вы правильно подключили свой. Также у него разные версии энкодера, у некоторых общий на среднем штифте, у других нет. Я установил небольшую сеть фильтров (резистор 470 Ом с емкостью 100 нФ) для фильтрации выходных сигналов A и B энкодера. Мне нужен этот фильтр, потому что на выходе было много шума. Я также включил в свою программу таймер устранения дребезга, чтобы убрать некоторый шум. В остальном схема понятная. ЖК-дисплей можно заказать через Adafruit

Шаг 5: Программа

Для использования двухпроводной шины я включил библиотеку Wire.h. Чтобы использовать ЖК-дисплей, я включил библиотеку Adafruit, которую вы можете скачать с https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library, а также библиотеку Adafruit_GFX.h, доступную здесь https:// github. com / adafruit / Adafruit-GFX-Library.

#включают

#включают

#включают

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

Здесь вы можете увидеть все переменные. Байт управления и байт команды, как описано ранее. DeBounceTime можно регулировать в зависимости от шума на вашем кодировщике.

байтовый горшок [2] = {1, 1}; byte controlByte = B0101000; // 7 бит, байт commandByte = B10101001; // последние 2 бита - выбор потенциометра. byte potValue [2]; int я = 0; int deBounceTime = 10; // Настройте это значение в зависимости от шума const int encoder_A = 8; const int encoder_B = 9; const int buttonPin = 2; беззнаковый длинный newDebounceTime = 0; беззнаковый длинный oldTime; логическое нажатие = 0; логическое число = 1;

В настройке я определяю правильные контакты и помещаю статический текст на ЖК-дисплей.

пустая настройка () {Wire.begin (); Serial.begin (9600); pinMode (кодировщик_A, ВХОД); pinMode (кодировщик_B, ВХОД); pinMode (buttonPin, ВВОД); newDebounceTime = миллис ();

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 ();

}

В цикле я сначала проверяю, превышает ли интервал 500 мс, если да, ЖК-дисплей обновляется. В противном случае проверяется кнопка на кодировщике. При нажатии вызывается toggleBuffer. После этого проверяется кодировщик. Если на входе 0 низкий уровень (обнаружено вращение), я проверяю вход B, если на входе B 0, я увеличиваю pot , другие - уменьшаю. После этого значение будет отправлено на DS1803 через wire.write.

void loop () {

интервал ();

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

if (digitalRead (encoder_A) == 0 && count == 0 && (millis () - newDebounceTime> deBounceTime)) {if (digitalRead (encoder_B) == 0) {pot ++; если (pot > 25) {pot = 25;}} else {pot -; если (pot <1) {pot = 1;}} count = 1; newDebounceTime = миллис ();

Wire.beginTransmission (controlByte); // начинаем передачу

Wire.write (commandByte); // выбор потенциометров Wire.write (pot [0] * 10); // отправляем 1-й байт данных потенциометра Wire.write (pot [1] * 10); // отправляем 2-й байт данных потенциометра Wire.endTransmission (); // прекращаем передачу} else if (digitalRead (encoder_A) == 1 && digitalRead (encoder_B) == 1 && count == 1 && (millis () - newDebounceTime> deBounceTime)) {count = 0; newDebounceTime = миллис (); }}

void toggleBuffer () {нажато = 1; if (i == 0) {i = 1;} else {i = 0;}}

Сначала я очищаю область, в которой мне нужно написать переменные. Я делаю это, чтобы нарисовать прямоугольник в этой области. После этого я записываю переменные на экран.

void writeToLCD () {Wire.requestFrom (controlByte, 2); potValue [0] = Wire.read (); // считываем первый байт потенциометра potValue [1] = Wire.read (); // считываем второй байт потенциометра display.fillRect (40, 0, 40, 45, БЕЛЫЙ); // очистить экран переменных на ЖК-дисплее. setCursor (40, 10); display.print (potValue [0]); // записываем 1-е значение потенциометра на ЖК-дисплей. setCursor (40, 22); display.print (potValue [1]); // записываем 2-е значение потенциометра на ЖК-дисплей. setCursor (60, (10 + i * 12)); display.print ("<"); display.display (); }

void interval () {// интервальный таймер для записи данных на ЖК-дисплей if ((millis () - oldTime)> 500) {writeToLCD (); oldTime = миллис (); }}

Рекомендуемые: