Mündəricat:

Arduino ilə DS1803 İkili Rəqəmsal Potansiyometr: 5 addım
Arduino ilə DS1803 İkili Rəqəmsal Potansiyometr: 5 addım

Video: Arduino ilə DS1803 İkili Rəqəmsal Potansiyometr: 5 addım

Video: Arduino ilə DS1803 İkili Rəqəmsal Potansiyometr: 5 addım
Video: ESP32 Tutorial 23 - Reading Voltage of potentiometer using ESP32 | SunFounder's ESP32 IoT kit 2024, Iyul
Anonim
Arduino ilə DS1803 İkili Rəqəmsal Potansiyometr
Arduino ilə DS1803 İkili Rəqəmsal Potansiyometr

DS1803 rəqəmsal potmetrinin istifadəsini Arduino ilə bölüşmək istəyirəm. Bu IC, iki telli bir interfeys üzərində idarə oluna bilən iki rəqəmsal potmetrdən ibarətdir, bunun üçün tel.h kitabxanasından istifadə edirəm.

Bu IC normal analoq potmetrini əvəz edə bilər. Bu yolla, məsələn, gücləndiricini və ya enerji təchizatını idarə edə bilərsiniz.

Bu təlimatda işini göstərmək üçün iki LED -in parlaqlığını idarə edirəm.

Arduino, fırlanan bir kodlayıcının nəbzini sayır və dəyəri dəyişən qazana [0] və qazana [1] yerləşdirir. Enkoderdəki düyməni basdığınızda, qazan [0] ilə qazan [1] arasında keçid edə bilərsiniz.

Qazanların həqiqi dəyəri DS1803 -dən geri oxunur və dəyişən potValue [0] və potValue [1] -də yerləşdirilir və LCD -də göstərilir.

Addım 1: DS1803 -ün əlaqələri

DS1803 əlaqələri
DS1803 əlaqələri

Burada DS1803 -ün əlaqələrini görə bilərsiniz. H potansiyometrin yüksək tərəfidir, L aşağı tərəfi və W silecekdir. SCL və SDA avtobus əlaqələridir.

A0, A1 və A2 bağlantısı ilə DS1803 -ə öz ünvanını verə bilərsiniz, beləliklə bir avtobusla daha çox cihazı idarə edə bilərsiniz. Mənim nümunəmdə, bütün pinləri yerə bağlayaraq DS1803 ünvanını 0 verdim.

Addım 2: Komanda Baytı

Komanda Baytı
Komanda Baytı

DS1803 -ün işləmə üsulu əmr baytında istifadə edilə bilər. "Yazma potensiometri-0" seçdiyiniz zaman hər iki potansiyometr seçilir, yalnız potansiyometr-0-ı tənzimləmək istədiyiniz zaman yalnız ilk məlumat baytını göndərməlisiniz. "Potansiyometr yazın-1" yalnız potmetr-1-i tənzimləyin. "Hər iki potensiometrə yaz" hər iki potensiometrə eyni dəyər verir.

Addım 3: DS1803 -ə nəzarət

DS1803 -ə nəzarət
DS1803 -ə nəzarət

Nəzarət baytı (şəkil 3) bir cihaz identifikatoruna malikdir, bu həmişə eyni qalır. Mənim nümunəmdə A0, A1 və A2 0-a bərabərdir, çünki bütün A pinlərini yerə qoyaraq ünvan seçirik. Arduino -da "Wire.beginTransmission" və "Wire.requestFrom" əmrləri ilə son R/W 0 və ya 1 olaraq təyin ediləcək. Şəkil 5 -də bütün teleqramı görə bilərsiniz. Oxunan teleqram Şəkil 4 -də göstərilmişdir.

Addım 4: Quraşdırın

Qurmaq
Qurmaq

Bu sxem hər şeyi necə bağlayacağınızı göstərir. Nokia LCD fərqli bağlantılarla mövcuddur, özünüzü düzgün bağladığınızdan əmin olun. Həm də fırlanan kodlayıcının fərqli versiyaları var, bəzilərinin ortasında digərlərində olmayan ortada var. Enkoderin A və B çıxış siqnallarını süzmək üçün kiçik bir filtr şəbəkəsi (100nF qapaqlı 470 Ohm rezistor) qoydum. Çıxışda çox səs -küy olduğu üçün bu filtrə ehtiyacım var. Bəzi səs -küyləri ləğv etmək üçün proqramımda debüt taymerini də qoydum. Qalanları üçün dövrənin aydın olduğunu düşünürəm. LCD, Adafruit https://www.adafruit.com/product/338 vasitəsilə sifariş verilə bilər.

Addım 5: Proqram

2 telli avtobusun istifadəsi üçün Wire.h kitabxanası daxildir. LCD-dən istifadə etmək üçün https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library saytından yükləyə biləcəyiniz Adafruit kitabxanasını da əlavə edirəm Adafruit_GFX.h kitabxanası burada mövcuddur https:// github. com/adafruit/Adafruit-GFX-Kitabxanası.

#daxil edin

#daxil edin

#daxil edin

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

Burada bütün dəyişənləri görə bilərsiniz. Bayt və əmr baytını daha əvvəl təsvir edildiyi kimi idarə edin. DeBounceTime, kodlayıcınızdakı səs -küydən asılı olaraq tənzimlənə bilər.

bayt qazan [2] = {1, 1}; bayt controlByte = B0101000; // 7 bit, bayt əmriByte = B10101001; // son 2 bit potmetr seçimidir. bayt potValue [2]; int i = 0; int deBounceTime = 10; // Gürültüdən asılı olaraq bu dəyəri tənzimləyin const enc encoder_A = 8; const int encoder_B = 9; const int buttonPin = 2; imzasız uzun newDebounceTime = 0; imzasız uzun oldTime; boolean preslənmiş = 0; boolean sayı = 1;

Quraşdırmada doğru pinləri təyin edirəm və statik mətni LCD -yə qoyuram

void setup () {Wire.begin (); Serial.begin (9600); pinMode (encoder_A, INPUT); pinMode (encoder_B, INPUT); pinMode (düyməPin, GİRİŞ); newDebounceTime = milis ();

display.begin ();

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

}

Döngədə əvvəlcə aralığın 500 ms -dən çox olub olmadığını yoxlayıram, əgər varsa LCD yenilənir. Əks təqdirdə, kodlayıcıdakı düymə yoxlanılır. ToggleBuffer düyməsinə basıldıqda çağırılır. Bundan sonra kodlayıcı yoxlanılır. 0 girişi aşağıdırsa (fırlanma aşkarlanır) B girişini yoxlayıram, B girişi 0 olarsa potu artırıram , digərlərini azaldıram. Bundan sonra, dəyər tel.write vasitəsilə DS1803 -ə göndəriləcək.

boşluq döngəsi () {

interval ();

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

if (digitalRead (encoder_A) == 0 && count == 0 && (millis () - newDebounceTime> deBounceTime)) {if (digitalRead (encoder_B) == 0) {pot ++; if (pot > 25) {pot = 25;}} başqa {pot -; if (qazan <1) {qazan = 1;}} say = 1; newDebounceTime = milis ();

Wire.beginTransmission (controlByte); // ötürməyə başlayın

Wire.write (commandByte); // potmetrlərin seçimi Wire.write (qazan [0] * 10); // Wire.write potmeter məlumatlarının 1 baytını göndərin (pot [1] * 10); // Wire.endTransmission potmeter məlumatlarının 2 baytını göndərin (); // ötürməni dayandırın} başqa halda (digitalRead (encoder_A) == 1 && digitalRead (encoder_B) == 1 && count == 1 && (millis () - newDebounceTime> deBounceTime)) {count = 0; newDebounceTime = milis (); }}

void toggleBuffer () {presed = 1; əgər (i == 0) {i = 1;} başqa {i = 0;}}

Əvvəlcə varisləri yazmalı olduğum sahəni təmizləyirəm. Bunu bu sahədə düzbucaqlı çəkmək üçün edirəm. Bundan sonra dəyişənləri ekrana yazıram.

void writeToLCD () {Wire.requestFrom (controlByte, 2); potValue [0] = Wire.read (); // oxumaq ilk potmeter byte potValue [1] = Wire.read (); // ikinci potmeter byte display.fillRect (40, 0, 40, 45, BEYAZ) oxuyun; // LCD displeydə dəyişkən ekranı sil.setCursor (40, 10); display.print (potValue [0]); // LCD displeyə 1 -ci potmetr dəyərini yazın. setCursor (40, 22); display.print (potValue [1]); // LCD display.setCursor -a 2 -ci potmetr dəyərini yazın (60, (10 + i * 12)); display.print ("<"); display.display (); }

void interval () {// məlumatların LCD -yə yazılması üçün interval taymeri ((millis () - oldTime)> 500) {writeToLCD (); oldTime = milis (); }}

Tövsiyə: