Ficha 02 · Sensores, atuadores e projeto
- Ler sensores
- Comandar atuadores
- Programação não bloqueante
- Integrar projeto
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.)