Nesta página Visão do sistema Montagem completa Controlo simples Velocidade variável Dashboard na matriz LED

🏠 Sistema de Ventilação Inteligente

Este projeto cria um sistema de ventilação automática: o LDR simula um sensor de temperatura (mais luz = mais quente) e controla um motor DC com transístor que alimenta a ventoinha. A matriz LED do micro:bit mostra o estado do sistema em tempo real.

🌡️

Sensor (LDR)

Simula temperatura — leitura analógica de 0 a 1023.

⚙️

Atuador (Motor)

Ventoinha controlada via transístor. Velocidade proporcional à "temperatura".

📊

Dashboard (Matriz)

5 colunas da matriz LED mostram o nível de ventilação atual.

🔘

Manual/Auto (Botão)

Botão A alterna entre modo automático e manual.

🔌 Montagem Completa

P1→ Divisor LDR: 3V → LDR → P1 → 2.2KΩ → GND
P16→ Resistência 47Ω → Base BC547 → Motor(+)=3V · Motor(-)=Coletor → GND=Emissor
DíodoMotor(−) → Cátodo díodo; Ânodo díodo → 3V (proteção flyback)
P2→ 47Ω → LED verde (modo AUTO) → GND
P3→ 47Ω → LED vermelho (alerta temperatura alta) → GND

▶️ Controlo Simples ON/OFF

ventilacao_simples.js
// Ventilação automática simples: liga acima de um limiar
let LIMIAR_ON = 500   // ligar ventilação
let LIMIAR_OFF = 350  // desligar (histerese)
let motor_ligado = false

basic.forever(function () {
    let temp_sim = pins.analogReadPin(AnalogPin.P1)

    if (!motor_ligado && temp_sim > LIMIAR_ON) {
        pins.digitalWritePin(DigitalPin.P16, 1)
        motor_ligado = true
        basic.showIcon(IconNames.Yes)
        serial.writeValue("motor", 1)
    } else if (motor_ligado && temp_sim < LIMIAR_OFF) {
        pins.digitalWritePin(DigitalPin.P16, 0)
        motor_ligado = false
        basic.showIcon(IconNames.No)
        serial.writeValue("motor", 0)
    }

    serial.writeValue("ldr", temp_sim)
    basic.pause(200)
})

📈 Velocidade Variável com PWM

ventilacao_pwm.js
// Velocidade proporcional à "temperatura" (LDR)
let TEMP_MIN = 200   // abaixo: motor desligado
let TEMP_MAX = 800   // acima: motor à velocidade máxima

basic.forever(function () {
    let temp = pins.analogReadPin(AnalogPin.P1)

    let velocidade = 0
    if (temp > TEMP_MIN) {
        // Mapear temp→velocidade entre os limiares
        velocidade = Math.map(temp, TEMP_MIN, TEMP_MAX, 200, 1023)
        velocidade = Math.clamp(0, 1023, velocidade)
    }

    pins.analogWritePin(AnalogPin.P16, velocidade)

    // Indicador: LED vermelho se muito quente
    pins.digitalWritePin(DigitalPin.P3, temp > 700 ? 1 : 0)

    serial.writeValue("temp", temp)
    serial.writeValue("vel", velocidade)
    basic.pause(100)
})

📊 Dashboard na Matriz LED

dashboard_ventilacao.js
// Dashboard completo: modo AUTO/MANUAL + barra de nível
let modo_auto = true
let vel_manual = 512

// Botão A: alternar AUTO/MANUAL
input.onButtonPressed(Button.A, function () {
    modo_auto = !modo_auto
    pins.digitalWritePin(DigitalPin.P2, modo_auto ? 1 : 0)
    basic.showString(modo_auto ? "A" : "M")
})

// Botão B (modo manual): aumentar velocidade
input.onButtonPressed(Button.B, function () {
    if (!modo_auto) {
        vel_manual = Math.min(1023, vel_manual + 200)
        pins.analogWritePin(AnalogPin.P16, vel_manual)
        basic.showNumber(Math.map(vel_manual, 0, 1023, 0, 9))
    }
})

basic.forever(function () {
    let ldr = pins.analogReadPin(AnalogPin.P1)
    let vel = 0

    if (modo_auto) {
        vel = ldr > 200 ? Math.map(ldr, 200, 1023, 100, 1023) : 0
        vel = Math.clamp(0, 1023, vel)
        pins.analogWritePin(AnalogPin.P16, vel)
    } else {
        vel = vel_manual
    }

    // Barra de nível na matriz (5 colunas × 5 linhas)
    let nivel = Math.map(vel, 0, 1023, 0, 4)
    for (let x = 0; x <= 4; x++) {
        for (let y = 0; y <= 4; y++) {
            // Barra preenchida de baixo para cima
            if ((4 - y) <= nivel) {
                led.plotBrightness(x, y, 255)
            } else {
                led.plotBrightness(x, y, 0)
            }
        }
    }

    // Alerta térmico: piscar toda a matriz se temp alta
    if (ldr > 850) {
        basic.showIcon(IconNames.Angry)
        pins.digitalWritePin(DigitalPin.P3, 1)
        music.playTone(1500, 100)
    } else {
        pins.digitalWritePin(DigitalPin.P3, 0)
    }

    serial.writeValue("ldr", ldr)
    serial.writeValue("vel", vel)
    basic.pause(100)
})
💡 Extensão do cenário LED oficial Este projeto é a base do cenário de aprendizagem "Ventilação Automática" dos LED — Laboratórios de Educação Digital. Experimenta combinar com o sensor de temperatura integrado do micro:bit para um sistema ainda mais realista.

🏆 Para ir mais longe