Você está na página 1de 14

AULA 3

LÓGICA E
MICROCONTROLADORES

Prof. Charles Way Hun Fung


TEMA 1 – VARIÁVEIS NO PROGRAMA

O programa desenvolvido deve seguir uma sequência lógica, determinada


pela semântica da linguagem de programação. Isto significa que há uma ordem e
forma de escrever o programa. No caso, utilizamos a linguagem Wiring, baseada
na linguagem C/C++, e logo conheceremos as suas regras para criar nossos
programas. A Figura 1 apresenta uma estrutura padrão:

Figura 1 – Estrutura do código em Wiring

Como se pode ver na Figura 1, a declaração de variáveis deve ser antes


da função setup(). Assim, as variáveis utilizadas serão consideradas globais, ou
seja, serão reconhecidas em qualquer parte do código. A Figura 2 ilustra o uso de
uma variável nesta estrutura de código:

Figura 2 – Uso de uma variável

A Figura 2 apresenta um exemplo do uso de uma variável chamada


estadoBotao. Esta foi declarada antes das funções, e por isso pode ser usada em
setup() e loop(). Essa é uma característica herdada da linguagem C/C++, que diz
que variáveis globais podem ser usadas em quaisquer funções. Assim, podemos
afirmar que as variáveis globais existem durante toda a execução do programa.
2
Existe outro tipo de variável chamada variável local. Ela existe apenas
dentro de um bloco de código, comandos que se encontram entre duas chaves {
}. Neste caso, estas variáveis só existem dentro do bloco de código em que foram
declaradas. A Figura 3 ilustra este tipo de variável:

Figura 3 – Variáveis locais

Na Figura 3 há dois blocos de código (funções); no primeiro, há uma


variável inteira chamada x, que recebe valor inicial igual a 2; no outro, há duas
variáveis: teste do tipo String e x do tipo inteiro. A variável na função setup() só
existirá enquanto esta função for executada, deixando de existir quando ela
terminar. A mesma ideia ocorre com as duas variáveis de loop(): só existem
enquanto loop() executar. As variáveis com nome de x em setup() e loop() são
diferentes e não devem ser confundidas; possuem o mesmo nome, mas o valor
que uma possuiu não tem relação com o valor que da outra.
Em resumo, há dois tipos de variáveis: globais e locais. As globais existem
em toda a extensão do código e podem ser utilizadas em qualquer função. Já as
locais apenas existem dentro do bloco de código em que foram criadas.
Além de variáveis, ainda é possível criar uma forma de armazenar dados
que não altera seu conteúdo no decorrer do código, o componente de constante.
Na IDE do Arduino, há diversos valores predefinidos para constantes,
classificados segundo alguns critérios1:

a. Constantes booleanas
 false: definido como zero na linguagem de programação, tem sentido
lógico falso.

1Disponível em: <https://www.arduino.cc/reference/pt/language/variables/constants/constants/>.


Acesso em: 26 abr. 2019.
3
 true: definido como o número 1, sendo o significado de verdadeiro.
Porém na linguagem de programação, qualquer número diferente de
zero tem sentido lógico verdadeiro.
Estas constantes booleanas devem ser escritas com todos os caracteres
minúsculos.
b. Níveis lógicos
 HIGH: indica que o pino do microcontrolador está em nível lógico alto,
em outras palavras, no caso de leitura, uma tensão superior a 3 V. No
caso de uma escrita, de 5 V ou 3,3V dependendo da alimentação da
placa.
 LOW: indica que o pino do microcontrolador está em nível lógico baixo,
no caso de leitura, uma tensão inferior 1,5 V. No caso de escrita, 0 V.
c. Definição de modos de pinos digitais
Estas constantes são usadas para definições de pinos como entrada ou
saída, por meio do comando pinMode(), normalmente usado na função
setup().
 INPUT: define o pino digital como uma entrada; neste caso, deve ser
usado para fazer a leitura de um botão ou algum sensor com saída
digital.
 OUTPUT: define o pino digital como uma saída; neste caso podemos
usar o pino para acender LED, tocar um buzzer ou enviar comando a um
display.
 NPUT_PULLUP: funciona da mesma forma que o INPUT, porém o pino
digital tem um valor padrão em nível alto ou HIGH.
d. Definição de LED na placa
 LED_BUILTIN: é o pino da placa conectado ao LED; na maioria das
placas é o pino 13.

TEMA 2 – OPERADORES ARITMÉTICOS

Na programação do Arduino, há um conjunto de operadores aritméticos,


relacionais e lógicos que podem ser usados para diversas situações no decorrer
do programa. Neste tema abordaremos cada um destes operadores e veremos
como utilizá-los.
Segundo Oliveira (2017), os operadores aritméticos são usados para
realizar contas simples como atribuição, soma, subtração, incremento etc. Seu
4
objetivo é realizar operações matemáticas, para que sejam utilizadas nas
estruturas de programação ou na própria lógica do algoritmo.
A tabela a seguir apresenta cada um dos símbolos e suas operações:

Tabela 1 – Operações aritméticas

Símbolo Operação
= Atribuição
+ Soma
- Subtração
* Multiplicação
/ Divisão
% Resto da divisão
++ Incremento
-- Decremento

O primeiro operador apresentado na tabela 1 é o operador de atribuição,


usado para alterar o conteúdo de determinada variável, exemplo:

 X = 10
 C = ‘A’

As operações seguintes são as operações matemáticas convencionais:


soma, subtração, multiplicação e divisão, que seguem o seguinte formato:

Resultado = <Num1> <operação> <Num2>

Exemplo:
Res = A+B

Temos uma soma entre as variáveis A e B, com o resultado colocado em


Res. Para manter o paralelo com o Scratch, a mesma operação é realizada:

Figura 4 – Soma no Scratch

Foi utilizado o bloco de atribuição com o bloco de operações aritméticas:

Figura 5 – Bloco de atribuição e aritmético do Scratch

5
A operação seguinte é o resto da divisão. A ideia desta operação é bastante
simples; consideremos a seguinte operação de divisão:

5 / 2 = 2, sobrando 1 (resto da divisão)

O resto da divisão é a operação simbolizada por %. No caso de nosso


exemplo, 1. É comum a confusão entre o quociente e o resto da divisão, mas
perceba que o quociente do nosso problema é o resultado da divisão, 2.
As duas últimas operações aritméticas são incremento e decremento, que
consistem em adicionar 1 ou subtrair 1 respectivamente. Vamos entender um
pouco mais como funciona o incremento, e tudo que for falado sobre esta
operação vale para o decremento.
A operação incremento é implementada na linguagem Wiring desta forma:

Num++;

em que Num é uma variável inteira. O efeito desta operação equivale à


seguinte linha de código:

Num = Num + 1;

Do lado direito da sentença é realizada uma soma entre o valor de Num


com 1, e o resultado desta operação substitui o valor da variável. Exemplo: se
Num tivesse o valor 5, após esta linha de código, Num estará com o valor 6.
As operações de incremento e decremento serão muito usadas mais à
frente na disciplina, em repetições.

TEMA 3 – OPERADORES RELACIONAIS

Resultam em valores lógicos como verdadeiro e falso. Normalmente são


usados em um programa, como condições em estruturas condicionais.

Tabela 2 – Operações relacionais

Símbolo Operação
== Igualdade
!= Diferença
> Maior
< Menor
>= Maior ou igual
<= Menor ou igual

6
As condições são formadas da seguinte forma:

<variável> <operador> <valor condicional>

Exemplo 1:

(X == 10)

A expressão indica que, se a variável X for igual a 10, a condição será


verdadeira, mas para qualquer outro valor a condição é falsa.

Exemplo 2:

(Idade>=18)

Temos a variável chamada idade e, se ela for maior ou igual a 18, a


condição estará verdadeira. Porém se for menor, ou seja, possuir um valor 17 ou
inferior, a condição será considerada falsa.
O Scratch possui a estrutura para as operações relacionais, como mostrado
na Figura 6:

Figura 6 – Operação relacional no Scratch

Este bloco da Figura 6 tem a possibilidade de ser utilizado com variáveis,


alternando a operação utilizada entre as operações relacionais.

TEMA 4 – OPERADORES LÓGICOS

Estes operadores são utilizados em conjunto com os operadores


relacionais para formar uma sentença lógica maior, de forma a juntar duas ou mais
sentenças relacionais.

Tabela 3 – Operações lógicas

Símbolo Operação
&& E (AND)
|| OU (OR)
! NÃO (NOT)

7
O uso destes operadores é para unir duas sentenças lógicas, por exemplo:
Exemplo 1:
(N<=10) && (N>=5)

A expressão apresentada tem duas sentenças relacionais. A primeira indica


que todos os valores menores ou iguais a 10 são considerados verdadeiros, isto
é: 10, 9, 8, ..., 0, -1, -2, ..., -∞. Então, é o conjunto definido na matemática como
[10, -∞). Por outro lado, temos a outra expressão, N>=5, na qual todos os valores
possíveis são valores que contêm o 5 e valores superiores: 5, 6, 7, ..., ∞.
O operador E funciona como uma interseção entre os dois conjuntos, e
pontos em comum serão escolhidos, no caso: 10, 9, 8, 7, 6 e 5. Logo, o E serve
para juntar elementos em comum entre dois ou mais conjuntos.
Exemplo 2:
(N>10)||(N<0)

Temos outros dois intervalos e devemos determinar os valores possíveis.


No caso de N>10, são todos os valores maiores que 10, sem incluir o 10: 11, 12,
13, ..., ∞. No segundo caso, todos valores com N<0, ou seja, todos os valores
negativos: -1, -2, -3, ..., -∞.
O operador OU é usado como a união destes dois conjuntos, por isso
qualquer valor que for considerado verdadeiro em qualquer uma das condições
será considerado verdadeiro na sentença com OU. Vamos supor N com valor 12,
como é verdadeiro na condição à esquerda, será considerado verdadeiro para
sentença como um todo. Agora suponha N com valor de 5; não é verdadeiro em
nenhuma das condições, por isso é considerado falso na expressão.
Exemplo 3:
!(N==2)

Para a condição ser verdadeira, N tem de ser igual a 2, mas o operador


NÃO inverte o sentido lógico. Então, supondo que N seja igual a 2, o resultado da
expressão será falso, pois o verdadeiro da condição foi invertido pelo operador
NÃO. Para fixar, vamos supor que N tenha o valor de 10; na condição isto é falso,
mas, quando aplicamos o operador NÃO, a sentença fica verdadeira.
No Scratch os operadores lógicos são usados com estes blocos:

8
Figura 7 – Operadores lógicos no Scratch

No hexágono que aparece nos operadores lógicos da Figura 7, podemos


colocar condições, como apresentado a seguir:

Figura 8 – Operação E entre condições relacionais

Este exemplo da Figura 8 é exatamente o Exemplo 1, porém em Scratch.


A lógica destes blocos é a mesma que usada na linguagem Wiring.

TEMA 5 – ESTRUTURA CONDICIONAL

Quando escrevemos linhas de código, podemos pensar que algumas linhas


podem executar se ocorrer alguma condição, ou que um trecho de código não
seja executado em outra situação. Para exemplificar, imagine um LED e um botão.
O LED só deverá acender se o botão for pressionado – o termo se indica que há
uma condição que deve ocorrer, neste caso, a ação de pressionar o botão.
O condicional mais simples é o if e sua estrutura é apresentada a seguir
(Oliveira, 2017):

if(condição){
Comando1;
Comando2;
}

Nesta estrutura há uma condição que é formada a partir de estruturas com


operadores aritméticos, relacionais e lógicos, de forma que o resultado seja uma
sentença com valor lógico verdadeiro ou falso. O comando if faz a verificação da
condição; caso seja verdadeira, os comandos de dentro das chaves serão
executados; caso contrário, os comandos serão ignorados e o programa
continuará normalmente.
Exemplo 1:

9
botao = digitalRead(2);
If(botao==HIGH){
digitalWrite(13,HIGH);
}

O circuito que representa este exemplo é apresentado a seguir:

Figura 9 – Circuito com um botão

Para o Exemplo 1, temos a variável botao que faz uma leitura digital do pino
2, onde encontra-se um botão. Caso este esteja pressionado, a leitura digital será
HIGH; caso contrário, a leitura será LOW.
Se o botão estiver pressionado, a condição será verdadeira, neste caso o
LED que está no pino 13 – na verdade o LED não está visivelmente ligado no
circuito, mas é representado pelo L na placa. Para este exemplo, uma vez que o
botão seja pressionado, o LED acenderá e não se apagará mais.
Uma forma complementar do condicional é a estrutura:

if(condição){
Comando1;
Comando2;
}
else{
Comando3;
Comando4;
}

Esta estrutura faz a verificação da condição; caso seja verdadeira,


executará os comandos dentro das chaves do if (Comando1 e Comando2). Caso

10
a condição seja falsa, executará os comandos entre as chaves do else (Comando3
e Comando4). Para ilustrar esta estrutura condicional vamos analisar o próximo
exemplo:

botao = digitalRead(2);
If(botao==HIGH){
digitalWrite(13,HIGH);
}
else{
digitalWrite(13,LOW);
}

Este exemplo também tem como circuito exemplo a Figura 9, mas neste
caso será analisado o botão no pino 2. Caso esteja pressionado, a variável botao
estará com valor HIGH e acenderá o LED no pino 13. Caso contrário, a variável
botao estará em LOW, fazendo com que a condição seja considerada falsa. Por
isso será executado o comando em else, que apagará o LED no pino 13.
O Scratch também possui a mesma estrutura condicional com os blocos:

Figura 10 – Estrutura condicional no Scratch

Esta estrutura condicional funciona de forma semelhante ao apresentado


em linguagem Wiring. A seguir um exemplo aplicado do Scratch:

Figura 11 – Condicional no Scratch

11
O funcionamento dos blocos da Figura 11 é semelhante ao apresentado no
Exemplo 2. Perceba que usando o Scratch a solução é muito mais visual, mas a
condição é semelhante à criada em Wiring.
Há uma terceira estrutura que possui condições intermediarias, como
mostrado a seguir:

if(condição1){
Comando1;
Comando2;
}
else if(condição2){
Comando5;
Comando6;
}
else{
Comando3;
Comando4;
}

Esta estrutura suporta uma nova verificação após a primeira e seu


funcionamento é da seguinte forma:

 Verifica a condição do if; se for verdadeira executa os comandos do if


(Comando1 e Comando2) e ignora o resto das condições.
 Caso a condição anterior não seja verdadeira, verifica a condição do else
if; se for verdadeira executa os comandos do else if (Comando5 e
Comando6) e ignora o resto das condições.
 Caso nenhuma condição seja verdadeira, executa os comandos em else
(Comando3 e Comando4).

Uma observação interessante sobre esta estrutura é a possibilidade de


existir qualquer número de condições intermediárias, ou seja, é possível colocar
quantos else if desejar.

12
Exemplo 3:

Figura 12 – Estrutura condicional com condição intermediária

O Exemplo 3 é código fonte do circuito apresentado a seguir:

Figura 13 – Circuito do Exemplo 3

Neste exemplo há duas condições, se o botão no pino 2 está pressionado


e se o botão do pino 4 está pressionado. Em ambos os casos, o mesmo LED
acenderá, mas perceba que são condições completamente diferentes que podem
ser atendidas para acender o mesmo LED.
Quando nenhum dos botões estiver pressionado, será apagado o LED. Isso
só ocorre se nenhuma condição for considerada verdadeira.
13
REFERÊNCIAS

ALVES, W. P. Linguagem e lógica de programação. 1. ed. São Paulo: Érica,


2014.

ASCENCIO, A. F. G. Fundamentos da programação de computadores. 1. ed.


São Paulo: Prentice Hall, 2002.

FORBELLONE, A. L. V. Lógica de programação: a construção de algoritmos e


estrutura de dados. 3. ed. São Paulo: Prentice Hall, 2005.

MCROBERTS, M. Arduino básico. 1. ed. São Paulo: Novatec, 2011.

OLIVEIRA, C. L. V. Arduino descomplicado: aprenda com projetos de eletrônica


e programação. 1. ed. São Paulo: Érica, 2017.

14

Você também pode gostar