Baixe o app para aproveitar ainda mais
Prévia do material em texto
AULA 3 LÓGICA E MICROCONTROLADORES Prof. Charles Way Hun Fung 2 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. 3 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. 1 Disponível em: <https://www.arduino.cc/reference/pt/language/variables/constants/constants/>. Acesso em: 26 abr. 2019. 4 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 5 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 6 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 7 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 ScratchEste 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) 8 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: 9 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: 10 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 11 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 12 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. 13 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. 14 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.
Compartilhar