İçindekiler:

DS1803 Arduino ile Çift Dijital Potansiyometre: 5 Adım
DS1803 Arduino ile Çift Dijital Potansiyometre: 5 Adım

Video: DS1803 Arduino ile Çift Dijital Potansiyometre: 5 Adım

Video: DS1803 Arduino ile Çift Dijital Potansiyometre: 5 Adım
Video: #11 LM35 и промышленный датчик температуры 4–20 мА для герметизации ПЛК Arduino 2024, Kasım
Anonim
DS1803 Arduino ile Çift Dijital Potansiyometre
DS1803 Arduino ile Çift Dijital Potansiyometre

Bir DS1803 dijital potmetrenin kullanımını bir Arduino ile paylaşmayı seviyorum. Bu IC, iki kablolu arayüz üzerinden kontrol edilebilen iki dijital potmetre içerir, bunun için wire.h kitaplığını kullanıyorum.

Bu IC, normal bir analog potmetrenin yerini alabilir. Bu şekilde örneğin bir amplifikatörü veya güç kaynağını kontrol edebilirsiniz.

Bu talimatta, çalışmayı göstermek için iki LED'in parlaklığını kontrol ediyorum.

Arduino, döner kodlayıcının darbelerini sayar ve değeri pot[0] ve pot[1] değişkenlerine yerleştirir. Enkoder üzerindeki düğmeye bastığınızda pot[0] ve pot[1] arasında geçiş yapabilirsiniz.

Potların gerçek değeri DS1803'ten okunur ve potValue[0] ve potValue[1] değişkenlerine yerleştirilir ve bir LCD'de görüntülenir.

Adım 1: DS1803'ün Bağlantıları

DS1803'ün bağlantıları
DS1803'ün bağlantıları

Burada DS1803'ün bağlantılarını görebilirsiniz. H, potansiyometrenin yüksek tarafı, L alt tarafı ve W sileceğidir. SCL ve SDA bus bağlantılarıdır.

A0, A1 ve A2 bağlantısı ile DS1803'e kendi adresini verebilirsiniz, bu şekilde bir bus üzerinden daha fazla cihazı kontrol edebilirsiniz. Örneğimde tüm pinleri toprağa bağlayarak DS1803 adresini 0 verdim.

Adım 2: Komut Baytı

Komut Baytı
Komut Baytı

DS1803'ün çalışma şekli komut baytında kullanılabilir. "Potansiyometre-0 yaz"ı seçtiğinizde her iki potansiyometre seçilir, sadece potansiyometre-0'ı ayarlamak istediğinizde sadece ilk veri baytını göndermeniz gerekir. "Potansiyometre-1 yaz" sadece potmetre-1'i ayarlayın. "Her iki potansiyometreye yaz", her iki potansiyometreye de aynı değeri verir.

Adım 3: DS1803'ün Kontrolü

DS1803'ün Kontrolü
DS1803'ün Kontrolü

Kontrol baytı (şekil 3) bir cihaz tanımlayıcısına sahiptir, bu her zaman aynı kalır. Örneğimde A0, A1 ve A2 0 çünkü tüm A pinlerini toprağa koyarak adres seçiyoruz. Son bit R/W, Arduino'da "Wire.beginTransmission" ve "Wire.requestFrom" komutu ile 0 veya 1'e ayarlanacaktır. Şekil 5'te telgrafın tamamını görebilirsiniz. Okunan telgraf şekil 4'te gösterilmektedir.

4. Adım: Kurulum

Kurmak
Kurmak

Bu devre her şeyin nasıl bağlanacağını gösterir. Nokia LCD farklı bağlantılarla mevcuttur, sizinkini doğru bağladığınızdan emin olun. Ayrıca döner kodlayıcının farklı versiyonları vardır, bazılarının orta pim üzerinde ortak noktası vardır, bazılarının değil. Kodlayıcının A ve B çıkış sinyallerini filtrelemek için küçük bir filtre ağı (100nF kapaklı 470 Ohm direnç) koydum. Çıktıda çok fazla gürültü olduğu için bu filtreye ihtiyacım var. Ayrıca biraz gürültüyü iptal etmek için programıma bir geri dönme zamanlayıcısı koydum. Geri kalanı için devrenin açık olduğunu düşünüyorum. LCD, Adafruit https://www.adafruit.com/product/338 adresinden sipariş edilebilir.

Adım 5: Program

2 kablolu veri yolunun kullanımı için Wire.h kitaplığını ekliyorum. LCD'yi kullanmak için https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library adresinden indirebileceğiniz Adafruit kütüphanesini de ekliyorum, ayrıca Adafruit_GFX.h kütüphanesini burada https://github mevcuttur. com/adafruit/Adafruit-GFX-Library.

#Dahil etmek

#Dahil etmek

#Dahil etmek

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

Burada tüm değişkenleri görebilirsiniz. Daha önce açıklandığı gibi kontrol baytı ve komut baytı. DeBounceTime, kodlayıcınızdaki gürültüye bağlı olarak ayarlanabilir.

bayt pot[2] = {1, 1};bayt kontrolByte = B0110000; // 7 bit, bayt komutuByte = B10101001; // son 2 bit potmetre seçimidir. bayt potValue[2]; int ben = 0; int deBounceTime = 10; // Bu değeri gürültüye bağlı olarak ayarlayın int encoder_A = 8; const int kodlayıcı_B = 9; const int buttonPin = 2; imzasız uzun newDebounceTime = 0; imzasız uzun oldTime; boolean basıldı = 0; boole sayısı = 1;

Kurulumda doğru pinleri tanımlıyorum ve statik metni LCD'ye koyuyorum

geçersiz kurulum() { Wire.begin(); Seri.başla(9600); pinMode(encoder_A, INPUT); pinMode(encoder_B, INPUT); pinMode(buttonPin, INPUT); newDebounceTime = millis();

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üde önce aralığın 500 ms'den fazla olup olmadığını kontrol ederim, evet ise LCD güncellenir. Değilse, kodlayıcı üzerindeki düğme kontrol edilir. Basıldığında toggleBuffer çağrılır. Bundan sonra kodlayıcı kontrol edilir. 0 girişi düşükse (dönüş algılandı) B girişini kontrol ederim, B girişi 0 ise pot artırır, diğerleri azaltır. Bundan sonra değer, wire.write aracılığıyla DS1803'e gönderilecektir.

boşluk döngüsü () {

Aralık();

if(digitalRead(buttonPin)== 1 && (basıldı == 0)){toggleBuffer();} if(digitalRead(buttonPin)== 0){basıldı = 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;} } sayı = 1; newDebounceTime = millis();

Wire.beginTransmission(controlByte); // iletmeye başla

Wire.write(commandByte); // potmetre seçimi Wire.write(pot[0] * 10); // potmetre verisinin 1. baytını gönder Wire.write(pot[1] * 10); // 2. bayt potmetre verisi gönder Wire.endTransmission(); // iletimi durdur }else if (digitalRead(encoder_A) == 1 && digitalRead(encoder_B) == 1 && count == 1 && (millis() - newDebounceTime > deBounceTime)){ count = 0; newDebounceTime = millis(); } }

void toggleBuffer(){ basıldı = 1; if (i == 0){i = 1;}else{i = 0;} }

İlk önce değişkenleri yazmam gereken alanı temizliyorum. Bunu, bu alanda bir dikdörtgen çizmek için yapıyorum. Ardından değişkenleri ekrana yazıyorum.

void writeToLCD(){ Wire.requestFrom(controlByte, 2); potValue[0] = Wire.read(); // ilk potmetre baytını oku potValue[1] = Wire.read(); // ikinci potmetre baytını oku display.fillRect(40, 0, 40, 45, BEYAZ); // LCD ekrandaki değişken ekranı temizle.setCursor(40, 10); display.print(potValue[0]); // LCD ekrana 1. potmetre değerini yaz.setCursor(40, 22); display.print(potValue[1]); // 2. potmetre değerini LCD ekrana yaz.setCursor(60, (10 + i * 12)); display.print("<"); display.display(); }

void interval(){ // LCD'ye veri yazmak için interval timer if ((millis() - oldTime) > 500) { writeToLCD(); eskiZaman = millis(); } }

Önerilen: