Orodha ya maudhui:

DS1803 Dual Digital Potentiometer na Arduino: 5 Hatua
DS1803 Dual Digital Potentiometer na Arduino: 5 Hatua

Video: DS1803 Dual Digital Potentiometer na Arduino: 5 Hatua

Video: DS1803 Dual Digital Potentiometer na Arduino: 5 Hatua
Video: Цифровые потенциометры и модуль на AD5245 2024, Novemba
Anonim
DS1803 Dual Digital Potentiometer na Arduino
DS1803 Dual Digital Potentiometer na Arduino

Ninapenda kushiriki utumiaji wa bomba la dijiti la DS1803 na Arduino. IC hii ina vipodozi viwili vya dijiti ambavyo vinaweza kudhibitiwa juu ya kiwambo cha waya mbili, kwa hii ninatumia maktaba ya waya.h.

IC hii inaweza kuchukua nafasi ya bomba la kawaida la analog. Kwa njia hii una uwezo wa kudhibiti kwa mfano kipaza sauti au usambazaji wa umeme.

Katika hii kufundisha mimi kudhibiti mwangaza wa LED mbili kuonyesha kazi.

Aruuino huhesabu kunde za kisimbuzi cha rotary na kuweka thamani kwenye sufuria inayobadilika [0] na sufuria [1]. Unapobonyeza swichi kwenye kisimbuzi, unaweza kubadilisha kati ya sufuria [0] na sufuria [1].

Thamani halisi ya sufuria inasomewa nyuma kutoka DS1803 na kuwekwa kwenye sufuria ya kutofautisha [0] na potValue [1] na kuonyeshwa kwenye LCD.

Hatua ya 1: Uunganisho wa DS1803

Uunganisho wa DS1803
Uunganisho wa DS1803

Hapa unaweza kuona unganisho la DS1803. H ni upande wa juu wa potentiometer, L upande wa chini na W wiper. SCL na SDA ni uhusiano wa basi.

Kwa unganisho A0, A1 na A2 unaweza kutoa DS1803 ni anwani yako mwenyewe, kwa njia hii unaweza kudhibiti vifaa zaidi kupitia basi moja. Katika mfano wangu nimetoa DS1803 adres 0 kwa kuunganisha pini zote chini.

Hatua ya 2: Amri Byte

Amri Byte
Amri Byte

Njia ambayo DS1803 inafanya kazi inaweza kutumika kwa amri ya ka. Unapochagua "andika potentiometer-0" potentiometers zote mbili zimechaguliwa, wakati unataka tu kurekebisha potentiometer-0, lazima utume tu byte ya kwanza ya data. "Andika potentiometer-1" rekebisha tu potmeter-1. "Andika kwa potentiometers zote mbili" inazipa zote mbili uwezo sawa.

Hatua ya 3: Udhibiti wa DS1803

Udhibiti wa DS1803
Udhibiti wa DS1803

Byte ya kudhibiti (kielelezo 3) ina kitambulisho cha kifaa, hii inakaa sawa kila wakati. Katika mfano wangu A0, A1 na A2 ni 0 kwa sababu tunachagua adres kwa kuweka pini zote za A chini. Kidogo cha mwisho R / W kitawekwa 0 au 1 kwa amri "Wire.beginTransmission" na "Wire.requestFrom" katika Arduino. Katika sura ya 5 unaweza kuona telegram nzima. Telegram iliyosomwa imeonyeshwa kwenye sura ya 4.

Hatua ya 4: Sanidi

Sanidi
Sanidi

Mzunguko huu unaonyesha jinsi ya kuunganisha kila kitu. Nokia LCD inapatikana na miunganisho tofauti, hakikisha umeunganisha yako sawa. Pia encoder ya rotary matoleo yake tofauti, zingine zina kawaida kwenye pini ya kati zingine sio. Nimeweka mtandao wa kichujio kidogo (470 Ohm resistor na 100nF cap) kuchuja A na B ishara za pato la kisimbuzi. Ninahitaji kichujio hiki kwa sababu pato lilikuwa na kelele nyingi. Pia niliweka kipima muda katika mpango wangu wa kufuta kelele. Kwa wengine nadhani mzunguko uko wazi. LCD inaweza kuamriwa kupitia Adafruit

Hatua ya 5: Programu

Kwa matumizi ya basi ya waya 2 ninajumuisha maktaba ya Wire.h. Kutumia LCD ninajumuisha maktaba ya Adafruit ambayo unaweza kupakua kutoka https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library pia maktaba ya Adafruit_GFX.h inapatikana hapa https:// github. com / adafruit / Adafruit-GFX-Maktaba.

# pamoja

# pamoja

# pamoja

Maonyesho ya Adafruit_PCD8544 = Adafruit_PCD8544 (7, 6, 5, 4, 3);

Hapa unaweza kuona anuwai zote. Dhibiti baiti na amri ya ka kama ilivyoelezwa hapo awali. Wakati wa deBounce unaweza kubadilishwa kulingana na kelele kwenye usimbuaji.

sufuria ya baiti [2] = {1, 1}; kudhibiti byteByte = B0101000; // bits 7, amri ya byteByte = B10101001; // bits 2 za mwisho ni uteuzi wa sufuria. Thamani ya baiti Thamani [2]; int i = 0; int deBounceTime = 10; // Rekebisha thamani hii kulingana na kelele ya encoder_A = 8; enc int encoder_B = 9; kifungo cha int intPin = 2; unsigned muda mrefu newDebounceTime = 0; muda mrefu wa muda mrefu; taabu ya boolean = 0; hesabu ya boolean = 1;

Katika usanidi ninafafanua pini sahihi na kuweka maandishi ya tuli kwenye LCD

kuanzisha batili () {Wire.begin (); Serial. Kuanza (9600); pinMode (encoder_A, INPUT); pinMode (encoder_B, INPUT); pinMode (kifungoPini, INPUT); newDebounceTime = milimita ();

onyesha.anza ();

onyesha.setContrast (50); onyesha wazi Cleplay (); onyesha.setTextSize (1); onyesha.setTextColor (NYEUSI); onyesha.setCursor (0, 10); onyesha.println ("POT 1 ="); Kuweka Mshale (0, 22); onyesha.println ("POT 2 ="); onyesha.display ();

}

Katika kitanzi ninaangalia kwanza ikiwa muda ni zaidi ya 500ms, ikiwa ndio LCD inasasishwa. Ikiwa sivyo kitufe kilicho kwenye kisimbuzi kimekaguliwa. Ikiwa imesisitizwa toggleBuffer itaitwa. Baada ya hii kisimbuzi kikaguliwa. Ikiwa pembejeo 0 ni ya chini (mzunguko umegunduliwa) ninaangalia pembejeo B, ikiwa pembejeo B ni 0 Ninaongeza sufuria , wengine napunguza. Baada ya hii thamani itatumwa kwa DS1803 kupitia waya. Andika.

kitanzi batili () {

muda ();

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

ikiwa (digitalRead (encoder_A) == 0 && count == 0 && (millis () - newDebounceTime> deBounceTime)) {if (digitalRead (encoder_B) == 0) {pot ++; ikiwa (sufuria > 25) {sufuria = 25;}} mwingine {sufuria -; ikiwa (sufuria <1) {sufuria = 1;}} hesabu = 1; newDebounceTime = milimita ();

Wire.beginUhamisho (controlByte); // kuanza kusambaza

Andika waya (commandByte); // uteuzi wa vifuniko vya waya.andika (sufuria [0] * 10); // tuma ka 1 ya data ya potmeter Wire.write (sufuria [1] * 10); // tuma baiti ya 2 ya data ya potmeter Wire.endUsambazaji (); // kuacha kusambaza} mwingine ikiwa (digitalRead (encoder_A) == 1 && digitalRead (encoder_B) == 1 && count == 1 && (millis () - newDebounceTime> deBounceTime)) {count = 0; newDebounceTime = milimita (); }}

toggleBuffer batili () {taabu = 1; ikiwa (i == 0) {i = 1;} mwingine {i = 0;}}

Kwanza mimi husafisha eneo ambalo inabidi niandike visababu. Ninafanya hivyo kuteka mstatili katika eneo hili. Baada ya hapo ninaandika vigeuzi kwenye skrini.

kuandika utupuToLCD () {Wire.requestFrom (controlByte, 2); potValue [0] = Wire.read (); // soma sufuria ya kwanza ya potmeter byte Thamani [1] = Wire.read (); // soma onyesho la pili la potmeter byte FillRect (40, 0, 40, 45, NYEUPE); // skrini wazi ya kutofautisha kwenye onyesho la LCD.setCursor (40, 10); onyesho.print (Thamani ya sufuria [0]); // andika 1 thamani ya potmeter kwa onyesho la LCD. Cursor (40, 22); onyesha.chapisho (Thamani ya sufuria [1]); // andika 2 ya thamani ya potmeter kwa onyesho la LCD.setCursor (60, (10 + i * 12)); onyesho.print ("<"); onyesha.display (); }

muda batili () {// kipima muda cha kuandika data kwa LCD ikiwa ((millis () - oldTime)> 500) {writeToLCD (); OldTime = milimita (); }}

Ilipendekeza: