Sisällysluettelo:

DS1803 Dual Digital -potentiometri Arduinolla: 5 vaihetta
DS1803 Dual Digital -potentiometri Arduinolla: 5 vaihetta

Video: DS1803 Dual Digital -potentiometri Arduinolla: 5 vaihetta

Video: DS1803 Dual Digital -potentiometri Arduinolla: 5 vaihetta
Video: Why Snatch Blocks are AWESOME (How Pulleys Work) - Smarter Every Day 228 2024, Heinäkuu
Anonim
DS1803 Dual Digital -potentiometri Arduinolla
DS1803 Dual Digital -potentiometri Arduinolla

Haluan jakaa DS1803 -digitaalisen potometrin käytön Arduinon kanssa. Tämä IC sisältää kaksi digitaalista potmetria, joita voidaan ohjata kaksijohtimisen rajapinnan kautta, tätä varten käytän wire.h -kirjastoa.

Tämä IC voi korvata normaalin analogisen potterimittarin. Tällä tavalla voit ohjata esimerkiksi vahvistinta tai virtalähdettä.

Tässä ohjeessa ohjaan kahden LEDin kirkkautta näyttääkseni työskentelyn.

Arduino laskee pyörivän anturin pulssit ja sijoittaa arvon muuttuvaan pottiin [0] ja pottiin [1]. Kun painat anturin kytkintä, voit vaihtaa potin [0] ja potin [1] välillä.

Ruukkujen todellinen arvo luetaan takaisin DS1803: sta ja sijoitetaan muuttujiin potValue [0] ja potValue [1] ja näytetään nestekidenäytöllä.

Vaihe 1: DS1803: n liitännät

DS1803: n liitännät
DS1803: n liitännät

Täältä näet DS1803: n liitännät. H on potentiometrin korkea puoli, L matala puoli ja W pyyhin. SCL ja SDA ovat väyläyhteyksiä.

Liitännöillä A0, A1 ja A2 voit antaa DS1803: lle oman osoitteen, jolloin voit ohjata useampia laitteita yhden väylän kautta. Esimerkissäni olen antanut DS1803 -osoitteen 0 yhdistämällä kaikki nastat maahan.

Vaihe 2: Komento tavu

Komento tavu
Komento tavu

DS1803: n toimintaa voidaan käyttää komentotavussa. Kun valitset "kirjoittaa potentiometri-0", molemmat potentiometrit valitaan, kun haluat säätää vain potentiometriä-0, sinun on lähetettävä vain ensimmäinen datatavu. "Kirjoita potentiometri-1" säädä vain potmetria-1. "Kirjoita molempiin potentiometreihin" antaa molemmille potentiometreille saman arvon.

Vaihe 3: DS1803: n ohjaus

DS1803: n ohjaus
DS1803: n ohjaus

Ohjaustavulla (kuva 3) on laitetunniste, joka pysyy aina samana. Esimerkissäni A0, A1 ja A2 ovat 0, koska valitsemme osoitteen asettamalla kaikki A-nastat maahan. Viimeinen bitti R/W asetetaan arvoon 0 tai 1 komennolla "Wire.beginTransmission" ja "Wire.requestFrom" Arduinossa. Kuvassa 5 näet koko sähkeen. Luettu sähke on esitetty kuvassa 4.

Vaihe 4: Asenna

Perustaa
Perustaa

Tämä piiri näyttää kuinka kaikki yhdistetään. Nokian LCD -näyttö on saatavana eri liitännöillä, varmista, että liität oikein. Myös pyörivän kooderin eri versiot, joillakin on yhteinen keskitapilla, toisilla ei. Olen laittanut pienen suodatinverkon (470 ohmin vastus 100nF: n korkilla) suodattamaan anturin A- ja B -lähtösignaalit. Tarvitsen tämän suodattimen, koska lähdössä oli paljon melua. Laitoin myös ohjelmaan katkaisuajastimen melun poistamiseksi. Muuten piiri on mielestäni selvä. Nestekidenäytön voi tilata Adafruitin kautta

Vaihe 5: Ohjelma

Käytän 2-johdinväylän käyttöä varten Wire.h-kirjastoa. LCD-näytön käyttämiseen kuuluu Adafruit-kirjasto, jonka voit ladata osoitteesta https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library, myös Adafruit_GFX.h-kirjasto on saatavilla täältä https:// github. fi/adafruit/Adafruit-GFX-kirjasto.

#sisältää

#sisältää

#sisältää

Adafruit_PCD8544 -näyttö = Adafruit_PCD8544 (7, 6, 5, 4, 3);

Täältä näet kaikki muuttujat. Hallitse tavu ja komento tavu kuten edellä on kuvattu. DeBounceTime -aikaa voidaan säätää koodaajan kohinan mukaan.

tavupotti [2] = {1, 1}; tavukontrolliByte = B0101000; // 7 bittiä, tavukomentoByte = B10101001; // viimeiset 2 bittiä on potterimittarin valinta. tavu potValue [2]; int i = 0; int deBounceTime = 10; // Säädä tätä arvoa kohinakonstin mukaan int encoder_A = 8; const int kooderi_B = 9; const int -painikePin = 2; allekirjoittamaton pitkä newDebounceTime = 0; allekirjoittamaton pitkä oldTime; boolean -painettu = 0; boolean count = 1;

Asetuksissa määritän oikeat nastat ja asetan staattisen tekstin nestekidenäyttöön

void setup () {Wire.begin (); Sarja.alku (9600); pinMode (kooderi_A, TULO); pinMode (kooderi_B, TULO); pinMode (buttonPin, INPUT); newDebounceTime = millis ();

display.begin ();

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

}

Silmukassa tarkistan ensin, onko väli yli 500 ms, jos kyllä, nestekidenäyttö päivittyy. Jos ei, lähettimen painike tarkistetaan. Jos painat toggleBufferia, soitetaan. Tämän jälkeen kooderi tarkistetaan. Jos tulo 0 on alhainen (kierto havaittu), tarkistan tulon B, jos tulo B on 0 I lisäyspotti , muut I vähentävät. Tämän jälkeen arvo lähetetään DS1803: lle wire.write -yhteyden kautta.

void loop () {

väli ();

if (digitalRead (buttonPin) == 1 && (painettu == 0)) {toggleBuffer ();} if (digitalRead (buttonPin) == 0) {painettu = 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); // aloita lähettäminen

Wire.write (commandByte); // potometrien valinta Wire.write (potti [0] * 10); // lähetä potttimittarin 1. tavu Wire.write (potti [1] * 10); // lähetä potttimittatiedon toinen tavu Wire.endTransmission (); // lopeta lähetys} else if (digitalRead (encoder_A) == 1 && digitalRead (encoder_B) == 1 && count == 1 && (millis () - newDebounceTime> deBounceTime)) {count = 0; newDebounceTime = millis (); }}

void toggleBuffer () {painettu = 1; jos (i == 0) {i = 1;} muu {i = 0;}}

Ensin tyhjennän alueen, johon minun on kirjoitettava muuttujat. Teen tämän piirtääkseni suorakulmion tälle alueelle. Tämän jälkeen kirjoitan muuttujat näytölle.

void writeToLCD () {Wire.requestFrom (controlByte, 2); potValue [0] = Wire.read (); // lue ensimmäinen potometrin tavu potValue [1] = Wire.read (); // lukee toisen potmetrin tavun näyttö.fillRect (40, 0, 40, 45, WHITE); // tyhjennä muuttuva näyttö nestekidenäytöstä. setCursor (40, 10); display.print (potValue [0]); // kirjoittaa 1. potmetrin arvo LCD -näyttöön. setCursor (40, 22); display.print (potValue [1]); // kirjoita toinen potmetrin arvo LCD -näyttöön. setCursor (60, (10 + i * 12)); display.print ("<"); display.display (); }

void interval () {// intervalliajastin tietojen kirjoittamiseen nestekidenäyttöön, jos ((millis () - oldTime)> 500) {writeToLCD (); oldTime = millis (); }}

Suositeltava: