Obsah:

Duálny digitálny potenciometer DS1803 s Arduino: 5 krokov
Duálny digitálny potenciometer DS1803 s Arduino: 5 krokov

Video: Duálny digitálny potenciometer DS1803 s Arduino: 5 krokov

Video: Duálny digitálny potenciometer DS1803 s Arduino: 5 krokov
Video: Как использовать ESP32 WiFi и Bluetooth с Arduino IDE, полная информация с примерами и кодом. 2024, Júl
Anonim
Duálny digitálny potenciometer DS1803 s Arduino
Duálny digitálny potenciometer DS1803 s Arduino

Rád by som zdieľal používanie digitálneho potmetra DS1803 s Arduino. Tento IC obsahuje dva digitálne potmetre, ktoré je možné ovládať pomocou dvojvodičového rozhrania, a preto používam knižnicu wire.h.

Tento IC môže nahradiť normálny analógový potmeter. Týmto spôsobom môžete ovládať napríklad zosilňovač alebo napájací zdroj.

V tomto návode ovládam jas dvoch LED diód, aby ukázali funkčnosť.

Arduino počíta impulzy rotačného enkodéra a umiestňuje hodnotu do variabilného pot [0] a pot [1]. Keď stlačíte spínač na kodéri, môžete prepínať medzi pot [0] a pot [1].

Skutočná hodnota kvetináčov sa odčíta z DS1803 a umiestni sa do premennej potValue [0] a potValue [1] a zobrazí sa na LCD displeji.

Krok 1: Pripojenia DS1803

Pripojenia DS1803
Pripojenia DS1803

Tu môžete vidieť pripojenia DS1803. H je horná strana potenciometra, L dolná strana a W stierač. SCL a SDA sú autobusové spojenia.

Pripojením A0, A1 a A2 môžete dať DS1803 vlastnú adresu, takže môžete ovládať viac zariadení cez jednu zbernicu. V mojom prípade som dal DS1803 adresu 0 pripojením všetkých pinov k zemi.

Krok 2: Príkazový bajt

Príkazový bajt
Príkazový bajt

Spôsob, akým DS1803 funguje, je možné použiť v príkazovom bajte. Keď vyberiete „zapisovať potenciometer-0“, budú vybraté oba potenciometre a keď chcete nastaviť iba potenciometer-0, musíte odoslať iba prvý dátový bajt. „Zapisujte potenciometer-1“nastavte iba potenciometer-1. „Zapisovať do oboch potenciometrov“dáva obom potenciometrom rovnakú hodnotu.

Krok 3: Ovládanie DS1803

Ovládanie DS1803
Ovládanie DS1803

Riadiaci bajt (obrázok 3) má identifikátor zariadenia, ktorý zostáva vždy rovnaký. V mojom prípade A0, A1 a A2 sú 0, pretože vyberáme adresu tak, že všetky A-piny uzemníme. Posledný bit R/W bude v Arduine nastavený na 0 alebo 1 príkazom „Wire.beginTransmission“a „Wire.requestFrom“. Na obrázku 5 môžete vidieť celý telegram. Načítaný telegram je znázornený na obrázku 4.

Krok 4: Nastavenie

Nastaviť
Nastaviť

Tento obvod ukazuje, ako všetko prepojiť. Displej Nokia LCD je k dispozícii s rôznymi pripojeniami. Uistite sa, že ste správne prepojili svoje. Tiež rotačný snímač jeho rôznych verzií, niektoré majú spoločné na strednom kolíku iné nie. Na filtráciu výstupných signálov A a B kodéra som vložil malú filtračnú sieť (odpor 470 Ohm s viečkom 100nF). Potrebujem tento filter, pretože výstup mal veľa šumu. Do svojho programu som tiež vložil časovač odskoku, aby som zrušil určitý hluk. Vo zvyšku si myslím, že obvod je jasný. LCD displej je možné objednať cez Adafruit

Krok 5: Program

Na použitie 2-vodičovej zbernice používam knižnicu Wire.h. Ak chcete používať LCD, uvádzam knižnicu Adafruit, ktorú si môžete stiahnuť z https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library, a tiež knižnicu Adafruit_GFX.h nájdete tu https:// github. com/adafruit/Adafruit-GFX-Library.

#zahrnúť

#zahrnúť

#zahrnúť

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

Tu môžete vidieť všetky premenné. Riadiaci bajt a príkazový bajt, ako je popísané vyššie. Čas deBounceTime je možné nastaviť v závislosti od hluku vášho kodéra.

byte pot [2] = {1, 1}; byte controlByte = B0101000; // 7 bitov, byte commandByte = B10101001; // posledné 2 bity je výber potmetra. byte potValue [2]; int i = 0; int deBounceTime = 10; // Upravte túto hodnotu v závislosti od konštanty šumu kodéra_A = 8; const int kodér_B = 9; tlačidlo const intPin = 2; nepodpísané dlhé newDebounceTime = 0; nepodpísaný dlhý oldTime; booleovský stlačený = 0; booleovský počet = 1;

V nastavení definujem správne kolíky a vložím statický text na LCD

neplatné nastavenie () {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 (ČIERNA); display.setCursor (0, 10); display.println ("POT 1 ="); display.setCursor (0, 22); display.println ("POT 2 ="); display.display ();

}

V slučke najskôr skontrolujem, či je interval dlhší ako 500 ms, ak áno, aktualizuje sa LCD. Ak nie, je začiarknuté tlačidlo na snímači. Po stlačení sa vyvolá toggleBuffer. Potom je kodér skontrolovaný. Ak je vstup 0 nízky (zistené otočenie), skontrolujem vstup B, ak je vstup B 0, zvýši sa pot , ostatné sa zníži. Potom bude hodnota odoslaná do DS1803 prostredníctvom wire.write.

prázdna slučka () {

interval ();

if (digitalRead (buttonPin) == 1 && (Press == 0)) {toggleBuffer ();} if (digitalRead (buttonPin) == 0) {Press = 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); // začnite vysielať

Wire.write (commandByte); // výber potmetrov Wire.write (pot [0] * 10); // odoslanie 1. bajtu údajov potmetra Wire.write (pot [1] * 10); // odoslanie 2. bajtu údajov potmetra Wire.endTransmission (); // zastavenie prenosu} else if (digitalRead (encoder_A) == 1 && digitalRead (encoder_B) == 1 && count == 1 && (millis () - newDebounceTime> deBounceTime)) {count = 0; newDebounceTime = millis (); }}

void toggleBuffer () {stlačené = 1; if (i == 0) {i = 1;} else {i = 0;}}

Najprv vyčistím oblasť, kde mám zapísať premenné. Robím to tak, aby sa v tejto oblasti nakreslil obdĺžnik. Potom napíšem premenné na obrazovku.

void writeToLCD () {Wire.requestFrom (controlByte, 2); potValue [0] = Wire.read (); // prečítanie prvého bajtu potmetra potValue [1] = Wire.read (); // prečítanie druhého bajtu potmetra display.fillRect (40, 0, 40, 45, WHITE); // vymazanie variabilnej obrazovky na LCD displeji.setCursor (40, 10); display.print (potValue [0]); // zapis 1. hodnoty potmetra na LCD display.setCursor (40, 22); display.print (potValue [1]); // zapisanie 2. hodnoty potmetra na LCD display.setCursor (60, (10 + i * 12)); display.print ("<"); display.display (); }

neplatný interval () {// intervalový časovač na zápis údajov na LCD, ak ((milis () - oldTime)> 500) {writeToLCD (); oldTime = millis (); }}

Odporúča: