Kazalo:

Dvojni digitalni potenciometer DS1803 z Arduinom: 5 korakov
Dvojni digitalni potenciometer DS1803 z Arduinom: 5 korakov

Video: Dvojni digitalni potenciometer DS1803 z Arduinom: 5 korakov

Video: Dvojni digitalni potenciometer DS1803 z Arduinom: 5 korakov
Video: Lesson 91: Controlling Servo motor using potentiometer and display angle on LCD 2024, November
Anonim
DS1803 Dvojni digitalni potenciometer z Arduinom
DS1803 Dvojni digitalni potenciometer z Arduinom

Uporabo digitalnega merilnika števcev DS1803 rad delim z Arduinom. Ta IC vsebuje dva digitalna potmetra, ki ju je mogoče upravljati prek dvožičnega vmesnika, za to uporabljam knjižnico wire.h.

Ta IC lahko nadomesti običajni analogni merilnik števcev. Na ta način lahko upravljate na primer ojačevalnik ali napajalnik.

V tem navodilu nadzorujem svetlost dveh LED, da prikažem delovanje.

Arduino šteje impulze vrtljivega dajalnika in vrednost vstavi v spremenljiv lonček [0] in lonec [1]. Ko pritisnete stikalo na kodirniku, lahko preklapljate med loncem [0] in loncem [1].

Dejanska vrednost loncev se odčita iz DS1803 in postavi v spremenljivo potValue [0] in potValue [1] ter prikaže na LCD -prikazovalniku.

1. korak: Priključitve DS1803

Priključki DS1803
Priključki DS1803

Tukaj si lahko ogledate povezave DS1803. H je visoka stran potenciometra, L spodnja stran in W brisalnik. SCL in SDA sta vodili.

S povezavami A0, A1 in A2 lahko DS1803 daste svoj naslov, na ta način lahko upravljate več naprav prek enega vodila. V svojem primeru sem dal DS1803 adres 0 tako, da povežem vse zatiče na tla.

Korak: Ukazni bajt

Ukazni bajt
Ukazni bajt

Način delovanja DS1803 lahko uporabite v ukaznem bajtu. Ko izberete "zapiši potenciometer-0", sta izbrana oba potenciometra, če želiš samo prilagoditi potenciometer-0, moraš poslati le prvi podatkovni bajt. "Napišite potenciometer-1" nastavite samo potmeter-1. "Zapiši na oba potenciometra" daje obema potenciometrima enako vrednost.

3. korak: Nadzor DS1803

Nadzor DS1803
Nadzor DS1803

Kontrolni bajt (slika 3) ima identifikator naprave, ki ostane vedno enak. V mojem primeru so A0, A1 in A2 0, ker izberemo naslov tako, da vse A-zatiče pritrdimo na tla. Zadnji bit R/W bo nastavljen na 0 ali 1 z ukazi "Wire.beginTransmission" in "Wire.requestFrom" v Arduinu. Na sliki 5 lahko vidite celoten telegram. Prebrani telegram je prikazan na sliki 4.

4. korak: Nastavite

Nastaviti
Nastaviti

To vezje prikazuje, kako vse povezati. LCD zaslon Nokia je na voljo z različnimi povezavami. Prepričajte se, da ste pravilno priključili svojega. Tudi rotacijski dajalnik njegovih različnih različic, nekaterim je skupno na srednjem zatiču, drugim pa ne. Za filtriranje izhodnih signalov A in B dajalnika sem dal malo filtrirnega omrežja (470 ohmski upor s 100nF pokrovčkom). Ta filter potrebujem, ker je imel izhod veliko hrupa. V svoj program sem vključil tudi časovnik za odpoved, da prekličem nekaj hrupa. Za ostalo se mi zdi vezje čisto. LCD lahko naročite prek Adafruit

5. korak: Program

Za uporabo 2-žičnega vodila vključujem knjižnico Wire.h. Za uporabo LCD-ja vključujem knjižnico Adafruit, ki jo lahko prenesete s spletnega mesta https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library, knjižnica Adafruit_GFX.h pa je na voljo tukaj https:// github. com/adafruit/Adafruit-GFX-Library.

#vključi

#vključi

#vključi

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

Tu lahko vidite vse spremenljivke. Nadzorni bajt in ukazni bajt, kot je opisano prej. Čas deBounceTime lahko prilagodite glede na hrup na vašem kodirniku.

bajt pot [2] = {1, 1}; byte controlByte = B0101000; // 7 bitov, byte commandByte = B10101001; // zadnji 2 bita je izbira merilnika števcev. bajt potValue [2]; int i = 0; int deBounceTime = 10; // To vrednost prilagodimo glede na šum const int encoder_A = 8; dajalnik const int_B = 9; const int buttonPin = 2; unsigned long newDebounceTime = 0; brez podpisa dolgo oldTime; logični pritisk = 0; logično število = 1;

V nastavitvah definiram desne zatiče in statično besedilo postavim na LCD

void setup () {Wire.begin (); Serial.begin (9600); pinMode (kodirnik_A, VHOD); pinMode (kodirnik_B, VHOD); pinMode (buttonPin, INPUT); newDebounceTime = millis ();

display.begin ();

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

}

V zanki najprej preverim, ali je interval večji od 500 ms, če da, se LCD posodobi. Če ni, je gumb na kodirniku preverjen. Če pritisnete toggleBuffer, pokličite. Po tem se kodirnik preveri. Če je vhod 0 nizek (zaznana je rotacija), preverim vhod B, če je vhod B 0, povečam lonec , druge pa zmanjšam. Po tem bo vrednost poslana v DS1803 prek wire.write.

void loop () {

interval ();

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

if (digitalRead (encoder_A) == 0 && count == 0 && (millis () - newDebounceTime> deBounceTime)) {if (digitalRead (encoder_B) == 0) {pot ++; če (pot > 25) {pot = 25;}} drugače {pot -; if (pot <1) {pot = 1;}} število = 1; newDebounceTime = millis ();

Wire.beginTransmission (controlByte); // začeti oddajati

Wire.write (commandByte); // izbor potmetrov Wire.write (pot [0] * 10); // pošljemo 1. bajt podatkov o merilniku Wire.write (pot [1] * 10); // pošljemo 2. bajt podatkov o merilniku Wire.endTransmission (); // prenehaj pošiljati} else if (digitalRead (encoder_A) == 1 && digitalRead (encoder_B) == 1 && count == 1 && (millis () - newDebounceTime> deBounceTime)) {count = 0; newDebounceTime = millis (); }}

void toggleBuffer () {pritisnjeno = 1; če (i == 0) {i = 1;} drugače {i = 0;}}

Najprej počistim področje, kjer moram zapisati spremenljivke. To naredim, da narišem pravokotnik na tem področju. Po tem spremenljivke zapišem na zaslon.

void writeToLCD () {Wire.requestFrom (controlByte, 2); potValue [0] = Wire.read (); // preberemo prvi bajt merilnika potValue [1] = Wire.read (); // branje prikaza drugega bajtnega merilnika.fillRect (40, 0, 40, 45, BELO); // počisti spremenljiv zaslon na LCD zaslonu.setCursor (40, 10); display.print (potValue [0]); // zapišemo prvo vrednost števca na LCD -prikazovalnik.setCursor (40, 22); display.print (potValue [1]); // zapišemo vrednost drugega števca na LCD zaslon.setCursor (60, (10 + i * 12)); display.print ("<"); display.display (); }

void interval () {// intervalni časovnik za zapis podatkov na LCD, če ((millis () - oldTime)> 500) {writeToLCD (); oldTime = millis (); }}

Priporočena: