Съдържание:

DS1803 Двоен цифров потенциометър с Arduino: 5 стъпки
DS1803 Двоен цифров потенциометър с Arduino: 5 стъпки

Видео: DS1803 Двоен цифров потенциометър с Arduino: 5 стъпки

Видео: DS1803 Двоен цифров потенциометър с Arduino: 5 стъпки
Видео: LDmicro 19: Rotary Encoder Menu Navigation (Microcontroller PLC Ladder Programming with LDmicro) 2024, Ноември
Anonim
DS1803 Двоен цифров потенциометър с Arduino
DS1803 Двоен цифров потенциометър с Arduino

Харесва ми да споделя използването на цифров потметър DS1803 с Arduino. Тази интегрална схема съдържа два цифрови брояча, които могат да се контролират чрез двужичен интерфейс, за това използвам библиотеката wire.h.

Тази интегрална схема може да замени нормален аналогов потметър. По този начин можете да управлявате например усилвател или захранване.

В тази инструкция контролирам яркостта на два светодиода, за да покажа работата.

Arduino брои импулсите на въртящ се енкодер и поставя стойността в променлив пот [0] и пот [1]. Когато натиснете превключвателя на енкодера, можете да превключвате между пот [0] и пот [1].

Действителната стойност на саксиите се отчита от DS1803 и се поставя в променлива potValue [0] и potValue [1] и се показва на LCD.

Стъпка 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: Настройте

Настройвам
Настройвам

Тази схема показва как да свържете всичко. LCD дисплеят на Nokia се предлага с различни връзки, уверете се, че сте свързали правилно. Също така въртящият се енкодер неговите различни версии, някои има общото на средния щифт други не. Поставих малка филтърна мрежа (470 ома резистор със 100nF капачка), за да филтрирам изходните сигнали A и B на енкодера. Имам нужда от този филтър, защото изходът имаше много шум. В програмата си поставих и таймер за деблокиране, за да анулирам някакъв шум. За останалото смятам, че веригата е чиста. LCD дисплеят може да бъде поръчан чрез Adafruit

Стъпка 5: Програмата

За използването на 2-жичната шина включвам библиотеката Wire.h. За да използвам LCD, включвам библиотеката Adafruit, която можете да изтеглите от https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library, също библиотеката Adafruit_GFX.h е достъпна тук https:// github. com/adafruit/Adafruit-GFX-Library.

#включва

#включва

#включва

Adafruit_PCD8544 дисплей = Adafruit_PCD8544 (7, 6, 5, 4, 3);

Тук можете да видите всички променливи. Байт за управление и байт за команда, както е описано по -горе. Времето deBounceTime може да се регулира в зависимост от шума на вашия енкодер.

байт пот [2] = {1, 1}; байт controlByte = B0101000; // 7 бита, байт commandByte = B10101001; // последните 2 бита са избор на потметър. байт potValue [2]; int i = 0; int deBounceTime = 10; // Регулираме тази стойност в зависимост от шума const int encoder_A = 8; const int енкодер_B = 9; const int buttonPin = 2; unsigned long newDebounceTime = 0; unsigned long oldTime; булево натискане = 0; булов брой = 1;

В настройката определям десните щифтове и поставям статичния текст на LCD

void setup () {Wire.begin (); Serial.begin (9600); pinMode (енкодер_A, ВХОД); pinMode (енкодер_B, ВХОД); pinMode (buttonPin, INPUT); newDebounceTime = millis ();

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

}

В цикъла първо проверявам дали интервалът е повече от 500ms, ако да, LCD се актуализира. Ако не, бутонът на енкодера е проверен. Ако бъде натиснат, toggleBuffer се извиква. След това енкодерът се проверява. Ако вход 0 е нисък (открито е въртене), проверявам вход B, ако вход B е 0, увеличавам пота , други намалявам. След това стойността ще бъде изпратена до DS1803 чрез wire.write.

void loop () {

интервал ();

if (digitalRead (buttonPin) == 1 && (натиснат == 0)) {toggleBuffer ();} if (digitalRead (buttonPin) == 0) {натиснат = 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); // започва предаване

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 = millis (); }}

void toggleBuffer () {натиснат = 1; ако (i == 0) {i = 1;} иначе {i = 0;}}

Първо изчиствам областта, където трябва да напиша променливите. Правя това, за да нарисувам правоъгълник в тази област. След това записвам променливите на екрана.

void writeToLCD () {Wire.requestFrom (controlByte, 2); potValue [0] = Wire.read (); // прочети първия байт метър potValue [1] = Wire.read (); // четене на втория байтметров дисплей display.fillRect (40, 0, 40, 45, БЯЛ); // изчистване на променлив екран на LCD дисплея.setCursor (40, 10); display.print (potValue [0]); // записва стойността на първия потметър на LCD дисплея.setCursor (40, 22); display.print (potValue [1]); // записваме втората стойност на потметъра на LCD дисплея.setCursor (60, (10 + i * 12)); display.print ("<"); display.display (); }

void interval () {// интервален таймер за записване на данни на LCD, ако ((millis () - oldTime)> 500) {writeToLCD (); oldTime = millis (); }}

Препоръчано: