Índice:
- Etapa 1: Conexões do DS1803
- Etapa 2: Byte de comando
- Etapa 3: Controle do DS1803
- Etapa 4: configuração
- Etapa 5: o programa
Vídeo: DS1803 Potenciômetro digital duplo com Arduino: 5 etapas
2024 Autor: John Day | [email protected]. Última modificação: 2024-01-30 11:39
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
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
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
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
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:
Fazendo seu próprio (gangorra) Dimmer LED duplo: 4 etapas
Fazendo seu próprio (gangorra) Dimmer de LED duplo: Hoje, vou mostrar como fazer o Dimmer de LED duplo com apenas 555 chips de temporizador junto com componentes comuns. Semelhante a um único MOSFET / transistor (PNP, NPN, canal P, ou N-Channel) que ajusta o brilho de um LED, este usa dois MOS
Osciloscópio de rastreamento duplo: 11 etapas (com imagens)
Osciloscópio de traço duplo: quando construí meu mini osciloscópio anterior, queria ver como poderia fazer meu menor microcontrolador ARM, um STM32F030 (F030), funcionar, e ele fez um bom trabalho. Em um dos comentários, foi sugerido que uma " Pílula Azul " com um STM32F103
Módulo sensor de tensão de canal duplo Arduino: 8 etapas
Módulo sensor de tensão de canal duplo Arduino: Já se passaram alguns anos desde que escrevi um instrutível, estava pensando que é hora de voltar. Tenho desejado construir um sensor de voltagem para poder conectá-lo à minha fonte de alimentação de bancada. Eu tenho uma fonte de alimentação variável de dois canais, tem n
Potenciômetro digital MCP41HVX1 para Arduino: 10 etapas (com imagens)
Potenciômetro digital MCP41HVX1 para Arduino: A família MCP41HVX1 de potenciômetros digitais (também conhecidos como DigiPots) são dispositivos que imitam a função de um potenciômetro analógico e são controlados por SPI. Um exemplo de aplicação seria substituir o botão de volume do seu aparelho de som por um DigiPot que é
Como fazer a interface do joystick de eixo duplo com o Arduino Uno: 5 etapas
Como fazer a interface do joystick de eixo duplo com o Arduino Uno: Aqui, faremos a interface de um joystick de eixo duplo com o arduino uno. Este joystick tem dois pinos analógicos para o eixo xey e um pino digital para a chave