Obsah:

Duální digitální potenciometr DS1803 s Arduinem: 5 kroků
Duální digitální potenciometr DS1803 s Arduinem: 5 kroků

Video: Duální digitální potenciometr DS1803 s Arduinem: 5 kroků

Video: Duální digitální potenciometr DS1803 s Arduinem: 5 kroků
Video: Arduino návody | Digitální potenciometr X9C103S 2024, Červenec
Anonim
Duální digitální potenciometr DS1803 s Arduino
Duální digitální potenciometr DS1803 s Arduino

Rád sdílím použití digitálního potmetru DS1803 s Arduinem. Tento IC obsahuje dva digitální potmetry, které lze ovládat přes dvouvodičové rozhraní, k tomu používám knihovnu wire.h.

Tento IC může nahradit normální analogový potmetr. Tímto způsobem můžete ovládat například zesilovač nebo napájecí zdroj.

V tomto pokynu ovládám jas dvou LED diod, abych ukázal fungování.

Arduino počítá impulsy rotačního kodéru a hodnotu umístí do proměnné pot [0] a pot [1]. Když stisknete spínač na kodéru, můžete přepínat mezi pot [0] a pot [1].

Skutečná hodnota potů se odečte zpět z DS1803 a umístí se do proměnné potValue [0] a potValue [1] a zobrazí se na LCD.

Krok 1: Připojení DS1803

Připojení DS1803
Připojení DS1803

Zde můžete vidět připojení DS1803. H je horní strana potenciometru, L dolní strana a W stěrač. SCL a SDA jsou autobusová spojení.

S připojením A0, A1 a A2 můžete dát DS1803 vlastní adresu, takže můžete ovládat více zařízení přes jednu sběrnici. V mém příkladu jsem dal DS1803 adresu 0 připojením všech pinů k zemi.

Krok 2: Command Byte

Command Byte
Command Byte

Způsob, jakým DS1803 pracuje, lze použít v příkazovém bajtu. Když vyberete „zapisovat potenciometr-0“, budou vybrány oba potenciometry a pokud chcete upravit pouze potenciometr-0, stačí odeslat první datový bajt. „Zápis potenciometru-1“upravte pouze potenciometr-1. „Zapisovat do obou potenciometrů“dává oběma potenciometrům stejnou hodnotu.

Krok 3: Ovládání DS1803

Ovládání DS1803
Ovládání DS1803

Řídicí bajt (obrázek 3) má identifikátor zařízení, který zůstává vždy stejný. V mém příkladu A0, A1 a A2 jsou 0, protože vybereme adresu tak, že všechny A-piny položíme na zem. Poslední bit R/W bude v Arduinu nastaven na 0 nebo 1 příkazem „Wire.beginTransmission“a „Wire.requestFrom“. Na obrázku 5 můžete vidět celý telegram. Přečtený telegram je znázorněn na obrázku 4.

Krok 4: Nastavení

Založit
Založit

Tento obvod ukazuje, jak vše propojit. Displej Nokia LCD je k dispozici s různými připojeními. Ujistěte se, že připojujete správně. Také rotační kodér jeho různých verzí, některé mají společné na středním pinu jiné ne. Dal jsem malou filtrační síť (odpor 470 Ohm s víčkem 100nF) k filtrování výstupních signálů A a B kodéru. Tento filtr potřebuji, protože na výstupu byl velký hluk. Také jsem do svého programu vložil časovač odskoku, který ruší nějaký hluk. Ve zbytku si myslím, že obvod je jasný. LCD lze objednat prostřednictvím Adafruit

Krok 5: Program

Pro použití 2vodičové sběrnice zahrnuji knihovnu Wire.h. Chcete-li používat LCD, přidávám knihovnu Adafruit, kterou si můžete stáhnout z https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library a také knihovnu Adafruit_GFX.h je k dispozici zde https:// github. com/adafruit/Adafruit-GFX-Library.

#zahrnout

#zahrnout

#zahrnout

Zobrazení Adafruit_PCD8544 = Adafruit_PCD8544 (7, 6, 5, 4, 3);

Zde můžete vidět všechny proměnné. Řídicí bajt a příkazový bajt, jak bylo popsáno výše. Čas deBounceTime lze upravit v závislosti na hluku kodéru.

byte pot [2] = {1, 1}; byte controlByte = B0101000; // 7 bitů, byte commandByte = B10101001; // poslední 2 bity je výběr potmetru. byte potValue [2]; int i = 0; int deBounceTime = 10; // Upravte tuto hodnotu v závislosti na konstantě šumu kodéru_A = 8; const int kodér_B = 9; tlačítko const intPin = 2; nepodepsané dlouhé newDebounceTime = 0; nepodepsaný dlouhý oldTime; booleovský stisk = 0; logický počet = 1;

V nastavení definuji správné piny a vložím statický text na LCD

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

}

Ve smyčce nejprve zkontroluji, zda je interval delší než 500 ms, pokud ano, LCD se aktualizuje. Pokud ne, je zaškrtnuto tlačítko na kodéru. Po stisknutí se zavolá toggleBuffer. Poté je kodér zkontrolován. Pokud je vstup 0 nízký (detekováno otáčení), zkontroluji vstup B, pokud je vstup B 0, zvýším pot , ostatní I sníží. Poté bude hodnota odeslána do DS1803 přes wire.write.

prázdná smyčka () {

časový úsek();

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čněte vysílat

Wire.write (commandByte); // výběr potmetrů Wire.write (pot [0] * 10); // poslat 1. byte dat potmetru Wire.write (pot [1] * 10); // poslat 2. byte dat potmetru Wire.endTransmission (); // zastavení vysílání} else if (digitalRead (encoder_A) == 1 && digitalRead (encoder_B) == 1 && count == 1 && (millis () - newDebounceTime> deBounceTime)) {count = 0; newDebounceTime = millis (); }}

void toggleBuffer () {stisknuto = 1; if (i == 0) {i = 1;} else {i = 0;}}

Nejprve vyčistím oblast, kam mám zapsat proměnné. Dělám to, abych v této oblasti nakreslil obdélník. Poté napíšu proměnné na obrazovku.

void writeToLCD () {Wire.requestFrom (controlByte, 2); potValue [0] = Wire.read (); // přečíst první bajt potmetru potValue [1] = Wire.read (); // čtení druhého bajtu potmetru display.fillRect (40, 0, 40, 45, WHITE); // vymazání proměnné obrazovky na LCD displeji.setCursor (40, 10); display.print (potValue [0]); // zapis 1. hodnoty potmetru na LCD display.setCursor (40, 22); display.print (potValue [1]); // zapište 2. hodnotu potmetru na LCD displej.setCursor (60, (10 + i * 12)); display.print ("<"); display.display (); }

void interval () {// intervalový časovač pro zápis dat na LCD if ((millis () - oldTime)> 500) {writeToLCD (); oldTime = millis (); }}

Doporučuje: