Efetuar a programação de microcontroladores
Apresentação
UC00670 (50h · 4,5 pts) do curso Técnico de Sistemas de Computação e Redes. Liga a programação ao mundo físico: arquitetura de microcontroladores, programação de I/O (digital, analógico, PWM), leitura de sensores, comando de atuadores, comunicação (Serial, I²C, SPI, Wi-Fi) e integração num projeto de automação/IoT. Usa Arduino como plataforma de referência. Aplica conhecimentos de UC00606/07 (programação) e UC01988/92/51 (eletrónica/lógica).
O microcontrolador
µC vs µP
| Microcontrolador (µC) | Microprocessador (µP) |
|---|---|
| Integra CPU + RAM + Flash + periféricos num único chip | Apenas CPU; precisa de RAM, armazenamento e I/O externos |
| Tarefa dedicada (controlo) | Uso geral (PC, servidor) |
| Baixo consumo, baixo custo | Alto desempenho, mais consumo |
| Arduino, ESP32, PIC, STM32 | Intel/AMD/ARM dos computadores |
Arquitetura típica (Arduino UNO / ATmega328P)
- CPU 8 bits, 16 MHz.
- Flash (programa) ~32 KB, SRAM ~2 KB, EEPROM ~1 KB.
- GPIO — pinos digitais (entrada/saída).
- ADC — conversor analógico-digital (entradas A0–A5, 10 bits).
- PWM — saídas com modulação de largura de impulso.
- UART/I²C/SPI — comunicação.
- Timers e interrupções.
Plataformas
- Arduino UNO (ATmega328P) — didático, ecossistema enorme.
- ESP32 / ESP8266 — Wi-Fi + Bluetooth integrados → IoT.
- STM32 — ARM Cortex-M, profissional.
- Raspberry Pi Pico (RP2040) — moderno, programável em C ou MicroPython.
- BBC micro:bit — educação.
Estrutura do programa (Arduino)
// Variáveis e includes globais
const int LED = 13;
void setup() {
// Executa UMA vez ao ligar/reset
pinMode(LED, OUTPUT);
Serial.begin(9600);
}
void loop() {
// Repete indefinidamente
digitalWrite(LED, HIGH);
delay(1000);
digitalWrite(LED, LOW);
delay(1000);
}
setup()— inicialização (modos de pino, Serial, periféricos).loop()— ciclo infinito; o "programa principal".
Linguagem: C/C++ (framework Arduino). Ferramentas: Arduino IDE ou PlatformIO (VS Code).
Ciclo: escrever → compilar (verificar) → carregar (upload via USB) → observar (LED / Serial Monitor) → depurar → iterar.
Entradas e saídas digitais
pinMode(8, INPUT_PULLUP); // entrada com resistência pull-up interna
int estado = digitalRead(8); // HIGH (1) ou LOW (0)
pinMode(9, OUTPUT);
digitalWrite(9, HIGH); // ~5 V
digitalWrite(9, LOW); // 0 V
INPUT_PULLUPevita entradas "a flutuar" (ruído): o pino fica em HIGH em repouso e vai a LOW quando o botão liga a GND.- Debounce: um botão mecânico "salta" (bounce) ms ao premir; tratar por software (esperar/estabilizar) ou hardware (RC) para não contar vários toques.
// Debounce simples
if (digitalRead(BTN) == LOW) {
delay(20); // estabiliza
if (digitalRead(BTN) == LOW) { /* premido */ }
}
Entradas analógicas e PWM
ADC
int leitura = analogRead(A0); // 0..1023 (10 bits)
float tensao = leitura * 5.0 / 1023.0; // converter para volts
Lê sensores analógicos (LDR, potenciómetro, NTC, LM35). A resolução do UNO é 10 bits (1024 níveis entre 0 e Vref).
PWM (saída "analógica")
analogWrite(6, 128); // 0..255 (duty cycle ≈ 50%)
O PWM liga/desliga muito rápido com largura de impulso variável → controla brilho de LED, velocidade de motor, etc. (não é tensão analógica real, mas comporta-se como tal para muitas cargas).
Comunicação Serial
void setup() { Serial.begin(9600); }
void loop() {
int v = analogRead(A0);
Serial.print("Valor: ");
Serial.println(v);
delay(500);
}
O Serial Monitor (e o Serial Plotter) são as principais ferramentas de depuração num microcontrolador (não há "breakpoints" fáceis como num PC). Também serve para comunicar com o PC ou outro módulo.
Sensores
| Sensor | Mede | Interface | Notas |
|---|---|---|---|
| LDR | luminosidade | analógico | divisor de tensão |
| NTC / LM35 | temperatura | analógico | LM35: 10 mV/°C |
| DHT11/DHT22 | temp + humidade | digital | biblioteca própria |
| HC-SR04 | distância | digital (trig/echo) | ultrassons; mede tempo de eco |
| PIR | movimento | digital | saída HIGH ao detetar |
| Potenciómetro | posição | analógico | divisor variável |
| MQ-x | gás/fumo | analógico | requer aquecimento |
Princípio: o sensor converte uma grandeza física num sinal elétrico que o µC lê (digital ou via ADC).
Atuadores
| Atuador | Função | Controlo |
|---|---|---|
| LED | luz | digital / PWM (brilho) |
| Buzzer | som | digital / tone() |
| Servo motor | ângulo (0–180°) | PWM (biblioteca Servo) |
| Motor DC | rotação | PWM + driver (L298N/ponte H) |
| Motor de passo | posição precisa | sequência + driver |
| Relé | ligar/desligar carga (AC) | digital (isolamento) |
Atenção à corrente: um pino do Arduino fornece pouca corrente (~20–40 mA). Motores, fitas LED e cargas AC nunca se ligam diretamente ao pino — usar transístor/driver/relé e alimentação dedicada, com GND comum. Cargas indutivas (relés, motores) precisam de díodo de roda livre (flyback).
Protocolos de comunicação
- UART (Serial) — assíncrono, 2 fios (TX/RX). Depuração e ligação ponto a ponto.
- I²C (Wire) — 2 fios (SDA/SCL), vários dispositivos endereçáveis no mesmo barramento (LCD, RTC DS3231, sensores BME280).
- SPI — rápido, full-duplex (cartões SD, ecrãs TFT). Usa MOSI/MISO/SCK/CS.
- 1-Wire — DS18B20 (temperatura) num só fio.
- Wi-Fi / BLE (ESP32/ESP8266) — IoT: enviar dados para a nuvem (MQTT/HTTP), receber comandos.
Boas práticas de programação embebida
- Não bloquear com
delay()longos — impede o µC de fazer outras coisas. Usarmillis()para temporização não bloqueante:
unsigned long ultimo = 0;
const unsigned long INTERVALO = 1000;
void loop() {
if (millis() - ultimo >= INTERVALO) {
ultimo = millis();
// tarefa periódica (ex.: ler sensor)
}
// outras tarefas continuam a correr
}
- Debounce de botões; tratar entradas inválidas.
- Modularizar — funções com responsabilidade única; constantes nomeadas (
const). - Memória escassa — cuidado com Strings dinâmicas (preferir
char[]/F()para texto na Flash). - Interrupções para eventos críticos/rápidos (manter ISRs curtas).
- Alimentação dimensionada; massa comum entre módulos.
- Esquema elétrico documentado (Fritzing) e testar por partes (um periférico de cada vez).
Padrão de automação
Quase todos os projetos seguem ler → decidir → atuar:
void loop() {
float t = lerTemperatura(); // SENSOR
if (t > 25.0) digitalWrite(RELE, HIGH); // DECISÃO + ATUADOR
else digitalWrite(RELE, LOW);
Serial.println(t); // monitorizar
delay(2000);
}
Termóstato, rega automática, alarme, estação meteorológica IoT — variações deste padrão.
Apêndices
A · Cheatsheet Arduino
pinMode(p, INPUT|OUTPUT|INPUT_PULLUP);
digitalRead(p); digitalWrite(p, HIGH|LOW);
analogRead(A0); analogWrite(p, 0..255);
Serial.begin(9600); Serial.print/println(x);
millis(); delay(ms);
tone(p, freq); noTone(p);
#include <Servo.h> / <Wire.h> (I2C) / <SPI.h>
B · Glossário
ADC. Conversor analógico-digital. GPIO. General Purpose Input/Output. I²C / SPI / UART. Protocolos de comunicação. ISR. Rotina de serviço de interrupção. PWM. Pulse Width Modulation. Pull-up/down. Resistência que define o estado em repouso. Sketch. Programa Arduino. µC / µP. Microcontrolador / microprocessador.
C · Recursos
- arduino.cc · referência da linguagem e tutoriais.
- Tinkercad Circuits · simular Arduino sem hardware.
- Wokwi · wokwi.com — simulador online (Arduino/ESP32).
- Random Nerd Tutorials · ESP32/IoT.
- Fritzing · desenhar esquemas de montagem.