Índice:

DS1803 Potenciômetro digital duplo com Arduino: 5 etapas
DS1803 Potenciômetro digital duplo com Arduino: 5 etapas

Vídeo: DS1803 Potenciômetro digital duplo com Arduino: 5 etapas

Vídeo: DS1803 Potenciômetro digital duplo com Arduino: 5 etapas
Vídeo: Почтовый мешок! Цифровой потенциометр DS1803 и другой кремний 2024, Novembro
Anonim
DS1803 Potenciômetro Digital Dual com Arduino
DS1803 Potenciômetro Digital Dual com Arduino

Eu gosto de compartilhar o uso de um potímetro digital DS1803 com um Arduino. Este IC contém dois medidores de potes digitais que podem ser controlados por uma interface de dois fios, para isso eu uso a biblioteca wire.h.

Este IC pode substituir um potímetro analógico normal. Desta forma, você pode controlar, por exemplo, um amplificador ou fonte de alimentação.

Neste instrutível eu controle o brilho de dois LEDs para mostrar o funcionamento.

O arduino conta os pulsos de um codificador rotativo e coloca o valor na variável pot [0] e pot [1]. Quando você pressiona a chave no encoder, pode alternar entre pot [0] e pot [1].

O valor real dos potenciômetros são lidos de volta no DS1803 e colocados nas variáveis potValue [0] e potValue [1] e exibidos em um LCD.

Etapa 1: Conexões do DS1803

Conexões do DS1803
Conexões do DS1803

Aqui você pode ver as conexões do DS1803. H é o lado alto do potenciômetro, L o lado baixo e W o limpador. SCL e SDA são as conexões de barramento.

Com as conexões A0, A1 e A2 você pode dar ao DS1803 seu próprio endereço, desta forma você pode controlar mais dispositivos através de um barramento. Em meu exemplo, dei o endereço 0 do DS1803 conectando todos os pinos ao solo.

Etapa 2: Byte de comando

Byte de Comando
Byte de Comando

A forma como o DS1803 opera pode ser usada no byte de comando. Quando você seleciona "escrever potenciômetro-0" ambos os potenciômetros são selecionados, quando você deseja apenas ajustar o potenciômetro-0, você só precisa enviar o primeiro byte de dados. "Write potentiometer-1" ajusta apenas o potenciômetro-1. "Gravar em ambos os potenciômetros" fornece a ambos os potenciômetros o mesmo valor.

Etapa 3: Controle do DS1803

Controle do DS1803
Controle do DS1803

O byte de controle (figura 3) possui um identificador de dispositivo, este permanece sempre o mesmo. No meu exemplo, A0, A1 e A2 são 0 porque selecionamos endereço colocando todos os pinos A no solo. O último bit R / W será definido como 0 ou 1 pelo comando "Wire.beginTransmission" e "Wire.requestFrom" no Arduino. Na figura 5 você pode ver o telegrama completo. O telegrama lido é mostrado na figura 4.

Etapa 4: configuração

Configurar
Configurar

Este circuito mostra como conectar tudo. O LCD Nokia está disponível com diferentes conexões, certifique-se de conectar as suas da maneira certa. Além disso, o codificador rotativo tem suas diferentes versões, alguns têm o comum no pino do meio, outros não. Eu coloquei uma pequena rede de filtro (resistor de 470 Ohm com tampa de 100nF) para filtrar os sinais de saída A e B do codificador. Eu preciso desse filtro porque a saída tinha muito ruído. Eu também coloquei um temporizador de debounce no meu programa para cancelar alguns ruídos. Quanto ao resto, acho que o circuito está livre. O LCD pode ser encomendado via Adafruit

Etapa 5: o programa

Para o uso do barramento de 2 fios, incluo a biblioteca Wire.h. Para usar o LCD, incluo a biblioteca Adafruit, que você pode baixar em https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library. Também a biblioteca Adafruit_GFX.h está disponível aqui https:// github. com / adafruit / Adafruit-GFX-Library.

#incluir

#incluir

#incluir

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

Aqui você pode ver todas as variáveis. Byte de controle e byte de comando conforme descrito anteriormente. O deBounceTime pode ser ajustado dependendo do ruído em seu codificador.

byte pot [2] = {1, 1}; byte controlByte = B0101000; // 7 bits, byte commandByte = B10101001; // os últimos 2 bits são a seleção do potmeter. byte potValue [2]; int i = 0; int deBounceTime = 10; // Ajuste este valor dependendo do ruído const int encoder_A = 8; const int encoder_B = 9; const int buttonPin = 2; longo sem sinal newDebounceTime = 0; unsigned long oldTime; booleano pressionado = 0; contagem booleana = 1;

Na configuração, defino os pinos corretos e coloco o texto estático no LCD

void setup () {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 (BLACK); display.setCursor (0, 10); display.println ("POT 1 ="); display.setCursor (0, 22); display.println ("POT 2 ="); display.display ();

}

No loop eu primeiro verifico se o intervalo é maior que 500ms, se sim o LCD é atualizado. Caso contrário, o botão no codificador é verificado. Se pressionado, o toggleBuffer é chamado. Depois disso, o codificador é verificado. Se a entrada 0 é baixa (rotação detectada) eu verifico a entrada B, se a entrada B é 0 eu incremento o potenciômetro , outros eu decremento. Depois disso, o valor será enviado para o DS1803 via wire.write.

void loop () {

intervalo();

if (digitalRead (buttonPin) == 1 && (pressionado == 0)) {toggleBuffer ();} if (digitalRead (buttonPin) == 0) {pressionado = 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;}} contagem = 1; newDebounceTime = millis ();

Wire.beginTransmission (controlByte); // começa a transmitir

Wire.write (commandByte); // seleção de medidores de potes Wire.write (pot [0] * 10); // envia o primeiro byte de dados potmeter Wire.write (pot [1] * 10); // envia o 2º byte de dados potmeter Wire.endTransmission (); // parar a transmissão} else if (digitalRead (encoder_A) == 1 && digitalRead (encoder_B) == 1 && count == 1 && (millis () - newDebounceTime> deBounceTime)) {count = 0; newDebounceTime = millis (); }}

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

Primeiro, limpo a área onde devo escrever as variáveis. Faço isso para desenhar um retângulo nesta área. Depois disso, escrevo as variáveis na tela.

void writeToLCD () {Wire.requestFrom (controlByte, 2); potValue [0] = Wire.read (); // lê o primeiro byte potmeter potValue [1] = Wire.read (); // lê o segundo byte do potmeter display.fillRect (40, 0, 40, 45, WHITE); // limpa a tela variável no LCD display.setCursor (40, 10); display.print (potValue [0]); // escreve o primeiro valor do potenciômetro no display LCD.setCursor (40, 22); display.print (potValue [1]); // escreve o segundo valor do potenciômetro no display LCD.setCursor (60, (10 + i * 12)); display.print ("<"); display.display (); }

void interval () {// temporizador de intervalo para gravar dados no LCD if ((millis () - oldTime)> 500) {writeToLCD (); oldTime = millis (); }}

Recomendado: