📚 Cartilha de Programação — Edição 2.0
ARDUINO
Cartilha para Programação em C/C++
Baseada na obra de João Alexandre da Silveira — Revista do Arduino
ATmega 328P LED 13
⚡ Arduino UNO / Nano 🔌 C / C++ 📡 Comunicação Serial 🔢 Pinos Digitais e Analógicos 🔄 Controle de Fluxo
📋 Índice
Conteúdo da Cartilha
A
Estrutura da Linguagemsetup(), loop(), símbolos
A.1
Constantes e VariáveisTRUE/FALSE, HIGH/LOW, tipos
A.2
Matrizes (Arrays)Declaração, leitura e escrita
A.3
Lógica e AritméticaOperadores e comparações
A.4
Funções de Tempo e Matemáticadelay, millis, map, random
A.5
Controle de Fluxoif, while, for, switch, ternário
B.1
Pinos DigitaispinMode, digitalRead/Write
B.2
Pinos AnalógicosanalogRead, analogWrite, PWM
B.3
Porta SerialSerial.begin, print, read
B.4
Pinos de Alimentação3.3V, 5V, Vin, GND, RESET
💻
Parte A — A Linguagem do ArduinoEstrutura, variáveis, operadores e controle de fluxo em C/C++
⚙️ Lição A
A Estrutura da Linguagem

A estrutura básica do Arduino é formada por dois blocos obrigatórios que carregam outras funções escritas em C/C++. Sem eles, nenhum programa funciona!

Os dois blocos
setup()Roda UMA ÚNICA VEZ ao ligar. Configura pinos e inicia a serial. É a função de preparação.
loop()Roda PARA SEMPRE, repetidamente. Lê entradas e controla saídas. É o coração do programa.
estrutura_basica.ino — o esqueleto de todo programa Arduino
/*
  Exemplo: setup() abre a serial; loop() transmite
  "Hello World!" a cada 2 segundos.
*/

void setup() {
  Serial.begin(9600); // inicia porta serial em 9600 bps
}

void loop() {
  Serial.println("Hello World!"); // transmite frase
  delay(2000);                      // pausa 2 segundos
}
os 4 símbolos essenciais
{ }bloco de código
;fim de instrução
//comentário 1 linha
/*...*/comentário multi-linha
📌
Funções

Em C, funções são blocos reutilizáveis com um tipo de retorno, um nome e parâmetros entre parênteses. O tipo void significa que a função não retorna nenhum valor.

⚠️
Declaração obrigatória

Toda função criada pelo programador deve ser declarada antes de ser chamada. Você pode declarar apenas o cabeçalho no início e escrever o corpo depois do loop().

🔤 Lição A.1
Constantes e Variáveis

Constantes são valores fixos que nunca mudam. No Arduino há 3 grupos, e cada par pode ser representado por 1 e 0 em binário:

TRUE / FALSEestados lógicos
HIGH / LOWtensão nos pinos
INPUT / OUTPUTdireção dos pinos
💡
Como lembrar

HIGH = 5 volts no pino digital. LOW = 0 volt (terra). TRUE = qualquer valor diferente de zero. FALSE = sempre zero.

tipos de variáveis
byte0 a 255 (8 bits)
intinteiro 16 bits
longinteiro 32 bits
floatdecimal 32 bits
booleantrue / false
charum caractere
variaveis_escopo.ino — global vs. local
int i = 0;          // variável GLOBAL — visível em todo o programa
void ledOn();        // declaração prévia da função criada

void setup() {
  pinMode(10, OUTPUT);
}

void loop() {
  for (i=0; i <= 255; i++) ledOn();  // aumenta brilho
  for (i=255; i >= 0; i--) ledOn();  // diminui brilho
}

void ledOn() {           // usa 'i' que é global
  analogWrite(10, i);  // brilho proporcional a i
  delay(10);
}
🧠
Escopo da variável

Declarada antes do setup() → é Global (todo o programa a enxerga). Declarada dentro de uma função → é Local (só essa função a enxerga). Use globais só quando realmente necessário!

📦 Lição A.2
Matrizes (Arrays)

Matrizes são coleções de variáveis do mesmo tipo armazenadas em posições contíguas de memória. Cada posição é acessada por um índice — e o primeiro índice é sempre 0!

matrizes.ino — declaração e acesso
// Declaração com inicialização dos valores
int nomeMatriz[] = { 16, 32, 64, 128, 255 };

// Declaração só com tamanho (sem valores iniciais)
int notas[10]; // reserva 10 posições para inteiros

// Escrevendo na 4ª posição (índice 3)
nomeMatriz[3] = 200;

// Lendo a 5ª posição (índice 4) e guardando em x
int x = nomeMatriz[4]; // x = 255

// Percorrendo a matriz inteira com for
for (int i = 0; i < 5; i++) {
  Serial.println(nomeMatriz[i]);
}
🚨
Índice começa em ZERO!

Uma matriz com 5 elementos tem índices de 0 a 4. Acessar o índice 5 é um erro que causa comportamento imprevisível no Arduino. Cuidado sempre!

🎵
Uso prático

Matrizes são perfeitas para guardar sequências de notas musicais, padrões de LEDs, leituras de sensores ao longo do tempo, ou comandos em sequência para um servo motor.

➕ Lição A.3
Lógica e Aritmética

O Arduino herda da linguagem C todos os operadores aritméticos e lógicos. Aqui estão os mais usados:

operadores aritméticos e símbolos compostos
+ - * /aritmética básica
x++x = x + 1
x--x = x - 1
x += yx = x + y
x -= yx = x - y
x *= yx = x * y
x /= yx = x / y
operadores de comparação
x == yigual a
x != ydiferente de
x < ymenor que
x > ymaior que
x <= ymenor/igual
x >= ymaior/igual
operadores lógicos
&&AND — porta E
||OR — porta OU
!NOT — porta NÃO
🚨
O erro mais comum!

= é atribuição (guarda um valor). == é comparação (pergunta se são iguais). Usar = dentro de um if em vez de == é o erro número 1 dos iniciantes — e o compilador às vezes nem avisa!

⚡ Experimento rápido

No Monitor Serial, mostre o resultado de: x++ 10 vezes, depois x-- 10 vezes — e observe o padrão. Depois teste && e || combinando duas condições ao mesmo tempo.

⏱️ Lição A.4
Funções de Tempo e Matemática

O Arduino tem funções embutidas para controlar o tempo, gerar números aleatórios e fazer conversões de faixas. São essenciais para praticamente todo projeto!

Função Exemplo e Resultado Observações
delay(ms) delay(1000);
Pausa de 1 segundo exato.
Congela TUDO por esse período. Nenhuma outra função roda. Equivale ao HALT do Assembly.
delayMicroseconds(us) delayMicroseconds(500);
Pausa de 500 microssegundos.
Para pausas muito curtas. Mesma limitação do delay().
millis() long t = millis();
Guarda ms desde o boot.
Não congela o programa! Reinicia após ~9 horas de uso contínuo.
random(min, max) int v = random(100,400);
Número entre 100 e 399.
O parâmetro min é opcional (padrão = 0). O max nunca é incluído.
abs(x) float v = abs(-3.14);
Resultado: 3.14
Retorna o valor absoluto (sem sinal).
map(val,min1,max1,min2,max2) int v = map(analogRead(A0), 0,1023, 0,255); Converte uma faixa de valores para outra. Pode inverter: map(x,1,100,100,1).
🔥
map() — o canivete suíço

A função map() é uma das mais poderosas: converte a leitura analógica (0–1023) para o brilho do LED (0–255), a posição de um sensor para ângulo de servo, temperatura em porcentagem... As possibilidades são infinitas!

millis_sem_delay.ino — piscar LED sem travar o programa
unsigned long ultimoTempo = 0;
int estado = LOW;

void loop() {
  if (millis() - ultimoTempo >= 500) { // 500ms passaram?
    ultimoTempo = millis();
    estado = (estado == LOW) ? HIGH : LOW;   // inverte
    digitalWrite(13, estado);
  }
  // Aqui você pode fazer outras coisas enquanto o LED pisca!
}
🔀 Lição A.5
Controle de Fluxo

As estruturas de controle de fluxo, herdadas da linguagem C/C++, determinam quais instruções serão executadas e quantas vezes. São o núcleo da lógica de qualquer programa!

if — if...else — if...else if

O comando if

EXPRESSÃO verdadeira? SIM BLOCO NÃO

O comando if...else

EXPRESSÃO verdadeira? SIM BLOCO 1 NÃO ELSE
if_elseif.ino — múltiplas condições encadeadas
int temperatura = 35;

if (temperatura > 40) {
  Serial.println("ALERTA: temperatura crítica!");
} else if (temperatura > 30) {
  Serial.println("Temperatura alta.");
} else if (temperatura > 20) {
  Serial.println("Temperatura normal.");
} else {
  Serial.println("Temperatura baixa.");
}
while — do...while — for

while — testa antes

EXPRESSÃO verdadeira? SIM BLOCO LOOP LOOP NÃO

do...while — executa ao menos 1x

BLOCO LOOP EXPRESSÃO verdadeira? LOOP SIM NÃO
for_contador.ino — estrutura completa do for
// for (variável; condição; incremento)
for (int i = 0; i <= 10; i++) {
  Serial.println(i); // imprime 0, 1, 2 ... 10
  delay(1000);
}

// Também funciona de trás para frente!
for (int i = 255; i >= 0; i--) {
  analogWrite(9, i); // LED apagando gradualmente
  delay(8);
}
switch...case e operador ternário
switch_case.ino — alternativa elegante ao if...else if
int modo = 2;

switch (modo) {
  case 1:
    Serial.println("Modo 1: LED piscando devagar");
    break; // ESSENCIAL! Sem break, cai no próximo case
  case 2:
    Serial.println("Modo 2: LED piscando rápido");
    break;
  case 3:
    Serial.println("Modo 3: LED apagado");
    break;
  default:        // se nenhum case for verdadeiro
    Serial.println("Modo desconhecido!");
}

// Operador ternário — if...else em uma linha só:
// (condição) ? valor_se_verdadeiro : valor_se_falso
int x = 8;
int y = (x > 10) ? 15 : 20; // y = 20 (pois 8 não é > 10)
⚠️
Não esqueça o break!

No switch...case, cada case precisa terminar com break;. Sem ele, o código "cai" no próximo case e continua executando — comportamento quase sempre indesejado!

🔌
Parte B — Hardware do ArduinoPinos digitais, analógicos, serial e alimentação
🗺️ Mapa
Entradas e Saídas do Arduino

O Arduino UNO possui 4 grupos de pinos, cada um com função e comandos específicos em C:

⬆️ Pinos Digitais (0–13)

  • pinMode()
  • digitalRead()
  • digitalWrite()
  • analogWrite() — pinos PWM ~
  • attachInterrupt()
  • pulseIn()

〰️ Pinos Analógicos (A0–A5)

  • analogRead()
  • Lê 0–5V → valor 0–1023
  • 10 bits de resolução
  • Podem virar digitais via pinMode()

📡 Porta Serial (USB)

  • Serial.begin()
  • Serial.end()
  • Serial.available()
  • Serial.read()
  • Serial.print()
  • Serial.println()

⚡ Pinos de Alimentação

  • 3.3V — saída 50mA máx.
  • 5V — alimentação principal
  • GND — terra (2 pinos)
  • Vin — entrada 9–15V
  • RESET — reinicia o Arduino
🔢 Lição B.1
Os Pinos Digitais

São 14 pinos (0 a 13) que operam em dois estados: HIGH (5V) ou LOW (0V). Antes de usar, é preciso configurar a direção com pinMode() dentro do setup().

🔆
Pinos PWM (~)

Os pinos 3, 5, 6, 9, 10 e 11 são marcados com ~ na placa e suportam analogWrite() para simular tensão analógica via PWM (Modulação por Largura de Pulso). Valores de 0 a 255.

FunçãoExemplo e ResultadoObservações
pinMode(pino, modo) pinMode(2, OUTPUT);
Pino 2 configurado como saída.
Sempre no setup(). Use INPUT ou OUTPUT. Existe também INPUT_PULLUP.
digitalRead(pino) int chave = digitalRead(3);
Guarda HIGH ou LOW em 'chave'.
Pino deve estar configurado como INPUT com pinMode().
digitalWrite(pino, val) digitalWrite(2, HIGH);
Coloca 5V no pino 2.
Pino deve ser OUTPUT. Use LOW para colocar 0V.
analogWrite(pino, val) analogWrite(10, 128);
~2.5V no pino 10 (PWM).
Só nos pinos PWM (~). Valor 0–255. Não precisa de pinMode().
attachInterrupt(pino,fn,modo) attachInterrupt(0, contador, RISING); Pino 0→digital 2, pino 1→digital 3. Modos: LOW, CHANGE, RISING, FALLING.
pulseIn(pino, val) pulseIn(4, HIGH);
Mede largura do pulso HIGH no pino 4.
Retorna microssegundos. Terceiro parâmetro opcional: timeout em µs.
botao_led.ino — LED acende quando botão é pressionado
void setup() {
  pinMode(2, OUTPUT);  // LED no pino 2 como saída
  pinMode(3, INPUT);   // Botão no pino 3 como entrada
}

void loop() {
  int chave = digitalRead(3); // lê estado do botão
  digitalWrite(2, chave);      // passa estado para o LED
}

// Versão ultra-compacta (mesma coisa em 1 linha):
// digitalWrite(2, digitalRead(3));
⚡ Projeto: Semáforo com for

Monte 3 LEDs (vermelho=pino 11, amarelo=10, verde=9). Use analogWrite() para fazer um fade: o verde vai de 0 a 255 enquanto o vermelho vai de 255 a 0. Use map() para calcular um a partir do outro!

〰️ Lição B.2
Os Pinos Analógicos

São 6 pinos (A0 a A5) dedicados à leitura de sinais analógicos — tensões que variam continuamente entre 0 e 5V. O conversor A/D de 10 bits transforma essa tensão em um número de 0 a 1023.

Na prática
0V no pinoanalogRead() retorna 0
2.5V no pinoanalogRead() retorna 512
5V no pinoanalogRead() retorna 1023
Qualquer tensãovalor = (tensão / 5.0) × 1023
FunçãoExemplo e ResultadoObservações
analogRead(pino) int sensor = analogRead(A0);
Guarda 0–1023 em 'sensor'.
Não precisa de pinMode()! Os pinos A0–A5 equivalem também a 14–19.
sensor_brilho.ino — potenciômetro controla brilho do LED
void setup() { }  // sem configuração necessária!

void loop() {
  // Lê A5 (0–1023) e divide por 4 para ter 0–255
  analogWrite(10, analogRead(A5) / 4);

  // Alternativa mais legível com map():
  // int leitura = analogRead(A5);
  // int brilho = map(leitura, 0, 1023, 0, 255);
  // analogWrite(10, brilho);
}
🔄
Pinos analógicos como digitais

Os pinos A0–A5 podem ser usados como pinos digitais comuns! Basta usar pinMode(14, OUTPUT) — onde 14 corresponde a A0. Isso aumenta o Arduino de 14 para 20 pinos digitais!

📡 Lição B.3
A Porta Serial do Arduino

A porta serial é o "chat" entre o Arduino e o computador. Pelo cabo USB, é possível enviar e receber dados em tempo real — visualizados no Monitor Serial da IDE do Arduino (Ctrl+Shift+M).

⚠️
Pinos 0 e 1 bloqueados!

Quando a porta serial está habilitada com Serial.begin(), os pinos digitais 0 (RX) e 1 (TX) ficam ocupados e não podem ser usados para outros fins.

FunçãoExemplo e ResultadoObservações
Serial.begin(taxa) Serial.begin(9600);
Taxa de 9600 bits/segundo.
Sempre no setup(). O computador deve usar a mesma taxa no Monitor Serial.
Serial.end() Serial.end(); Libera os pinos 0 e 1 para uso geral. Também no setup().
Serial.available() int n = Serial.available();
Nº de bytes no buffer.
Retorna 0 se não há dados. Use para verificar antes de ler.
Serial.read() int v = Serial.read();
Lê 1 byte do buffer.
Retorna -1 se não há dados. Consome o byte lido.
Serial.print(val, fmt) Serial.print(3.14159, 3);
Transmite: 3.142
fmt opcional: nº de decimais ou base (BIN, OCT, HEX, DEC).
Serial.println(val) Serial.println("Olá!");
Transmite com quebra de linha.
Igual ao print(), mas acrescenta \r\n no final. Cada chamada fica em uma linha.
serial_completo.ino — testando todas as funções seriais
void setup() {
  Serial.begin(9600); // abre serial em 9600 bps
}

void loop() {
  Serial.print("Bytes no buffer: ");
  Serial.println(Serial.available()); // mostra qtd disponível
  delay(1000);

  Serial.print("Primeiro byte: ");
  Serial.println(Serial.read());    // -1 se vazio
  delay(1000);
}

/* Abra o Monitor Serial e digite "ABCDE" + Send.
   available() mostrará 5 bytes disponíveis.
   read() mostrará 65 (código ASCII do 'A').
   Os demais bytes saem em sequência. */
🎨
Serial.print() com formatos

Serial.print('A', BIN) → 01000001  |  Serial.print('A', HEX) → 41  |  Serial.print('A', DEC) → 65  |  Serial.print(3.14159, 2) → 3.14

⚡ Lição B.4
Os Pinos de Alimentação

A barra POWER fica ao lado dos pinos analógicos e fornece tensões reguladas para alimentar circuitos externos conectados ao Arduino.

RESETforça reinício
3.3Vsaída 50mA máx.
5Vsaída regulada
GNDterra (2 pinos)
Vinentrada 9–15V
Uso prático
LED externo+ no 5V, – no GND (com resistor de 220Ω)
Sensor 3.3VAlimentar pelo pino 3.3V, não pelo 5V!
Bateria 9VConectar no Vin para usar sem USB
Reset manualBotão entre RESET e GND reinicia o programa
🔥
Cuidado com a corrente!

O pino 5V pode fornecer no máximo 500mA (quando alimentado por USB). O pino 3.3V está limitado a 50mA. Exceder esses limites pode danificar permanentemente o Arduino!

🔌
Alimentação sem USB

Use o conector P4 (jack 2.1mm) ou o pino Vin para alimentar o Arduino com bateria ou fonte externa de 7 a 12V. O regulador interno converte para 5V automaticamente.

🎉⚡🔌
Cartilha Concluída!

Você agora conhece a estrutura completa do Arduino: linguagem C/C++, variáveis, operadores, controle de fluxo, pinos digitais, analógicos, comunicação serial e alimentação.

🤖 Robótica 🌡️ Sensores 💡 Automação 🎵 Instrumentos 🏠 Casa inteligente 🎮 Games físicos

Baseado na obra de João Alexandre da Silveira — www.revistadoarduino.com.br 📖

CARTILHA ARDUINO C/C++ — EDIÇÃO 2.0 — 2026
🚀 Próxima etapa — Arduino como Corpo Humano