Innholdsfortegnelse:

DS1803 dobbelt digitalt potensiometer med Arduino: 5 trinn
DS1803 dobbelt digitalt potensiometer med Arduino: 5 trinn

Video: DS1803 dobbelt digitalt potensiometer med Arduino: 5 trinn

Video: DS1803 dobbelt digitalt potensiometer med Arduino: 5 trinn
Video: Lesson 01 Arduino Boards | Robojax Arduino Step By Step Course 2024, November
Anonim
DS1803 dobbelt digitalt potensiometer med Arduino
DS1803 dobbelt digitalt potensiometer med Arduino

Jeg liker å dele bruken av en DS1803 digital potmeter med en Arduino. Denne IC inneholder to digitale potmetre som kan styres over et to -tråders grensesnitt, for dette bruker jeg wire.h -biblioteket.

Denne IC kan erstatte en normal analog potmeter. På denne måten kan du styre for eksempel en forsterker eller strømforsyning.

I denne instruksen kontrollerer jeg lysstyrken til to LED -er for å vise arbeidet.

Arduino teller pulser til en roterende encoder og plasserer verdien i variabel potte [0] og potte [1]. Når du trykker på bryteren på encoderen, kan du veksle mellom potten [0] og potten [1].

Den faktiske verdien av grytene leses tilbake fra DS1803 og plasseres i variabel potValue [0] og potValue [1] og vises på en LCD.

Trinn 1: Tilkoblinger av DS1803

Tilkoblinger av DS1803
Tilkoblinger av DS1803

Her kan du se tilkoblingene til DS1803. H er den høye siden av potensiometeret, L den nedre siden og W viskeren. SCL og SDA er bussforbindelsene.

Med tilkobling A0, A1 og A2 kan du gi DS1803 sin egen adresse, på denne måten kan du styre flere enheter via en buss. I mitt eksempel har jeg gitt DS1803 -adressen 0 ved å koble alle pinnene til bakken.

Trinn 2: Kommando Byte

Kommando Byte
Kommando Byte

Måten DS1803 fungerer på kan brukes i kommandobyten. Når du velger "skriv potensiometer-0" velges begge potensiometrene, når du bare vil justere potensiometer-0, trenger du bare å sende den første databyten. "Skriv potensiometer-1" juster bare potmeter-1. "Skriv til begge potensiometre" gir begge potensiometrene samme verdi.

Trinn 3: Kontroll av DS1803

Kontroll av DS1803
Kontroll av DS1803

Kontrollbyten (figur 3) har en enhetsidentifikator, denne forblir alltid den samme. I mitt eksempel A0, A1 og A2 er 0 fordi vi velger adresse ved å sette alle A-pins til bakken. Den siste biten R/W vil bli satt til 0 eller 1 med kommandoen "Wire.beginTransmission" og "Wire.requestFrom" i Arduino. I figur 5 kan du se hele telegrammet. Det lest telegrammet er vist i figur 4.

Trinn 4: Sett opp

Sett opp
Sett opp

Denne kretsen viser hvordan du kobler til alt. Nokia LCD er tilgjengelig med forskjellige tilkoblinger. Sørg for at du kobler din riktig. Også roterende encoder hans forskjellige versjoner, noen har det vanlige på den midterste pinnen andre ikke. Jeg har satt et lite filternettverk (470 Ohm motstand med 100nF cap) for å filtrere A- og B -utgangssignalene til koderen. Jeg trenger dette filteret fordi utgangen hadde mye støy. Jeg har også satt en avvisningstimer i programmet for å avbryte noe støy. For resten tror jeg kretsen er klar. LCD -skjermen kan bestilles via Adafruit

Trinn 5: Programmet

For bruk av 2-leder bussen inkluderer jeg Wire.h biblioteket. For å bruke LCD-skjermen inkluderer jeg Adafruit-biblioteket som du kan laste ned fra https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library også Adafruit_GFX.h-biblioteket er tilgjengelig her https:// github. com/adafruit/Adafruit-GFX-Library.

#inkludere

#inkludere

#inkludere

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

Her kan du se alle variablene. Kontrollbyte og kommandobyte som beskrevet tidligere. DeBounceTime kan justeres avhengig av støyen på encoderen din.

byte pot [2] = {1, 1}; byte controlByte = B0101000; // 7 bits, byte commandByte = B10101001; // siste 2 biter er valg av potmeter. byte potValue [2]; int i = 0; int deBounceTime = 10; // Juster denne verdien avhengig av støy const int encoder_A = 8; const int encoder_B = 9; const int buttonPin = 2; usignert lang newDebounceTime = 0; usignert lang oldTime; boolsk presset = 0; boolsk telling = 1;

I oppsettet definerer jeg de riktige pinnene og legger den statiske teksten på LCD -skjermen

ugyldig oppsett () {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 sløyfen sjekker jeg først om intervallet er mer enn 500 ms, hvis ja blir LCD -skjermen oppdatert. Hvis ikke er knappen på koderen merket. Hvis du trykker på toggleBuffer, ring. Etter dette er koderen sjekket. Hvis inngang 0 er lav (rotasjon oppdaget) sjekker jeg inngang B, hvis inngang B er 0 I øker potten , reduserer jeg andre. Etter dette vil verdien bli sendt til DS1803 via wire.write.

void loop () {

intervall ();

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

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

Wire.beginTransmission (controlByte); // begynne å sende

Wire.write (commandByte); // utvalg av potmetre Wire.write (potten [0] * 10); // send 1. byte av potmeter data Wire.write (pot [1] * 10); // send 2. byte av potmeter -data Wire.endTransmission (); // slutte å sende} annet hvis (digitalRead (encoder_A) == 1 && digitalRead (encoder_B) == 1 && count == 1 && (millis () - newDebounceTime> deBounceTime)) {count = 0; newDebounceTime = millis (); }}

void toggleBuffer () {presset = 1; hvis (i == 0) {i = 1;} annet {i = 0;}}

Først fjerner jeg området der jeg må skrive variablene. Jeg gjør dette for å tegne et rektangel i dette området. Etter det skriver jeg variablene til skjermen.

void writeToLCD () {Wire.requestFrom (controlByte, 2); potValue [0] = Wire.read (); // les første potmeter byte potValue [1] = Wire.read (); // les andre potmeter byte display.fillRect (40, 0, 40, 45, WHITE); // klar variabel skjerm på LCD -display. setCursor (40, 10); display.print (potValue [0]); // skriv første potmeterverdi til LCD display.setCursor (40, 22); display.print (potValue [1]); // skriv 2. potmeterverdi til LCD display.setCursor (60, (10 + i * 12)); display.print ("<"); display.display (); }

ugyldighetsintervall () {// intervalltimer for å skrive data til LCD hvis ((millis () - oldTime)> 500) {writeToLCD (); oldTime = millis (); }}

Anbefalt: