Início › Programação Arduino
💻 Fundamentos

Programação Arduino

Aprende a linguagem C/C++ simplificada usada no Arduino para controlar hardware.

Estrutura do Sketch

estrutura.ino
// 1. INCLUSÃO DE BIBLIOTECAS (no topo)
#include <Servo.h>

// 2. CONSTANTES E VARIÁVEIS GLOBAIS
const int LED_PIN = 13;      // Constante - não muda
int contador = 0;             // Variável global

// 3. OBJETOS
Servo meuServo;

// 4. SETUP — corre uma vez
void setup() {
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(9600);
  meuServo.attach(9);
}

// 5. LOOP — corre em ciclo infinito
void loop() {
  // Lógica principal aqui
}

// 6. FUNÇÕES AUXILIARES
void piscaLed(int vezes) {
  for (int i = 0; i < vezes; i++) {
    digitalWrite(LED_PIN, HIGH);
    delay(200);
    digitalWrite(LED_PIN, LOW);
    delay(200);
  }
}

Variáveis e Tipos de Dados

📦 Tipos principais

TipoTamanhoIntervaloExemplo
int2 bytes-32768 a 32767int x = 10;
long4 bytes-2M a 2Mlong t = millis();
float4 bytes±3.4×10³⁸float v = 3.14;
boolean1 bytetrue / falseboolean on = true;
char1 byte-128 a 127char c = 'A';
StringvariáveltextoString s = "Olá";
byte1 byte0 a 255byte b = 255;
variaveis.ino
const int PINO_LED = 9;      // Constante (boa prática: MAIUSCULAS)
int brilho = 0;               // Valor atual do brilho
int incremento = 5;           // Passo de variação

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

void loop() {
  analogWrite(PINO_LED, brilho);  // Aplica o brilho
  brilho += incremento;           // Incrementa
  
  if (brilho <= 0 || brilho >= 255) {
    incremento = -incremento;     // Inverte direção
  }
  delay(10);
}

Entradas e Saídas Digitais

📤 Saída Digital

Controla se um pino está a 5V (HIGH) ou 0V (LOW).

pinMode(13, OUTPUT);
digitalWrite(13, HIGH);  // Liga
digitalWrite(13, LOW);   // Desliga

📥 Entrada Digital

Lê se um pino está a HIGH (5V) ou LOW (0V).

pinMode(2, INPUT_PULLUP);
int estado = digitalRead(2);
// HIGH = solto, LOW = premido
💡 INPUT_PULLUP ativa uma resistência interna de pull-up (~20kΩ). O pino lê HIGH quando solto e LOW quando ligado ao GND. Evita a necessidade de resistências externas com botões.

Entradas Analógicas

leitura_analogica.ino
// analogRead() devolve um valor de 0 a 1023
// correspondente a tensão de 0 a 5V

void setup() {
  Serial.begin(9600);
  // Pinos analógicos não precisam de pinMode!
}

void loop() {
  int leitura = analogRead(A0);    // 0 a 1023
  
  // Converter para tensão em Volt
  float tensao = leitura * (5.0 / 1023.0);
  
  Serial.print("Leitura: ");
  Serial.print(leitura);
  Serial.print("  Tensão: ");
  Serial.print(tensao);
  Serial.println(" V");
  
  delay(500);
}

PWM — Modulação por Largura de Pulso

O Arduino não tem saída analógica verdadeira. O PWM simula tensões intermédias ligando e desligando muito rapidamente o pino. Funciona nos pinos marcados com ~ (3, 5, 6, 9, 10, 11).

pwm.ino
// analogWrite() aceita valores de 0 a 255
// 0   = sempre LOW  (0% duty cycle)
// 127 = 50% do tempo HIGH
// 255 = sempre HIGH (100% duty cycle)

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

void loop() {
  // Fade in
  for (int i = 0; i <= 255; i++) {
    analogWrite(9, i);
    delay(5);
  }
  // Fade out
  for (int i = 255; i >= 0; i--) {
    analogWrite(9, i);
    delay(5);
  }
}

Condições (if / else)

condicoes.ino
int leitura = analogRead(A0);    // 0 a 1023

// if / else if / else
if (leitura > 800) {
  digitalWrite(13, HIGH);         // Muito luz
} else if (leitura > 400) {
  // Luz moderada — não faz nada
} else {
  digitalWrite(13, LOW);          // Pouca luz
}

// Operadores de comparação:
// ==  igual a
// !=  diferente de
// >   maior que
// <   menor que
// >=  maior ou igual
// <=  menor ou igual

// Operadores lógicos:
// &&  E (AND)
// ||  OU (OR)
// !   NÃO (NOT)

if (leitura > 500 && leitura < 900) {
  // Intervalo: entre 500 e 900
}

Ciclos (for / while)

ciclos.ino
// FOR — repetição com contador conhecido
for (int i = 0; i < 5; i++) {
  digitalWrite(13, HIGH);
  delay(100);
  digitalWrite(13, LOW);
  delay(100);
}
// Pisca 5 vezes e para

// WHILE — repete enquanto condição verdadeira
int botao = digitalRead(2);
while (botao == LOW) {
  // Mantém LED aceso enquanto botão pressionado
  digitalWrite(13, HIGH);
  botao = digitalRead(2);       // Relê o botão
}
digitalWrite(13, LOW);

// DO...WHILE — executa pelo menos uma vez
int contador = 0;
do {
  contador++;
  delay(100);
} while (contador < 10);

Funções Personalizadas

funcoes.ino
// Função sem retorno (void)
void piscarLed(int pino, int vezes, int intervalo) {
  for (int i = 0; i < vezes; i++) {
    digitalWrite(pino, HIGH);
    delay(intervalo);
    digitalWrite(pino, LOW);
    delay(intervalo);
  }
}

// Função com retorno
float celsiusParaFahrenheit(float c) {
  return c * 9.0 / 5.0 + 32.0;
}

// Função que lê temperatura do LM35
float lerTemperatura(int pino) {
  int leitura = analogRead(pino);
  float tensao = leitura * (5.0 / 1023.0);
  return tensao * 100.0;    // LM35: 10mV por °C
}

void setup() {
  pinMode(13, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  piscarLed(13, 3, 200);    // Pisca 3x, 200ms entre
  
  float temp = lerTemperatura(A0);
  float tempF = celsiusParaFahrenheit(temp);
  
  Serial.print(temp);
  Serial.print("°C = ");
  Serial.print(tempF);
  Serial.println("°F");
  
  delay(2000);
}

Monitor Série

O Monitor Série (Ctrl+Shift+M no IDE) permite ver mensagens do Arduino no ecrã do computador — essencial para depuração.

serie.ino
void setup() {
  Serial.begin(9600);           // Velocidade: 9600 baud
  Serial.println("Iniciado!");
}

void loop() {
  int val = analogRead(A0);
  
  Serial.print("Valor: ");      // Imprime sem nova linha
  Serial.println(val);          // Imprime COM nova linha
  
  // Receber dados do computador
  if (Serial.available() > 0) {
    String cmd = Serial.readStringUntil('\n');
    Serial.print("Recebido: ");
    Serial.println(cmd);
  }
  
  delay(500);
}
// Certifica-te que o baud rate no Monitor Série
// é o mesmo que no Serial.begin()!

Bibliotecas

📚 Bibliotecas usadas neste kit

BibliotecaPara quêInstalação
Servo.hControlo do servo SG90Incluída no IDE
LiquidCrystal.hDisplay LCD 16x2Incluída no IDE
Stepper.hMotor de passoIncluída no IDE
IRremote.hRecetor infravermelhosGestor de Bibliotecas
SoftwareSerial.hBluetooth HC-05/06Incluída no IDE
📦 Para instalar bibliotecas externas: Sketch → Incluir Biblioteca → Gerir Bibliotecas. Pesquisa pelo nome e clica em Instalar.

Funções Utilitárias Essenciais

funcoes_uteis.ino
// map() — remapeia um valor de um intervalo para outro
int potVal = analogRead(A0);          // 0 a 1023
int brilho = map(potVal, 0, 1023, 0, 255);  // 0 a 255
analogWrite(9, brilho);

// constrain() — limita valor a um intervalo
int val = constrain(analogRead(A0), 200, 800);

// millis() — tempo desde o arranque (em ms), sem bloquear
unsigned long agora = millis();
if (agora - ultimoTempo >= 1000) {
  ultimoTempo = agora;
  // Corre a cada segundo sem usar delay()!
}

// abs() — valor absoluto
int diferenca = abs(valorA - valorB);

// min() e max()
int menor = min(val1, val2);
int maior = max(val1, val2);

// random() — número aleatório
int r = random(0, 256);       // 0 a 255
randomSeed(analogRead(A5));   // Semente aleatória
Continuar → Lista de Componentes Primeiro Exercício →