Aula 41c — Sensores Analógicos e PIR

Robótica com C — Bloco 1

O ecossistema de hardware do Arduino

Nas aulas 41a e 41b você aprendeu a estrutura do Arduino, o Wokwi, Serial, interrupções e bits. Agora vamos conhecer o ecossistema de hardware — os sensores que permitem ao robô perceber o ambiente.

Cada componente de hardware se comunica com o Arduino de uma de três formas:

Tipo de interface Como funciona Função de leitura Exemplos
Digital Retorna HIGH ou LOW — ligado ou desligado digitalRead(pino) Botão, sensor PIR, sensor de toque
Analógico Retorna 0–1023 proporcional à tensão (0–5V) analogRead(A0) Potenciômetro, LDR, LM35, MQ-2, célula de carga
Protocolo (I2C/SPI) Comunicação digital por barramento — biblioteca obrigatória Métodos do objeto da biblioteca LCD I2C, RTC DS3231, display OLED, acelerômetro

Regra prática: se o sensor tem 3 fios (GND, VCC, sinal), provavelmente é analógico ou digital simples — use analogRead() ou digitalRead(). Se tem 4 fios ou mais (GND, VCC, SDA, SCL), é um protocolo I2C e vai precisar de #include <Wire.h> e uma biblioteca específica.

Sensores analógicos — o padrão universal

Sensores analógicos produzem uma tensão variável proporcional à grandeza medida. O ADC do Arduino converte essa tensão em um número de 0 a 1023. O esqueleto do código é sempre o mesmo — só muda a fórmula de conversão:

// Padrão universal para qualquer sensor analógico:
int bruto = analogRead(PINO_SENSOR);    // 0 – 1023
float grandeza = converter(bruto);      // fórmula específica do sensor
Serial.println(grandeza);

Perceba o padrão: LDR, MQ-2, LM35 e FSR têm exatamente esse mesmo esqueleto. Quando você dominar um sensor analógico, domina o padrão de todos. A única diferença é a fórmula de conversão e o pino.

🌡️ Sensor de Temperatura LM35

O LM35 gera 10 mV por grau Celsius — 0°C = 0V, 100°C = 1V. A conversão é direta: converta o valor bruto para tensão e depois multiplique por 100 para obter graus:

// LM35 conectado ao pino A0
// Ligação: VCC → 5V, GND → GND, Saída → A0

const int PINO_LM35 = A0;

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

void loop() {
    int   bruto = analogRead(PINO_LM35);
    float volts = bruto * (5.0 / 1023.0);   // ADC → tensão (0–5V)
    float temp  = volts * 100.0;            // 10mV/°C → ×100 = °C

    Serial.print("Temperatura: ");
    Serial.print(temp, 1);                  // 1 casa decimal
    Serial.println(" C");
    delay(1000);
}

Temperatura: 23.4 C

Temperatura: 24.0 C

Temperatura: 24.5 C

Por que 5.0 e não 5? Divisão entre dois int é inteira em C: 5/1023 = 0. O sufixo .0 força float — exatamente o type casting que você aprendeu na Aula 02.

💡 Sensor de Luminosidade LDR

O LDR (Light Dependent Resistor) diminui sua resistência conforme a luz aumenta. Conectado em divisor de tensão com um resistor de 10kΩ, o valor lido é proporcional à luminosidade — quanto mais claro, maior o número:

// LDR em divisor de tensão: 5V → resistor 10kΩ → A0 → LDR → GND

const int PINO_LDR = A0;

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

void loop() {
    int lum = analogRead(PINO_LDR);   // 0 = escuro, 1023 = muito claro

    Serial.print("Luminosidade: ");
    Serial.print(lum);

    if      (lum < 300) Serial.println("  [ESCURO]");
    else if (lum < 700) Serial.println("  [MEIA LUZ]");
    else                Serial.println("  [CLARO]");

    delay(500);
}

Luminosidade: 87 [ESCURO]

Luminosidade: 512 [MEIA LUZ]

Luminosidade: 980 [CLARO]

☁️ Sensor de Gás MQ-2

O MQ-2 detecta gases inflamáveis (GLP, metano, fumaça) produzindo tensão analógica proporcional à concentração. Precisa de ~1 minuto de aquecimento antes de dar leituras estáveis:

// MQ-2 conectado ao pino A0 (saída AO — analógica)
// Também tem saída DO (digital) com limiar ajustável por trimpot

const int PINO_MQ2   = A0;
const int LIMIAR_GAS = 400;   // ajuste conforme calibração do ambiente

void setup() {
    Serial.begin(9600);
    Serial.println("Aquecendo sensor — aguarde 60 segundos...");
    delay(60000);
    Serial.println("Pronto!");
}

void loop() {
    int conc = analogRead(PINO_MQ2);

    Serial.print("Gas: ");
    Serial.print(conc);

    if (conc > LIMIAR_GAS) Serial.println("  *** ALERTA: GAS DETECTADO! ***");
    else                   Serial.println("  [normal]");

    delay(1000);
}

Aquecendo sensor — aguarde 60 segundos...

Pronto!

Gas: 180 [normal]

Gas: 612 *** ALERTA: GAS DETECTADO! ***

⚖️ Sensor de Força FSR

O FSR (Force Sensitive Resistor) diminui sua resistência conforme a pressão aplicada aumenta — análogo ao LDR, mas respondendo à força em vez da luz. Quanto maior a força, maior o valor lido:

// FSR em divisor de tensão: 5V → FSR → A0 → resistor 10kΩ → GND

const int PINO_FSR = A0;

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

void loop() {
    int forca = analogRead(PINO_FSR);   // 0 = sem força, 1023 = força máxima

    Serial.print("Forca: ");
    Serial.println(forca);
    delay(200);
}

Uso no robô: FSRs nas solas das patas do cachorro-robô detectam quando cada pata está no chão — informação essencial para a marcha. Isso aparece na Aula 53.

🏃 Sensor de Movimento PIR

O sensor PIR (Passive Infrared) detecta variações de calor infravermelho geradas por corpos em movimento. Saída digital: LOW quando inativo, HIGH quando detecta movimento. Tem dois trimpots para ajustar sensibilidade e tempo de saída ativa.

// PIR conectado ao pino 2
// Ligação: VCC → 5V, GND → GND, OUT → pino 2

const int PINO_PIR = 2;
const int PINO_LED = 8;

void setup() {
    pinMode(PINO_PIR, INPUT);
    pinMode(PINO_LED, OUTPUT);
    Serial.begin(9600);
    Serial.println("Calibrando PIR — aguarde 10 segundos...");
    delay(10000);           // PIR precisa calibrar com a temperatura do ambiente
    Serial.println("Monitorando...");
}

void loop() {
    if (digitalRead(PINO_PIR) == HIGH) {
        digitalWrite(PINO_LED, HIGH);
        Serial.println("MOVIMENTO DETECTADO!");
    } else {
        digitalWrite(PINO_LED, LOW);
    }
    delay(100);
}

Calibrando PIR — aguarde 10 segundos...

Monitorando...

MOVIMENTO DETECTADO!

MOVIMENTO DETECTADO!

PIR vs HC-SR04: o PIR detecta movimento (variação térmica), enquanto o HC-SR04 detecta presença/distância (reflexo de ultrassom). No robô, o PIR serve para modo de vigilância; o HC-SR04 serve para desvio de obstáculos. A próxima aula cobre o HC-SR04 em detalhe.

Sensor Interface O que mede Uso no robô
LM35 Analógico Temperatura (°C) Monitorar temperatura dos motores
LDR Analógico Luminosidade Modo diurno/noturno, seguidor de luz
MQ-2 Analógico + Digital Concentração de gás Detector de ambiente perigoso
FSR Analógico Pressão / força Detecção de contato nas patas
PIR Digital Movimento (calor IR) Modo de vigilância, detectar presença

Quiz — Aula 41c

Teste o que você aprendeu sobre sensores analógicos e o sensor PIR:

1. Um sensor tem 3 fios (GND, VCC, sinal) e a folha de dados indica tensão de saída variável entre 0V e 5V. Qual função do Arduino você usará para lê-lo?

2. O LM35 gera 10 mV por °C. Se analogRead(A0) retorna 205, qual é a temperatura?

3. Por que 5.0 / 1023.0 deve ser escrito com .0 em vez de 5 / 1023?

4. No LDR em divisor de tensão, o que acontece com o valor de analogRead() quando o ambiente fica mais escuro?

5. Por que o sensor MQ-2 precisa de cerca de 60 segundos antes de dar leituras úteis?

6. Qual é a diferença fundamental de interface entre o FSR e o PIR?

7. Por que o sensor PIR precisa de ~10 segundos de espera no setup()?

8. Qual sensor da aula é mais adequado para detectar se a pata do robô tocou o chão?