Partilhar: WhatsApp
aulify
UC UC00670 · T. Sist. Comp. Redes

Ficha 02 · Sensores, atuadores e projeto

Sensores, atuadores, millis(), protocolos
Versão · Aluno
Tempo · 60 minutos
Cotação · 100 pontos
Aluno(a)
Turma
Data
Objectivos da ficha

Parte I · Sensores

Exercício 1 · Interface (10 pts)

Indica se a leitura é digital ou analógica (via ADC):

a) LDR (luz). ___

b) PIR (movimento). ___

c) Potenciómetro. ___

d) HC-SR04 (distância ultrassónica). ___

a) Analógica (ADC) — divisor de tensão com o LDR. b) Digital — saída HIGH/LOW (deteta movimento). c) Analógica (ADC) — divisor variável. d) Digital — pinos trig/echo; mede-se o tempo do eco para calcular distância.

Exercício 2 · Ler sensor (15 pts)

Um LM35 dá 10 mV por °C, ligado a A0 (Vref 5 V). Escreve o código que lê e imprime a temperatura em °C.

void setup() { Serial.begin(9600); }

void loop() {
  int leitura = analogRead(A0);             // 0..1023
  float tensao = leitura * 5.0 / 1023.0;    // volts
  float tempC  = tensao / 0.01;             // 10 mV/°C → /0,01
  Serial.print("Temp: ");
  Serial.print(tempC);
  Serial.println(" C");
  delay(1000);
}

Parte II · Atuadores

Exercício 3 · Corrente (15 pts)

Um aluno liga um motor DC diretamente a um pino do Arduino e queima a placa.

a) Porquê? (8 pts)

b) Como se deve ligar o motor corretamente? (7 pts)

a) Um pino do Arduino fornece muito pouca corrente (~20–40 mA). Um motor exige muito mais (centenas de mA a amperes); ao tentar puxar essa corrente, o pino/regulador sobreaquece e queima. Além disso, o motor (carga indutiva) gera picos de tensão ao arrancar/parar que danificam o µC.

b) Usar um driver/ponte H (ex.: L298N) ou transístor, com alimentação dedicada para o motor e GND comum com o Arduino. O pino só comanda o driver (sinal PWM), não alimenta o motor. Acrescentar díodo de roda livre (flyback) para os picos indutivos.

Exercício 4 · Servo (10 pts)

Escreve um sketch que move um servo (pino 9) entre 0° e 180° de 1 em 1 segundo.

#include <Servo.h>
Servo s;

void setup() {
  s.attach(9);
}

void loop() {
  s.write(0);
  delay(1000);
  s.write(180);
  delay(1000);
}

Parte III · Boas práticas

Exercício 5 · millis() (20 pts)

a) Por que é mau usar delay(5000) num programa que também precisa de ler um botão? (8 pts)

b) Reescreve um "piscar LED a cada 1 s" usando millis() (não bloqueante). (12 pts)

a) delay() bloqueia o microcontrolador — durante os 5 s ele não faz mais nada, incluindo ler o botão. Pressões de botão durante o delay são perdidas. O programa fica "surdo".

b)

const int LED = 9;
unsigned long ultimo = 0;
const unsigned long INTERVALO = 1000;
bool estado = false;

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

void loop() {
  if (millis() - ultimo >= INTERVALO) {
    ultimo = millis();
    estado = !estado;
    digitalWrite(LED, estado);
  }
  // aqui o botão (ou outras tarefas) continua a ser lido a cada volta
}

Exercício 6 · Protocolos (10 pts)

Indica o protocolo adequado:

a) Ligar vários sensores e um LCD no mesmo barramento de 2 fios. ___

b) Depurar valores no PC. ___

c) Enviar dados para a nuvem (ESP32). ___

a) I²C (SDA/SCL — vários dispositivos endereçáveis em 2 fios). b) Serial (UART) — Serial Monitor. c) Wi-Fi (ESP32) — HTTP/MQTT para a nuvem.

Parte IV · Projeto

Exercício 7 · Termóstato (20 pts)

Projeta (descrição + código) um sistema que: lê a temperatura; se > 26 °C liga uma ventoinha (via relé no pino 7); senão desliga; mostra a temperatura no Serial; não usa delay() longo.

Descrição: sensor de temperatura (LM35 em A0) → decisão (limiar 26 °C) → atuador (relé que liga/desliga ventoinha). Leitura periódica não bloqueante com millis() para o sistema continuar responsivo.

const int SENSOR = A0;
const int RELE   = 7;
unsigned long ultimo = 0;
const unsigned long INTERVALO = 2000;

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

float lerTemp() {
  float v = analogRead(SENSOR) * 5.0 / 1023.0;
  return v / 0.01;   // LM35: 10 mV/°C
}

void loop() {
  if (millis() - ultimo >= INTERVALO) {
    ultimo = millis();
    float t = lerTemp();
    if (t > 26.0) digitalWrite(RELE, HIGH);   // liga ventoinha
    else          digitalWrite(RELE, LOW);
    Serial.print("Temp: "); Serial.print(t); Serial.println(" C");
  }
  // loop continua livre para outras tarefas (botões, etc.)
}

(Nota de hardware: o relé comanda a ventoinha com alimentação própria; pino do Arduino só aciona o relé; cargas indutivas com proteção adequada.)