Sadržaj:

DS1803 Dvostruki digitalni potenciometar sa Arduinom: 5 koraka
DS1803 Dvostruki digitalni potenciometar sa Arduinom: 5 koraka

Video: DS1803 Dvostruki digitalni potenciometar sa Arduinom: 5 koraka

Video: DS1803 Dvostruki digitalni potenciometar sa Arduinom: 5 koraka
Video: Control Position and Speed of Stepper motor with L298N module using Arduino 2024, Juli
Anonim
DS1803 Dvostruki digitalni potenciometar sa Arduinom
DS1803 Dvostruki digitalni potenciometar sa Arduinom

Volim podijeliti upotrebu digitalnog mjerača udaljenosti DS1803 s Arduinom. Ovaj IC sadrži dva digitalna potmetra koji se mogu kontrolirati preko dvožilnog sučelja, za to koristim wire.h biblioteku.

Ovaj IC može zamijeniti uobičajeni analogni mjerač udaljenosti. Na taj način možete kontrolirati, na primjer, pojačalo ili napajanje.

U ovom uputstvu kontroliram svjetlinu dvije LED diode kako bih pokazao rad.

Arduino broji impulse rotacijskog davača i postavlja vrijednost u promjenjivi pot [0] i pot [1]. Kada pritisnete prekidač na koderu, možete se prebacivati između pot [0] i pot [1].

Stvarna vrijednost posuda se očitava iz DS1803 i stavlja u promjenjive potValue [0] i potValue [1] i prikazuje na LCD -u.

Korak 1: Povezivanje DS1803

Priključci DS1803
Priključci DS1803

Ovdje možete vidjeti veze DS1803. H je gornja strana potenciometra, L donja strana i W brisač. SCL i SDA su sabirničke veze.

Sa priključcima A0, A1 i A2 možete dati DS1803 vlastitu adresu, na taj način možete kontrolirati više uređaja putem jedne sabirnice. U mom primjeru dao sam DS1803 adresu 0 povezivanjem svih pinova na uzemljenje.

Korak 2: Naredbeni bajt

Komandni bajt
Komandni bajt

Način rada DS1803 može se koristiti u komandnom bajtu. Kada odaberete "upiši potenciometar-0", odabrani su oba potenciometra, a samo želiš podesiti potenciometar-0, moraš poslati samo prvi bajt podataka. "Potenciometar za pisanje-1" podesite samo mjerač-1. "Zapisi na oba potenciometra" daje oba potenciometra istu vrijednost.

Korak 3: Kontrola DS1803

Upravljanje DS1803
Upravljanje DS1803

Kontrolni bajt (slika 3) ima identifikator uređaja, koji ostaje uvijek isti. U mom primjeru A0, A1 i A2 su 0 jer odabiremo adresu stavljajući sve A-pinove na zemlju. Zadnji bit R/W bit će postavljen na 0 ili 1 naredbom "Wire.beginTransmission" i "Wire.requestFrom" u Arduinu. Na slici 5 možete vidjeti cijeli telegram. Pročitani telegram prikazan je na slici 4.

Korak 4: Postavite

Postaviti
Postaviti

Ovo kolo pokazuje kako sve spojiti. Nokijin LCD zaslon dostupan je s različitim vezama, pazite da pravilno povežete svoj. Također rotacijski koder njegove različite verzije, neke imaju zajedničko na srednjem pinu, druge nemaju. Stavio sam malu mrežu filtera (otpornik od 470 Ohma sa 100nF kapom) za filtriranje izlaznih signala A i B davača. Trebam ovaj filter jer je izlaz imao mnogo buke. Takođe sam u svoj program stavio tajmer debounce za poništavanje buke. Za ostalo mislim da je krug jasan. LCD se može naručiti putem Adafruit

Korak 5: Program

Za upotrebu 2-žične sabirnice uključujem knjižnicu Wire.h. Za korištenje LCD-a uključujem biblioteku Adafruit koju možete preuzeti s https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library, a biblioteka Adafruit_GFX.h dostupna je ovdje https:// github. com/adafruit/Adafruit-GFX-Library.

#include

#include

#include

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

Ovdje možete vidjeti sve varijable. Kontrolni bajt i komandni bajt kao što je prethodno opisano. Vrijeme deBounceTime može se prilagoditi ovisno o šumu na vašem koderu.

bajt pot [2] = {1, 1}; bajt controlByte = B0101000; // 7 bitova, bajt commandByte = B10101001; // posljednja 2 bita su odabir mjerača. bajt potValue [2]; int i = 0; int deBounceTime = 10; // Podesite ovu vrijednost ovisno o šumu const int enkoder_A = 8; const int enkoder_B = 9; const int buttonPin = 2; unsigned long newDebounceTime = 0; unsigned long oldTime; logičko pritisnuto = 0; logički broj = 1;

U postavkama definiram desne pinove i stavljam statički tekst na LCD

void setup () {Wire.begin (); Serial.begin (9600); pinMode (enkoder_A, ULAZ); pinMode (enkoder_B, ULAZ); pinMode (buttonPin, INPUT); newDebounceTime = millis ();

display.begin ();

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

}

U petlji prvo provjeravam je li interval veći od 500 ms, ako da, LCD se ažurira. Ako nije, gumb na koderu je provjeren. Ako pritisnete toggleBuffer, pozovite. Nakon toga se koder provjerava. Ako je ulaz 0 nizak (otkrivena rotacija) provjeravam ulaz B, ako je ulaz B 0 povećavam pot , ostale smanjujem. Nakon toga vrijednost će biti poslana na DS1803 putem wire.write.

void loop () {{100} {101}

interval ();

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

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

Wire.beginTransmission (controlByte); // započinjemo prijenos

Wire.write (commandByte); // izbor potmetara Wire.write (pot [0] * 10); // šalje 1. bajt podataka o metru Wire.write (pot [1] * 10); // šalje 2. bajt podataka o metru Wire.endTransmission (); // zaustavljanje prijenosa} else if (digitalRead (encoder_A) == 1 && digitalRead (encoder_B) == 1 && count == 1 && (millis () - newDebounceTime> deBounceTime)) {count = 0; newDebounceTime = millis (); }}

void toggleBuffer () {pritisnuto = 1; if (i == 0) {i = 1;} else {i = 0;}}

Prvo očistim područje u koje moram upisati varijable. Ovo radim da nacrtam pravokutnik u ovoj oblasti. Nakon toga zapisujem varijable na ekran.

void writeToLCD () {Wire.requestFrom (controlByte, 2); potValue [0] = Wire.read (); // čita prvi bajtmetar metra potValue [1] = Wire.read (); // čita drugi prikaz bajtmetra display.fillRect (40, 0, 40, 45, WHITE); // brisanje promjenjivog ekrana na LCD ekranu.setCursor (40, 10); display.print (potValue [0]); // upisuje prvu vrijednost merača na LCD zaslon.setCursor (40, 22); display.print (potValue [1]); // upisuje drugu vrijednost mjerača na LCD zaslon.setCursor (60, (10 + i * 12)); display.print ("<"); display.display (); }

void interval () {// intervalni mjerač za pisanje podataka na LCD ako ((millis () - oldTime)> 500) {writeToLCD (); oldTime = millis (); }}

Preporučuje se: