Basicamente uma função matemática pode ser entendida como uma caixa onde valores são transformados. Ou seja, a função tem uma entrada ou várias para os valores, dentro da caixa os valores são transformado e posteriormente retornados os resultado desta transformação.
Por exemplo, a função acima recebe maças, corta essas maçãs ao meios, e retorna as metades cortadas.
A função acima soma 2 ao número (x) que entra e retorna o resultado.
Já a função acima tem 2 valores de entrada e retorna apenas 1 valor.
Funções no Arduino
Uma função no Arduino é, em linhas gerais, uma sequência de comandos que pode ser reutilizada várias vezes ao longo de um programa.
Por exemplo. A função abaixo gera uma espera de 250 ms. Esse código pode ser utilizado (chamado) várias vezes durante a execução de um Sketch.
void espera(){
delay(250);
}
Existem duas funções que são obrigatórias em um Sketch: a função setup() e a função loop(), as outras funções são opcionais.
As vantagens de se trabalhar com funções
- Funções ajudam o programador permanecer organizado. Isso ajuda também a deixar claro o conceito do programa.
- Funções codificam a tarefa em um único lugar, para que a funcionalidade seja pensada e depurada uma única vez.
- As chances de erros em modificações reduzem drasticamente no caso do código precisar ser alterado.
- Funções reduzem o tamanho dos Sketches (projetos criados na IDE do Arduino, do inglês: rascunhos), pois seções de código podem ser reutilizadas diversas vezes.
- Elas também tornam mais fácil reutilizar código, tornando-o mais modular, e com um efeito colateral benéfico: fica mais agradável de ler o código.
Criando funções
Funções no Arduino precisam ser criadas fora das chaves ({ }) das funções Setup e Loop. Uma boa prática é criar uma nova aba na interface IDE do Arduino para as funções.
Sketch com aba só para funções
Para se criar uma função precisamos primeiramente declarar essa função.
Veja como uma função é declarada:
void setup() { // declaração da função setup
pinMode(13, OUTPUT);
}
void loop() { // declaração da função loop
digitalWrite(13, HIGH);
espera();
digitalWrite(13, LOW);
espera();
}
void espera(){ // declaração da função espera
delay(250);
}
A palavra void na declaração da função significa que essa não retorna valores.
A palavra "espera" na função acima é o nome que damos a essa função.
Em seguida temos os parênteses ( ). Quando a função não recebe valores, esses parênteses estão vazios.
Em seguida temos as chaves { } onde é inserido o código da função.
A função espera() acima pode ser escrita assim:
void espera(){ delay(250);}
ou assim:
void espera(){
delay(250);
}
Porém para facilitar a leitura e entendimento, é preferível se utilizar a segunda opção.
Chamada das funções
Para se chamar uma função, basta colocarmos no nosso código o nome da função que foi declarado.
Interessante observar que as funções setup() e loop() não precisam ser chamadas pois são executadas automaticamente.
Por exemplo:
void loop() {
digitalWrite(13, HIGH);
espera(); // chamada da função espera
digitalWrite(13, LOW);
espera(); // chamada da função espera
}
A chamada de uma função pode estar localizada dentro de outra função:
void espera2(){
delay(500);
espera();
}
Imagem
Algumas funções recebem valores para serem transformados ou simplesmente utilizados dentro da função.
Na nossa função espera(), se quisermos que o valor a ser utilizado por delay() seja informado a cada chamada da função, então informamos esse valor atraves de uma variável (chamada "tempo").
É fundamental declarar dentro do parêntese essa nova variável com o tipo de dado correspondente.
Veja a declaração da função agora:
void espera(int tempo){ // declaração da função espera,
delay(tempo);
}
Essa função continua não retornando valores, porém receberá na sua chamada o valor para a variável tempo.
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH);
espera(1000);
digitalWrite(13, LOW);
espera(500);
}
void espera(int tempo){ // declaração da função e da variável tempo
delay(tempo);
}
É possível que uma função tenha que receber mais de um valor. Neste caso, a sua declaração seria assim:
void espera(int tempo1, int tempo2){ // declaração da função e de suas entradas
delay(tempo1);
delay(tempo2);
}
Funções que retornam valores
As funções que retornam valores precisam ser declaradas com o tipo de dado que será retornado.
Alguns tipos de dados possíveis são:
- int: -32,768 e 32,767.
- long: -2,147,483,648 a 2,147,483,647
- unsigned long: 0 a 4,294,967,295
- float: valores fracionários: 3.1542, 2.558, 151,778.98
- boolean: verdadeiro ou falso
- char: caractéres da tabela ASCII como "A", "c", etc.
Exemplo:
long incrementa(long t, int inc){ // a função retorna um número long e recebe 2 valores
t = t + inc;
return t; // variável a ser retornada
}
Veja esse exemplo em um Sketch:
long tempo = 100;
void setup() {
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH);
delay(50);
digitalWrite(13, LOW);
delay(tempo);
tempo = incrementa(tempo, 100); // chama a função "incrementa" e passa 2 valores
}
long incrementa(long t, int inc){ // declara a função que retorna um long e recebe 2 valores
t = t + inc; // processa os valores recebidos
return t; // retorna o resultado
}
Video Aula
Exercícios:
1) Abra o exemplo Blink e substitua todo o código dentro da função Loop por uma função em uma nova aba do Sketch.
2) Crie um Sketch com uma função que calcula o tempo em segundos desde a última vez que um botão foi pressionado e envia essa informação pela serial.
3) Crie um Sketch com uma função que é chamada sempre que um número aleatório especifico for sorteado pela função random().
4) O que faz a seguinte função?
int Func_selec(int X) {
if (X < 20) {
X = X + 15;
return X;
}
else {
return 0;
}
}