Sisukord:

DS1803 kahekordne digitaalne potentsiomeeter Arduinoga: 5 sammu
DS1803 kahekordne digitaalne potentsiomeeter Arduinoga: 5 sammu

Video: DS1803 kahekordne digitaalne potentsiomeeter Arduinoga: 5 sammu

Video: DS1803 kahekordne digitaalne potentsiomeeter Arduinoga: 5 sammu
Video: Chord Qutest ЦАП который удивил 2024, November
Anonim
DS1803 kahekordne digitaalne potentsiomeeter koos Arduinoga
DS1803 kahekordne digitaalne potentsiomeeter koos Arduinoga

Mulle meeldib jagada DS1803 digitaalse potimeetri kasutamist Arduinoga. See IC sisaldab kahte digitaalset potomeetrit, mida saab juhtida kahe juhtmega liidese kaudu, selleks kasutan wire.h raamatukogu.

See IC võib asendada tavalise analoog -potimeetri. Sel viisil saate juhtida näiteks võimendit või toiteallikat.

Selles juhendis kontrollin kahe LED -i heledust, et näidata töötamist.

Arduino loendab pöörleva kodeerija impulsse ja asetab väärtuse muutuvasse potti [0] ja potti [1]. Kui vajutate kodeerija lülitit, saate vahetada potti [0] ja potti [1] vahel.

Pottide tegelik väärtus loetakse DS1803 -st tagasi ja paigutatakse muutujatesse potValue [0] ja potValue [1] ning kuvatakse LCD -ekraanil.

Samm: DS1803 ühendused

DS1803 ühendused
DS1803 ühendused

Siin näete DS1803 ühendusi. H on potentsiomeetri kõrge külg, L alumine ja W klaasipuhasti. SCL ja SDA on siinide ühendused.

Ühenduste A0, A1 ja A2 abil saate DS1803 -le anda oma aadressi, nii saate ühe bussi kaudu juhtida rohkem seadmeid. Näites olen andnud DS1803 aadressile 0, ühendades kõik tihvtid maapinnaga.

Samm: käsu bait

Käsu bait
Käsu bait

DS1803 toimimisviisi saab kasutada käsubaidis. Kui valite "kirjutada potentsiomeeter-0", valitakse mõlemad potentsiomeetrid, kui soovite reguleerida ainult potentsiomeetrit-0, peate saatma ainult esimese andmebaidi. "Kirjutamise potentsiomeeter-1" reguleerib ainult potimeetrit-1. "Kirjutage mõlemale potentsiomeetrile" annab mõlemale potentsiomeetrile sama väärtuse.

3. samm: DS1803 juhtimine

DS1803 juhtimine
DS1803 juhtimine

Juhtbaidil (joonis 3) on seadme identifikaator, see jääb alati samaks. Minu näites on A0, A1 ja A2 0, kuna valime aadressi, pannes kõik A-tihvtid maapinnale. Viimane bit R/W määratakse Arduino käsuga "Wire.beginTransmission" ja "Wire.requestFrom" väärtuseks 0 või 1. Joonisel 5 näete kogu telegrammi. Loetud telegramm on näidatud joonisel 4.

4. samm: seadistage

Seadistamine
Seadistamine

See skeem näitab, kuidas kõike ühendada. Nokia LCD on saadaval erinevate ühendustega, veenduge, et ühendate oma õigesti. Ka pöörleva kodeerija tema erinevad versioonid, mõnel on ühine keskmine tihvt, teistel mitte. Kooderi A ja B väljundsignaalide filtreerimiseks olen pannud väikese filtrivõrgu (470 oomi takisti 100nF korgiga). Mul on seda filtrit vaja, sest väljundis oli palju müra. Panin oma programmi ka tagasilöögitaimeri, et müra tühistada. Ülejäänud osas arvan, et ring on selge. LCD -ekraani saab tellida Adafruuti kaudu

Samm: programm

Kahejuhtmelise bussi kasutamiseks lisan Wire.h raamatukogu. Vedelkristallekraani kasutamiseks lisan Adafruit raamatukogu, mille saate alla laadida aadressilt https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library, samuti Adafruit_GFX.h raamatukogu on saadaval siin https:// github. com/adafruit/Adafruit-GFX-raamatukogu.

#kaasake

#kaasake

#kaasake

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

Siin näete kõiki muutujaid. Kontrolli baiti ja käsu baiti, nagu eespool kirjeldatud. DeBounceTime'i saab reguleerida sõltuvalt kodeerija mürast.

baidipott [2] = {1, 1}; baitide kontrollBait = B0101000; // 7 bitti, baitkäskByte = B10101001; // viimased 2 bitti on potimeetri valik. bait potValue [2]; int i = 0; int deBounceTime = 10; // Reguleerige seda väärtust sõltuvalt mürakonstist int encoder_A = 8; const int kodeerija_B = 9; const int nuppPin = 2; allkirjastamata pikk newDebounceTime = 0; allkirjastamata pikk oldTime; boolean pressitud = 0; boolean count = 1;

Seadistuses määratlen õiged tihvtid ja panen staatilise teksti LCD -le

void setup () {Wire.begin (); Seriaalne algus (9600); pinMode (kodeerija_A, INPUT); pinMode (kodeerija_B, sisend); pinMode (buttonPin, INPUT); newDebounceTime = millis ();

display.begin ();

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

}

Tsüklis kontrollin kõigepealt, kas intervall on üle 500 ms, kui jah, siis LCD värskendatakse. Kui ei, siis on kodeerija nupp kontrollitud. Kui vajutate toggleBufferit, helistatakse. Pärast seda kontrollitakse kodeerijat. Kui sisend 0 on madal (pöörlemine tuvastatud), kontrollin sisendit B, kui sisend B on 0 I juurdekasv , teised vähendavad. Pärast seda saadetakse väärtus Wire.write kaudu DS1803 -le.

void loop () {

intervall ();

if (digitalRead (buttonPin) == 1 && (pressitud == 0)) {toggleBuffer ();} if (digitalRead (buttonPin) == 0) {vajutatud = 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); // hakka edastama

Wire.write (commandByte); // potimeetrite valik Wire.write (pott [0] * 10); // saata 1. bait potimeetri andmeid Wire.write (pott [1] * 10); // saata 2. bait potimeetri andmeid Wire.endTransmission (); // lõpetage edastamine} else if (digitalRead (encoder_A) == 1 && digitalRead (encoder_B) == 1 && count == 1 && (millis () - newDebounceTime> deBounceTime)) {count = 0; newDebounceTime = millis (); }}

void toggleBuffer () {vajutatud = 1; kui (i == 0) {i = 1;} veel {i = 0;}}

Kõigepealt puhastan ala, kuhu pean muutujad kirjutama. Teen seda selleks, et joonistada selles piirkonnas ristkülik. Pärast seda kirjutan muutujad ekraanile.

void writeToLCD () {Wire.requestFrom (controlByte, 2); potValue [0] = Wire.read (); // loe esimest potimeetri baiti potValue [1] = Wire.read (); // teise potimeetri baidi kuva lugemine.fillRect (40, 0, 40, 45, WHITE); // tühjenda muutuv ekraan LCD -ekraanil.setCursor (40, 10); display.print (potValue [0]); // kirjutage 1. potmeetri väärtus LCD -ekraanile.setCursor (40, 22); display.print (potValue [1]); // kirjutage LCD -ekraanile 2. potmeetri väärtus.setCursor (60, (10 + i * 12)); display.print ("<"); display.display (); }

void interval () {// intervalli taimer andmete kirjutamiseks LCD -le, kui ((millis () - oldTime)> 500) {writeToLCD (); oldTime = millis (); }}

Soovitan: