Mudanças entre as edições de "MCO018703 2021 2 AULA06"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
(Criou página com '=Funções para Controle de Fluxo - Repetição= ;Objetivo: *Aprender sobre o comando de repetição ''while'' controlado por condição; *Saber usar o comando ''while'' e '...')
 
 
(2 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
=Funções para Controle de Fluxo - Repetição=
+
=Mapa das Entradas e Saídas do Arduino=
  
 
;Objetivo:
 
;Objetivo:
  
*Aprender sobre o comando de repetição ''while'' controlado por condição;
+
* Apresentar o mapa das entradas e saídas do Arduino;
*Saber usar o comando ''while'' e ''do while''.
+
* Saber utilizar as funções na linguagem do Arduino.
  
  
==while( )==
 
  
Uma das operações mais frequentes que os programas executam é repetir um grupo de instruções até que uma condição inicialmente verdadeira se torne falsa. É para isso que serve o comando '''while'''. A sua sintaxe é a seguinte:
 
  
<syntaxhighlight lang=c>
+
[[imagem:Fig041_MCO018703.jpg|600px|center]]
while (expressão) {
+
<center>
   bloco de instruções;   
+
Figura 1 - Mapa das Entradas e Saídas do Arduino.
}
+
</center>
</syntaxhighlight>
+
 
 +
;Pinos Digitais: São usados  para  detecção ou  transmissão  de controles digitais. 
 +
 
 +
:Funções em C:
 +
::pinMode( )
 +
::digitalRead( )
 +
::digitalWrite( )
 +
::analogWrite( )
 +
::attachInterrupt( )
 +
::pulseIn( )
 +
 
 +
 
 +
;Pinos analógicos: São usados para leitura de sinais de sensores análogicos.
 +
    
 +
:Funções em C:
 +
::analogRead( )
 +
 
 +
 
 +
;Porta USB: É usada  para  comunicação  serial  com um computador.
 +
 +
:Funções em C:
 +
::begin( )
 +
::end( )
 +
::available( )
 +
::read( )
 +
::print( )
 +
::println( )
 +
 
 +
;Pinos de Alimentação: São usados para alimentação de circuitos externos e ''reset'' do Arduino.
 +
 
 +
==Portas de E/S do Arduino e suas Funções==
 +
 
 +
;Pinos Digitais
  
O bloco de instruções será executado enquanto o parâmetro expressão for verdadeiro. A Figura 1 mostra o comando '''while''' e '''do while'''.
+
São 14 pinos marcados com o nome DIGITAL logo abaixo de duas barras de 8 pinos. São numerados de 0 a 13 da direita para a esquerda e podem ser configurados pela função
 +
'''pinMode( )''' para detetarem ou transmitirem níveis lógicos digitais (verdadeiro/falso, 1/0 ou HIGH/LOW). A Figura 2 mostra o mapa de pinos Digitais do Arduino.
  
[[imagem:Fig039_MCO018703.jpg|600px|center]]
+
[[imagem:Fig042_MCO018703.jpg|600px|center]]
 
<center>
 
<center>
Figura 1 - Controle de Fluxo com os comandos '''while''' e '''do while'''.
+
Figura 2 - Mapa dos Pinos Digitais do Arduino.
 
</center>
 
</center>
  
;Exemplo 1
 
  
O exemplo abaixo mostra como o comando ''while'' permite implementar loops com controle no início.
+
{| class="wikitable"
 +
! style="background:#A0522D; color:white; font-weight:bold;" | Função
 +
! style="background:#A0522D; color:white; font-weight:bold;" | Exemplo
 +
! style="background:#A0522D; color:white;font-weight:bold;" | Notas
 +
|-
 +
| '''pinMode(pino,modo)'''
 +
Serve para estabelecer a direção do
 +
fluxo de informações em qualquer dos 14
 +
pinos digitais. Dois parâmetros devem
 +
ser passados à função: o primeiro indica
 +
qual pino vai ser usado; o segundo, se
 +
esse pino vai ser entrada ou se vai ser
 +
saída dessas informações.
 +
| '''pinMode(2,OUTPUT);'''
 +
Aqui o pino 2 é selecionado para
 +
transmitir informações do Arduino
 +
para um circuito externo qualquer. 
 +
Para configurar esse pino como
 +
entrada, o segundo parâmetro dessa
 +
função deve ser INPUT.
 +
| Essa função é sempre
 +
escrita dentro da
 +
função
 +
setup( ).
 +
|-
 +
|'''digitalRead(pino) '''
 +
Uma vez configurado um certo pino
 +
como entrada com a função
 +
pinMode( ), a informação presente
 +
nesse pino pode ser lida com a função
 +
digitalRead( )  e armazenada
 +
numa variável qualquer.
 +
| '''int chave = digitalRead(3);'''
 +
Nesse exemplo a variável inteira
 +
‘chave’ vai guardar o estado lógico
 +
(verdadeiro/falso) presente no
 +
pino digital 3.
 +
|
 +
|-
 +
| '''digitalWrite(pino,valor) '''
 +
Para enviar um nível lógico para qualquer
 +
pino digital do Arduino utiliza-se essa
 +
função. Dois parâmetros são requeri
 +
dos: o número do pino e o estado lógico
 +
(HIGH/LOW ) em que esse pino deve
 +
permanecer.
 +
| '''digitalWrite(2,HIGH);'''
 +
Aqui uma tensão de 5 volts é colo
 +
cada no pino 2. Para enviar terra
 +
para esse pino o segundo parâmetro
 +
deverá ser LOW.
 +
| É necessário configurar previamente o
 +
pino como saída com a função
 +
pinMode( ).
 +
|-
 +
| '''analogWrite(pino,valor)'''
 +
O Arduino pode gerar tensões analógicas
 +
em 6 de seus 14 pinos digitais com a função
 +
'''analogWrite( )'''. Dois parâmetros devem
 +
ser passados à função: o primeiro indica em
 +
qual pino será gerada a tensão; o segundo
 +
determina a amplitude dessa tensão, e
 +
deve ter valores entre 0 (para 0 volt) e
 +
255 (para 5 volts).
 +
| '''analogWrite(10,128);'''
 +
Com esses parâmetros uma
 +
tensão analógica de 2,5 volts
 +
vai aparecer no pino 10. Não é
 +
necessário configurar um pino
 +
PWM como saída com a função
 +
'''pinMode( )'''  quando se chama
 +
função '''analogWrite( )'''.
 +
| Modulação por Largura de Pulsos, ou
 +
PWM (Pulse Width Modulation) na
 +
língua inglesa,  é uma técnica usada
 +
para gerar tensões analógicas a partir
 +
de uma sequência de pulsos digitais.
 +
|-
 +
| '''attachInterrupt(pino,função,modo)'''
 +
Essa função é uma rotina de serviço de
 +
interrupção, ou ISR (Interrupt Service
 +
Routine) em inglês. Toda vez que ocorrer
 +
uma interrupção por hardware no pino digi
 +
tal 2 ou no 3 do Arduino uma outra função,
 +
criada pelo programador, vai ser chamada.
 +
O terceiro parâmetro, modo, informa
 +
como a interrupção vai ser disparada, se
 +
na borda de subida do pulso detetado no
 +
pino do Arduino, se na borda de descida, se
 +
quando o pulso for baixo ou se na mudança
 +
de nível desse pulso.
 +
| '''attachInterrupt(0,contador,RISING);'''
 +
Nesse exemplo a função
 +
‘contador’ vai ser chamada
 +
quando o Arduino detetar uma
 +
mudança do nível LOW para
 +
o nível HIGH em seu pino 2.
 +
Nessa ISR o parâmetro 0
 +
monitora o pino 2, o parâmetro 1
 +
monitora o pino 3.
 +
| LOW - dispara a interrupção quando
 +
o pino está em 0;
 +
CHANGE - dispara sempre que o
 +
pino muda de estado (de 0 para 1,
 +
ou vice-versa);
 +
RISING - somente quando o pino
 +
muda de 0 para 1;
 +
FALLING - somente quando o pino
 +
muda de 1 para 0.
 +
|-
 +
| '''pulseIn(pino,valor,espera)'''
 +
Essa função mede a largura em microssegundos
 +
de um pulso em qualquer pino digital.
 +
O parâmetro ‘valor’ diz à função que
 +
tipo de pulso deve ser medido, se HIGH
 +
ou LOW. O parâmetro ‘espera’ (time out) é
 +
opcional e se passado à função faz com que
 +
a medida do pulso só comece após o tempo
 +
em microssegundos ali especificado.
 +
| '''pulseIn(4,HIGH);'''
 +
Aqui essa função vai monitorar
 +
o pino 4, e quando o nível
 +
nesse pino mudar de LOW
 +
para HIGH a sua largura vai
 +
ser medida até que seu nível
 +
volte para LOW. Se, por
 +
exemplo, for passado o valor 100
 +
como terceiro parâmetro, a
 +
medida da largura do pulso só
 +
será disparada após 100 uS.
 +
| Uma aplicação interessante para
 +
essas duas últimas funções seria
 +
o de montar um contador de dois dígitos
 +
com mostradores de 7-segmentos.
 +
|}
 +
 
 +
;Exemplo
 +
 
 +
 
 +
No programa abaixo essas três funções: pinMode(), digitalRead() e digitalWrite() são utilizadas para acender um LED no pino 2 toda vez que
 +
uma chave normalmente aberta no pino 3 for pressionada.
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
int contador;
+
void setup()  
void setup( )  
 
 
{
 
{
  Serial.begin(9600); // inicializa a porta serial
+
    pinMode(11,OUTPUT);
 +
    // led no pino 11 como saída
 +
    pinMode(5,INPUT);  // Pode-se definir um resistor interno de pull-up com INPUT_PULLUP 
 +
    // chave no pino 5 como entrada
 
}
 
}
void loop( )  
+
void loop()  
 
{
 
{
  contador=0;
+
    int chave = digitalRead(5);  
  while (contador<5) { 
+
    // variável ‘chave’ guarda estado do pino 5
    Serial.print("valor do contador: "); // imprime o texto entre ""
+
    if (chave==HIGH)
    Serial.println(contador); // imprime o valor do contador
+
      digitalWrite(11,LOW);  
    contador=contador+1;
+
    else
    delay(500);
+
      digitalWrite(11,HIGH);  
  }
+
    // estado de ‘chave’ é passado para pino 11
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
==do...while==
+
A Figura 3 mostra como ficaria as ligações para acender o LED toda vez que a chave for pressionada.
 +
 
 +
[[imagem:Fig043_MCO018703.jpg|400px|center]]
 +
<center>
 +
Figura 3 - Fios vermelhos são 5V, fios pretos GND e fios verdes conexões com os Pinos de E/S.
 +
</center>
 +
 
 +
O botão ''push-button'' também é chamado micro ''switch''. A Figura 4 ilustra o seu funcionamento.
 +
 
 +
[[imagem:Fig013_MCO18703.png|500px|center]]
 +
<center>
 +
Figura 4 - ''Push-button'' de pólo simples com 2 ou 4 pinos de contato.
 +
</center>
 +
 
 +
LED, ou ''Light Emitter Diode'' é um diodo emissor de luz que, quando alimentado corretamente, permite o fluxo de energia apenas em um sentido. É um componente polarizado (com pólos positivo e negativo) e deve ser corretamente conectado para funcionar. Note que o polo positivo possui uma perna maior (terminal maior) que a outra (veja a figura abaixo). Já o polo negativo possui a menor perna (terminal menor).  
 +
 
 +
[[imagem:Fig004_MCO18703.jpg|500px|center]]
 +
<center>
 +
Figura 5 - ''Diodo emissor de luz.
 +
</center>
 +
 
 +
<blockquote style="background: #E0FFFF; border: 2px solid #6A5ACD; margin-left: 0px; margin-right: 0px; padding: 1em;">
 +
Nota: Alguns LED's apresentam o polo negativo chanfrado (plano) no seu exterior.
 +
</blockquote>
  
Para que o bloco de instruções seja executado ao menos uma vez, ele é  deslocado para a entrada da caixa de decisões, antes do teste de validade:
+
==Enviando estado de chave para Monitor Serial==
  
<syntaxhighlight lang=c>
+
;EXEMPLO 3:
do {
+
 
  bloco de instruções;                               
+
Neste teste, o estado de uma chave externa será lido e enviado pro Monitor Serial.
}
 
while (expressão);
 
</syntaxhighlight>
 
  
Aqui o "bloco de instruções" será executado primeiro e só então o parâmetro "expressão" é avaliado. Veja na Figura 1.
+
;Esquemático:
  
  
;Exemplo 2
+
[[imagem:Fig022_MCO18703.png|500px|center]]
  
Nesta variação do comando '''do while''' permite a repetição de uma ou mais instruções, com controle do loop no final.
+
;Código fonte:
Isto permite que o bloco seja executado pelo menos uma vez.
 
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
int contador;
+
int pushButton=2;
void setup( )  
+
 
 +
void setup()
 
{
 
{
   Serial.begin(9600); // inicializa a porta serial
+
   Serial.begin(9600);
 +
  pinMode(pushButton, INPUT);
 
}
 
}
void loop( )  
+
 
 +
void loop()  
 
{
 
{
  contador=0;
+
  int buttonState=digitalRead(pushButton);
  do { 
+
 
    Serial.print("valor do contador: "); // imprime o texto entre ""
+
  Serial.println(buttonState);
    Serial.println(contador); // imprime o valor do contador
+
  delay(1);
    contador=contador+1;
 
    delay(500);
 
  } while (contador<5);
 
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
==for==
+
;No protoshield do laboratório:
 +
 
 +
[[imagem:Fig023_MCO18703.jpg|400px|center]]
  
Inserindo-se no loop do comando '''while''' um contador que registre cada execução do bloco de instruções cria-se o comando for. Esse contador deve ter uma variável de controle que deve ser previamente inicializada com um tipo e um valor. A sua sintaxe é a seguinte:
+
;Quando pressiona a chave, efeito no Monitor Serial:
  
<syntaxhighlight lang=c>
+
[[imagem:Fig024_MCO18703.png|500px|center]]
for (variável;expressão;incremento) {
 
  bloco de instruções;
 
}
 
</syntaxhighlight>
 
  
A '''variável''' é inicializada normalmente com 0 ou 1; o parâmetro '''expressão''' deve conter o valor máximo
 
(ou mínimo) que o contador deve alcançar; e '''incremento''' é o valor que será incrementado (ou decrementado) da variável cada vez que o bloco de instruções é executado. Observe que cada parâmetro entre parênteses é separado por ponto e vírgula.
 
  
[[imagem:Fig040_MCO018703.jpg|300px|center]]
 
<center>
 
Figura 2 - Controle de Fluxo com o comando '''for'''.
 
</center>
 
  
;Exemplo 3
+
==Pushbutton como interruptor liga/desliga==
  
No código abaixo a variável de controle '''i''' do contador criada e inicializada com 0; o contador é testado e se o valor nele acumulado for menor que 10 seu valor é enviado para o Terminal, e depois de 1 segundo, o contador é incrementado e seu novo valor é testado novamente.
+
Criar um circuito para atribuir duas funções em um único botão (pushbutton). O botão servirá como um interruptor para ligar e desligar um componente eletrônico. Neste exemplo vamos ligar e desligar um led utilizando o pushbutton como interruptor.
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
void setup( )  
+
const int buttonPin = 6;
{
+
const int ledPin = 13;
  Serial.begin(9600); // inicializa a porta serial
+
 
 +
int estado = 0; // variável para leitura do pushbutton
 +
int guarda_estado = LOW; // variável para armazenar valores do pushbutton
 +
 
 +
void setup() {
 +
    pinMode(ledPin, OUTPUT);
 +
    pinMode(buttonPin, INPUT); // resistor de pullup -> pinMode(buttonPin, INPUT_PULLUP);
 
}
 
}
void loop( )  
+
 
{
+
void loop(){
   for (int i=0; i < 10; i++) { 
+
    estado = digitalRead(buttonPin);
    Serial.println(i); // imprime o valor de i
+
    delay(1000);  
+
    if (estado == HIGH) {    // para pullup (estado==LOW)
  }
+
        guarda_estado = !guarda_estado; // inverte valor da variável variable_buttonEstado
 +
        delay(500); //esperera o tempo de 500ms para evitar que haja várias vezes alterações
 +
    }
 +
    if (guarda_estado == HIGH) {
 +
        digitalWrite(ledPin, HIGH);
 +
    }
 +
    else {
 +
        digitalWrite(ledPin, LOW);
 +
    }
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
;Exemplo 4
+
=Exercícios=
  
No código abaixo vemos um exemplo de dois loops aninhados. Enquanto '''i''' conta as linhas '''j''' conta as colunas.
+
:1. Altere o programa Button para trocar o estado do LED quando o botão é pressionado.
 +
:2. Explique e implemente o código abaixo:
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
int i,j; // i e j são variáveis inteiras
+
#define BOTAO 6
 +
#define LED 13
 +
void setup() {
 +
  pinMode(LED, OUTPUT);
 +
  pinMode(BOTAO, INPUT);
 +
}
  
void setup( )  
+
void loop() {
{
+
   digitalWrite(LED, !digitalRead(BOTAO));
   Serial.begin(9600); // inicializa a porta serial
 
}
 
void loop( )  
 
{
 
  for (i=0;i<13;i++) {
 
        for (j=0;j<=i;j++) {
 
          Serial.print('*'); // imprime um asterisco
 
          delay(100);   
 
        }
 
        Serial.println(); // pula uma linha
 
        delay(50);
 
  }
 
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
;Nota: O operador !, em linguagem C, significa negação ('''not''') e tem como finalidade complementar a expressão que segue à sua direita.
  
 
=Referências=
 
=Referências=
  
[1] http://linguagemc.com.br/comando-do-while/
+
[1] http://ordemnatural.com.br/pdf-files/CartilhadoArduino_ed1.pdf
 +
 
 +
[2] https://www.tinkercad.com/circuits
 +
 
  
  
  
 
-----
 
-----
[[Imagem:icone_voltar.png|link=MCO018703_2021_2_AULA04]]
+
[[Imagem:icone_voltar.png|link=MCO018703_2021_2_AULA05]]
 
[[Imagem:icone_menu.png|link=MCO018703_2021_2#Aulas]]
 
[[Imagem:icone_menu.png|link=MCO018703_2021_2#Aulas]]
[[Imagem:icone_prox.png|link=MCO018703_2021_2_AULA06]]
+
[[Imagem:icone_prox.png|link=MCO018703_2021_2_AULA07]]

Edição atual tal como às 09h39min de 18 de outubro de 2021

Mapa das Entradas e Saídas do Arduino

Objetivo
  • Apresentar o mapa das entradas e saídas do Arduino;
  • Saber utilizar as funções na linguagem do Arduino.



Fig041 MCO018703.jpg

Figura 1 - Mapa das Entradas e Saídas do Arduino.

Pinos Digitais
São usados para detecção ou transmissão de controles digitais.
Funções em C:
pinMode( )
digitalRead( )
digitalWrite( )
analogWrite( )
attachInterrupt( )
pulseIn( )


Pinos analógicos
São usados para leitura de sinais de sensores análogicos.
Funções em C:
analogRead( )


Porta USB
É usada para comunicação serial com um computador.
Funções em C:
begin( )
end( )
available( )
read( )
print( )
println( )
Pinos de Alimentação
São usados para alimentação de circuitos externos e reset do Arduino.

Portas de E/S do Arduino e suas Funções

Pinos Digitais

São 14 pinos marcados com o nome DIGITAL logo abaixo de duas barras de 8 pinos. São numerados de 0 a 13 da direita para a esquerda e podem ser configurados pela função pinMode( ) para detetarem ou transmitirem níveis lógicos digitais (verdadeiro/falso, 1/0 ou HIGH/LOW). A Figura 2 mostra o mapa de pinos Digitais do Arduino.

Fig042 MCO018703.jpg

Figura 2 - Mapa dos Pinos Digitais do Arduino.


Função Exemplo Notas
pinMode(pino,modo)

Serve para estabelecer a direção do fluxo de informações em qualquer dos 14 pinos digitais. Dois parâmetros devem ser passados à função: o primeiro indica qual pino vai ser usado; o segundo, se esse pino vai ser entrada ou se vai ser saída dessas informações.

pinMode(2,OUTPUT);

Aqui o pino 2 é selecionado para transmitir informações do Arduino para um circuito externo qualquer. Para configurar esse pino como entrada, o segundo parâmetro dessa função deve ser INPUT.

Essa função é sempre

escrita dentro da função setup( ).

digitalRead(pino)

Uma vez configurado um certo pino como entrada com a função pinMode( ), a informação presente nesse pino pode ser lida com a função digitalRead( ) e armazenada numa variável qualquer.

int chave = digitalRead(3);

Nesse exemplo a variável inteira ‘chave’ vai guardar o estado lógico (verdadeiro/falso) presente no pino digital 3.

digitalWrite(pino,valor)

Para enviar um nível lógico para qualquer pino digital do Arduino utiliza-se essa função. Dois parâmetros são requeri dos: o número do pino e o estado lógico (HIGH/LOW ) em que esse pino deve permanecer.

digitalWrite(2,HIGH);

Aqui uma tensão de 5 volts é colo cada no pino 2. Para enviar terra para esse pino o segundo parâmetro deverá ser LOW.

É necessário configurar previamente o

pino como saída com a função pinMode( ).

analogWrite(pino,valor)

O Arduino pode gerar tensões analógicas em 6 de seus 14 pinos digitais com a função analogWrite( ). Dois parâmetros devem ser passados à função: o primeiro indica em qual pino será gerada a tensão; o segundo determina a amplitude dessa tensão, e deve ter valores entre 0 (para 0 volt) e 255 (para 5 volts).

analogWrite(10,128);

Com esses parâmetros uma tensão analógica de 2,5 volts vai aparecer no pino 10. Não é necessário configurar um pino PWM como saída com a função pinMode( ) quando se chama função analogWrite( ).

Modulação por Largura de Pulsos, ou

PWM (Pulse Width Modulation) na língua inglesa, é uma técnica usada para gerar tensões analógicas a partir de uma sequência de pulsos digitais.

attachInterrupt(pino,função,modo)

Essa função é uma rotina de serviço de interrupção, ou ISR (Interrupt Service Routine) em inglês. Toda vez que ocorrer uma interrupção por hardware no pino digi tal 2 ou no 3 do Arduino uma outra função, criada pelo programador, vai ser chamada. O terceiro parâmetro, modo, informa como a interrupção vai ser disparada, se na borda de subida do pulso detetado no pino do Arduino, se na borda de descida, se quando o pulso for baixo ou se na mudança de nível desse pulso.

attachInterrupt(0,contador,RISING);

Nesse exemplo a função ‘contador’ vai ser chamada quando o Arduino detetar uma mudança do nível LOW para o nível HIGH em seu pino 2. Nessa ISR o parâmetro 0 monitora o pino 2, o parâmetro 1 monitora o pino 3.

LOW - dispara a interrupção quando

o pino está em 0; CHANGE - dispara sempre que o pino muda de estado (de 0 para 1, ou vice-versa); RISING - somente quando o pino muda de 0 para 1; FALLING - somente quando o pino muda de 1 para 0.

pulseIn(pino,valor,espera)

Essa função mede a largura em microssegundos de um pulso em qualquer pino digital. O parâmetro ‘valor’ diz à função que tipo de pulso deve ser medido, se HIGH ou LOW. O parâmetro ‘espera’ (time out) é opcional e se passado à função faz com que a medida do pulso só comece após o tempo em microssegundos ali especificado.

pulseIn(4,HIGH);

Aqui essa função vai monitorar o pino 4, e quando o nível nesse pino mudar de LOW para HIGH a sua largura vai ser medida até que seu nível volte para LOW. Se, por exemplo, for passado o valor 100 como terceiro parâmetro, a medida da largura do pulso só será disparada após 100 uS.

Uma aplicação interessante para

essas duas últimas funções seria o de montar um contador de dois dígitos com mostradores de 7-segmentos.

Exemplo


No programa abaixo essas três funções: pinMode(), digitalRead() e digitalWrite() são utilizadas para acender um LED no pino 2 toda vez que uma chave normalmente aberta no pino 3 for pressionada.

void setup() 
{
    pinMode(11,OUTPUT);
    // led no pino 11 como saída
    pinMode(5,INPUT);   // Pode-se definir um resistor interno de pull-up com INPUT_PULLUP  
    // chave no pino 5 como entrada
}
void loop() 
{
    int chave = digitalRead(5); 
    // variável ‘chave’ guarda estado do pino 5
    if (chave==HIGH)
       digitalWrite(11,LOW);   
    else
       digitalWrite(11,HIGH);   
    // estado de ‘chave’ é passado para pino 11 
}

A Figura 3 mostra como ficaria as ligações para acender o LED toda vez que a chave for pressionada.

Fig043 MCO018703.jpg

Figura 3 - Fios vermelhos são 5V, fios pretos GND e fios verdes conexões com os Pinos de E/S.

O botão push-button também é chamado micro switch. A Figura 4 ilustra o seu funcionamento.

Fig013 MCO18703.png

Figura 4 - Push-button de pólo simples com 2 ou 4 pinos de contato.

LED, ou Light Emitter Diode é um diodo emissor de luz que, quando alimentado corretamente, permite o fluxo de energia apenas em um sentido. É um componente polarizado (com pólos positivo e negativo) e deve ser corretamente conectado para funcionar. Note que o polo positivo possui uma perna maior (terminal maior) que a outra (veja a figura abaixo). Já o polo negativo possui a menor perna (terminal menor).

Fig004 MCO18703.jpg

Figura 5 - Diodo emissor de luz.

Nota: Alguns LED's apresentam o polo negativo chanfrado (plano) no seu exterior.

Enviando estado de chave para Monitor Serial

EXEMPLO 3

Neste teste, o estado de uma chave externa será lido e enviado pro Monitor Serial.

Esquemático


Fig022 MCO18703.png
Código fonte
int pushButton=2;

void setup()
{
   Serial.begin(9600);
   pinMode(pushButton, INPUT);
}

void loop() 
{
   int buttonState=digitalRead(pushButton);

   Serial.println(buttonState);
   delay(1);
}
No protoshield do laboratório
Fig023 MCO18703.jpg
Quando pressiona a chave, efeito no Monitor Serial
Fig024 MCO18703.png


Pushbutton como interruptor liga/desliga

Criar um circuito para atribuir duas funções em um único botão (pushbutton). O botão servirá como um interruptor para ligar e desligar um componente eletrônico. Neste exemplo vamos ligar e desligar um led utilizando o pushbutton como interruptor.

const int buttonPin = 6; 
const int ledPin = 13; 

int estado = 0; // variável para leitura do pushbutton
int guarda_estado = LOW; // variável para armazenar valores do pushbutton
  
void setup() {
    pinMode(ledPin, OUTPUT);
    pinMode(buttonPin, INPUT); // resistor de pullup -> pinMode(buttonPin, INPUT_PULLUP);
}
  
void loop(){
    estado = digitalRead(buttonPin);
 
    if (estado == HIGH) {    // para pullup (estado==LOW)
        guarda_estado = !guarda_estado;  // inverte valor da variável variable_buttonEstado
        delay(500); //esperera o tempo de 500ms para evitar que haja várias vezes alterações
    }
    if (guarda_estado == HIGH) {
        digitalWrite(ledPin, HIGH);
    }
    else {
        digitalWrite(ledPin, LOW);
    }
}

Exercícios

1. Altere o programa Button para trocar o estado do LED quando o botão é pressionado.
2. Explique e implemente o código abaixo:
#define BOTAO 6
#define LED 13
void setup() {
   pinMode(LED, OUTPUT);
   pinMode(BOTAO, INPUT);
}

void loop() {
   digitalWrite(LED, !digitalRead(BOTAO));
}
Nota
O operador !, em linguagem C, significa negação (not) e tem como finalidade complementar a expressão que segue à sua direita.

Referências

[1] http://ordemnatural.com.br/pdf-files/CartilhadoArduino_ed1.pdf

[2] https://www.tinkercad.com/circuits




Icone voltar.png Icone menu.png Icone prox.png