segunda-feira, 13 de agosto de 2018

Leitura de um número por entrada digital


Quando lemos entradas digitais lemos apenas bits. 
Para lermos números é necessário combinar os bits lidos de forma compor um número.

Lembrando a composição de um número binário



Abaixo uma função que faz a leitura de 4 bits 

  

#define bt_in0 8
#define bt_in1 9
#define bt_in2 10
#define bt_in3 11



byte le_byte (void){
  byte b0, b1, b2, b3;
  byte numero;
  b0 = digitalRead (bt_in0);
  b1 = digitalRead (bt_in1);
  b2 = digitalRead (bt_in2);
  b3 = digitalRead (bt_in3);
  numero = b3*8 + b2*4 + b1*2 + b0;
  return numero;
}
    
  

Entendendo a função

byte le_byte (void)


  • byte -  no início da declaração da função prevê que ao final da função ela retornará um valor do tipo byte
  • le_byte - nome escolhido para a função
  • void - prevê a que a função não recebe nenhum parâmetro

===============================

byte b0, b1, b2, b3;

byte numero;


  • Declara variáveis do tipo byte

===============================

  b0 = digitalRead (bt_in0);
  b1 = digitalRead (bt_in1);
  b2 = digitalRead (bt_in2);

  b3 = digitalRead (bt_in3);


  • Lê o valor digital em cada pino e armazena em uma variável

===============================

numero = b3*8 + b2*4 + b1*2 + b0;


  • Calula o número compondo o valor binário

===============================

return numero;


  • Devolve o numero lido lido nos pinos digitais
  

Usando a função

byte contador=0;              // cria uma variável do tipo byte (0 a 255) e inicilaiza com valor 0

contador = le_byte();
  
  

Atividades

1 - Crie um skecth para ler 4 bits e mostrar o numero lido em 4 leds. 


Dica: Para mostrar o número lido utilze a função "escreve_byte" utilizada na atividade contador binário

2 - Crie um novo skecth utilizando o anterior para:
ler um número com 6 bits
mostrar os 6 bits lidos em leds

3 - Crie um novo skecth para:
  • Ler um numero de 8 bits
  • Possuir 4 leds para indicar que
    • O número é igual a 100
    • O número é menor que 50
    • O número está entre  25 e 125
    • O número é maior que 200
  


  

/*
 * Leitura de um número por entrada digital
 * Atividade 1
 * 
 * Adicional -> Inclusão do módulo LCD I2C
 */

//Inclusão de bibliotecas 
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);  // Criando um LCD de 16x2 no endereço 0x27


//apelidos para as saídas
#define led0 0
#define led1 1
#define led2 2
#define led3 3
//apelido para as entradas
#define entrada0 8
#define entrada1 9
#define entrada2 10
#define entrada3 11

//variavel para trabalhar
int valor;

// função para transformar um número em saídas em formato binário
void escreve_byte (byte x){
  if ( x & 0b00000001) digitalWrite(led0, HIGH); else digitalWrite (led0, LOW);
  if ( x & 0b00000010) digitalWrite(led1, HIGH); else digitalWrite (led1, LOW);
  if ( x & 0b00000100) digitalWrite(led2, HIGH); else digitalWrite (led2, LOW);
  if ( x & 0b00001000) digitalWrite(led3, HIGH); else digitalWrite (led3, LOW);
}

// função para transformar entradas binárias em um valor numérico
byte le_byte (void){
  byte b0, b1, b2, b3;
  byte numero;
  b0 = digitalRead (entrada0);
  b1 = digitalRead (entrada1);
  b2 = digitalRead (entrada2);
  b3 = digitalRead (entrada3);
  numero = b3*8 + b2*4 + b1*2 + b0;
  return numero;
}

void setup() {
  // configurações de entradas e saídas digitais
  pinMode (led0, OUTPUT);
  pinMode (led1, OUTPUT);
  pinMode (led2, OUTPUT);
  pinMode (led3, OUTPUT);
  pinMode (entrada0, INPUT_PULLUP);
  pinMode (entrada1, INPUT_PULLUP);
  pinMode (entrada2, INPUT_PULLUP);
  pinMode (entrada3, INPUT_PULLUP);
  // comandos do lcd
  lcd.init();                 // Inicializando o LCD
  lcd.backlight();            // Ligando o BackLight do LCD
}

void loop() {
  // put your main code here, to run repeatedly:
  valor = le_byte();
  escreve_byte(valor);

  // imprime o numero em binário
  lcd.setCursor (0,0);
  lcd.print("Bin=");
  lcd.print(valor,BIN);
  lcd.print("       "); 
  //imprime o numero em Hexadecimal
  lcd.setCursor (0,1);
  lcd.print("Hex=");
  lcd.print(valor,HEX);
  lcd.print(" ");
  // imprime o numero em decimal
  lcd.setCursor (8,1);
  lcd.print("Dec=");
  lcd.print(valor,DEC);
  lcd.print("  ");
}



Nenhum comentário:

Postar um comentário