Lendo Entradas Digitais – input() – GVensino – fome de saber!
Lendo Entradas Digitais – input()
Caro aluno, na vida nós, seres-humanos, precisamos receber informações do mundo exterior, do ambiente ao nosso redor. Que seria de nós sem o tato, sem a visão, sem a audição? Os nossos 5 sentidos (dizem que as mulheres tem 6) nos permitem detectar o que está acontecendo no ambiente ao nosso redor e, a partir disso, tomar decisões.
Mas espere, vamos com calma. Será que um microcontrolador precisa receber dados do mundo exterior a ele?
A resposta é um sonoro CLARO, SIM, COM CERTEZA, ÓBVIO, CERTAMENTE, POSITIVO, AFIRMATIVO!
Repare em uma coisa: praticamente qualquer sistema, por mais simples que ele seja, precisa receber alguma informação do mundo exterior.
– E como é que um sistema recebe a informação do mundo exterior, querido professor?
– É simples, caro e dileto aluno. Você consegue imaginar máquinas sem botões?
– Realmente, eu não consigo. Parece que todos os aparelhos ao nosso redor possuem botões.
– Exatamente, sagaz aluno, exatamente! Quase todos os sistemas automáticos ao nosso redor possuem botões. Os botões são uma forma que nós, seres-humanos, usamos pra se comunicar com as máquinas! Através dos botões, nós podemos informar à máquina qual é o nosso desejo, informar a ela o que é que nós queremos!
– Puxa, nunca tinha pensado por este lado, excelentíssimo professor.
– Calma, não sou presidente de nenhum país pra ser chamado de excelentíssimo. Mas no fundo, é isso o que os botões fazem. Se você quer ligar alguma coisa, como é que você faz pra dizer isso pra máquina? Você aperta um botão!
– E os botões são a única forma que as máquinas usam pra receber informação do mundo exterior, magnânimo professor?
– Não, espetacular aluno, não! Além dos botões, existem os SENSORES! Os sensores são dispositivos que "sentem" alguma característica do ambiente, como temperatura, pressão, luminosidade, presença ou não de certos objetos, etc., e informa isso para o controlador do sistema!
– Wow! Entendi! E como é que a gente faz pro microcontrolador LER o sinal de um botão ou de um sensor?
– É isso o que vamos começar a aprender na aula de hoje, caro aluno. Aperte o cinto e simbora!
Entradas Digitais x Analógicas
Entradas digitais ou discretas são aquelas que só recebem 2 valores: 0 ou 1, desligado ou ligado, acionado ou desacionado. Um botão é um exemplo clássico de entrada digital: quantos estados um botão pode ter? Apenas dois: pressionado ou solto. 1 ou 0. Um botão nunca pode estar "meio pressionado". Isso não existe!
Um outro exemplo de entrada digital seria um sensor de presença, que detecte a presença de alguma coisa. Ou essa "coisa" está presente, ou não está! Não existe "a coisa está meio presente". Ou está, ou não está! 1 ou 0. Digital!
Já as entradas Analógicas podem receber muito mais do que 2 valores. Elas podem receber muitos valores diferentes. Por exemplo, um sensor que mede temperatura. Existem só 2 temperaturas possíveis? Não! Existem infinitas temperaturas possíveis. Logo, um sensor desses teria de ser ligado a uma Entrada Analógica!
O único detalhe aqui é que há certos tipos de dispositivos que medem a temperatura e a transformam em um sinal digital. Os termostatos, por exemplo. Eles funcionam emitindo um sinal sempre que a temperatura for MAIOR que determinado valor. Dessa forma, seu funcionamento é digital: ou a temperatura é menor que o valor ajustado, ou é maior. Nesse caso, ele pode sim ser digital.
Digital/Discreto: 1 ou 0. Ligado ou desligado. 2 estados apenas.
Analógico: Vários (possivelmente infinitos) estados possíveis.
Na aula de hoje, nosso foco será nas Entradas Digitais!
Lendo Entradas Digitais
Liguemos um botão a um pino do microcontrolador:
Na imagem acima, ligamos o botão no pino RA0 do PIC. Este pino, agora, é uma ENTRADA, pois sempre que ligamos um botão ou um sensor a um pino, esse pino passa a RECEBER sinal vindo de fora, a informação ENTRA no pino.
E pra que serve o resistor? Esse resistor é chamado de Resistor de Pull-Down. Serve para que o pino do PIC não fique flutuando quando o botão estiver solto.
Sem o resistor de pull-down, quando o botão estiver solto, o microcontrolador não estará recebendo sinal nenhum (estará flutuando). E isso é indesejável, pois ele poderá ler qualquer valor (0 ou 1) aleatoriamente.
O valor desse resistor não é fixo: pode ser desde um valor baixo, como 100Ω, até valores mais elevados, como 1kΩ. Padronizamos 220Ω porque é o mesmo valor que temos usado para os LEDs – embora os LEDs sejam SAÍDA e não entrada.
OK, já sabemos agora que o botão, quando solto, vai fazer com que o pino receba 0. Quando pressionado, vai fazer com que o pino receba 1.
Qual é o comando que utilizamos para LER uma entrada digital?
É o comando input( <<pino>> ).
O que é natural, certo? P/ saídas, usamos os comandos output_high() e output_low(). Output significa saída em inglês.
Para ler entradas, usamos um comando só: input() (que em inglês, significa entrada).
Seu uso é muito, muito simples!
Imagine que inserimos um botão no pino RA0 do microcontrolador. O que é que o comando input(pin_a0) faz?
Esse comando não faz NADA! Ele não realiza nenhuma ação. Ele apenas irá LER o estado da entrada do pino RA0 e DAR PRA MIM UM VALOR: esse pino está em 0 (zero) ou em 1 (um)?
Ou seja, o comando input( <<pino>> ) me dá um valor, que pode ser apenas 0 (caso botão esteja solto) ou valor 1 (caso esteja pressionado, com nível lógico alto).
Ok, diria o atento aluno. Mas como eu UTILIZO esse valor? Eu preciso saber SE este valor é 0 ou 1 para fazer alguma coisa. Como eu faço pra saber SE o valor é 0 ou 1 e fazer alguma coisa com essa informação? Ai entra mais um comando muito importante….. o IF.
IF em inglês é uma palavra que significa SE. Na vida, temos muitos SEs:
SE o céu estiver escuro, levarei o guarda-chuvas.
SE o Corinthians for campeão brasileiro, farei um churrasco.
SE eu entender esta matéria, serei um grande programador.
Em inglês, utilizamos a palavra IF (SE).
O IF (SE) tem a seguinte estrutura:
if ( <<condição>> ) { //comando 1 //comando 2 }
if ( <<condição>> ) {
//comando 1
//comando 2
Repare bem: dentro dos parêntesis, colocamos uma CONDIÇÃO.
Dentro das chaves, colocamos as ações que serão feitas SE a condição acontecer, isto é, se a condição for verdadeira.
if ( Corinthians==Campeão ){ ConvidarAmigos(); FazerChurrasco(); }
if ( Corinthians==Campeão ){
ConvidarAmigos();
FazerChurrasco();
No exemplo acima, SE o Corinthians for campeão, que ações serão tomadas? Duas: Convidar os amigos e então Fazer um Churrasco.
Veja que, tudo o que for colocado dentro das chaves { e } só será executado SE a condição for verdadeira! Caso a condição seja falsa (o Corinthians não for campeão), então não haverá convite aos amigos e nem churrasco!
Para saber SE um botão foi pressionado ou não, devemos combinar o uso do comando IF com o do comando input.
IF e Input()
Combinamos o uso do comando input com as estruturas de decisão (if) para saber SE a entrada está em 0 ou em 1. Simples assim.
if ( input(pin_a0) ==1 ){ output_high(pin_a1); }
if ( input(pin_a0) ==1 ){
No exemplo acima, Se a Entrada do Pino RA0 estiver recebendo 1 (nível lógico alto), a saída RA1 irá ligar.
Repare que no exemplo acima, em nenhum momento a saída RA1 será DESLIGADA.
Ou seja: Se apertarmos o botão ligado em RA0, a saída RA1 irá ligar. Mas ela nunca irá desligar, pois em nenhum momento foi usado output_low nela!
E se quisermos que, ao soltar o botão de RA0, a saída RA1 desligue?
Há duas formas de se fazer isso. Vejamos cada uma delas. A primeira forma é acrescentar um outro if. Já temos um if (se) para avaliar SE o botão estiver pressionado, ligue o pino RA1. Poderíamos, então, criar outro if (se) para avaliar SE o botão estiver solto (==0), então DESLIGUE RA1. Ficaria assim:
while(1){ if ( input(pin_a0) ==1 ){ output_high(pin_a1); } if ( input(pin_a0) ==0 ){ output_low(pin_a1); } }
if ( input(pin_a0) ==0 ){
Primeiramente, o programa irá avaliar SE a ENTRADA RA0 é igual a 1 (nível alto). Se for, liga a saída RA1. Em seguida, independentemente se ligou ou não RA1, ele irá avaliar SE a ENTRADA RA0 é igual a 0 (nível lógico baixo). Se for, irá desligar o pino RA1. Como o programa está em loop infinito, ele voltará ao primeiro if e avaliará SE a entrada RA0 está acionada.
Outra forma de fazer a mesma coisa, porém de maneira mais simples, é usando o ELSE.
Else é uma palavra que em inglês significa "Senão", "Caso Contrário".
Usamos no nosso dia-a-dia essa expressão juntamente com a SE. Veja:
SE estiver chovendo, irei de carro. SENÃO, irei a pé.
SE o Corinthians for campeão, farei um Churrasco. SENÃO, irei ao cinema.
Veja que o SENÃO (else) DEPENDE do SE (if).
Não faz sentido o SENÃO se antes dele não tiver o SE. Se eu falar a frase: SENÃO, vou pra praia. Ela tem sentido? SENÃO o quê? Primeiro há um SE, depois um SENÃO.
Sintaxe do IF..ELSE:
if ( <condição> ) { //comandos }else{ //comandos }
if ( <condição> ) {
Utilizaremos o ELSE sempre que quisermos que o programa faça alguma coisa quando a condição do if não acontecer.
Agora ficou fácil fazer o que tinhamos feito acima: se o botão estiver pressionado, liga a saída RA1; SENÃO, desliga RA1. Veja: