Figura 01 - "Multi-Funcion Shield" |
- Um "Reset button" instalado para reinicializar o Arduino conectado.
- Três "Push buttons" botões de pressão definidos pelo usuário conectado nos pinos de entradas analógicas A1, A2, A3.
- Um "Potentiometer" para que você insira uma tensão variável no Arduino, conectado ao pino de entrada analógica A0.
- Um "Buzzer" que não é acionado diretamente de um pino do Arduino, mas controlado por um transistor conectado ao pino digital D3.
- Um "LED display" de 4 dígitos e 7 segmentos que é acionado por meio de registradores de deslocamento 74HC595 para selecionar o dígito e os segmentos desse dígito a serem energizados.
- Quatro LEDs montados na placa (pinos digitais D10, D11, D12, D13).
Definir os componentes e suas conexões para torná-lo mais fácil de programar
Um dos recursos convenientes de programação no Arduino é que você pode definir nomes para representar os pinos do Arduino. Conforme você programa, é fácil lembrar que BUZZER é o pino ao qual a campainha está conectada. Usaremos um nome para cada um dos recursos para que possamos tornar nosso código mais fácil de ler e escrever.
- Como exemplo: #define PotIn A0 // Potenciômetro da entrada analógica A0;
A próxima coisa que você geralmente deseja fazer é configurar o pinMode para cada um desses recursos. É uma boa prática garantir que os pinos sejam configurados de acordo com sua preferência. No procedimento setup (), você deve configurar o comando pinMode (): Iremos configurar os pinos dos LED's e Buzzer como saídas; definir os pinos do Display como saídas; configurar os botões como entradas e configurar o Potenciômetro como entrada. Por fim vamos configurar leitura do valor na porta serial. Como exemplo: pinMode (LED_1, OUTPUT);
Trabalhando com LEDs: Vamos começar ligando e desligando os LEDs. Os LEDs são conectados diretamente aos pinos do Arduino (por meio de resistores limitadores de corrente), portanto, ligá-los e desligá-los é tão fácil quanto escrever HIGH ou LOW no pino digital associado. Para ligar o LED, defina a saída digital para LOW. Para desligá-lo, defina-o como HIGH (como fizemos no procedimento setup ()). Como exemplo: digitalWrite (LED_1, HIGH);
Trabalhando com botões de pressão: Os botões de pressão são tão fáceis de trabalhar quanto os LEDs. Eles são conectados diretamente aos pinos de entrada. Os pinos são normalmente conectados por resistores pullup na placa. Esses resistores garantem que o pino pareça HIGH quando a chave estiver aberta. Sem eles, é possível que a saída neste pino "flutue" e possa causar um falso LOW no pino. Quando o botão é pressionado, ele conecta o pino ao aterramento e um LOW é visto no pino. Podemos ler facilmente o estado do botão de pressão solicitando a leitura do valor do pino: Como exemplo: int but1 = digitalRead (BUTTON_1);
Usando a campainha: A campainha (Buzzer) incluída com a placa é apenas uma campainha e não um gerador de tons. Quando você escreve HIGH ou LOW no pino, você desliga ou liga a campainha. Podemos usar o mesmo comando que usamos para testar o LED para testar a campainha ou inverter o estado lógico como mostrado abaixo. Este código pode ser colocado na função loop ():
- if (digitalRead (BUTTON_1) == LOW) // Se o botão for pressionado
- E_BUZZER = !E_BUZZER; // troca o estado do buzzer
- digitalWrite (BUZZER, E_BUZZER);
Usando o potenciômetro: Um potenciômetro é um tipo de resistor variável. Normalmente, uma tensão é aplicada ao elemento resistor e o ajuste através da haste seleciona uma tensão da tensão do menor valor para a tensão maior. O potenciômetro é conectado ao aterramento (0V) e à alimentação positiva (5V). Portanto, o valor que pode ser selecionado com o potenciômetro será todos os valores de 0 a 5 volts.
Vamos escrever um código rápido para usar o potenciômetro. Iremos acender os LEDs na placa com base no seguinte: LED 1: 0-1V , LED 2:> 1-2,5V, LED 3:> 2,5V-4V e LED 4:> 4-5V
A função analogRead () retorna um número inteiro no intervalo de 0 a 1023 com base na tensão de entrada. Isso significa que para nossa referência de 5 V, cada volt será igual a 204,8. Podemos usar isso para converter as tensões acima em números inteiros que podemos usar para comparar com o valor analógico. Coloque o seguinte código na função loop (), que irá comparar e indicar valores no LED correspondente:
- PotValue = analogRead (PotIn);
- digitalWrite (LED_1, LOW);
- if (PotValue < 100) {digitalWrite (LED_1, HIGH);}
- digitalWrite (LED_2, LOW);
- if (PotValue < 300) {digitalWrite (LED_2, HIGH);}
- digitalWrite (LED_3, LOW);
- if (PotValue < 600) {digitalWrite (LED_3, HIGH);}
- digitalWrite (LED_4, LOW);
- if (PotValue < 1000){digitalWrite (LED_4, HIGH);}
- if (PotValue > 1010){digitalWrite (BUZZER, LOW);}
Quando você executa este código, os LEDs acenderão com base na posição do potenciômetro. Note que é um potenciômetro multivoltas e dá cerca de 30 voltas para ir do mínimo ao máximo.
Figura 02- Medidor com alarme |
Vamos começar definindo uma matriz que converte o número de 0 a 9 nos segmentos corretos que precisam acender para fazer esse dígito aparecer. Essa matriz é a seguinte:
- const byte numMap [ ] = {0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XF8, 0X80, 0X90};
A outra coisa de que precisamos é um "arranjo" para decodificar o número do dígito que queremos exibir. Essa matriz é a seguinte:
- const byte digitMap [ ] = {0xF1, 0xF2, 0xF4, 0xF8};
Vamos escrever uma função para colocar um número em um dos 4 locais no visor. Vamos habilitar a exibição, mudar o número, mudar o dígito a ser exibido e, em seguida, desabilitar a exibição. Aqui está o código:
- void dispNum (int digitNum, int Value) {
- digitalWrite (DISP_LATCH, LOW);
- shiftOut (DISP_DATA, DISP_CLK, MSBFIRST, numMap [PotIn]);
- shiftOut (DISP_DATA, DISP_CLK, MSBFIRST, digitMap [digitNum]);
- digitalWrite (DISP_LATCH, HIGH);
Esta sub-rotina exibirá apenas um número com um único dígito. Precisamos usar código para escrever todo o display. Primeiro devemos separar os dígitos individualmente:
- int dig1 = PotValue / 1000;
- int dig2 = (PotValue - (1000 * dig1)) / 100;
- int dig3 = (PotValue - (100 * dig2)) / 10;
- int dig4 = (PotValue % 10) / 1;
- dispNum (0, dig1);
- dispNum (1, dig2);
- dispNum (2, dig3);
- dispNum (3, dig4);
Vamos programar um Medidor com alarme para mostrar como isso pode ser feito. No link está o esboço completo: 20_03_05_Medidor_com_alarme_SRG
Diagrama elétrico do Medidor com Alarme Shield Multi-funções Shield está disponível em: 21_03_15_Medidor_com_Alarme_Multi_Funtion_Shield.
Nenhum comentário:
Postar um comentário