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:

Exemplos de Constantes
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ógica
HIGH / LOW Tensão (5V / 0V)
INPUT / OUTPUT Fluxo da Porta

As 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

TipoMemóriaDescrição / Exemplo
bool1 bytetrue (1) ou false (0)
char1 byteLetras ou números (-128 a 127)
byte1 byte0 a 255
int2 bytesInteiros (-32.768 a 32.767)
long4 bytesAté 32 bits (números grandes)
float4 bytesPonto flutuante (decimais)
StringVariávelColeçã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 =.

Exemplos de Declaração de Variáveis
                
                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:

Exemplo de Matriz

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:

Exemplo de Matriz

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.

Exemplo de Operadores Aritméticos

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.

Exemplo de Operadores Relacionais

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 Conjução

Tabela - Operador Lógico de Disjunção

Tabela Disjunção

Tabela - Operador Lógico de Negação

Tabela Negação
As condições podem aparecer de forma aninhada.
                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.

Exemplo de Operadores Relacionais

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ência
  • sqrt(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()Letra
isDigit()Número
isAlnum()Alfanumérico

A 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 
            */