INHOUDSOPGAWE:

DS1803 dubbele digitale potensiometer met Arduino: 5 stappe
DS1803 dubbele digitale potensiometer met Arduino: 5 stappe

Video: DS1803 dubbele digitale potensiometer met Arduino: 5 stappe

Video: DS1803 dubbele digitale potensiometer met Arduino: 5 stappe
Video: Lesson 10: Using Potentiometer reading voltage, Analog and Digital 2024, Julie
Anonim
DS1803 dubbele digitale potensiometer met Arduino
DS1803 dubbele digitale potensiometer met Arduino

Ek deel graag die gebruik van 'n DS1803 digitale potmeter met 'n Arduino. Hierdie IC bevat twee digitale potmeters wat beheer kan word oor 'n tweedraads koppelvlak, hiervoor gebruik ek die wire.h biblioteek.

Hierdie IC kan 'n normale analoog potmeter vervang. Op hierdie manier kan u byvoorbeeld 'n versterker of kragtoevoer beheer.

In hierdie instruksies beheer ek die helderheid van twee LED's om die werking te wys.

Die arduino tel die pulse van 'n roterende encoder en plaas die waarde in die veranderlike pot [0] en pot [1]. As u op die skakelaar op die encoder druk, kan u wissel tussen pot [0] en pot [1].

Die werklike waarde van die potte word van die DS1803 af gelees en in veranderlike potValue [0] en potValue [1] geplaas en op 'n LCD vertoon.

Stap 1: Verbindings van die DS1803

Aansluitings van die DS1803
Aansluitings van die DS1803

Hier kan u die verbindings van die DS1803 sien. H is die hoë kant van die potensiometer, L die lae kant en W die ruitveër. SCL en SDA is die busverbindings.

Met verbinding A0, A1 en A2 kan u die DS1803 sy eie adres gee, op hierdie manier kan u meer toestelle via een bus beheer. In my voorbeeld het ek die DS1803 adres 0 gegee deur alle penne aan die grond te koppel.

Stap 2: Command Byte

Command Byte
Command Byte

Die manier waarop die DS1803 werk, kan in die opdragbyte gebruik word. As u 'skryf potensiometer-0' kies, word beide potensiometers gekies; as u slegs potensiometer-0 wil aanpas, hoef u slegs die eerste databyte te stuur. "Skryf potensiometer-1" pas potmeter-1 net aan. "Skryf aan beide potensiometers" gee beide potensiometers dieselfde waarde.

Stap 3: Beheer van die DS1803

Beheer van die DS1803
Beheer van die DS1803

Die beheerbyte (figuur 3) het 'n toestel -identifiseerder; dit bly altyd dieselfde. In my voorbeeld is A0, A1 en A2 0 omdat ons adres kies deur alle A-penne op die grond te sit. Die laaste bietjie R/W word op 0 of 1 gestel deur die opdrag "Wire.beginTransmission" en "Wire.requestFrom" in die Arduino. In figuur 5 kan u die hele telegram sien. Die geleesde telegram word in figuur 4 getoon.

Stap 4: Stel op

Stel op
Stel op

Hierdie kring wys hoe u alles kan koppel. Die Nokia LCD is beskikbaar met verskillende verbindings; maak seker dat u die regte verbinding het. Ook die roterende encoder sy verskillende weergawes, sommige het die gemeenskaplike op die middelste pen ander nie. Ek het 'n klein filternetwerk (470 Ohm -weerstand met 'n 100nF -kap) aangebring om die A- en B -seine van die encoder te filter. Ek het hierdie filter nodig omdat die uitset baie geraas gehad het. Ek het ook 'n ontbindingstimer in my program geplaas om geraas te kanselleer. Vir die res dink ek die kring is duidelik. Die LCD kan bestel word via Adafruit

Stap 5: Die program

Vir die gebruik van die 2-draad bus sluit ek die Wire.h biblioteek in. Om die LCD te gebruik, sluit ek die Adafruit-biblioteek in wat u kan aflaai van https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library, ook die Adafruit_GFX.h-biblioteek is hier beskikbaar https:// github. com/adafruit/Adafruit-GFX-biblioteek.

#insluit

#insluit

#insluit

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

Hier kan u al die veranderlikes sien. Beheer byte en opdragbyte soos voorheen beskryf. Die deBounceTime kan aangepas word, afhangende van die geraas op u encoder.

byte pot [2] = {1, 1}; byte controlByte = B0101000; // 7 bisse, byte commandByte = B10101001; // laaste 2 bisse is potmeterkeuse. byte potValue [2]; int i = 0; int deBounceTime = 10; // Pas hierdie waarde aan, afhangende van die geraas const int encoder_A = 8; const int encoder_B = 9; const int buttonPin = 2; ongetekende lang newDebounceTime = 0; ongetekende lang oldTime; booleaans gedruk = 0; boolean count = 1;

In die opstelling definieer ek die regte penne en plaas ek die statiese teks op die LCD

ongeldige opstelling () {Wire.begin (); Serial.begin (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 (SWART); display.setCursor (0, 10); display.println ("POT 1 ="); display.setCursor (0, 22); display.println ("POT 2 ="); vertoon.display ();

}

In die lus kyk ek eers of die interval meer as 500 ms is, indien wel, word die LCD opgedateer. Indien nie, word die knoppie op die encoder nagegaan. As u die toggleBuffer ingedruk het, word u gebel. Hierna word die encoder nagegaan. As inset 0 laag is (rotasie bespeur), kyk ek na invoer B, as inset B 0 is, verhoog ek pot , verminder ek ander. Hierna sal die waarde via wire.write na die DS1803 gestuur word.

leemte -lus () {

interval ();

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

if (digitalRead (encoder_A) == 0 && count == 0 && (millis () - newDebounceTime> deBounceTime)) {if (digitalRead (encoder_B) == 0) {pot ++; if (pot > 25) {pot = 25;}} anders {pot -; as (pot <1) {pot = 1;}} count = 1; newDebounceTime = millis ();

Wire.beginTransmission (controlByte); // begin stuur

Wire.write (commandByte); // keuse van potmeters Wire.write (pot [0] * 10); // stuur 1ste greep potmeter -data Wire.write (pot [1] * 10); // stuur 2de greep potmeter -data Wire.endTransmission (); // stop met die versending} anders as (digitalRead (encoder_A) == 1 && digitalRead (encoder_B) == 1 && count == 1 && (millis () - newDebounceTime> deBounceTime)) {count = 0; newDebounceTime = millis (); }}

void toggleBuffer () {gedruk = 1; as (i == 0) {i = 1;} anders {i = 0;}}

Eers maak ek die gebied skoon waar ek die veranderlikes moet skryf. Ek doen dit om 'n reghoek in hierdie gebied te teken. Daarna skryf ek die veranderlikes op die skerm.

void writeToLCD () {Wire.requestFrom (controlByte, 2); potValue [0] = Wire.read (); // lees die eerste potmeter -byte potValue [1] = Wire.read (); // lees tweede potmeter byte display.fillRect (40, 0, 40, 45, WIT); // duidelik veranderlike skerm op LCD display.setCursor (40, 10); display.print (potValue [0]); // skryf 1ste potmeterwaarde na LCD display.setCursor (40, 22); display.print (potValue [1]); // skryf 2de potmeterwaarde na LCD display.setCursor (60, (10 + i * 12)); display.print ("<"); vertoon.display (); }

leegte interval () {// interval timer om data na LCD te skryf as ((millis () - oldTime)> 500) {writeToLCD (); oldTime = millis (); }}

Aanbeveel: