Mundarija:

DS1803 Arduino bilan ikkita raqamli potentsiometr: 5 qadam
DS1803 Arduino bilan ikkita raqamli potentsiometr: 5 qadam

Video: DS1803 Arduino bilan ikkita raqamli potentsiometr: 5 qadam

Video: DS1803 Arduino bilan ikkita raqamli potentsiometr: 5 qadam
Video: Lesson 98: Arduino 10 LED Push button Projects, Potentiometer LED Voltmeter and Traffic Light 2024, Iyul
Anonim
DS1803 Arduino bilan ikkita raqamli potentsiometr
DS1803 Arduino bilan ikkita raqamli potentsiometr

Men DS1803 raqamli potmetrini Arduino bilan bo'lishishni yoqtiraman. Ushbu IC ikkita simli interfeys orqali boshqariladigan ikkita raqamli potmetrni o'z ichiga oladi, buning uchun men sim.h kutubxonasidan foydalanaman.

Bu IC oddiy analog potmetrni almashtirishi mumkin. Shunday qilib, siz kuchaytirgich yoki quvvat manbasini boshqarishingiz mumkin.

Bu ko'rsatmada men ishlayotganini ko'rsatish uchun ikkita LEDning yorqinligini boshqaraman.

Arduino aylanadigan kodlovchi pulslarini hisoblab chiqadi va qiymatni o'zgaruvchan qozonga [0] va qozonga [1] joylashtiradi. Enkoderning kalitini bosganingizda, idish [0] va qozon [1] o'rtasida almashishingiz mumkin.

Idishlarning haqiqiy qiymati DS1803 -dan o'qiladi va o'zgaruvchan potValue [0] va potValue [1] ga joylashtiriladi va LCD displeyda ko'rsatiladi.

1 -qadam: DS1803 ulanishlari

DS1803 ulanishlari
DS1803 ulanishlari

Bu erda siz DS1803 ulanishlarini ko'rishingiz mumkin. H - potentsiometrning yuqori tomoni, L - past tomoni va V - tozalagich. SCL va SDA - bu avtobus ulanishlari.

A0, A1 va A2 ulanishi bilan siz DS1803 -ga o'z manzilini berishingiz mumkin, shu orqali siz bitta avtobus orqali ko'proq qurilmalarni boshqarishingiz mumkin. Mening misolimda barcha pinlarni erga ulash orqali DS1803 manzilini 0 beraman.

2 -qadam: Bayt buyrug'i

Buyruq buyrug'i
Buyruq buyrug'i

DS1803 ning ishlash usuli buyruq baytida ishlatilishi mumkin. "Yozish potentsiometr-0" ni tanlaganingizda ikkala potentsiometr ham tanlanadi, faqat potentsiometr-0 ni sozlashni xohlasangiz, faqat birinchi ma'lumot baytini yuborishingiz kerak bo'ladi. "Potentsiometr-1 yozing" faqat potmetr-1 ni sozlang. "Ikkala potentsiometrga ham yozing" ikkala potentsiometrga bir xil qiymat beradi.

3 -qadam: DS1803 -ni boshqarish

DS1803 -ni boshqarish
DS1803 -ni boshqarish

Boshqaruv baytida (3 -rasm) qurilma identifikatori mavjud, bu har doimgidek qoladi. Mening misolimda A0, A1 va A2 0 ga teng, chunki biz barcha A-pinlarni erga qo'yish orqali manzilni tanlaymiz. Oxirgi R/V biti Arduino -dagi "Wire.beginTransmission" va "Wire.requestFrom" buyrug'i bilan 0 yoki 1 ga o'rnatiladi. 5 -rasmda siz butun telegrammani ko'rishingiz mumkin. O'qilgan telegramma 4 -rasmda ko'rsatilgan.

4 -qadam: sozlash

Sozlash
Sozlash

Bu sxema hamma narsani qanday ulash kerakligini ko'rsatadi. Nokia LCD displeyi har xil ulanishlar bilan ta'minlangan, uni to'g'ri ulaganingizga ishonch hosil qiling. Shuningdek, uning turli xil versiyalari aylanadigan kodlovchi, ba'zilari o'rta pinada umumiydir, boshqalari esa yo'q. Men kodlovchi A va B chiqish signallarini filtrlash uchun ozgina filtr tarmog'ini (100nF qopqoqli 470 Ohmli rezistor) qo'ydim. Menga bu filtr kerak, chunki chiqishda juda ko'p shovqin bor edi. Men shovqinni bekor qilish uchun dasturga hisobdan chiqish taymerini qo'ydim. Qolganlari uchun menimcha, sxema aniq. LCD displeyni Adafruit https://www.adafruit.com/product/338 orqali buyurtma qilish mumkin.

5 -qadam: Dastur

2 simli avtobusdan foydalanish uchun men Wire.h kutubxonasini o'z ichiga olaman. LCD-dan foydalanish uchun men Adafruit kutubxonasini o'z ichiga olaman, uni https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library saytidan yuklab olishingiz mumkin, shuningdek Adafruit_GFX.h kutubxonasi bu erda https:// github. com/adafruit/Adafruit-GFX-kutubxonasi.

#qo'shing

#qo'shing

#qo'shing

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

Bu erda siz barcha o'zgaruvchilarni ko'rishingiz mumkin. Bayt va buyruq baytini yuqorida aytib o'tilganidek boshqaring. DeBounceTime siz kodlovchi shovqiniga qarab sozlanishi mumkin.

bayt pot [2] = {1, 1}; bayt controlByte = B0101000; // 7 bit, bayt buyrug'iByte = B10101001; // oxirgi 2 bit - bu potmetrni tanlash. bayt potValue [2]; int i = 0; int deBounceTime = 10; // Bu qiymatni shovqin turiga qarab rostlang int encoder_A = 8; const int encoder_B = 9; const int buttonPin = 2; imzosiz uzoq newDebounceTime = 0; imzosiz uzoq oldTime; mantiqiy bosilgan = 0; boolean soni = 1;

O'rnatishda men to'g'ri pinlarni aniqlayman va statik matnni LCD displeyga qo'yaman

void setup () {Wire.begin (); Serial.begin (9600); pinMode (kodlovchi_A, Kirish); pinMode (encoder_B, INPUT); pinMode (tugmaPin, Kirish); newDebounceTime = millis ();

display.begin ();

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

}

Loopda men birinchi navbatda interval 500 ms dan oshishini tekshiraman, agar bo'lsa, LCD yangilanadi. Aks holda, kodlovchi tugmasi tekshiriladi. Agar toggleBuffer bosilsa, qo'ng'iroq qiling. Shundan so'ng, kodlovchi tekshiriladi. Agar 0 kirish past bo'lsa (burilish aniqlansa) Men B kirishini tekshiraman, agar B kirishi 0 bo'lsa, men potni , boshqalarini kamaytiraman. Shundan so'ng, qiymat DS1803 ga tel.write orqali yuboriladi.

void loop () {

interval ();

if (digitalRead (buttonPin) == 1 && (press == 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;}} boshqa {pot -; if (pot <1) {pot = 1;}} count = 1; newDebounceTime = millis ();

Wire.beginTransmission (controlByte); // uzatishni boshlang

Wire.write (commandByte); // Wire.write potmetrlarini tanlash (pot [0] * 10); // Wire.write potmetr ma'lumotlarining 1 -baytini yuborish (pot [1] * 10); // Wire.endTransmission potmeter ma'lumotlarining 2 -baytini yuborish (); // uzatishni to'xtating} else if if (digitalRead (encoder_A) == 1 && digitalRead (encoder_B) == 1 && count == 1 && (millis () - newDebounceTime> deBounceTime)) {count = 0; newDebounceTime = millis (); }}

void toggleBuffer () {pressed = 1; agar (i == 0) {i = 1;} boshqa {i = 0;}}

Avval men varibllarni yozishim kerak bo'lgan joyni tozalayman. Men bu sohada to'rtburchak chizish uchun qilaman. Shundan so'ng men o'zgaruvchilarni ekranga yozaman.

void writeToLCD () {Wire.requestFrom (controlByte, 2); potValue [0] = Wire.read (); // birinchi potmetr baytini o'qing potValue [1] = Wire.read (); // ikkinchi potmetr baytini o'qing display.fillRect (40, 0, 40, 45, WHITE); // LCD displeyda aniq o'zgaruvchan ekran.setCursor (40, 10); display.print (potValue [0]); // LCD displeyga 1 -potmetr qiymatini yozing.setCursor (40, 22); display.print (potValue [1]); // LCD displeyga 2 -potmetr qiymatini yozing.setCursor (60, (10 + i * 12)); display.print ("<"); display.display (); }

void interval () {// intervalli taymer, LCD ga ma'lumotlarni yozish uchun, agar ((millis () - oldTime)> 500) {writeToLCD (); oldTime = millis (); }}

Tavsiya: