Satura rādītājs:

DS1803 divkāršs digitālais potenciometrs ar Arduino: 5 soļi
DS1803 divkāršs digitālais potenciometrs ar Arduino: 5 soļi

Video: DS1803 divkāršs digitālais potenciometrs ar Arduino: 5 soļi

Video: DS1803 divkāršs digitālais potenciometrs ar Arduino: 5 soļi
Video: DFT_#A92 DOUBLE POTENTIOMETRE NUMERIQUE - I2C - DS1803 - ATTINY85 2024, Novembris
Anonim
DS1803 Dual Digital potenciometrs ar Arduino
DS1803 Dual Digital potenciometrs ar Arduino

Man patīk dalīties ar digitālā potmetra DS1803 lietošanu ar Arduino. Šajā IC ir divi digitālie potmetri, kurus var vadīt, izmantojot divu vadu saskarni, tāpēc es izmantoju wire.h bibliotēku.

Šis IC var aizstāt parasto analogo potmetru. Tādā veidā jūs varat kontrolēt, piemēram, pastiprinātāju vai barošanas avotu.

Šajā pamācībā es kontrolēju divu gaismas diodes spilgtumu, lai parādītu darbu.

Arduīno saskaita rotējošā kodētāja impulsus un ievieto vērtību mainīgajā katlā [0] un katlā [1]. Nospiežot kodētāja slēdzi, varat pārslēgties starp pot [0] un pot [1].

Katlu faktiskā vērtība tiek nolasīta no DS1803 un ievietota mainīgajos potValue [0] un potValue [1] un parādīta LCD.

1. darbība: DS1803 savienojumi

DS1803 savienojumi
DS1803 savienojumi

Šeit jūs varat redzēt DS1803 savienojumus. H ir potenciometra augstā puse, L apakšējā puse un W tīrītājs. SCL un SDA ir kopnes savienojumi.

Izmantojot savienojumu A0, A1 un A2, jūs varat piešķirt DS1803 savu adresi, tādējādi jūs varat kontrolēt vairāk ierīču, izmantojot vienu kopni. Savā piemērā es esmu norādījis DS1803 adresi 0, savienojot visas tapas ar zemi.

2. darbība: komandu baits

Komandu baits
Komandu baits

DS1803 darbības veidu var izmantot komandu baitos. Izvēloties "rakstīt potenciometru-0", tiek atlasīti abi potenciometri, un, ja vēlaties pielāgot tikai potenciometru-0, jums jānosūta tikai pirmais datu baits. "Rakstīšanas potenciometrs-1" regulē tikai potmetru-1. "Rakstīt abiem potenciometriem" dod abiem potenciometriem vienādu vērtību.

3. darbība: DS1803 vadība

DS1803 vadība
DS1803 vadība

Vadības baitam (3. attēls) ir ierīces identifikators, tas vienmēr paliek nemainīgs. Manā piemērā A0, A1 un A2 ir 0, jo mēs izvēlamies adresi, noliekot visas A tapas pie zemes. Pēdējais bits R/W tiks iestatīts uz 0 vai 1 ar komandu "Wire.beginTransmission" un "Wire.requestFrom" Arduino. 5. attēlā var redzēt visu telegrammu. Lasītā telegramma ir parādīta 4. attēlā.

4. darbība: iestatīšana

Uzstādīt
Uzstādīt

Šī shēma parāda, kā visu savienot. Nokia LCD ir pieejams ar dažādiem savienojumiem, pārliecinieties, vai esat pareizi pievienojis savu. Arī rotācijas kodētājs viņa dažādās versijās, dažiem ir kopīgs uz vidējās tapas, citiem nav. Esmu ievietojis nelielu filtru tīklu (470 omu rezistors ar 100nF vāciņu), lai filtrētu kodētāja A un B izejas signālus. Man ir vajadzīgs šis filtrs, jo izejā bija daudz trokšņa. Es savā programmā ievietoju arī atslēgšanās taimeri, lai atceltu troksni. Par pārējo es domāju, ka ķēde ir skaidra. LCD var pasūtīt, izmantojot Adafruit

5. solis: programma

Lai izmantotu 2 vadu kopni, es iekļauju Wire.h bibliotēku. Lai izmantotu LCD, es iekļauju Adafruit bibliotēku, kuru varat lejupielādēt vietnē https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library, kā arī Adafruit_GFX.h bibliotēka ir pieejama šeit https:// github. com/adafruit/Adafruit-GFX-Library.

#iekļaut

#iekļaut

#iekļaut

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

Šeit jūs varat redzēt visus mainīgos. Kontrolējiet baitu un komandu baitu, kā aprakstīts iepriekš. DeBounceTime var pielāgot atkarībā no kodētāja radītā trokšņa.

baitu katls [2] = {1, 1}; baitu kontroleBīts = B0101000; // 7 biti, baitu komandaByte = B10101001; // pēdējie 2 biti ir potmetra izvēle. baits potValue [2]; int i = 0; int deBounceTime = 10; // Pielāgojiet šo vērtību atkarībā no trokšņa konst int kodētājs_A = 8; const int kodētājs_B = 9; const int pogaPin = 2; neparakstīts garš newDebounceTime = 0; neparakstīts ilgi oldTime; Būla nospiests = 0; Būla skaitlis = 1;

Iestatījumā es definēju pareizās tapas un ievietoju statisko tekstu LCD

void setup () {Wire.begin (); Sērijas sākums (9600); pinMode (kodētājs_A, IEEJA); pinMode (kodētājs_B, IEEJA); pinMode (buttonPin, INPUT); newDebounceTime = milis ();

display.begin ();

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

}

Ciklā es vispirms pārbaudu, vai intervāls ir lielāks par 500 ms, ja jā, LCD tiek atjaunināts. Ja nē, kodētāja poga ir pārbaudīta. Nospiežot pārslēgšanas buferi, tiek izsaukts. Pēc tam kodētājs tiek pārbaudīts. Ja ieeja 0 ir zema (ir konstatēta rotācija), es pārbaudu ievadi B, ja ievade B ir 0 I pieauguma katls , citi - samazinājumu. Pēc tam vērtība tiks nosūtīta uz DS1803, izmantojot wire.write.

void loop () {

intervāls ();

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

ja (digitalRead (encoder_A) == 0 && count == 0 && (millis () - newDebounceTime> deBounceTime)) {ja (digitalRead (encoder_B) == 0) {pot ++; ja (pot > 25) {pot = 25;}} cits {pot -; ja (pot <1) {pot = 1;}} skaits = 1; newDebounceTime = milis ();

Wire.beginTransmission (controlByte); // sākt pārraidīt

Wire.write (commandByte); // potmetru izvēle Wire.write (pot [0] * 10); // nosūtīt potmetra datu 1. baitu Wire.write (pot [1] * 10); // nosūtīt potmetra datu 2. baitu Wire.endTransmission (); // pārtraukt pārraidi} else if (digitalRead (encoder_A) == 1 && digitalRead (encoder_B) == 1 && count == 1 && (millis () - newDebounceTime> deBounceTime)) {count = 0; newDebounceTime = milis (); }}

void toggleBuffer () {nospiests = 1; ja (i == 0) {i = 1;} cits {i = 0;}}

Vispirms es notīrīju apgabalu, kurā jāraksta mainīgie. Es to daru, lai šajā jomā uzzīmētu taisnstūri. Pēc tam es uzrakstu ekrānā mainīgos.

void writeToLCD () {Wire.requestFrom (controlByte, 2); potValue [0] = Wire.read (); // lasīt pirmo potmetra baitu potValue [1] = Wire.read (); // lasīt otrā potmetra baitu displeju.fillRect (40, 0, 40, 45, WHITE); // notīrīt mainīgo ekrānu LCD displejā.setCursor (40, 10); display.print (potValue [0]); // LCD displejā ierakstīt 1. potmetra vērtību.setCursor (40, 22); display.print (potValue [1]); // LCD displejā ierakstīt 2. potmetra vērtību.setCursor (60, (10 + i * 12)); display.print ("<"); display.display (); }

void interval () {// intervāla taimeris datu ierakstīšanai LCD, ja ((milis () - oldTime)> 500) {writeToLCD (); oldTime = milis (); }}

Ieteicams: