Taula de continguts:

Potenciòmetre digital dual DS1803 amb Arduino: 5 passos
Potenciòmetre digital dual DS1803 amb Arduino: 5 passos

Vídeo: Potenciòmetre digital dual DS1803 amb Arduino: 5 passos

Vídeo: Potenciòmetre digital dual DS1803 amb Arduino: 5 passos
Vídeo: Control Position and Speed of Stepper motor with L298N module using Arduino 2024, Desembre
Anonim
Potenciòmetre digital dual DS1803 amb Arduino
Potenciòmetre digital dual DS1803 amb Arduino

M'agrada compartir l'ús d'un mesurador digital DS1803 amb un Arduino. Aquest CI conté dos potòmetres digitals que es poden controlar a través d’una interfície de dos fils, per això faig servir la biblioteca wire.h.

Aquest CI pot substituir un mesurador analògic normal. D'aquesta manera, podeu controlar per exemple un amplificador o una font d'alimentació.

En aquest instructiu controlo la brillantor de dos LED per mostrar el funcionament.

L'arduino compta els polsos d'un codificador rotatiu i col·loca el valor en pot variable [0] i pot [1]. En prémer l'interruptor del codificador, podeu canviar entre el pot [0] i el pot [1].

El valor real de les olles es llegeix des del DS1803 i es col·loca a potValue variable [0] i potValue [1] i es mostra en una pantalla LCD.

Pas 1: connexions del DS1803

Connexions del DS1803
Connexions del DS1803

Aquí podeu veure les connexions del DS1803. H és el costat alt del potenciòmetre, L el costat baix i W el netejador. SCL i SDA són les connexions d'autobús.

Amb les connexions A0, A1 i A2 podeu donar al DS1803 la seva pròpia adreça, d'aquesta manera podeu controlar més dispositius mitjançant un bus. En el meu exemple, he donat l'adreça DS1803 0 connectant tots els pins a terra.

Pas 2: Byte de comandament

Byte de comandament
Byte de comandament

La manera com funciona el DS1803 es pot utilitzar al byte d'ordres. Quan seleccioneu "escriure potenciòmetre-0", se seleccionen els dos potenciòmetres, quan només voleu ajustar el potenciòmetre-0, només heu d'enviar el primer byte de dades. "Potenciómetre d'escriptura-1" només ajusteu el potòmetre-1. "Escriure als dos potenciòmetres" dóna als dos potenciòmetres el mateix valor.

Pas 3: control del DS1803

Control del DS1803
Control del DS1803

El byte de control (figura 3) té un identificador de dispositiu, que sempre és el mateix. En el meu exemple A0, A1 i A2 són 0 perquè seleccionem l'adreça posant tots els pins A a terra. L'últim bit R / W s'establirà a 0 o 1 mitjançant l'ordre "Wire.beginTransmission" i "Wire.requestFrom" a l'Arduino. A la figura 5 podeu veure tot el telegrama. El telegrama llegit es mostra a la figura 4.

Pas 4: configureu

Configura
Configura

Aquest circuit mostra com connectar-ho tot. La pantalla LCD de Nokia està disponible amb diferents connexions. Assegureu-vos de connectar-la bé. També el codificador rotatiu de les seves diferents versions, alguns tenen el comú en el pin mig, altres no. He posat una petita xarxa de filtres (resistència de 470 Ohm amb tap de 100nF) per filtrar els senyals de sortida A i B del codificador. Necessito aquest filtre perquè la sortida tenia molt de soroll. També he posat un temporitzador de rebut al meu programa per cancel·lar una mica de soroll. Per la resta crec que el circuit està clar. La pantalla LCD es pot demanar mitjançant Adafruit

Pas 5: el programa

Per a l'ús del bus de 2 fils, incloc la biblioteca Wire.h. Per utilitzar la pantalla LCD, incloc la biblioteca Adafruit que podeu descarregar des de https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library i també la biblioteca Adafruit_GFX.h està disponible aquí https:// github. com / adafruit / Adafruit-GFX-Library.

#incloure

#incloure

#incloure

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

Aquí podeu veure totes les variables. Byte de control i byte d’ordres tal com s’ha descrit anteriorment. El deBounceTime es pot ajustar en funció del soroll del codificador.

byte pot [2] = {1, 1}; byte controlByte = B0101000; // 7 bits, byte commandByte = B10101001; // els darrers 2 bits és la selecció de paràmetres. byte potValue [2]; int i = 0; int deBounceTime = 10; // Ajusteu aquest valor en funció del soroll int int codificador_A = 8; const int encoder_B = 9; const int buttonPin = 2; unsigned long newDebounceTime = 0; unsigned long oldTime; premut booleà = 0; recompte booleà = 1;

A la configuració defineixo els pins correctes i poso el text estàtic a la pantalla LCD

void setup () {Wire.begin (); Serial.begin (9600); pinMode (codificador_A, INPUT); pinMode (codificador_B, INPUT); pinMode (buttonPin, INPUT); newDebounceTime = millis ();

display.begin ();

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

}

Al bucle primer comprovo si l'interval és superior a 500 ms, si és així, s'actualitza la pantalla LCD. Si no, es marca el botó del codificador. Si es prem el botó toggleBuffer, es crida. Després d'això, es comprova el codificador. Si l'entrada 0 és baixa (s'ha detectat la rotació) comprovo l'entrada B, si l'entrada B és 0 I incremento el pot , altres decremento. Després d'això, el valor s'enviarà al DS1803 mitjançant wire.write.

bucle buit () {

interval();

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

if (digitalRead (codificador_A) == 0 && count == 0 && (millis () - newDebounceTime> deBounceTime)) {if (digitalRead (codificador_B) == 0) {pot ++; if (pot > 25) {pot = 25;}} else {pot -; if (pot <1) {pot = 1;}} count = 1; newDebounceTime = millis ();

Wire.beginTransmission (controlByte); // començar a transmetre

Wire.write (commandByte); // selecció de potòmetres Wire.write (pot [0] * 10); // envia el primer byte de dades de potòmetre Wire.write (pot [1] * 10); // envia el 2n byte de dades de mesurador Wire.endTransmission (); // deixar de transmetre} else if (digitalRead (codificador_A) == 1 && digitalRead (codificador_B) == 1 && count == 1 && (millis () - newDebounceTime> deBounceTime)) {count = 0; newDebounceTime = millis (); }}

void toggleBuffer () {pressionat = 1; if (i == 0) {i = 1;} else {i = 0;}}

Primer vaig netejar la zona on he d’escriure les variables. Ho faig per dibuixar un rectangle en aquesta àrea. Després d'això, escric les variables a la pantalla.

void writeToLCD () {Wire.requestFrom (controlByte, 2); potValue [0] = Wire.read (); // llegeix el primer byte de potòmetre potValue [1] = Wire.read (); // llegeix el segon byte de potòmetre display.fillRect (40, 0, 40, 45, BLANC); // esborra la pantalla variable a la pantalla LCD.setCursor (40, 10); display.print (potValue [0]); // escriviu el primer valor del potòmetre a display.setCursor LCD (40, 22); display.print (potValue [1]); // escriviu el valor del 2n potòmetre a display.setCursor LCD (60, (10 + i * 12)); display.print ("<"); display.display (); }

void interval () {// temporitzador d’interval per escriure dades a la pantalla LCD si ((millis () - oldTime)> 500) {writeToLCD (); oldTime = millis (); }}

Recomanat: