Partilhar: WhatsApp
aulify · Sebenta
UC · Unidade de Competência · UC00670

Efetuar a programação de microcontroladores

Sebenta · Arduino, GPIO, sensores, atuadores, protocolos
50h · 4.5 pontos crédito Curso: T. Sist. Comp. Redes ↗ Referencial oficial SNQ
Índice

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)

Plataformas

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);
}

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

Boas práticas de programação embebida

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
}

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