Cuprins:

DS1803 Potențiometru digital dual cu Arduino: 5 pași
DS1803 Potențiometru digital dual cu Arduino: 5 pași

Video: DS1803 Potențiometru digital dual cu Arduino: 5 pași

Video: DS1803 Potențiometru digital dual cu Arduino: 5 pași
Video: DS1803 controlled thru I2C for volume control 2024, Noiembrie
Anonim
DS1803 Potentiometru digital dual cu Arduino
DS1803 Potentiometru digital dual cu Arduino

Îmi place să împărtășesc utilizarea unui contor digital DS1803 cu un Arduino. Acest IC conține două potmetre digitale care pot fi controlate printr-o interfață cu două fire, pentru aceasta folosesc biblioteca wire.h.

Acest CI poate înlocui un potmetru analogic normal. În acest fel, puteți controla, de exemplu, un amplificator sau o sursă de alimentare.

În acest instructable controlez luminozitatea a două LED-uri pentru a arăta funcționarea.

Arduino numără impulsurile unui codificator rotativ și plasează valoarea în pot variabile [0] și pot [1]. Când apăsați comutatorul de pe codificator, puteți comuta între pot [0] și pot [1].

Valoarea reală a poturilor este citită din DS1803 și plasată în variabilă potValue [0] și potValue [1] și afișată pe un LCD.

Pasul 1: Conexiuni ale DS1803

Conexiuni ale DS1803
Conexiuni ale DS1803

Aici puteți vedea conexiunile DS1803. H este partea înaltă a potențiometrului, L partea inferioară și W ștergătorul. SCL și SDA sunt conexiunile de autobuz.

Cu conexiunile A0, A1 și A2 puteți oferi DS1803 propria adresă, în acest fel puteți controla mai multe dispozitive printr-o singură magistrală. În exemplul meu, am dat adresa DS1803 0 prin conectarea tuturor pinilor la sol.

Pasul 2: Byte de comandă

Byte de comandă
Byte de comandă

Modul în care funcționează DS1803 poate fi utilizat în octetul de comandă. Când selectați „scrie potențiometru-0” sunt selectate ambele potențiometre, când doriți doar să reglați potențiometrul-0, trebuie doar să trimiteți primul octet de date. „Scrieți potențiometrul-1” reglați numai potmetrul-1. „Scrie la ambele potențiometre” oferă ambelor potențiometre aceeași valoare.

Pasul 3: Controlul DS1803

Controlul DS1803
Controlul DS1803

Octetul de control (figura 3) are un identificator de dispozitiv, acesta rămâne întotdeauna același. În exemplul meu A0, A1 și A2 sunt 0 deoarece selectăm adresul punând toți pinii A la sol. Ultimul bit R / W va fi setat la 0 sau 1 prin comanda „Wire.beginTransmission” și „Wire.requestFrom” din Arduino. În figura 5 puteți vedea întreaga telegramă. Telegrama citită este prezentată în figura 4.

Pasul 4: Configurați

Înființat
Înființat

Acest circuit arată cum să conectați totul. Ecranul LCD Nokia este disponibil cu conexiuni diferite, asigurați-vă că vă conectați corect. De asemenea, codificatorul rotativ diferitele sale versiuni, unele au comun pe pinul din mijloc, altele nu. Am pus o mică rețea de filtrare (rezistor de 470 Ohm cu capac 100nF) pentru a filtra semnalele de ieșire A și B ale codificatorului. Am nevoie de acest filtru, deoarece ieșirea a avut mult zgomot. Am pus, de asemenea, un temporizator de retragere în programul meu pentru a anula ceva zgomot. În rest cred că circuitul este clar. Ecranul LCD poate fi comandat prin Adafruit

Pasul 5: Programul

Pentru utilizarea magistralei cu 2 fire includ biblioteca Wire.h. Pentru a utiliza ecranul LCD, includ biblioteca Adafruit pe care o puteți descărca de la https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library, de asemenea, biblioteca Adafruit_GFX.h este disponibilă aici https:// github. com / adafruit / Adafruit-GFX-Library.

#include

#include

#include

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

Aici puteți vedea toate variabilele. Octet de control și octet de comandă așa cum s-a descris mai înainte. DeBounceTime poate fi ajustat în funcție de zgomotul de pe codificator.

byte pot [2] = {1, 1}; octet controlByte = B0101000; // 7 biți, byte commandByte = B10101001; // ultimii 2 biți este selecția potmetrului. octet potValue [2]; int i = 0; int deBounceTime = 10; // Reglați această valoare în funcție de const zgomot int encoder_A = 8; const int encoder_B = 9; const int buttonPin = 2; nesemnat lung newDebounceTime = 0; nesemnat mult timp vechi; boolean apăsat = 0; număr boolean = 1;

În setare definesc pinii potriviți și pun textul static pe ecranul LCD

void setup () {Wire.begin (); Serial.begin (9600); pinMode (encoder_A, INPUT); pinMode (codificator_B, INPUT); pinMode (buttonPin, INPUT); newDebounceTime = millis ();

display.begin ();

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

}

În buclă verific mai întâi dacă intervalul este mai mare de 500 ms, dacă da LCD-ul se actualizează. Dacă nu, butonul de pe codificator este bifat. Dacă este apăsat butonul de comutare, sună apelat. După aceasta, codificatorul este verificat. Dacă intrarea 0 este mică (rotația detectată) verific intrarea B, dacă intrarea B este 0 I pot crește , altele le scad. După aceasta, valoarea va fi trimisă către DS1803 prin wire.write.

bucla nulă () {

interval();

if (digitalRead (buttonPin) == 1 && (apăsat == 0)) {toggleBuffer ();} if (digitalRead (buttonPin) == 0) {apăsat = 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); // începe să transmită

Wire.write (commandByte); // selecția potmetrelor Wire.write (pot [0] * 10); // trimite primul octet de date potmeter Wire.write (pot [1] * 10); // trimite al doilea octet de date potmeter Wire.endTransmission (); // opriți transmiterea} else if (digitalRead (encoder_A) == 1 && digitalRead (encoder_B) == 1 && count == 1 && (millis () - newDebounceTime> deBounceTime)) {count = 0; newDebounceTime = millis (); }}

void toggleBuffer () {apăsat = 1; if (i == 0) {i = 1;} else {i = 0;}}

Mai întâi curăț zona în care trebuie să scriu varibilele. Fac asta pentru a desena un dreptunghi în această zonă. După aceea, scriu variabilele pe ecran.

void writeToLCD () {Wire.requestFrom (controlByte, 2); potValue [0] = Wire.read (); // citește primul potmeter octet potValue [1] = Wire.read (); // citiți al doilea potmetru octet display.fillRect (40, 0, 40, 45, WHITE); // ștergeți ecranul variabil pe ecranul LCD.setCursor (40, 10); display.print (potValue [0]); // scrieți valoarea 1 a potmetrului pe ecranul LCD.setCursor (40, 22); display.print (potValue [1]); // scrieți a doua valoare a potmetrului pe ecranul LCD.setCursor (60, (10 + i * 12)); display.print ("<"); display.display (); }

void interval () {// interval timer pentru a scrie date pe LCD if ((milis () - oldTime)> 500) {writeToLCD (); oldTime = millis (); }}

Recomandat: