quinta-feira, 11 de fevereiro de 2021

EX21 - Programação Arduino com "Multi-Funcion Shield": Medidor com alarme

Figura 01 - "Multi-Funcion Shield" 

    Esta postagem tem o objetivo de controlar a "Multi-Funcion Shield"  sem o uso de uma biblioteca Arduino. Se você está elaborando projetos simples que exigem interruptores, leds e uma campainha, talvez não precise de tudo isso, então este guia não tem como objetivo substituir o uso da biblioteca, mas fornecer ao usuário uma maneira de acessar facilmente os recursos da placa  "Multi-Funcion Shield".  Primeiro, vamos examinar os componentes instalados:

  • 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;

    Se você inserir essas instruções #define no início de seu código Arduino, agora será capaz de se referir aos recursos por seus nomes "PotIn" em vez de seus número do pino 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);

    Isso conclui nossa configuração para usar a placa. Agora, vamos ver como codificar os recursos.

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

Usando display LED de 7 segmentos e 4 dígitos: Os dígitos no display LED não são controlados por um decodificador. Isso permitiria que você apenas escrevesse os números no decodificador e ele exibisse o número no LED de 7 segmentos. Em vez disso, a placa vem com um registrador de deslocamento para alternar em um conjunto de uns e zeros e uma "trava" para transferir esses dados para o visor. Isso tem algumas implicações. Primeiro, estamos trocando uns e zeros que não representam os números, mas são a instrução de qual segmento acender para criar o número desejado. Em segundo lugar, o registrador de deslocamento só pode conter os dados de 1 dos dígitos de cada vez. Iremos desenvolver o código para colocar um número específico em um dígito específico, mas precisaremos contar com um software para escrever todo o display repetidamente, um dígito por vez.

    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;
    Depois exibir os dígitos no display de sete seguimentos
  • 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