Мазмұны:

DS1803 Arduino көмегімен қос цифрлық потенциометр: 5 қадам
DS1803 Arduino көмегімен қос цифрлық потенциометр: 5 қадам

Бейне: DS1803 Arduino көмегімен қос цифрлық потенциометр: 5 қадам

Бейне: DS1803 Arduino көмегімен қос цифрлық потенциометр: 5 қадам
Бейне: Цифровые потенциометры и модуль на AD5245 2024, Қараша
Anonim
DS1803 Arduino көмегімен қос сандық потенциометр
DS1803 Arduino көмегімен қос сандық потенциометр

Мен DS1803 цифрлық өлшегішін Arduino -мен қолдануды бөліскім келеді. Бұл IC екі сымды интерфейс арқылы басқарылатын екі сандық потметрді қамтиды, ол үшін мен сым.h кітапханасын қолданамын.

Бұл IC қарапайым аналогтық потметрді алмастыра алады. Осылайша сіз күшейткішті немесе қуат көзін басқара аласыз.

Бұл нұсқаулықта мен жұмысты көрсету үшін екі жарықдиодты жарықтылықты басқарамын.

Ардуино айналмалы кодердің импульсін есептейді және мәнді ауыспалы ыдысқа [0] және кастрюльге [1] орналастырады. Кодердегі қосқышты басқан кезде, кастрөл [0] мен кастрөл [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, себебі біз барлық А-түйреуіштерді жерге қою арқылы адрес таңдаймыз. Соңғы бит R/W 0 немесе 1 мәніне Arduino ішіндегі «Wire.beginTransmission» және «Wire.requestFrom» пәрмендері бойынша орнатылады. 5 суретте сіз телеграмманы толық көре аласыз. Оқылған жеделхат 4 суретте көрсетілген.

4 -қадам: реттеу

Орнату
Орнату

Бұл схема бәрін қалай қосу керектігін көрсетеді. Nokia СКД әр түрлі қосылымдармен қол жетімді, оны дұрыс қосқаныңызға көз жеткізіңіз. Сондай -ақ, оның әр түрлі нұсқаларында айналмалы кодер бар, ал кейбіреулерінің ортаңғы түйреуіште ортақ белгілері бар, басқаларында жоқ. Мен кодердің А және В шығыс сигналдарын сүзу үшін кішкене сүзгі желісін (100nF қақпағы бар 470 Ом резисторы) қойдым. Маған бұл сүзгі қажет, себебі шығуда шу көп болды. Мен сондай -ақ шуды азайту үшін бағдарламаға дебюндің таймерін қойдым. Қалғандары үшін схема түсінікті деп ойлаймын. СКД Adafruit арқылы тапсырыс беруге болады

5 -қадам: Бағдарлама

2 сымды автобусты пайдалану үшін мен Wire.h кітапханасын қосамын. СКД пайдалану үшін менде Adafruit кітапханасы бар, оны https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library сайтынан жүктеуге болады, сонымен қатар Adafruit_GFX.h кітапханасы https:// github. com/adafruit/Adafruit-GFX-кітапханасы.

#қосу

#қосу

#қосу

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

Мұнда сіз барлық айнымалыларды көре аласыз. Байтты және командалық байтты басқару бұрын сипатталғандай. DeBounceTime кодтаушыдағы шуылға байланысты реттелуі мүмкін.

байт ыдысы [2] = {1, 1}; байтты басқаруBBte = B0101000; // 7 бит, байт командасыByte = B10101001; // соңғы 2 бит - бұл потметрді таңдау. байт potValue [2]; int i = 0; int deBounceTime = 10; // Шу мәніне байланысты бұл мәнді реттеңіз const encoder_A = 8; const int encoder_B = 9; const int buttonPin = 2; белгісіз ұзақ newDebounceTime = 0; қол қойылмаған long oldTime; логикалық сығылған = 0; логикалық санау = 1;

Орнатуда мен дұрыс түйреуіштерді анықтап, статикалық мәтінді СКД -ге қоямын

void setup () {Wire.begin (); Serial.begin (9600); pinMode (encoder_A, INPUT); pinMode (encoder_B, INPUT); 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 ();

}

Циклда мен алдымен интервал 500 мс -тен асатынын тексеремін, егер иә болса, СКД жаңартылады. Олай болмаса, кодердегі түйме тексеріледі. Егер toggleBuffer басылса, қоңырау шалыңыз. Осыдан кейін кодер тексеріледі. Егер 0 кірісі төмен болса (айналу анықталса) Мен В кірісін тексеремін, егер В кірісі 0 болса, мен өсіретін ыдыс , басқалары I азайтады. Осыдан кейін мән DS1803 -ке tel.write арқылы жіберіледі.

void loop () {

интервал ();

if (digitalRead (buttonPin) == 1 && (басылған == 0)) {toggleBuffer ();} if (digitalRead (buttonPin) == 0) {pressed = 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 potmeters таңдау (горшок [0] * 10); // Wire.write potmeter деректерінің 1 байтын жіберу (pot [1] * 10); // Wire.endTransmission potmeter деректерінің 2 байтын жіберу (); // жіберуді тоқтатыңыз} else if (digitalRead (encoder_A) == 1 && digitalRead (encoder_B) == 1 && count == 1 && (millis () - newDebounceTime> deBounceTime)) {count = 0; newDebounceTime = millis (); }}

void toggleBuffer () {pressed = 1; егер (i == 0) {i = 1;} басқа {i = 0;}}

Алдымен мен жазуға болатын жерлерді тазалаймын. Мен мұны осы аймаққа тіктөртбұрыш салу үшін жасаймын. Осыдан кейін мен айнымалыларды экранға жазамын.

жарамсыз writeToLCD () {Wire.requestFrom (controlByte, 2); potValue [0] = Wire.read (); // бірінші potmeter байт potValue оқу [1] = Wire.read (); // оқу екінші potmeter байт display.fillRect (40, 0, 40, 45, WHITE); // LCD дисплейіндегі ауыспалы айнымалы экран.setCursor (40, 10); display.print (potValue [0]); // LCD display.setCursor -ге 1 -ші потметрдің мәнін жазу (40, 22); display.print (potValue [1]); // LCD display.setCursor -ге 2 -ші потметрдің мәнін жазыңыз (60, (10 + i * 12)); display.print («<»); display.display (); }

void interval () {// интервал таймері СКД -ге деректерді жазу үшін, егер ((millis () - oldTime)> 500) {writeToLCD (); oldTime = millis (); }}

Ұсынылған: