Inhoudsopgave:

DS1803 dubbele digitale potentiometer met Arduino - Ajarnpa
DS1803 dubbele digitale potentiometer met Arduino - Ajarnpa

Video: DS1803 dubbele digitale potentiometer met Arduino - Ajarnpa

Video: DS1803 dubbele digitale potentiometer met Arduino - Ajarnpa
Video: DFT_#A92 DOUBLE POTENTIOMETRE NUMERIQUE - I2C - DS1803 - ATTINY85 2024, November
Anonim
DS1803 dubbele digitale potentiometer met Arduino
DS1803 dubbele digitale potentiometer met Arduino

Ik deel graag het gebruik van een DS1803 digitale potmeter met een Arduino. Dit IC bevat twee digitale potmeters die via een tweedraads interface kunnen worden aangestuurd, hiervoor gebruik ik de wire.h bibliotheek.

Dit IC kan een normale analoge potmeter vervangen. Zo ben je in staat om bijvoorbeeld een versterker of voeding aan te sturen.

In deze instructable regel ik de helderheid van twee LED's om de werking te laten zien.

De arduino telt de pulsen van een roterende encoder en plaatst de waarde in variabele pot[0] en pot[1]. Als je de schakelaar op de encoder indrukt, kun je schakelen tussen pot[0] en pot[1].

De werkelijke waarde van de potten wordt uit de DS1803 afgelezen en in variabele potValue[0] en potValue[1] geplaatst en op een LCD weergegeven.

Stap 1: Aansluitingen van de DS1803

Aansluitingen van de DS1803
Aansluitingen van de DS1803

Hier zie je de aansluitingen van de DS1803. H is de hoge kant van de potentiometer, L de lage kant en W de wisser. SCL en SDA zijn de busverbindingen.

Met aansluiting A0, A1 en A2 kunt u de DS1803 een eigen adres geven, op deze manier kunt u meerdere apparaten via één bus aansturen. In mijn voorbeeld heb ik de DS1803 adres 0 gegeven door alle pinnen met de grond te verbinden.

Stap 2: Opdrachtbyte

Opdrachtbyte
Opdrachtbyte

De manier waarop de DS1803 werkt, kan worden gebruikt in de opdrachtbyte. Wanneer u "write potentiometer-0" selecteert, zijn beide potentiometers geselecteerd, wanneer u alleen potentiometer-0 wilt instellen, hoeft u alleen de eerste databyte te verzenden. "Schrijf potmeter-1" pas potmeter-1 aan. "Schrijf naar beide potentiometers" geeft beide potentiometers dezelfde waarde.

Stap 3: Bediening van de DS1803

Besturing van de DS1803
Besturing van de DS1803

De stuurbyte (figuur 3) heeft een device identifier, deze blijft altijd hetzelfde. In mijn voorbeeld zijn A0, A1 en A2 0 omdat we het adres selecteren door alle A-pinnen op massa te zetten. Het laatste bit R/W wordt op 0 of 1 gezet door het commando "Wire.beginTransmission" en "Wire.requestFrom" in de Arduino. In figuur 5 zie je het hele telegram. Het gelezen telegram is weergegeven in figuur 4.

Stap 4: Instellen

Opgericht
Opgericht

Deze schakeling laat zien hoe je alles aansluit. Het Nokia LCD-scherm is verkrijgbaar met verschillende aansluitingen, zorg ervoor dat u de uwe goed aansluit. Ook de roterende encoder zijn verschillende versies, sommige hebben de gemeenschappelijke op de middelste pin, andere niet. Ik heb een klein filternetwerk geplaatst (470 Ohm weerstand met 100nF dop) om de A en B uitgangssignalen van de encoder te filteren. Ik heb dit filter nodig omdat de uitgang veel ruis had. Ik heb ook een debounce timer in mijn programma gezet om wat ruis te onderdrukken. Voor de rest denk ik dat het circuit duidelijk is. De LCD is te bestellen via Adafruit

Stap 5: Het programma

Voor het gebruik van de 2-draads bus neem ik de Wire.h bibliotheek mee. Om het LCD-scherm te gebruiken, voeg ik de Adafruit-bibliotheek toe die u kunt downloaden van https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library. Ook de Adafruit_GFX.h-bibliotheek is hier beschikbaar https://github. com/adafruit/Adafruit-GFX-bibliotheek.

#erbij betrekken

#erbij betrekken

#erbij betrekken

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

Hier zie je alle variabelen. Besturingsbyte en opdrachtbyte zoals eerder beschreven. De deBounceTime kan worden aangepast afhankelijk van de ruis op je encoder.

byte pot [2] = {1, 1};byte controlByte = B0101000; // 7 bits, bytecommandoByte = B10101001; // laatste 2 bits is potmeter selectie. byte potWaarde [2]; int ik = 0; int deBounceTime = 10; // Pas deze waarde aan afhankelijk van de ruisconst int encoder_A = 8; const int encoder_B = 9; const int knopPin = 2; unsigned long newDebounceTime = 0; ongetekende lange oldTime; boolean ingedrukt = 0; booleaanse telling = 1;

In de setup definieer ik de juiste pinnen en zet ik de statische tekst op het LCD

void setup() { Wire.begin(); Serieel.begin(9600); pinMode (encoder_A, INPUT); pinMode (encoder_B, INPUT); pinMode (knopPin, INPUT); newDebounceTime = millis();

weergave.begin();

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

}

In de lus controleer ik eerst of het interval meer dan 500ms is, zo ja, dan wordt het LCD-scherm bijgewerkt. Zo niet, dan is de knop op de encoder aangevinkt. Indien ingedrukt, wordt de toggleBuffer gebeld. Hierna wordt de encoder gecontroleerd. Als ingang 0 laag is (rotatie gedetecteerd) controleer ik ingang B, als ingang B 0 is, verhoog ik pot , andere verlaag ik. Hierna wordt de waarde via wire.write naar de DS1803 gestuurd.

lege lus() {

interval();

if(digitalRead(buttonPin)== 1 && (ingedrukt == 0)){toggleBuffer();} if(digitalRead(buttonPin)== 0){ingedrukt = 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;} } telling = 1; newDebounceTime = millis();

Wire.beginTransmission (controlByte); // begin met zenden

Wire.write (commandByte); // selectie van potmeters Wire.write(pot[0] * 10); // stuur 1e byte van potmetergegevens Wire.write (pot [1] * 10); // stuur 2e byte van potmetergegevens Wire.endTransmission (); // stop met verzenden }else if (digitalRead(encoder_A) == 1 && digitalRead(encoder_B) == 1 && count == 1 && (millis() - newDebounceTime > deBounceTime)){ count = 0; newDebounceTime = millis(); } }

void toggleBuffer(){ ingedrukt = 1; als (i == 0){i = 1;}anders{i = 0;} }

Eerst wis ik het gebied waar ik de variabelen moet schrijven. Ik doe dit om een rechthoek in dit gebied te tekenen. Daarna schrijf ik de variabelen naar het scherm.

void writeToLCD(){ Wire.requestFrom(controlByte, 2); potValue[0] = Wire.read(); // lees eerste potmeterbyte potValue [1] = Wire.read (); // lees tweede potmeterbyte display.fillRect (40, 0, 40, 45, WIT); // wis variabel scherm op LCD-display.setCursor (40, 10); display.print(potValue[0]); // schrijf de 1e potmeterwaarde naar het LCD-scherm.setCursor (40, 22); display.print(potValue[1]); // schrijf de 2e potmeterwaarde naar het LCD-scherm.setCursor (60, (10 + i * 12)); display.print("<"); weergave.weergave(); }

void interval () { // intervaltimer om gegevens naar het LCD-scherm te schrijven als ((millis () - oldTime)> 500) {writeToLCD(); oldTime = millis(); } }

Aanbevolen: