Cuprins:
2025 Autor: John Day | [email protected]. Modificat ultima dată: 2025-01-13 06:58
Î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
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ă
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
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
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 (); }}