Мазмуну:

DS1803 Arduino менен кош санарип потенциометр: 5 кадам
DS1803 Arduino менен кош санарип потенциометр: 5 кадам

Video: DS1803 Arduino менен кош санарип потенциометр: 5 кадам

Video: DS1803 Arduino менен кош санарип потенциометр: 5 кадам
Video: Цифровые потенциометры и модуль на AD5245 2024, Ноябрь
Anonim
DS1803 Ардуино менен кош санарип потенциометр
DS1803 Ардуино менен кош санарип потенциометр

Мен DS1803 санарип потметринин колдонулушун Arduino менен бөлүшкүм келет. Бул ICде эки зым интерфейси аркылуу башкарыла турган эки санариптик потметр бар, бул үчүн мен sim.h китепканасын колдоном.

Бул IC кадимки аналогдук потметрди алмаштыра алат. Ушундай жол менен сиз, мисалы, күчөткүчтү же электр менен камсыздоону көзөмөлдөй аласыз.

Бул көрсөтмөдө мен иштеп жаткандыгын көрсөтүү үчүн эки LEDдин жарыгын көзөмөлдөйм.

Ардуино айлануучу коддогучтун импульстарын санап, маанини өзгөрмөлүү идишке [0] жана казанга [1] жайгаштырат. Сиз коддогучту которгондо, казан [0] менен казандын [1] ортосунда которула аласыз.

Казандардын чыныгы баасы DS1803төн кайра окулат жана potValue [0] жана potValue [1] өзгөрмөсүнө жайгаштырылат жана ЖКда көрсөтүлөт.

1 -кадам: DS1803 туташуулары

DS1803 байланыштары
DS1803 байланыштары

Бул жерде DS1803 туташууларын көрө аласыз. H - потенциометрдин жогорку жагы, L төмөн жагы жана W тазалагыч. SCL жана SDA - бул автобустук байланыштар.

A0, A1 жана A2 туташуусу менен сиз DS1803кө өзүнүн дарегин бере аласыз, ушундай жол менен бир автобус аркылуу көбүрөөк түзмөктөрдү башкара аласыз. Менин мисалымда, бардык казыктарды жерге туташтыруу менен DS1803 дарегин 0 бердим.

2 -кадам: Command Byte

Command Byte
Command Byte

DS1803 иштөө ыкмасын буйрук байтында колдонсо болот. "Потенциометрди жаз-0" дегенди тандаганыңызда, эки потенциометр тең тандалат, эгер сиз потенциометрди-0 жөнгө салгыңыз келсе, сиз биринчи маалыматтын байтын жөнөтүшүңүз керек. "Потенциометрди жаз-1" жөн гана потметрди тууралаңыз-1. "Эки потенциометрге тең жаз" эки потенциометрге бирдей маанини берет.

3 -кадам: DS1803 контролдоо

DS1803 контролдоо
DS1803 контролдоо

Башкаруу байтында (3 -сүрөт) түзмөктүн идентификатору бар, бул дайыма ошол бойдон калат. Менин мисалда A0, A1 жана A2 0, анткени биз бардык А-пиндерди жерге коюп, даректи тандап алабыз. Акыркы бит R/W Arduinoдогу "Wire.beginTransmission" жана "Wire.requestFrom" буйругу менен 0 же 1ге коюлат. 5 -сүрөттө телеграмманы толугу менен көрө аласыз. Окулган телеграмма 4 -сүрөттө көрсөтүлгөн.

4 -кадам: Орнотуу

Жайгашуу
Жайгашуу

Бул схема бардыгын кантип туташтырууну көрсөтөт. Nokia ЖК ар кандай байланыштар менен жеткиликтүү, өзүңүздү туура туташтырганыңызга ишениңиз. Ошондой эле айлануучу коддогуч анын ар кандай версияларын камтыйт, кээ бирлеринин ортоңку пинде жалпылыгы бар, башкаларында жок. Мен коддогучтун А жана В чыгаруу сигналдарын чыпкалоо үчүн кичине чыпка тармагын (100nF капкагы бар 470 Ом резистору) койдум. Мага бул чыпка керек, анткени өндүрүштө ызы -чуу көп болчу. Мен дагы ызы -чууну жок кылуу үчүн программама дебюндун таймерин койдум. Калгандары үчүн схема ачык деп ойлойм. ЖКны Adafruit аркылуу заказ кылса болот

5 -кадам: Программа

2 зымдуу автобусту колдонуу үчүн мен Wire.h китепканасын камтыйм. ЖКны колдонуу үчүн мен https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library сайтынан жүктөп ала турган Adafruit китепканасын кошо алам, Adafruit_GFX.h китепканасы бул жерде жеткиликтүү https:// github. com/adafruit/Adafruit-GFX-Китепкана.

#кошуу

#кошуу

#кошуу

Adafruit_PCD8544 дисплей = Adafruit_PCD8544 (7, 6, 5, 4, 3);

Бул жерде сиз бардык өзгөрмөлөрдү көрө аласыз. Башкаруу байт жана буйрук байт мурда айтылгандай. DeBounceTime коддогучтагы ызы -чууга жараша жөнгө салынышы мүмкүн.

байт казаны [2] = {1, 1}; byte controlByte = B0101000; // 7 бит, байт commandByte = B10101001; // акыркы 2 бит - бул потметрди тандоо. байт potValue [2]; int i = 0; int deBounceTime = 10; // Бул маанини ызы -чууга жараша тууралаңыз const encoder_A = 8; const int encoder_B = 9; const int buttonPin = 2; белгисиз узак newDebounceTime = 0; unsigned long oldTime; логикалык пресс = 0; логикалык эсеп = 1;

Орнотууда мен туура казыктарды аныктап, статикалык текстти ЖКга коем

void setup () {Wire.begin (); Serial.begin (9600); pinMode (encoder_A, INPUT); pinMode (encoder_B, INPUT); pinMode (buttonPin, INPUT); newDebounceTime = миллис ();

display.begin ();

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

}

Укурукта мен адегенде интервал 500 мсден ашпасын текшерем, эгер ооба болсо, ЖК жаңыртылып турат. Болбосо, коддогучтун баскычы текшерилет. Эгерде toggleBuffer басылган болсо, анда чалуу керек. Андан кийин кодер текшерилет. Эгерде 0 кирүүсү төмөн болсо (айлануу аныкталды) Мен В киришин текшерем, эгер В кириши 0 болсо, мен казанды көбөйтөм, башкаларын мен азайтам. Андан кийин, маани DS1803кө tel.write аркылуу жөнөтүлөт.

void loop () {

интервал ();

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;}} else {pot -; if (pot <1) {pot = 1;}} count = 1; newDebounceTime = миллис ();

Wire.beginTransmission (controlByte); // өткөрүп баштоо

Wire.write (commandByte); // potmeters тандоо Wire.write (pot [0] * 10); // potmeter маалыматтарынын 1 байтын жөнөтүү Wire.write (pot [1] * 10); // Wire.endTransmission potmeter маалыматтарынын 2 байтын жөнөтүү (); // берүүнү токтотуу} else if if (digitalRead (encoder_A) == 1 && digitalRead (encoder_B) == 1 && count == 1 && (millis () - newDebounceTime> deBounceTime)) {count = 0; newDebounceTime = миллис (); }}

void toggleBuffer () {pressed = 1; эгер (i == 0) {i = 1;} башка {i = 0;}}

Биринчиден, мен varibles жазуум керек болгон аймакты тазалайм. Мен муну бул аймакта тик бурчтук тартуу үчүн жасайм. Андан кийин мен экранга өзгөрмөлөрдү жазам.

Void writeToLCD () {Wire.requestFrom (controlByte, 2); potValue [0] = Wire.read (); // биринчи potmeter байт potValue окуу [1] = Wire.read (); // окуу экинчи potmeter байт display.fillRect (40, 0, 40, 45, АК); // LCD display.setCursor боюнча ачык өзгөрмө экран (40, 10); display.print (potValue [0]); // LCD Display.setCursor үчүн 1 -потмердин маанисин жазыңыз (40, 22); display.print (potValue [1]); // LCD display.setCursorго 2 -потмердин маанисин жазуу (60, (10 + i * 12)); display.print ("<"); display.display (); }

боштук аралыгы () {// интервалдын таймери LCDге маалыматтарды жазуу үчүн эгер ((millis () - oldTime)> 500) {writeToLCD (); oldTime = millis (); }}

Сунушталууда: