Escolar Documentos
Profissional Documentos
Cultura Documentos
Linguagem de
Programação
Quando falamos sobre programação, geralmente, a primeira coisa que vem à nossa cabeça
são computadores e equipamentos relacionados à área de informática. Porém, não paramos para
observar que a maioria dos equipamentos que usamos diariamente são de alguma forma
“programados” e funcionam graças a “dispositivos programáveis” como microprocessadores,
microcontroladores, FPGAs, DSPs etc. Podemos citar como exemplos de equipamentos que se
utilizam de alguma forma de programação: máquina de lavar roupas, televisores, carros,
celulares, máquinas industriais, entre vários outros.
Em adição a isso, há de se considerar também que, dentro da área das ciências exatas, existe
uma grande demanda no uso de algoritmos e linguagens de programação para solução de
problemas numéricos, simulação de sistemas dinâmicos, métodos não convencionais para controle
de sistemas (redes neurais artificiais, por exemplo), otimização de processos industriais etc., que
nos motivam ainda mais a buscarmos compreender melhor esse importante campo de
desenvolvimento!
De forma simplificada, podemos definir o algoritmo como uma sequência de etapas que são
necessárias para a resolução de uma determinada tarefa ou problema. Praticamente tudo o que
fazemos em nosso dia a dia pode ser escrito na forma de algoritmo. Por exemplo, vamos pensar na
sucessão de tarefas para se fazer café:
Inicio_Algoritmo
1 – Colocar água na panela
2 – Ferver a água
3 - Acrescentar o açúcar à água
4 - Pegar o bule, o coador e a caneca
5 - Colocar o café em pó no coador
6 – Encaixar o coador no bule
7 - Despejar água fervente no bule
8 - Retirar o coador
9 - Despejar o café na caneca
10 - Beber
Fim Algoritmo
Uma vez observado o exemplo acima, podemos tirar algumas conclusões sobre a forma de
se desenvolver um algoritmo:
2
Prof. Rodrigo Rech v.1
Com base no que discutimos até agora, como seria, por exemplo, um algoritmo para
solucionar uma equação do segundo grau na forma 𝒂𝒙𝟐 + 𝒃𝒙 + 𝒄 = 𝟎?
Inicio_Algoritmo
1 – Entrar com os valores a, b e c.
2 – Calcular Delta = b²-4.a.c
3 – Se Delta < 0
então: exibir mensagem: “não há raízes reais”
se não: exibir os valores de 𝒙𝟏 = -𝒃 + √𝑫𝒆𝒍𝒕𝒂/(𝟐. 𝒂) e 𝒙𝟐 = -𝒃 - √𝑫𝒆𝒍𝒕𝒂/(𝟐. 𝒂)
Fim Algoritmo
4
Prof. Rodrigo Rech v.1
Lógica de Programação
Vimos, no tópico anterior, que um algoritmo é uma sequência de etapas que são necessárias
para a resolução de uma determinada tarefa. Vimos também que praticamente tudo o que fazemos
em nosso dia a dia pode ser escrito por meio de um algoritmo, desde que observemos o problema ou
atividade a ser executada de forma a encontrarmos a sequência correta de ações a serem
desenvolvidas para alcançarmos o objetivo. É justamente nesse ponto que nos deparamos com a
lógica de programação.
A palavra lógica faz parte do nosso vocabulário cotidiano, especialmente quando nos
deparamos com a necessidade de solucionarmos um problema. Sua origem é atribuída a Aristóteles
(discípulo de Platão que viveu na cidade grega de Atenas aproximadamente três séculos antes de
Cristo), que a definia, em poucas palavras, como a “ciência que descreve as leis que regem o
pensamento objetivando descobrir algo de novo sem possibilidade de erro”(dado que em seu conceito
somente a verdade absoluta é aceita).
Sendo assim, podemos então pensar que a lógica de programação é o “modo pelo qual, a
partir das ferramentas disponíveis para a realização de uma tarefa, estabelecemos a sequência de
etapas necessárias para a sua resolução”. Portanto, podemos inferir que é algo abstrato e
individual, afinal, podemos chegar a um mesmo objetivo por meio de variados caminhos.
Consequentemente, a lógica de programação não é algo a ser “aprendido” de fato, mas sim, a ser
estimulado por meio da resolução de tarefas “lógicas”. Existem inúmeras ferramentas que têm
como objetivo de estimular o desenvolvimento de lógica de programação. Dentre elas, o aplicativo
Light-bot apresenta, em forma de um jogo, uma ótima maneira de estimular o desenvolvimento
de pequenos algoritmos para solucionar determinadas tarefas (figura 5).
5
Prof. Rodrigo Rech v.1
Esses comandos são implementados: clicando sobre eles, arrastando-os e encaixando-os nas
lacunas. Você deve encaixá-los nos espaços já na sequência correta pensada para a locomoção do
robô. Caso não seja feito assim, o robô irá desenvolver uma trajetória aleatória (que estará
relacionada ao que você preencheu). A etapa referente à “iluminação dos ladrilhos” deve ser
executada por meio do comando representado por uma lâmpada.
Tomemos o exemplo da primeira fase. Nessa etapa, partindo-se do ponto inicial, é necessário
que o robô realize dois passos à frente e, posteriormente, “acenda o ladrilho azul”. A sequência de
comandos necessários para a conclusão dessa etapa pode observada na Figura 7.
6
Prof. Rodrigo Rech v.1
7
Prof. Rodrigo Rech v.1
Modo online:
Aplicativos mobile:
Pesquise pelo aplicativo “Lightbot: Hour of Code” na loja do Android ou IOS para a versão
gratuita ou simplesmente “Lightbot” para a versão paga.
8
Prof. Rodrigo Rech v.1
Exercícios:
9
Prof. Rodrigo Rech v.1
As ferramentas que vimos até agora (algoritmo e fluxograma) buscam auxiliar a resolução
de alguma situação-problema na qual iremos aplicar uma determinada linguagem de
programação para programar o dispositivo responsável por controlar o processo. Mas, o que vem a
ser uma linguagem de programação?
Para definirmos linguagem de programação, antes vamos falar sobre o que é um programa
de computador, que nada mais é do que uma “sequência de comandos enviados ao processador
para a realização de uma determinada tarefa”. Assim, de forma resumida, podemos falar que a
Linguagem de Programação é uma ferramenta computacional que se utiliza de palavras ou
símbolos padronizados que nos possibilitam a escrita de um programa de computador para
implementação de um determinado algoritmo.
• Não estruturada (linear): nessa concepção não temos a organização do programa em “blocos de
instruções” e, sendo assim, os comandos de decisão são baseados em “desvios”, condicionais ou
incondicionais. São exemplos: Assembly, Basic, Cobol etc.;
• Estruturada: tem como objetivo deixar o código mais intuitivo, utilizando blocos estruturados.
Deste modo, torna-se mais fácil entender a sintaxe (regras que regem a composição de textos com
significados em uma linguagem de programação) e o fluxo do programa. Na linguagem
estruturada, o comando “ir para” costuma ser usado somente em casos específicos e deve sempre
que possível ser evitado, pois é considerado um comando de desestruturação. São exemplos de
linguagem estruturada: C, Clipper, Pascal, etc.;
Linguagem C
Foi desenvolvida nos anos 1970 por Dennis M. Ritchie e Ken Thompson nos laboratórios
da BELLTelephone e, como dito anteriormente, é da categoria “estruturada”, significando que seu
código pode ser separado em sub-rotinas que podem ser reutilizadas em toda a programação,
deixando o código mais enxuto e simples de se efetuar manutenção.
10
Prof. Rodrigo Rech v.1
Para os exemplos apresentados durante nosso curso utilizaremos o IDE Arduino. Uma IDE
(Integrated Development Environment ou Ambiente Integrado de Desenvolvimento) é um
programa computacional que fornece diversas ferramentas para o desenvolvedor em um único
ambiente, tais como: compilador, depurador (debugger) e editor de texto.
Extensão Função
.c Código fonte do programa. No Arduino a principal extensão utilizada é a .ino
.h Arquivo “header”, utilizado para armazenar os cabeçalhos das bibliotecas
Arquivo compilado e pronto para ser executado. No Arduino e outros sistemas embarcados
.exe
essa extensão é a .hex
11
Prof. Rodrigo Rech v.1
Por fim, o editor de texto é a ferramenta que nos permite digitar e editar texto sem
formatação (de forma análoga ao bloco de notas do Windows) e que também está incorporado ao
IDE. Assim como no caso do debugger, no caso no editor de texto algumas funções mais avançadas
podem estar incorporadas, tais como: verificação de sintaxe durante a escrita do código, gerando
sinalizações instantâneas na ocorrência de erros de digitação para variáveis ou determinados
comandos básicos ou mais utilizados.
1. Inclusão de arquivos externos: funções externas ao programa, por exemplo, a biblioteca stdio.h;
2. Declaração de variáveis globais: variáveis que podem ser utilizadas em qualquer trecho do
programa;
3. Declaração de protótipos de funções: funções criadas pelo próprio programador;
4. Função principal (main): determina o ponto onde o programa começa a ser executado;
5. Funções: criadas pelo programador no decorrer do código.
12
Prof. Rodrigo Rech v.1
O Arduino
Existem várias placas Arduino, porém, o Arduino Uno (Figura 1) é o mais comum. E para
o desenvolvimento de projetos com Arduino são utilizados os Shields (Figura 2), que são placas
eletrônicas com finalidades diversas (Displays, acionamento de motores, comunicação sem fio,
etc.).
O software programação é chamado de Arduino IDE, e seu download pode ser realizado no
site oficial do Arduino: https://www.arduino.cc/en/Main/Software. Para iniciar a programação é
importante conhecer como funciona o programa.
12
13
Prof. Rodrigo Rech v.1
Configuração da placa
Para inserir uma biblioteca nova deve ser utilizado o menu “Ferramentas -> Gerenciar
Bibliotecas” (Figura 5). Caso ocorra algum problema para carregar uma biblioteca por meio deste
menu, é possível copiar a pasta da biblioteca (Deve ser feito o download previamente) no caminho:
Sketch-> Incluir Biblioteca -> Adicionar Biblioteca .ZIP. Como teste, faça o download da
biblioteca “ArduinoSTL” pelo gerenciador de bibliotecas.
14
Prof. Rodrigo Rech v.1
15
Prof. Rodrigo Rech v.1
Caso não seja possível realizar o download por causa de limitações da internet, baixe o
arquivo pelo seguinte caminho e faça a instalação da forma manual:
Para este primeiro exemplo, copie o código abaixo no Arduino IDE, compile e grave no
Arduino. Para verificar seu funcionamento, abra o menu “Ferramentas->Monitor Serial”.
Obs: A linguagem C é sensível ao tamanho do caractere, se maiúsculo ou minúsculo. Esta
característica se chama “case sensitive”. Por isso, preste atenção na hora de digitar os comandos,
pois poderá ocorrer erros de compilação.
#include <ArduinoSTL.h>
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.print("Olá Mundo\n");
}
Analisando o código:
#include <ArduinoSTL.h>
O comando “#include” é chamado de diretiva do compilador, isto é, esta linha avisa para o
compilador incluir naquele código uma biblioteca externa. Neste caso, a biblioteca é a
“ArduinoSTL”. Ela é responsável por permitir o uso de funções padrões da linguagem C Console
no Arduino, como a função printf e a função scanf. Funções básicas do Arduino, como a
“Serial.begin” e outras não necessitam de uma biblioteca externa. As funções básicas podem ser
acessadas neste link: https://www.arduino.cc/reference/en/.
void setup() {
Serial.begin(9600);
}
Aqui, as palavras “void setup ( )” criam uma função. Neste caso, os comandos inseridos
entre as chaves ({ e }) serão executados uma única vez pelo Arduino e, ao seu término, a função
loop começa a ser executada. Já a função “Serial.begin (9600);” é utilizada para configurar a
comunicação USB entre o Arduino e o Computador. Todos os comandos que são inseridos dentro
de uma função devem, obrigatoriamente, serem finalizados com um ponto e vírgula (;).
void loop() {
Serial.print("Olá Mundo\n");
}
Novamente as palavras “void loop ( )” criam uma função, porém, desta vez, os comandos
inseridos entre as chaves dela serão repetidos infinitas vezes ou, até o Arduino ser desligado. A
função “Serial.print(“Texto”)” envia para o computador o texto escrito dentro dos parênteses e aspas.
16
Prof. Rodrigo Rech v.1
Este texto é denominado “String”. Para ver este texto no computador deve ser utilizado o Monitor
Serial do Arduino IDE (Figura 6).
Note que, no exemplo do código do Arduino, a estrutura básica da linguagem C está diferente da
apresentada no início desta aula. Isso se dá pelo fato de o Arduino abstrair funções para facilitar a
programação. As duas funções que programamos: a setup e a loop, na verdade estão dentro de uma função
“main”, mas que não é visível para o programador. De forma resumida, a função main do Arduino pode ser
apresentada da seguinte forma:
Para acionar um LED é necessário que exista uma tensão entre seus pinos, Anodo e Catodo
(Figura 7). No Anodo deve ser inserido o potencial mais positivo, enquanto no catodo, o mais
negativo. Os pinos do Arduino podem fornecer dois níveis de tensão (0V ou GND e 5V). A tensão
5V também é definida como nível lógico alto (HIGH ou ‘1’), enquanto 0V pode ser definido como
nível lógico baixo (LOW ou ‘0’). Analisando o esquema eletrônico do shield utilizado (Figura 8)
é possível observar que os leds estão com os catodos ligados diretamente ao 0V (GND), enquanto
17
Prof. Rodrigo Rech v.1
os anodos estão nos pinos do Arduino (D0 à D7). Logo, para acionar um LED é necessário enviar
um nível lógico alto (HIGH) para o pino anodo.
Figura 7: Light Emitter Diode (LED) Figura 8: Ligação dos leds no Shield
Copie o código abaixo no Arduino IDE, envie para o Arduino e observe o comportamento dos
LEDs na placa:
void setup() {
Serial.begin(9600); //Configura a comunicação entre o Arduino e o Computador
pinMode(2,OUTPUT); //Configura o pino D2 como saída
pinMode(3,OUTPUT); //Configura o pino D3 como saída
}
void loop() {
Serial.print("Olá Mundo\n"); //Envia uma string para o computador
digitalWrite(2,HIGH); //Aciona o pino D2 com nível baixo (0)
digitalWrite(3,LOW); //Aciona o pino D3 com nível alto (1)
delay(500); //Aguarda um tempo de 500ms
digitalWrite(2,LOW); //Aciona o pino D2 com nível alto (1)
digitalWrite(3,HIGH); //Aciona o pino D3 com nível baixo (0)
delay(500); //Aguarda um tempo de 500ms
}
Analisando o código:
Na função “setup” foi incluída a função “pinMode( )”, ela é utilizada para configurar o
pino do Arduino como entrada de sinal ou saída de sinal. Basicamente um pino de entrada recebe
um sinal de um elemento externo, que pode ser um botão, sensor, etc. Já um pino configurado como
saída tem a capacidade de mudar seu nível lógico e fornecer corrente elétrica para algum
componente, neste caso, um LED. A sintaxe da função pinMode é:
18
Prof. Rodrigo Rech v.1
Serial.print("Olá Mundo\n");
Tem a mesma finalidade da função printf(), porém, não tem a necessidade de se incluir
uma biblioteca específica para seu funcionamento.
digitalWrite(3,LOW);
Tem a função de alterar o nível lógico de um pino definido como saída anteriormente. Sua
sintaxe é:
delay(500);
Gera um atraso no código de acordo com o valor inserido nos parênteses. Este tempo é dado
em milissegundos e só são aceitos números inteiros.
Exercícios:
1. Utilizando os 4 últimos leds ligados na placa, desenvolva um deslocador de bits. A cada 0,5
segundos o led atual apaga e acende o próximo. Ao apagar o último LED, aparece a frase
“Recomeçando...” no monitor serial e o ciclo começa novamente.
2. Ainda no programa do exercício anterior, ao finalizar o ciclo, o LED D3 deve piscar 3 vezes com
intervalos de 200ms, recomeçando o ciclo após o término.
19
Prof. Rodrigo Rech v.1
Tipos de dados
Assim como na linguagem C ANSI, o Arduino também trabalha com tipos de dados de
diferentes tamanhos, utilizando o mesmo padrão (byte, char, int, float). Além dos tipos de
variáveis, existem também os modificadores de tipo, que alteram a forma na qual o compilador
enxerga aquela variável (signed, unsigned, long, short), e os modificadores de acesso, que
determinam de qual forma o compilador pode acessar determinada variável (const, volatile).
Alguns tipos de tamanhos e modificadores estão listados na tabela 1.
O modificador const declara uma constante, isto é, uma variável que não pode ser
modificada durante a execução do programa. Já o modificador volatile indica ao compilador que a
variável pode ser modificada de forma não explícita, ou seja, o compilador pode alterar a variável
para otimizações de código.
Para mais informações ou para verificar outros tipos de variáveis e modificadores aceitos
pelo Arduino, acesse: https://www.arduino.cc/reference/en/#variables.
Declaração de variáveis
20
Prof. Rodrigo Rech v.1
Exemplo:
int var_global = 0; //Esta variável pode ser acessada por qualquer função do programa
void setup() {
char var_local = 0; //Esta variável funciona apenas na função "setup()"
void loop() {
float var_local = 0; //Esta variável funciona apenas na função "loop()"
Observe que o nome escolhido para as variáveis locais é o mesmo, o que não acarreta em
nenhum problema, já que estão declaradas em funções diferentes. Este mesmo nome não poderia
ser utilizado em uma variável global, pois o compilador define, como preferência, as variáveis
locais.
Operações aritméticas
Operador Ação
Atribuição de valor em uma
=
variável
- Subtração
+ Adição
* Multiplicação
/ Divisão
% Módulo da divisão (resto)
-- Decremento
++ Incremento
Tabela 2: Operadores aritméticos
21
Prof. Rodrigo Rech v.1
Programa de exemplo:
Para o programa de exemplo, iremos trabalhar com as funções scanf( ) e printf( ) para
capturar os valores pela comunicação serial e enviar os resultados para a tela do computador. Para
isso, não esqueça de instalar e incluir a biblioteca ArduinoSTL.h no programa.
Código fonte:
#include <ArduinoSTL.h>
void setup() {
Serial.begin(9600);
}
void loop() {
printf("Digite um número inteiro:\n");
scanf("%d", &num_1); //Recebe um número inteiro e armazena na variável num_1
printf("Digite outro número inteiro:\n");
scanf("%d", &num_2); //Recebe um número inteiro e armazena na variável num_2
22
Prof. Rodrigo Rech v.1
Loop
1 2
Setup
Configura
comunicação Serial Somar número 1 e Apresentar o resto
número 2 da divisão
Apresentar o
FIM Apresentar
resultado da
resultado da soma
exponenciação
Neste programa foi utilizada a função scanf( ) para capturar os valores digitados no
computador. Sua sintaxe é:
O formato da variável indica para a função qual o tipo da variável que está sendo lida. Na
biblioteca ArduinoSTL são aceitos apenas os formatos “%d”, que se refere a um número inteiro, e
“%c”, que se refere a um caractere. O & indica para a função o endereço em que se encontra a
variável, para que o valor lido seja armazenado nele.
Além do scanf, também foi utilizado o caractere especial “\n”. Ele é chamado de caractere
de controle. No caso dele, sua função é de pular uma linha. Na tabela 3 segue a descrição de alguns
caracteres de controle:
Caractere Ação
\b Retrocesso (“back”);
\t Tabulação horizontal (“tab”);
\” Aspas dupla;
\? Aspas simples;
\0 Nulo (0 em decimal) –Terminador;
\\ Barra invertida;
\v Tabulação vertical;
Tabela 3: Caracteres de controle
23
Prof. Rodrigo Rech v.1
Também foi utilizada neste programa a função Serial.println( ) para enviar um valor para
o computador e pular uma linha na sequência. Sua sintaxe é:
Esta é uma função nativa do Arduino e não é necessária a inclusão de bibliotecas para sua
utilização. A grande vantagem é que podem ser impressas variáveis de qualquer tipo,
diferentemente da função printf da biblioteca ArduinoSTL. É importante notar que, para se enviar
um texto, é necessário que ele esteja entre aspas dupla, por exemplo:
No caso de uma variável não é necessário utilizar as aspas dupla, mas é importante
informar o número de casas decimais que se deseja visualizar ou então o formato, se decimal,
binário, hexadecimal, etc.
https://www.arduino.cc/reference/en/language/functions/communication/serial/println/
Exercícios:
1. Desenvolva um programa que receba três números inteiros e apresente na tela o resultado das
seguintes equações: Obs: Para imprimir o número utilize a função Serial.println( ).
𝒏𝟏 + 𝒏𝟐
𝒙= 𝒙 = 𝒏𝟏𝟐 ∗ 𝒏𝟑 𝒙 = (𝒏𝟏 + 𝒏𝟐)𝟐
𝒏𝟑
2. Elabore um programa que receba 4 números inteiros e apresente sua média aritmética;
3. Crie um programa que receba um valor de temperatura em Celsius e converta para Kelvin e
Fahrenheit;
4. Crie um programa que, a partir de um número digitado pelo usuário, apareça na tela este número
sendo incrementado a cada 500ms infinitamente.
5. Elabore um programa onde seja digitado um número em decimal e ele seja apresentado na tela em:
hexadecimal, octal e binário;
6. Desenvolva um programa que apresente na tela os caracteres da tabela ASCII da posição 33 até a
126. Para isso utilize a função Serial.write( ):
https://www.arduino.cc/reference/en/language/functions/communication/serial/
24
Prof. Rodrigo Rech v.1
A condição que realiza o controle de fluxo pode assumir apenas dois valores: verdadeiro ou
falso. Na linguagem C ANSI estes valores também podem ser considerados 0 (zero) para falso e
qualquer coisa diferente de zero para verdadeiro. No Arduino também são aceitas as constantes
“true” ou “false”.
Além dos valores e constantes utilizados para definir o controle do fluxo, também é comum
a utilização de operadores relacionais e lógicos para realização de comparações com variáveis. Eles
estão apresentados na figura 2.
Operadores relacionais
Operador Ação
> Maior que
>= Maior que ou igual
< Menor que
<= Menor que ou igual
== Igual
!= Diferente
Operadores lógicos
Operador Ação
&& AND
|| OR
! NOT
Figura 2: Operadores relacionais e lógicos
25
Prof. Rodrigo Rech v.1
Traduzindo de forma literal, estes comandos são os “se( )” e o “senão”. O comando “if”
executa um bloco de código caso a condição inserida nele seja verdadeira. Caso a condição seja
falsa, o bloco executado será o “else”.
Uma condição dita como verdadeira em linguagem C pode ser dada de duas formas:
• Se (5 > 3); neste caso o número 5 é maior do que 3, logo, a condição é verdadeira!
• Se (‘a’ == ‘b’); agora é fácil de observar que as letras são diferentes, logo, a condição é
falsa!
Assim como as saídas digitais, no Arduino também é possível realizar a leitura de valores
de elementos externos a ele. Quando os valores lidos possuem apenas dois estados lógicos, tais
como: 0 ou 1, 0V ou 5V, falso ou verdadeiro, estes são ditos como digitais. Quando um valor lido
assume três ou mais níveis diferentes, consideramos este como analógico.
Elementos ditos como digitais em eletrônica podem ser, entre outros, botões e alguns tipos
de sensores. O funcionamento de um botão juntamente com um microcontrolador pode ser de
diversas formas, as mais comuns são apresentadas na figura 3.
26
Prof. Rodrigo Rech v.1
Na placa que estamos utilizando os botões estão ligados como demonstra na figura 4.
É fácil notar que os botões estão ligados no esquema de pull-up, isto é, enquanto o botão
estiver solto teremos nível alto (1) nos pinos do Arduino. Ao pressioná-los, os pinos ficarão com
nível baixo (0).
Programa de Exemplo:
Setup Loop 2
1
Botões 1 e 2
Declara a variável pressionados
globla contador SIM
simultâneamente
?
Botão 1 foi
NÃO SIM
pressionado? Envia o texto:
Lógica AND
Configura a NÃO
Envia o texto:
comunicação serial Envia o texto:
Botão 1
Botão 1 solto
pressionado
Configura o pino 10
como saída 2 1
Fim
27
Prof. Rodrigo Rech v.1
Código Fonte:
void setup()
{
//Inicia a comunicação serial
Serial.begin(9600);
//Define os pinos de entrada
pinMode(A2, INPUT_PULLUP);
pinMode(A3, INPUT_PULLUP);
//Define os pinos de saída
pinMode(7, OUTPUT);
}
void loop()
{
//Se o botão S1 foi pressionado, executa...
if(digitalRead(A2) == 0)
{
Serial.println("Botão 1 pressionado!");
digitalWrite(7, LOW); //Acende o LED
contador++; //Incrementa a variável contador
Serial.print("Contador = ");//Envia a palavra "contador =" para o PC
Serial.println(contador); //Apresenta o valor atual de contador no PC
}
//Caso não tenha sido pressionado...
else
{
Serial.println("Botão 1 solto!");
digitalWrite(7, HIGH); //Apaga o LED
}
delay(300);
}
Analisando o código
Caso a condição seja falsa, isto é, o pino esteja com um nível lógico alto, é sinal de que o
botão está solto e, por isso, o bloco que será executado é o “else”.
Já na segunda condição é utilizado um operador lógico para testar se os dois botões (S1 e
S2) foram pressionados simultaneamente. Observe que, aqui, a condição será verdadeira somente
quando os dois pinos do Arduino (A2 e A3) estiverem em nível 0 ao mesmo tempo. Caso apenas
um botão esteja pressionado, esta condição será falsa.
28
Prof. Rodrigo Rech v.1
Exercícios:
2. Crie um programa que faça a leitura de um número inteiro e verifique se é par ou ímpar. Indique
por meio de um LED e, também, por meio de um texto na tela;
4. Desenvolva um programa que apresente, por meio dos leds e um texto enviado para o computador,
as seguintes lógicas:
a. LED1 = (S1 && S2) || S3;
b. LED2 = (S1 || S3) && S2;
5. Crie um programa que conte a quantidade de vezes que o botão S1 foi pressionado e solto, e apresente
o valor na tela cada vez que o acionamento ocorrer.
29
Prof. Rodrigo Rech v.1
Nele e possível testar uma série de condições utilizando apenas um comando, evitando,
desta forma, trabalhar com vários if e else encadeados, com a diferença de que, com este comando,
apenas valores constantes inteiros e caracteres são aceitos. Logo, não é possível trabalhar com
variáveis tipo float ou double e, também, com operadores relacionais. Para exemplificar seu
funcionamento, observe o seguinte pseudocódigo e fluxograma:
Início
Recebe um valor
para uma variável
Escolha(variável)
Início: Variável = 1? Sim Instruções
Caso (valor1)
Execute...; Não
Caso (valor2)
Variável = 2? Sim Instruções
Execute...;
Caso (padrão) Não
Execute...;
Fim; Instruções
FIM
switch(variável)
{
case 1: {
//ações realizadas caso a variável seja 1
break;
}
case 2: {
//ações realizadas caso a variável seja 2
break;
}
default: {
//ações realizadas caso a variável não seja nenhuma das opções
}
}
30
Prof. Rodrigo Rech v.1
A variável escolhida não pode ser do tipo float ou double, apenas números inteiros ou
caracteres são aceitos. A palavra reservada “case” determina qual o bloco que será executado, de
acordo com o valor da variável escolhida. Já a palavra reservada “break”, finaliza o comando switch,
evitando que os blocos que estão após ele sejam executados. Caso o comando break não seja
utilizado, todos os blocos abaixo do case selecionado serão executados. A palavra “default” indica
que a variável não possui nenhum dos valores indicados nos cases, então este bloco é executado.
Exemplo:
Setup Loop
Escreve o menu de
Cria variável global
funcionamento dos
led LEDs
Não
Não
31
Prof. Rodrigo Rech v.1
Código:
#include <ArduinoSTL.h>
void setup() {
Serial.begin(9600);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
}
void loop() {
//Cria o menu
Serial.println("1 - Acende LED3\n2 - Apaga LED3\n3 - Acende LED4\n4 - Apaga
LED4\n5 - Acende LED5\n6 - Apaga LED5");
//recebe o valor do led
scanf("%d", &led);
Analisando o código:
Na função setup() foi configurada a comunicação serial e os pinos dos leds foram definidos
como saída.
Nesta função é gerado o menu que indica para o usuário a ação correspondente de cada
número digitado no monitor serial;
scanf("%d", &led);
O scanf() é responsável por ler e armazenar o valor digitado pelo usuário no monitor serial.
Neste caso o valor armazenado é do tipo inteiro.
32
Prof. Rodrigo Rech v.1
switch(led){
O comando switch( ) define qual a variável que será utilizada para o teste condicional.
Neste caso, a variável é a “led”, que possui o valor digitado pelo usuário e recebido pela função
scanf( ).
O comando switch é complementado pela palavra reservada “case”, que possui a função de
escolher a condição correta de acordo com o valor contido na variável “led”. Aqui o bloco foi escrito
em apenas uma linha, porém, é possível escrever normalmente em linhas separadas, desde que, ao
final do bloco, seja inserido o comando “break”.
Para finalizar foi utilizada a condição “default”. Ela entra em ação após nenhum dos casos
anteriores ser atendido. Nela não é necessário incluir o comando break, pois se trata do último
bloco que será executado.
Exercícios:
2. Crie um programa que receba 2 números e, a partir de uma escolha do usuário execute uma
das funções abaixo:
Opção Operação
1 Média entre os números
2 Apresente qual é o maior
3 Número 1 elevado ao número 2
3. Faça um programa que acenda a quantidade de leds de acordo com o número enviado pelo
usuário. Caso o número seja maior do que a quantidade de leds disponível, deve aparecer
uma mensagem de erro no monitor serial;
4. Desenvolva um programa no qual o usuário escolha quantas vezes um LED irá piscar.
Considere os intervalos de 150ms.
33
Prof. Rodrigo Rech v.1
Enquanto as entradas digitais do Arduino conseguem assumir apenas dois valores (0V
ou 5V), as entradas analógicas possuem a capacidade de realizar a leitura de infinitos valores
dentro de uma faixa pré-estabelecida. Variáveis analógicas são comuns para medir grandezas
físicas, como temperatura, vazão, pressão, entre outras.
𝑉𝑟𝑒𝑓
𝑟𝑒𝑠𝑜𝑙𝑢çã𝑜 =
2𝑛 − 1
onde Vref é a tensão de referência do conversor A/D (normalmente 5V) e n é o número de bits do
conversor. (https://www.embarcados.com.br/arduino-entradas-analogicas/)
O conversor A/D do Arduino possui 10 bits de resolução, a sua tensão de entrada pode variar
de 0V até o valor de VCC. Dessa forma, o menor valor que pode ser lido será:
5𝑉
𝑅𝑒𝑠𝑜𝑙𝑢çã𝑜 = = 4,88𝑚𝑉
210−1
Este é o valor que representa o degrau para uma conversão em 10 bits com referência em 5V.
34
Prof. Rodrigo Rech v.1
A função que deve ser utilizada para efetuar a leitura de um pino analógico do Arduino é:
Var = analogRead(pino);
Esta função retorna um valor inteiro, entre 0 e 1023, que representa a conversão do sinal
analógico lido no pino (A0 a A5). “Var” é a variável criada para receber o valor da conversão e deve
possuir um tamanho de 16 bits.
Saídas analógicas
As saídas analógicas seguem o mesmo conceito das entradas analógicas, isto é, possuem
infinitos valores dentro de uma faixa pré-estabelecida. Com isso, é possível realizar o controle de
cargas que não são binárias, como por exemplo, aumentar ou diminuir a intensidade de luz de
um LED ou controlar a velocidade de um motor de corrente contínua.
35
Prof. Rodrigo Rech v.1
É possível notar na figura 2 que, quanto maior o tempo ativo, isto é, ligado, maior é a
intensidade do LED. Esse efeito ocorre porque a frequência de chaveamento (ligado-desligado) é
alta e o componente “enxerga” este sinal como uma tensão média sobre ele.
Da mesma forma das entradas analógicas, estas saídas também são calculadas a partir
de sua resolução. No Arduino, a resolução das saídas com PWM é de 8 bits, ou seja, é possível obter
255 valores de tensão média diferentes nestes pinos, entre 0 e 5V.
Para calcular o valor exato da tensão de saída pode ser utilizada a equação:
(5 ∗ 𝑉𝑎𝑙𝑜𝑟𝑃𝑊𝑀)
𝑣𝑚𝑒𝑑𝑖𝑎 (𝑉) =
255
Onde ValorPWM é um número inteiro entre 0 e 255.
analogWrite(pino, ValorPWM);
Neste exemplo será lido um valor analógico na entrada A0 do Arduino e com ele será
controlada a intensidade de luz no LED do pino 0. Além de realizar a leitura do pino, teremos que
efetuar um ajuste de escala, já que a entrada analógica funciona com 10 bits (0 a 1023) e a saída
analógica, com 8 bits (0 a 255). O ajuste é feito a partir de uma regra de três simples:
𝐸𝑛𝑡𝑟𝑎𝑑𝑎𝐴𝑛𝑎𝑙ó𝑔𝑖𝑐𝑎 ∗ 255
𝑆𝑎í𝑑𝑎 =
1023
Para facilitar, o Arduino possui uma função de ajuste de escala que retorna o valor de uma
regra de três, assim como apresentado:
É importante destacar que, esta função realiza a conversão apenas para números inteiros.
Para números reais é necessário realizar um cálculo de regra de três utilizando os operadores
aritméticos apresentados na aula 03.
36
Prof. Rodrigo Rech v.1
Loop
Setup
Declara variáveis
globais:
valor_analógico e
Realiza a leitura do
valor_pwm pino A0
Configura
comunicação com o Envia o valor lido
PC para o computador
Envia o valor
ajustado para o
computador
FIM
Atualiza o valor do
pino 0
Atraso de 500ms
Código:
void setup() {
Serial.begin(9600);
pinMode(3, OUTPUT);
}
void loop()
{
//Faz a leitura do pino analógico
valor_analogico = analogRead(A0);
37
Prof. Rodrigo Rech v.1
Analisando o código:
Esta função realiza o ajuste de escala da variável “valor_analogico”, que possui uma faixa
de 0 a 1023, para uma escala de faixa entre 0 e 255. Dessa forma é possível utilizar a variável
“valor_pwm” para atualizar o nível de tensão média no pino 0.
analogWrite(3, valor_pwm);
Depois que a escala é ajustada, ela já pode ser utilizada para alterar o valor da tensão média
no pino 10. A partir desta função é possível ver a intensidade do LED aumentado ou diminuindo
de acordo com a posição do potenciômetro.
Exercícios:
1. Converta o valor digital lido em uma entrada analógica em tensão e apresente na tela do
computador. Utilize 2 casas decimais para a apresentação.
4. Desenvolva um programa que realize a comparação entre duas entradas analógicas (A0 e
A1), apresente a diferença na tela e acenda o LED1 caso A0>A1, LED2 caso A0<A1 ou
LED3 caso A0=A1.
38
Prof. Rodrigo Rech v.1
São utilizados para criar blocos que serão repetidos no programa enquanto uma
condição, testada periodicamente pelo bloco do laço de repetição, é verdadeira. Quando
esta condição atingir um valor e ser considerada falsa, o programa para de executar o
laço. No Arduino, a função “loop” pode ser considerada um laço de repetição, porém, incondicional.
Isso significa que a função loop é repetida infinitas vezes sem depender de uma condição.
Em linguagem C existem três tipos básicos de laços: laço “while”, laço “do-while” e laço “for”.
Laço “while”:
Início
Instruções...
Condição
Sim Instruções...
verdadeira?
Não
Fim
Neste fluxograma é possível observar que as instruções contidas no laço de repetição só serão
executadas se o teste condicional for verdadeiro. Do contrário, as instruções não serão realizadas.
O critério adotado para que uma condição seja verdadeira ou não é o mesmo utilizado nas
estruturas condicionais, com operadores relacionais e lógicos.
while(condição)
{
//Instruções realizadas caso a condição seja verdadeira
}
39
Prof. Rodrigo Rech v.1
Exemplo 1:
#include <ArduinoSTL.h>
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("Digite o numero de repeticoes:");
scanf("%d",&maximo);
Laço “do-while”:
Início
Instruções...
Sim
Instruções...
Condição
verdadeira?
Não
Fim
40
Prof. Rodrigo Rech v.1
Diferente do laço “while”, as instruções que estão dentro do bloco do “do-while” são
executadas antes da verificação da condição. Esta é feita somente ao final da primeira execução
das instruções, fazendo com que o bloco seja executado ao menos uma vez, mesmo se a condição
for falsa.
do{
//Instruções do laço
}while(condição);
Exemplo 2:
#include <ArduinoSTL.h>
int maximo=0;
int contador = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
do{
Serial.println(contador);
contador++;
delay(1000);
contador = 0;
Serial.println("A contagem terminou...");
}
Laço “for”:
41
Prof. Rodrigo Rech v.1
Início
Instruções...
Inicialização do laço
for
Instruções...
Sim
Operação de
controle do laço
for
Condição
verdadeira?
Não
Fim
42
Prof. Rodrigo Rech v.1
Exemplo 3:
#include <ArduinoSTL.h>
int maximo=0;
int contador = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
A operação de controle do laço é definida pelo programador e pode assumir qualquer tipo de
operação aritmética. Ela será executada automaticamente ao final de cada iteração do laço.
É comum que, em algumas situações, um laço de repetição tenha que ser finalizado antes
que sua condição se torne verdadeira. Um bom exemplo para isso seria em uma emergência, na
qual no meio de uma contagem um botão de “stop” tenha sido pressionado. Para que isso funcione
e o laço pare de ser executado, deve ser utilizado o comando “break”. Por exemplo:
Neste trecho de programa, o laço imprime na tela o valor atual da variável “i”. Normalmente
o laço seria finalizado apenas quando a variável fosse maior do que 10, porém, a condição do
comando “if” é verdadeira quando ela atinge o valor 5, executando, dessa forma, o comando
“break”. A partir daí o laço “for” deixa de ser executado.
43
Prof. Rodrigo Rech v.1
Serial.print("Indice: ");
Serial.println(i);
}
Aqui, a finalidade é imprimir o valor atual da variável “i” na tela. O comando “if” é
verdadeiro em duas condições: quando a variável atingir o valor 5 ou o valor 7. Em ambos os casos
será executado o comando “continue”, fazendo com que o laço seja reiniciado a partir daquele ponto.
Como resultado, aparecerá na tela a faixa de valores de 0 a 10, porém, sem apresentar os números
5 e 7.
0 1 2 3 4 6 8 9 10
Exercícios:
1. Faça um programa no qual o usuário digite o número de vezes que um LED deve piscar.
Considere um intervalo de 1s. Obs: Desenvolva o mesmo programa para os três tipos de laço.
3. Utilizando como base o programa anterior, receba dois números inteiros, no qual o primeiro
é o valor mínimo e o segundo o valor máximo da tabuada que deverá ser apresentada. Para
isso, utilize dois laços “for” aninhados. Obs: Crie um algoritmo que não permita que o
usuário digite o segundo número menor do que o primeiro.
44
Prof. Rodrigo Rech v.1
O arrays, também chamados de vetores e/ou matrizes, são variáveis que armazenam uma
quantidade “n” de valores do mesmo tipo e de forma indexada. Na prática, temos uma série de
valores organizados em posições sequenciais, sendo mais simples acessá-los.
Imagine que é necessário medir a variação de temperatura de uma sala dentro de um período
de 10 horas para verificar em que horário a sala se encontra mais quente. Podemos, para este caso,
montar uma tabela com 10 posições, nas quais serão armazenados os valores a cada 1 hora:
Hora 9h00 10h00 11h00 12h00 13h00 14h00 15h00 16h00 17h00 18h00
Temperatura
17,5 19,8 22,2 25,1 26,0 26,6 26,9 26,3 25,5 24,7
(ºC)
Com estes valores é possível realizar diversas análises, tais como: Qual o horário em que a
sala está com a menor temperatura? E a maior? Quais horários o ar-condicionado irá gastar mais
energia? Qual a média de temperatura da sala durante este horário? Em que período houve a menor
variação de temperatura?
Observe que, para realizar estas observações é necessário que se tenha o histórico dos valores
lidos pelo sensor de temperatura, e não apenas o último valor. Em programação, para se obter um
histórico dessa forma é necessário utilizar os arrays.
float temperatura[10];
45
Prof. Rodrigo Rech v.1
Aqui foram reservadas 10 posições da memória para armazenamento dos valores referentes
à variável “temperatura”. Para acessar cada uma das posições devem ser utilizados os índices
referentes a cada uma, começando no 0:
Índice 0 1 2 3 4 5 6 7 8 9
Temperatura
17,5 19,8 22,2 25,1 26,0 26,6 26,9 26,3 25,5 24,7
(ºC)
É possível atribuir os valores referentes a cada posição do vetor durante sua declaração ou
no decorrer do programa:
1- Durante a declaração:
2- Na execução do programa:
numero[0] = 32;
numero[1] = 56;
numero[2] = 13;
numero[3] = 22;
numero[4] = 9;
Além de vetores, também é possível declarar matrizes com 2 ou mais dimensões utilizando
a seguinte sintaxe:
O acesso aos seus dados é feito de forma semelhante aos vetores, e seus índices também
iniciam com 0. Abaixo é mostrado como fica organizada uma matriz 3x3:
Linha Coluna 0 1 2
0 Valor_00 Valor_01 Valor_02
1 Valor_10 Valor_11 Valor_12
2 Valor_20 Valor_21 Valor_22
O acesso às posições das linhas e colunas de uma matriz de 2 ou mais dimensões segue o
mesmo padrão de um vetor. Os valores podem ser inicializados já na declaração ou durante a
execução do programa:
1- Durante a declaração:
2- Na execução do programa:
46
Prof. Rodrigo Rech v.1
matriz[0][0] = 32;
matriz[0][1] = 56;
matriz[0][2] = 13;
matriz[1][0] = 22;
matriz[1][1] = 12;
matriz[1][2] = 65;
matriz[2][0] = 10;
matriz[2][1] = 8;
matriz[2][2] = 1;
Exemplo 1: Neste exemplo serão armazenados 5 números digitados pelo usuário em um vetor. Ao
final, eles deverão ser apresentados na tela:
#include <ArduinoSTL.h>
//Declaração do vetor
unsigned int numeros[5];
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("Este programa armazena 5 valores em um vetor: ");
Serial.print("Numero ");
Serial.print(indice+1);
Serial.print(" :");
47
Prof. Rodrigo Rech v.1
Exemplo 2: Neste exemplo será mostrado como preencher e apresentar os valores de uma matriz
3x3.
#include <ArduinoSTL.h>
//Declaração da matriz
unsigned int matriz[3][3];
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("Este programa armazena 9 valores distribuídos em uma matriz 3x3: ");
48
Prof. Rodrigo Rech v.1
Os displays de 7 segmentos são formados por LEDs dispostos de uma forma que,
dependendo da sequência acionada, formam um número de 0 a 9 ou 0 a F. Podem ser encontrados
displays de anodo comum ou catodo comum (figura 2).
Em um display de catodo comum, é necessário nível lógico ‘1’ nos segmentos para que eles
acendam. Já no display de anodo comum, é necessário nível ‘0’.
No circuito que iremos trabalhar os segmentos estão ligados nos pinos 0 a 7 do Arduino,
sendo o pino 0 o seguimento ‘a’ e o pino 7 o ponto decimal (figura 3).
O display utilizado neste circuito é catodo comum, isto é, para acionar os segmentos é
necessário que os pinos do Arduino estejam em nível lógico ‘1’.
Para facilitar o acionamento do display com os dígitos de 0 a F, é criada uma tabela com o
estado lógico de cada segmento para cada dígito.
49
Prof. Rodrigo Rech v.1
#include <ArduinoSTL.h>
int num = 0;
int pino = 0;
void setup() {
Serial.begin(9600);
pinMode (8, OUTPUT);
//Define os pinos 0 - 7 como saídas
for(int i=0; i<8; i++){
pinMode(i, OUTPUT);
}
void loop() {
Serial.println("Digite o numero que deseja ver no display: ");
scanf("%d", &num);
50
Prof. Rodrigo Rech v.1
Exercícios:
2. Crie um programa onde um vetor já é inicializado com 5 caracteres, depois, peça para que
o usuário digite outros 5 caracteres e os armazene em um outro vetor. Caso todos os
caracteres forem iguais, apresenta uma mensagem de correto, caso diferente, incorreto.
3. Desenvolva um programa que preencha uma matriz 3x3 e calcule sua determinante.
4. Crie um contador de 0 a 9 que deve ser incrementado e decrementado pelos botões ligados
em A2 e A3 (ao pressionar e soltar o botão).
Dica: Utilize como base o exercício 5 da aula de estruturas condicionais e não esqueça de
ativar os resistores de pullup dos pinos.
5. Faça um programa que armazene os valores lidos de uma entrada analógica cada vez que
um botão é pressionado e solto. O total de valores lidos deve ser de 10. Ao finalizar as
leituras o programa deve enviar pela serial: A0[número da leitura] = valor lido; Ex. A0[3]
= 234;
51
Prof. Rodrigo Rech v.1
Funções são sub-rotinas que executam determinadas tarefas e podem ser chamadas sempre
que necessário, alguns exemplos são as funções printf(), scanf() e pow(), estas já criadas e
utilizadas nos programas, desde que as bibliotecas que as possuem sejam inseridas no cabeçalho.
Toda função criada pode receber ou retornar um valor da função principal, para isso, basta
informar o tipo de dado que irá enviar, receber ou ambos. Abaixo é demonstrada a sintaxe de criação
de uma função:
OBS: Uma função pode receber quantos argumentos forem necessários, separados por vírgula,
porém, pode retornar apenas um valor.
As funções podem ser criadas diretamente no arquivo do projeto, junto da função main, ou
então, em outros arquivos .c ou .h. Na segunda opção é necessário adicionar a biblioteca no
cabeçalho do arquivo principal com a diretiva #include “endereço do arquivo .h”, neste caso não
foram utilizados os símbolos < e >, pois o arquivo .h está em alguma pasta do computador e não
é nativo do compilador.
Outro detalhe importante se dá pelo fato de ser necessário criar os protótipos das
funções, que nada mais é do que inserir os nomes das funções com “;” no final para indicar
ao compilador que aquela função existe naquele arquivo. Estes protótipos não precisam
ser adicionados caso as funções sejam criadas antes da função “main”.
52
Prof. Rodrigo Rech v.1
Como exemplo, será criada uma função responsável por receber quatro argumentos e
retornar a média aritmética para o programa principal:
Caso seja necessário utilizar esta função dentro da “main”, basta colocar seu nome e os
argumentos necessários:
void main()
{
float nota_1, nota_2, nota_3, nota_4, media_final;
media_final = media(nota_1,nota_2,nota_3,nota_4);
}
Variáveis globais
A melhor forma para enviar valores de variáveis para uma função é por meio dos
argumentos, porém, como foi visto neste tópico, uma função tem a capacidade de retornar apenas
um valor, então, se fosse necessário retornar dois ou mais valores, ou então receber um vetor como
argumento? A forma mais simples para resolver estes problemas é utilizando variáveis globais.
As variáveis globais são criadas fora de qualquer função, por isso podem ser lidas e
modificadas em qualquer parte do programa. Ao criar uma variável global deve se prestar atenção
em alguns detalhes:
a. Não poderá existir outra variável com o mesmo nome no programa inteiro, se existir, o
compilador definirá a prioridade para a variável local;
b. Variáveis locais (aquelas criadas dentro da própria função) são apagadas da memória
sempre que a função acaba de ser executada, liberando espaço da memória RAM. Já as
variáveis globais não são apagadas, ou seja, possuem um endereço fixo na memória durante
toda a execução do programa. Este detalhe não é extremamente impactante em programas
pequenos para computadores, porém, em dispositivos com uma capacidade de memória
menor é um agravante, por isso a recomendação de se evitar variáveis globais sempre que
possível;
c. Variáveis globais podem ser modificadas a qualquer momento e em qualquer função, por
isso deve se tomar cuidado para não alterar seus valores em momentos indesejáveis.
53
Prof. Rodrigo Rech v.1
Exemplo 1:
#include <ArduinoSTL.h>
void setup() {
Serial.begin(9600);
}
void loop() {
int a;
char b;
Serial.println();
Serial.println();
mostra_dobro(3.5); //Apresenta o resultado do dobro na tela
char maiusculo(char l)
{
if(l >= 'a' && l <= 'z')
return l - 32; //Ajusta o valor de acordo com a tabela ASCII
else
return l;
}
void mostra_dobro(double v)
{
Serial.print("O valor do dobro e: ");
Serial.println(2*v);
}
54
Prof. Rodrigo Rech v.1
Exemplo 2:
#include <ArduinoSTL.h>
void setup() {
Serial.begin(9600);
}
void loop() {
int x = 7, y = 10, z = 9, maior;
double vetor[] = {1.2, 3.1, 4.6, 8.9, 7.5, 2.2};
Serial.print("Media = ");
Serial.println(media(vetor, 6),2); //Mostra a media dos valores do vetor
while(1);
}
/* definicoes das funcoes */
int maximo(int a, int b, int c)
{
if(a > b && a > c)
return a;
else if(b > a && b > c)
return b;
else
return c;
}
55
Prof. Rodrigo Rech v.1
Exemplo 3:
//Protótipo da função
float calcula_temperatura(unsigned int valor_AD);
void setup() {
Serial.begin(9600);
}
void loop() {
float temperatura;
resultado = (valor_AD/1023.0)*100;
return resultado;
}
Exercícios:
1. Desenvolva uma função que verifique se um número é par ou ímpar. Ela deve retornar “0”
caso seja par, e “1” caso seja ímpar;
2. Agora, crie uma função que retorne “1” caso um número seja primo e “0”, caso não seja;
3. Faça uma função que receba por parâmetro o raio de uma esfera e retorne o seu volume;
4. Crie uma função que retorne o número do botão pressionado (1, 2 ou 3). Caso nenhum
tenha sido pressionado, a função deve retornar o valor 0.
5. Desenvolva uma função que retorne a diferença de tensão entre as duas entradas
analógicas (A0 e A1).
56