Innehållsförteckning:

DS1803 dubbel digital potentiometer med Arduino: 5 steg
DS1803 dubbel digital potentiometer med Arduino: 5 steg

Video: DS1803 dubbel digital potentiometer med Arduino: 5 steg

Video: DS1803 dubbel digital potentiometer med Arduino: 5 steg
Video: DFT_#A92 DOUBLE POTENTIOMETRE NUMERIQUE - I2C - DS1803 - ATTINY85 2024, November
Anonim
DS1803 Dual Digital Potentiometer Med Arduino
DS1803 Dual Digital Potentiometer Med Arduino

Jag gillar att dela användningen av en DS1803 digital potmeter med en Arduino. Denna IC innehåller två digitala potmetrar som kan styras över ett tvåtrådigt gränssnitt, för detta använder jag wire.h -biblioteket.

Denna IC kan ersätta en normal analog potmeter. På så sätt kan du styra till exempel en förstärkare eller strömförsörjning.

I denna instruerbara kontrollerar jag ljusstyrkan på två lysdioder för att visa arbetet.

Arduino räknar pulserna hos en roterande kodare och placerar värdet i variabel potten [0] och potten [1]. När du trycker på omkopplaren på givaren kan du växla mellan kruka [0] och kruka [1].

Det verkliga värdet på krukorna läses tillbaka från DS1803 och placeras i variabel potValue [0] och potValue [1] och visas på en LCD -skärm.

Steg 1: Anslutningar av DS1803

Anslutningar av DS1803
Anslutningar av DS1803

Här kan du se anslutningarna till DS1803. H är potentiometerns högsida, L den nedre sidan och W torkaren. SCL och SDA är bussförbindelserna.

Med anslutning A0, A1 och A2 kan du ge DS1803 en egen adress, på så sätt kan du styra fler enheter via en buss. I mitt exempel har jag ge DS1803 -adressen 0 genom att ansluta alla stift till marken.

Steg 2: Kommando Byte

Kommando Byte
Kommando Byte

Det sätt som DS1803 fungerar kan användas i kommandobyten. När du väljer "skriv potentiometer-0" väljs båda potentiometrarna, när du bara vill justera potentiometer-0 behöver du bara skicka den första databyten. "Skriv potentiometer-1" justera bara potmeter-1. "Skriv till båda potentiometrarna" ger båda potentiometrarna samma värde.

Steg 3: Kontroll av DS1803

Kontroll av DS1803
Kontroll av DS1803

Kontrollbyten (figur 3) har en enhetsidentifierare, den förblir alltid densamma. I mitt exempel A0, A1 och A2 är 0 eftersom vi väljer adress genom att sätta alla A-stift till marken. Den sista biten R/W kommer att ställas till 0 eller 1 med kommandot "Wire.beginTransmission" och "Wire.requestFrom" i Arduino. I figur 5 kan du se hela telegrammet. Det lästa telegrammet visas i figur 4.

Steg 4: Konfigurera

Uppstart
Uppstart

Denna krets visar hur du ansluter allt. Nokia LCD finns med olika anslutningar, se till att du ansluter din rätt. Även roterande kodare hans olika versioner, vissa har det gemensamma på mittstiftet andra inte. Jag har satt ett litet filternätverk (470 Ohm motstånd med 100nF lock) för att filtrera A och B utsignaler från kodaren. Jag behöver det här filtret eftersom utgången hade mycket brus. Jag lägger också in en avstängningstimer i mitt program för att avbryta brus. För resten tror jag att kretsen är klar. LCD -skärmen kan beställas via Adafruit

Steg 5: Programmet

För användning av 2-trådsbussen inkluderar jag Wire.h-biblioteket. För att använda LCD-skärmen inkluderar jag Adafruit-biblioteket som du kan ladda ner från https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library också Adafruit_GFX.h-biblioteket är tillgängligt här https:// github. com/adafruit/Adafruit-GFX-Library.

#omfatta

#omfatta

#omfatta

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

Här kan du se alla variabler. Kontrollbyte och kommandobyte enligt beskrivningen tidigare. DeBounceTime kan justeras beroende på bruset på din kodare.

byte pot [2] = {1, 1}; byte controlByte = B0101000; // 7 bitar, byte commandByte = B10101001; // sista 2 bitarna är val av potmeter. byte potValue [2]; int i = 0; int deBounceTime = 10; // Justera detta värde beroende på buller const int encoder_A = 8; const int encoder_B = 9; const int buttonPin = 2; osignerad lång newDebounceTime = 0; osignerad lång oldTime; booleskt pressat = 0; booleskt antal = 1;

I installationen definierar jag de rätta stiften och lägger den statiska texten på LCD -skärmen

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 (SVART); display.setCursor (0, 10); display.println ("POT 1 ="); display.setCursor (0, 22); display.println ("POT 2 ="); display.display ();

}

I slingan kontrollerar jag först om intervallet är mer än 500 ms, om ja LCD -skärmen uppdateras. Om inte är knappen på givaren markerad. Om du trycker på toggleBuffer blir du uppringd. Efter detta kontrolleras kodaren. Om ingång 0 är låg (rotation detekterad) kontrollerar jag ingång B, om ingång B är 0 I ökar potten , andra minskar jag. Efter detta skickas värdet till DS1803 via wire.write.

void loop () {

intervall();

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

if (digitalRead (encoder_A) == 0 && count == 0 && (millis () - newDebounceTime> deBounceTime)) {if (digitalRead (encoder_B) == 0) {pot ++; if (pot > 25) {pot = 25;}} annat {pot -; if (pot <1) {pot = 1;}} count = 1; newDebounceTime = millis ();

Wire.beginTransmission (controlByte); // börja sända

Wire.write (commandByte); // urval av potmetrar Wire.write (kruka [0] * 10); // skicka 1: a byte av potmeterdata Wire.write (kruka [1] * 10); // skicka 2: a byte av potmeterdata Wire.endTransmission (); // sluta sända} annars om (digitalRead (encoder_A) == 1 && digitalRead (encoder_B) == 1 && count == 1 && (millis () - newDebounceTime> deBounceTime)) {count = 0; newDebounceTime = millis (); }}

void toggleBuffer () {pressad = 1; om (i == 0) {i = 1;} annat {i = 0;}}

Först rensar jag området där jag måste skriva variablerna. Jag gör detta för att rita en rektangel i detta område. Efter det skriver jag variablerna till skärmen.

void writeToLCD () {Wire.requestFrom (controlByte, 2); potValue [0] = Wire.read (); // läs första potmeter byte potValue [1] = Wire.read (); // läs andra potmeter byte display.fillRect (40, 0, 40, 45, WHITE); // rensa variabel skärm på LCD display.setCursor (40, 10); display.print (potValue [0]); // skriva första potmetervärdet till LCD display.setCursor (40, 22); display.print (potValue [1]); // skriv 2: a potmetervärdet till LCD display.setCursor (60, (10 + i * 12)); display.print ("<"); display.display (); }

void interval () {// intervall timer för att skriva data till LCD om ((millis () - oldTime)> 500) {writeToLCD (); oldTime = millis (); }}

Rekommenderad: