Conceitos de Programação I
Os pilares da linguagem C++ para o desenvolvimento de sistemas inteligentes.
Conceitos Básicos de Programação
Vamos explorar os fundamentos da linguagem utilizada para programar o Arduino. Se você já está familiarizado com alguma linguagem de programação, pode simplesmente realizar uma adaptação para este novo ambiente.
Variáveis e Constantes
Declaramos como constante um objeto cujo valor não precisa ser modificado durante todo o processamento. Existem duas formas principais de declaração:
const int LED = 10; // Utilizando a palavra reservada CONST
#define PINO_A 10 // Utilizando a diretiva DEFINE
Palavras Reservadas
Em C++, certas palavras têm significados específicos para o compilador:
TRUE / FALSE LógicaHIGH / LOW Tensão (5V / 0V)INPUT / OUTPUT Fluxo da PortaAs variáveis armazenam dados na memória e seu conteúdo pode variar. Regras de nomenclatura:
- Deve iniciar com uma letra.
- Não pode conter caracteres especiais (*, %, @) ou espaços.
- Dica: Utilize o underline (_) para separar palavras.
executar_Led = false; // Exemplo de atribuição
Tipos de Variáveis
| Tipo | Memória | Descrição / Exemplo |
|---|---|---|
| bool | 1 byte | true (1) ou false (0) |
| char | 1 byte | Letras ou números (-128 a 127) |
| byte | 1 byte | 0 a 255 |
| int | 2 bytes | Inteiros (-32.768 a 32.767) |
| long | 4 bytes | Até 32 bits (números grandes) |
| float | 4 bytes | Ponto flutuante (decimais) |
| String | Variável | Coleção de caracteres |
Declaração de Variáveis
A atribuição de valores para as variáveis e constantes são realizados com o uso do operador =.
int efeito = 3; // atribuição do valor 3 para efeito
int contraste = 0; // atribuição do valor 0 para contraste
boolean aumenta = true; // atribuição true para aumenta
Vetores e Matrizes
Conhecidas como "variáveis vetoriais", permitem armazenar mais de um valor simultaneamente.
Vetores (Unidimensionais)
int pinLed[3] = {2,3,4}; // Criar vetor de tamanho 3
pinLed[0] = 2; // Atribuir valor à posição 0
Para acessar um valor em uma determinada posição do vetor, basta indicar a sua localização (índice).
pinMode(pinLed[0], OUTPUT);
Matrizes (Bidimensionais)
Possuem linhas e colunas. Exemplo de matriz 4x4:
Para atribuir um valor a uma determinada posição da matriz, basta usar o índice (linha e coluna).
teclas[0][3] = 'A'; // Atribuição: Linha 1, Coluna 4
Um exemplo completo demonstrando como declarar, inicializar e acessar elementos de uma matriz no Arduino:
Operadores
Além dos dados existentes em um processamento de um programa, temos também os operadores. Esses elementos indicam a realização de uma operação sobre os tipos de dados, gerando um resultado. O termo operador é o elemento que indica a realização da operação.
Operadores Aritméticos
Os operadores aritméticos são utilizados nos cálculos matemáticos, são os responsáveis pelas operações matemáticas realizadas no computador. No próximo quadro, iremos mostrar como utilizar os operadores e o grau de prioridade em um cálculo matemático.
Operadores Relacionais
Os operadores relacionais permitem que sejam feitas comparações entre dois elementos, tendo como resultado um valor lógico (Verdadeiro ou Falso). Através do resultado da comparação, é possível determinar qual caminho um processamento vai seguir. Os operadores relacionais possuem o mesmo grau de prioridade entre si.
Operadores Lógicos
Da mesma forma que os operadores relacionais, os operadores lógicos retornam como resultado um dos dois valores lógicos: verdadeiro ou falso. Os operadores lógicos podem ser: conjunção (AND); disjunção (OR); e negação (NOT).
CONJUNÇÃO (&&)
Verdadeiro somente se AMBOS forem verdadeiros.
if (x==2 && y==10)
DISJUNÇÃO (||)
Verdadeiro se PELO MENOS UM for verdadeiro.
if (x==2 || y==10)
NEGAÇÃO (!)
Verdadeiro se o argumento for falso ou falso se o argumento for verdadeiro
if (!(valor > 10)) // Verdadeiro se 'valor' for (<= 10)
Tabela - Operador Lógico de Conjunção
Tabela - Operador Lógico de Disjunção
Tabela - Operador Lógico de Negação
if (x==2 || y==10 && k == 20) {......}
Grau de Prioridades
Os cálculos seguem a ordem da esquerda para a direita, respeitando os parênteses.
Funções
No Arduino é possível controlar o intervalo de execução dos componentes através das Funções.
Funções de Temporização
No Arduino, controlar o tempo é essencial para coordenar ações. Podemos fazer isso de forma simples (bloqueante) ou avançada (não bloqueante).
Função delay()
A maneira mais simples de pausar o programa. Ela suspende a execução por um período em milissegundos (ms).
delay(1000);// Aguarda 1 segundo (programa fica "parado")
Função millis()
Retorna o tempo decorrido desde o boot. Ideal para multitarefa, pois não interrompe a execução de outras instruções.
unsigned long tempoInicial = millis(); while (millis() - tempoInicial < 5000) { // Executa algo por 5 seg sem travar o processador}
Interrupções de Tempo (TimerOne)
Para tarefas que exigem precisão absoluta, utilizamos bibliotecas de Timer para executar códigos em intervalos exatos, independentemente do que o loop principal está fazendo.
#include <TimerOne.h>
void setup() {
Timer1.initialize(1000000); // Configura temporização para 1 segundo (em microssegundos)
Timer1.attachInterrupt(timerCallback); // Chama a função timerCallback a cada segundo
}
void loop() {
// Outras operações aqui
}
void timerCallback() {
// Código a ser executado a cada segundo
}
Funções Matemáticas
Utilizadas para processamento de sinais de sensores, cálculos de trajetórias e lógica avançada.
Trigometria
Calculadas em radianos:
sin(x),cos(x),tan(x)
Potência e Raiz
pow(base, exp): Potênciasqrt(x): Raiz Quadrada
Funções de Arredondamento e Valor Absoluto:
abs(x): Calcula o valor absoluto de x.ceil(x): Arredonda x para cima (próximo inteiro).floor(x): Arredonda x para baixo (próximo inteiro).round(x): Arredonda x para o inteiro mais próximo.
int valorAbsoluto = abs(-5); // 5
float arredondaCima = ceil(2.3); // 3.0
float arredondaBaixo = floor(2.7); // 2.0
float arredonda = round(2.5); // 3.0
Função map():
Indispensável na robótica para reescalar intervalos (ex: converter leitura de sensor em brilho de LED).
A função tem a seguinte assinatura:
long map(long x, long in_min, long in_max, long out_min, long out_max);
Ela mapeia o valor x do intervalo [in_min, in_max] para o intervalo [out_min, out_max].
// Converte 0-1023 (Sensor) para 0-255 (PWM)
int output = map(analogRead(A0), 0, 1023, 0, 255);
analogWrite(9, output);
Números Aleatórios
Para simular comportamentos imprevisíveis ou jogos:
randomSeed(analogRead(0));// "Embaralha"
int valor = random(1, 100); // Sorteia entre 1 e 99
Manipulação de Caracteres e Strings
Essencial para comunicação serial, displays LCD e processamento de mensagens de texto.
isAlpha()LetraisDigit()NúmeroisAlnum()AlfanuméricoA Classe String
Permite manipular textos de forma dinâmica no Arduino:
String texto = " Arduino ";
texto.trim(); // Remove espaços
texto.toUpperCase(); // Fica MAIÚSCULO
int tam = texto.length(); // Retorna o tamanho
Comentários
Geralmente é necessário comentar as linhas dos códigos de um programa. Utilizaremos duas maneiras:
// Comentário de linha única
/* Comentário de bloco
para múltiplas linhas
*/