Neste projeto, criaremos uma biblioteca Arduino de porta IO de 8 bits que lê e grava todos os oito bits em um único comando combinando os pinos do Arduino. Isso significa que enviar e receber dados de 8 bits de um único pino será possível.
O Arduino fornece saída digital usando a função digitalWrite e recebe entrada digital por meio da função digitalRead . Ao usar essas duas funções, o Arduino pode fornecer saída ou entrada de qualquer pino único. No entanto, o Arduino normalmente fornece apenas entrada ou saída de um pino por vez.
Portanto, para fazer a interface do Arduino com um dispositivo IO de 8 bits – como um display de 7 segmentos, chaves DIP ou DAC (conversor digital para analógico), geralmente são necessários oito pinos diferentes. O padrão de bytes de dados (8 bits) é enviado para pinos diferentes como '1s' e '0s'. Por exemplo, se um byte de dados for 37h (0011 0111), é necessário enviar o padrão '0' e '1' para oito pinos diferentes usando a função digitalWrite .
Para resolver esta situação, criamos uma biblioteca de portas IO (porta de entrada-saída) de 8 bits que combina os pinos do Arduino. Funciona como uma porta IO de 8 bits para Arduino e configura a direção dos dados como entrada ou saída. A direção dos dados é definida pelo caractere 'O' para a saída e 'I' para a entrada.
Esta biblioteca possui cinco funções. Dois “construtores” criam o(s) objeto(s) de porta, incluindo uma função que envia a saída digital de 8 bits para os pinos da porta e outra que recebe a entrada digital de 8 bits dos pinos da porta. Uma terceira função altera e define a direção de E/S da porta. Todas as cinco funções são explicadas a seguir.
As cinco funções
1. IO_Port_8bit(int pino1,int pino2,int pino3,int pino4,int pino5,int pino6,int pino7,int pino8,char diretório)
Este construtor cria objeto(s) desta classe. Ele pode criar uma ou várias portas de 8 bits combinando pinos específicos do Arduino. É importante especificar quais oito pinos do Arduino combinar, juntamente com a direção dos dados de cada porta (entrada ou saída). O último argumento, dir, define se uma porta funciona como entrada ou saída.
- Se dir='O' = a porta funciona como saída
- Se dir='I' = a porta funciona como entrada
A mesma porta não pode funcionar como entrada e saída simultaneamente ou alternativamente. A direção da porta deve ser selecionada ou resultará em erro.
2. IO_Port_8bit(int pin1,int pin2,int pin3,int pin4,int pin5,int pin6,int pin7,int pin8)
Este é outro construtor, que cria objeto(s) desta classe. Ele pode criar uma ou várias portas de 8 bits combinando pinos específicos do Arduino. É importante especificar quais oito pinos do Arduino combinar para cada porta. No entanto, incluir a direção dos dados como entrada ou saída é desnecessário.
Em vez disso, após criar um objeto de porta usando este construtor, defina a direção da porta usando a função set_IO_direction. Este construtor permite que o programador altere a direção dos dados da porta em tempo de execução. Então, uma porta pode funcionar como entrada ou saída alternativamente (mas não simultaneamente).
3. set_IO_direction(char diretório)
Esta função especifica a direção de entrada e saída de uma porta. Ela tem um argumento de caractere, que é 'I' para uma porta que é entrada e 'O' para uma porta que é saída. Um erro será exibido no monitor serial do Arduino se a direção dos dados não for selecionada.
4. enviar_dados_de_8_bits(int byt)
Esta função envia dados de 8 bits para pinos especificados. Ele fornece os dados 'int' (deve ser <255) como argumento, que é enviado diretamente para oito pinos diferentes. Se os dados forem >255, um erro será exibido no monitor serial do Arduino.
5. get_8bit_data(vazio)
Esta função recebe dados de 8 bits de pinos especificados. Ele retorna os dados 'int' de 8 bits lendo o status dos oito pinos diferentes.
Exemplo 1: Pisque oito LEDs alternadamente a uma taxa de 1 Hz
#incluir
IO_Port_8bit minhaport(2,3,4,5,6,7,8,9,'O'); //cria porta de saída
void setup // nada é necessário na configuração
{
}
loop vazio
{
myport.send_8bit_data(85); // envia dados para piscar todos os LEDs ímpares
atraso(500);
minhaporta.send_8bit_data(170); envia dados para piscar todos os LEDs pares
atraso(500);
}
Diagrama de circuito
Exemplo 2: Exiba um padrão de contagem binária nos LEDs, de 0 a F
#incluir
IO_Port_8bit my8bitport(2,3,4,5,6,7,8,9);//criar objeto de porta
configuração nula
{
my8bitport.set_IO_direction('O');// define a direção da porta
}
loop vazio
{
int eu;
for(i=0;i<16;i++) //envia dados de 0 a 15 para exibição
{ // padrão binário
minhaporta.send_8bit_data(i);
atraso(200);
}
}
Exemplo 3: Indicar o nível de tensão de entrada analógica em um display gráfico de barras LED de 8 bits
#incluir
IO_Port_8bit minhaport(2,3,4,5,6,7,8,9,'O'); //cria objeto de porta de saída
configuração nula
{
minhaporta.send_8bit_data(255); //pisca todos os LEDs do gráfico de barras uma vez
atraso(500);
minhaporta.send_8bit_data(0);
}
loop vazio
{
nível int;
level = analogRead(A0); //ler tensão de entrada analógica
level = map(level,0,1023,0,80);// limita a voltagem de 0 a 80
//aumenta ou diminui o nível do gráfico de barras conforme a entrada
if((nível<80) && (nível>70)) myport.send_8bit_data(255);
senão se((nível<=70) && (nível>60)) myport.send_8bit_data(127);
senão if((nível<=60) && (nível>50)) myport.send_8bit_data(63);
senão if((nível<=50) && (nível>40)) myport.send_8bit_data(31);
senão if((nível<=40) && (nível>30)) myport.send_8bit_data(15);
senão if((nível<=30) && (nível>20)) myport.send_8bit_data(7);
senão if((nível<=20) && (nível>10))myport.send_8bit_data(3);
senão if((nível<=10) && (nível>0)) myport.send_8bit_data(1);
senão if(level==0) myport.send_8bit_data(0);
}
Diagrama de circuito
Exemplo 4: Receba uma entrada digital de 8 bits de interruptores DIP e exiba o valor no monitor serial
#incluir
IO_Port_8bit minhaport(2,3,4,5,6,7,8,9); //cria objeto porta
configuração nula
{
Serial.begin(9600); // inicializa comunicação serial.
myport.set_IO_direction('I'); // define a direção da porta
Serial.println(“teste de porta de entrada de 8 bits”);
}
loop vazio
{
int entrada_byt;
input_byt = myport.get_8bit_data ; // leia o status do interruptor DIP
Serial.print(“entrada recebida = “); // e
Serial.println(input_byt); //mostra seu valor
atraso(1000);
}
Diagrama de circuito