Turinys:

DS1803 dvigubas skaitmeninis potenciometras su „Arduino“: 5 žingsniai
DS1803 dvigubas skaitmeninis potenciometras su „Arduino“: 5 žingsniai

Video: DS1803 dvigubas skaitmeninis potenciometras su „Arduino“: 5 žingsniai

Video: DS1803 dvigubas skaitmeninis potenciometras su „Arduino“: 5 žingsniai
Video: Новый YAMAHA XMAX 2023, королева категории 👑 2024, Lapkritis
Anonim
DS1803 dvigubas skaitmeninis potenciometras su „Arduino“
DS1803 dvigubas skaitmeninis potenciometras su „Arduino“

Man patinka pasidalinti DS1803 skaitmeninio potmetro naudojimu su „Arduino“. Šiame IC yra du skaitmeniniai potmetrai, kuriuos galima valdyti per dviejų laidų sąsają, todėl naudoju wire.h biblioteką.

Šis IC gali pakeisti įprastą analoginį potmetrą. Tokiu būdu galite valdyti, pavyzdžiui, stiprintuvą ar maitinimo šaltinį.

Šioje instrukcijoje aš kontroliuoju dviejų šviesos diodų ryškumą, kad parodytų veikimą.

Arduino suskaičiuoja sukamojo kodavimo įrenginio impulsus ir įdeda vertę į kintamąjį puodą [0] ir puodą [1]. Paspaudę kodavimo įrenginio jungiklį, galite perjungti puodą [0] ir puodą [1].

Tikroji puodų vertė nuskaitoma iš DS1803, sudedama į kintamuosius potValue [0] ir potValue [1] ir rodoma LCD ekrane.

1 žingsnis: DS1803 prijungimas

DS1803 jungtys
DS1803 jungtys

Čia galite pamatyti DS1803 jungtis. H yra aukštoji potenciometro pusė, L - apatinė, o W - valytuvas. SCL ir SDA yra magistralės jungtys.

Prijungę A0, A1 ir A2, galite suteikti DS1803 savo adresą, tokiu būdu galite valdyti daugiau įrenginių per vieną magistralę. Savo pavyzdyje turiu nurodyti DS1803 adresą 0, prijungdamas visus kaiščius prie žemės.

2 veiksmas: komandų baitas

Komandų baitas
Komandų baitas

DS1803 veikimo būdą galima naudoti komandiniame baite. Kai pasirenkate „rašyti potenciometrą-0“, pasirenkami abu potenciometrai, o kai norite reguliuoti tik potenciometrą-0, turite išsiųsti tik pirmąjį duomenų baitą. „Rašymo potenciometras-1“reguliuoja tik potmetrą-1. „Rašyti į abu potenciometrus“suteikia abiems potenciometrams tą pačią vertę.

3 žingsnis: DS1803 valdymas

DS1803 valdymas
DS1803 valdymas

Kontrolinis baitas (3 pav.) Turi įrenginio identifikatorių, kuris visada išlieka tas pats. Mano pavyzdyje A0, A1 ir A2 yra 0, nes mes pasirenkame adresą, sudėdami visus A kaiščius į žemę. Paskutinis bitas R/W bus nustatytas į 0 arba 1 pagal komandą „Wire.beginTransmission“ir „Wire.requestFrom“„Arduino“. 5 paveiksle galite pamatyti visą telegramą. Perskaityta telegrama parodyta 4 paveiksle.

4 žingsnis: Nustatykite

Nustatyti
Nustatyti

Ši grandinė parodo, kaip viską prijungti. „Nokia“skystųjų kristalų ekranas yra prieinamas įvairiais jungtimis, todėl įsitikinkite, kad tinkamai prijungėte. Taip pat skirtingų versijų rotacinis kodavimo įrenginys, kai kurie turi bendrą ant vidurinio kaiščio, kiti - ne. Aš įdėjau nedidelį filtrų tinklą (470 omų rezistorius su 100nF dangteliu), kad būtų galima filtruoti kodavimo įrenginio A ir B išvesties signalus. Man reikia šio filtro, nes išvestyje buvo daug triukšmo. Taip pat į savo programą įdėjau išjungimo laikmatį, kad pašalinčiau triukšmą. Likusiai daliai manau, kad grandinė yra aiški. LCD ekraną galima užsisakyti per „Adafruit“https://www.adafruit.com/product/338.

5 žingsnis: programa

Norėdami naudoti 2 laidų magistralę, įtraukiu „Wire.h“biblioteką. Norėdami naudotis LCD, įtraukiu „Adafruit“biblioteką, kurią galite atsisiųsti iš https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library, taip pat „Adafruit_GFX.h“biblioteką rasite čia https:// github. com/adafruit/Adafruit-GFX-Library.

#įtraukti

#įtraukti

#įtraukti

„Adafruit_PCD8544“ekranas = Adafruit_PCD8544 (7, 6, 5, 4, 3);

Čia galite pamatyti visus kintamuosius. Valdykite baitus ir komandų baitus, kaip aprašyta anksčiau. „DeBounceTime“galima koreguoti, atsižvelgiant į jūsų kodavimo įrenginio triukšmą.

baitų indas [2] = {1, 1}; baitų valdymasByte = B0101000; // 7 bitai, baitų komandaByte = B10101001; // paskutiniai 2 bitai yra potmetro pasirinkimas. baitas potValue [2]; int i = 0; int deBounceTime = 10; // Sureguliuokite šią vertę, priklausomai nuo triukšmo konst int intoder_A = 8; const int koduotojas_B = 9; const int mygtukasPin = 2; nepasirašytas ilgas newDebounceTime = 0; unsigned long oldTime; loginis paspaudimas = 0; loginis skaičius = 1;

Sąrankoje aš apibrėžiu tinkamus kaiščius ir įdedu statinį tekstą į LCD

void setup () {Wire.begin (); Serial.begin (9600); pinMode (kodavimo priemonė_A, Įvestis); pinMode (kodavimo priemonė_B, Įvestis); pinMode (buttonPin, INPUT); newDebounceTime = milis ();

display.begin ();

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

}

Cikle aš pirmiausia patikrinu, ar intervalas yra didesnis nei 500 ms, jei taip, LCD atnaujinamas. Jei ne, kodavimo mygtukas yra pažymėtas. Paspaudus „toggleBuffer“, bus iškviestas. Po to tikrinamas kodavimo įrenginys. Jei įvestis 0 yra maža (aptiktas sukimasis), aš tikrinu įvestį B, jei įvestis B yra 0 I didinimo indas , kiti - sumažina. Po to vertė bus siunčiama į DS1803 per wire.write.

void loop () {

intervalas ();

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 ++; jei (puodas > 25) {puodas = 25;}} dar {puodas -; jei (puodas <1) {puodas = 1;}} skaičius = 1; newDebounceTime = milis ();

Wire.beginTransmission (controlByte); // pradėti perduoti

Wire.write (commandByte); // potmetrų pasirinkimas Wire.write (puodas [0] * 10); // siųsti 1 baitą potmetro duomenų Wire.write (puodas [1] * 10); // siųsti 2 baitą potmetro duomenų Wire.endTransmission (); // sustabdyti perdavimą} else if (digitalRead (encoder_A) == 1 && digitalRead (encoder_B) == 1 && count == 1 && (millis () - newDebounceTime> deBounceTime)) {count = 0; newDebounceTime = milis (); }}

void toggleBuffer () {paspaustas = 1; jei (i == 0) {i = 1;} kitaip {i = 0;}}

Pirmiausia išvalau sritį, kurioje turiu rašyti kintamuosius. Aš tai darau, kad šioje srityje nupieščiau stačiakampį. Po to aš rašau kintamuosius į ekraną.

void writeToLCD () {Wire.requestFrom (controlByte, 2); potValue [0] = Wire.read (); // skaityti pirmą potmetro baitą potValue [1] = Wire.read (); // skaityti antrojo potmetro baitų ekraną.fillRect (40, 0, 40, 45, WHITE); // išvalyti kintamą ekraną LCD ekrane.setCursor (40, 10); display.print (potValue [0]); // į LCD ekraną įrašykite 1 -ą potmetro reikšmę.setCursor (40, 22); display.print (potValue [1]); // į LCD ekraną įrašykite 2 -ąją potmetro reikšmę.setCursor (60, (10 + i * 12)); display.print ("<"); display.display (); }

void interval () {// intervalo laikmatis duomenims įrašyti į LCD, jei ((millis () - oldTime)> 500) {writeToLCD (); oldTime = milis (); }}

Rekomenduojamas: