VIXI, BORA MEDIR O BARULHO!

🎤 Medindo o barulho da galera

"O primeiro olho do robô" — Desenvolva um programa que captura áudio do microfone, calcula intensidade sonora simulada e gera alertas personalizados com memes paranaenses.

Duração: 100 min (2 aulas)
Google Colab + Chromebook + Microfone
Memes & Alertas irreverentes
╭( ・ㅂ・)و ̑̑ 🔊
🎤📊🤣
Códigos BNCC

EM13CNT104 - Avaliar limites e potencialidades das tecnologias de captura de áudio
EM13MAT503 - Interpretar e representar dados sonoros em gráficos simples
EM13LGG702 - Utilizar diferentes linguagens para produção de sentido (memes como linguagem)
Competências Gerais

Competência 2 - Exercitar curiosidade intelectual
Competência 7 - Argumentar com base em dados
Etapas da Aula (100 minutos)
Etapa Tempo Atividade
Abertura 10 min Desafio: "Quanto barulho tem na nossa sala?" estimativa coletiva.
Conceituação 15 min Explicar decibéis (dB) e como o computador "escuta" (PCM, amostragem).
Codificação 40 min Implementar o código de captura de áudio e decisões com memes (em duplas).
Teste prático 20 min Criar diferentes níveis de barulho (sussurro, conversa, grito, palmas). Registrar no CSV.
Fechamento 15 min Gerar gráfico dos últimos 10 registros. Debater: "O robô reagiu certo?"
Simulador do Robô Fofoqueiro 🤣 Clique e teste os memes!

🎤 Nível de som simulado

0.0 dB

🚨 ALERTA! PASSOU DOS 75 dB! TÁ MUITO ALTO!

📢 Mensagem do Robô:

🤫 Clique nos botões para testar...
Materiais

  • Notebook Colab da aula anterior
  • Microfones (embutidos no Chromebook ou headsets)
  • Caixa de som (para gerar barulho controlado)
Adaptações para inclusão

  • Alunos com deficiência auditiva podem usar o recurso de "vibração do Chromebook" ou focar na parte visual do gráfico
  • Para alunos com TDAH: sessões curtas de codificação com pausas
robo_fofoqueiro_sensor_som.py — Código completo da aula 2 download disponível
# -*- coding: utf-8 -*-
# ============================================================
# ROBÔ FOFOQUEIRO - AULA 2: SENSOR DE SOM IRREVERENTE
# "Medindo o barulho da galera: o primeiro olho do robô"
# ============================================================
# Alunos: [Seu nome aqui]
# Tutora: Gisele Nunes
# Data: 2026
# ============================================================

# ===== BIBLIOTECAS NECESSÁRIAS =====
import pyaudio
import numpy as np
import time
import threading
import csv
from datetime import datetime
import matplotlib.pyplot as plt
from IPython.display import clear_output

# ===== CONFIGURAÇÃO INICIAL =====
# No Colab: !pip install pyaudio keyboard matplotlib numpy

# ===== FUNÇÃO PRINCIPAL =====
def medidor_fofoqueiro():
    """
    Função que simula o sensor KY-038 usando o microfone real.
    Retorna:
    tuple: (decibeis_simulados, alerta, mensagem_meme)
    """
    # PARÂMETROS DE ÁUDIO
    DURACAO = 3
    TAXA_AMOSTRAGEM = 44100
    TAMANHO_BUFFER = 1024
    
    audio = pyaudio.PyAudio()
    stream = audio.open(
        format=pyaudio.paInt16,
        channels=1,
        rate=TAXA_AMOSTRAGEM,
        input=True,
        frames_per_buffer=TAMANHO_BUFFER
    )
    
    print("🎤 Gravando 3 segundos de áudio...")
    
    frames = []
    for _ in range(0, int(TAXA_AMOSTRAGEM / TAMANHO_BUFFER * DURACAO)):
        data = stream.read(TAMANHO_BUFFER)
        dados_audio = np.frombuffer(data, dtype=np.int16)
        frames.append(dados_audio)
    
    stream.stop_stream()
    stream.close()
    audio.terminate()
    
    audio_data = np.concatenate(frames)
    
    # CÁLCULO DA INTENSIDADE SONORA
    rms = np.sqrt(np.mean(audio_data**2))
    max_rms = 32768
    decibeis = (rms / max_rms) * 120
    decibeis = min(120, max(0, decibeis))
    
    # EMOJI CONFORME VOLUME
    if decibeis < 20:
        emoji = "🔇🤫"
    elif decibeis < 40:
        emoji = "🤫"
    elif decibeis < 60:
        emoji = "🗣️"
    elif decibeis < 80:
        emoji = "📢"
    elif decibeis < 100:
        emoji = "🔊"
    else:
        emoji = "💀📢"
    
    # MENSAGEM MEME POR NÍVEL
    if decibeis < 40:
        mensagem = "🤫 silêncio absoluto... até assusta"
        alerta = False
    elif decibeis < 60:
        mensagem = "🗣️ papinho normal, nada de mais"
        alerta = False
    elif decibeis < 80:
        mensagem = "📢 TÁ FICANDO BOM! logo logo viro fofoqueiro"
        alerta = True
    elif decibeis < 100:
        mensagem = "🔊 CALA A BOCA! vou piscar o LED vermelho"
        alerta = True
    else:
        mensagem = "💀 INFERNO ACÚSTICO! vou chamar a diretora robô"
        alerta = True
    
    alerta = decibeis > 75
    
    print("\n" + "="*50)
    print(f"Nível atual: {emoji}")
    print(f"Decibéis simulados: {decibeis:.1f} dB")
    print(f"📢 {mensagem}")
    print("="*50)
    
    return (decibeis, alerta, mensagem)

# ===== FUNÇÃO PARA SALVAR LOG EM CSV =====
def salvar_log(decibeis, mensagem, arquivo="log_fofoqueiro.csv"):
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    with open(arquivo, mode='a', newline='', encoding='utf-8') as file:
        writer = csv.writer(file)
        file.seek(0, 2)
        if file.tell() == 0:
            writer.writerow(["Timestamp", "Decibeis (dB)", "Mensagem"])
        writer.writerow([timestamp, f"{decibeis:.1f}", mensagem])
    print(f"💾 Log salvo: {timestamp} - {decibeis:.1f} dB")

# ===== FUNÇÃO PARA MOSTRAR GRÁFICO =====
def mostrar_grafico(arquivo="log_fofoqueiro.csv"):
    try:
        with open(arquivo, 'r', encoding='utf-8') as file:
            leitor = csv.reader(file)
            cabecalho = next(leitor)
            timestamps = []
            decibeis = []
            contador = 0
            for linha in leitor:
                timestamps.append(linha[0])
                decibeis.append(float(linha[1]))
                contador += 1
            
            ultimos = min(10, contador)
            timestamps = timestamps[-ultimos:]
            decibeis = decibeis[-ultimos:]
            
            plt.figure(figsize=(12, 6))
            cores = ['green' if db <= 75 else 'red' for db in decibeis]
            barras = plt.bar(range(len(decibeis)), decibeis, color=cores, alpha=0.7)
            plt.axhline(y=75, color='orange', linestyle='--', linewidth=2, label='Limite de Alerta (75 dB)')
            plt.xlabel('Medições (mais recente na direita)', fontsize=12)
            plt.ylabel('Decibéis Simulados (dB)', fontsize=12)
            plt.title('📊 Histórico do Robô Fofoqueiro - Últimas Medições', fontsize=14, fontweight='bold')
            plt.xticks(range(len(timestamps)), timestamps, rotation=45, ha='right')
            plt.ylim(0, 120)
            plt.grid(True, alpha=0.3)
            plt.legend()
            
            for i, (barra, db) in enumerate(zip(barras, decibeis)):
                altura = barra.get_height()
                plt.text(barra.get_x() + barra.get_width()/2., altura + 2, f'{db:.0f}dB', ha='center', va='bottom', fontsize=9)
            
            plt.tight_layout()
            plt.show()
            print(f"📈 Gráfico mostrado com os últimos {ultimos} registros!")
    except FileNotFoundError:
        print("⚠️ Ainda não há dados para mostrar. Faça algumas medições primeiro!")
    except Exception as e:
        print(f"❌ Erro ao gerar gráfico: {e}")

# ===== LOOP PRINCIPAL =====
def main():
    print("""
╔══════════════════════════════════════════════════════════╗
║                                                          ║
║ 🤖 ROBÔ FOFOQUEIRO - VERSÃO PARANÁENSE 🤖                ║
║                                                          ║
║ "Bora medir o barulho da galera!"                        ║
║ "Égua, que gritaria danada!"                             ║
║                                                          ║
║ Pressione 'q' a qualquer momento para sair              ║
║                                                          ║
╚══════════════════════════════════════════════════════════╝
    """)
    
    contador_medicoes = 0
    historico_dB = []
    
    try:
        while True:
            contador_medicoes += 1
            print(f"\n🔁 Medição #{contador_medicoes}")
            
            dB, alerta, mensagem = medidor_fofoqueiro()
            salvar_log(dB, mensagem)
            historico_dB.append(dB)
            
            if alerta:
                print("🚨 ALERTA! 🚨")
                print("🔴🔴🔴 PASSOU DOS 75 dB! TÁ MUITO ALTO! 🔴🔴🔴")
            
            comando = input("\nPressione ENTER para nova medição ou 'q' para sair: ")
            if comando.lower() == 'q':
                break
    except KeyboardInterrupt:
        print("\n\n🛑 Programa interrompido pelo usuário!")
    
    print("\n" + "="*50)
    print("📊 RESUMO DO ROBÔ FOFOQUEIRO")
    print("="*50)
    print(f"Total de medições realizadas: {contador_medicoes}")
    if historico_dB:
        print(f"Maior nível registrado: {max(historico_dB):.1f} dB")
        print(f"Menor nível registrado: {min(historico_dB):.1f} dB")
        print(f"Média dos níveis: {sum(historico_dB)/len(historico_dB):.1f} dB")
    
    print("\n📊 Gerando gráfico final com todo o histórico...")
    mostrar_grafico()
    print("\n✅ Programa encerrado com sucesso!")
    print("🙏 Valeu por usar o Robô Fofoqueiro - Tchê!")

if __name__ == "__main__":
    print("⚠️ IMPORTANTE: Execute no terminal do Colab:")
    print("!pip install pyaudio keyboard matplotlib numpy")
    print("!apt-get install portaudio19-dev")
    input("\nPressione ENTER após instalar as bibliotecas...")
    main()

Checklist de avaliação - Aluno

  • Código funcional que captura som e exibe dB?
  • Log CSV gerado com sucesso?
  • Gráfico plotado ao final com as últimas 10 medições?
  • Participação na discussão sobre "O robô reagiu certo?"
  • Testou diferentes níveis de barulho (sussurro, conversa, grito, palmas)?
  • Os memes e alertas personalizados aparecem corretamente?
Simulação de Coleta de Dados

Clique no botão abaixo para simular uma coleta de dados com diferentes níveis de som:

Critérios de Avaliação

  • Código funcional que captura som e exibe dB
  • Log CSV gerado com sucesso
  • Gráfico plotado ao final
  • Participação na discussão

Dica: "Se o código não rodar, verifica se instalou o pyaudio e o portaudio!"

Plano de Aula - Docente

Título: "Medindo o barulho da galera: o primeiro olho do robô"

Códigos BNCC: EM13CNT104, EM13MAT503, EM13LGG702 | RCP - Paraná: Física - Ondulatória, Matemática - Tratamento da Informação

Duração: 2 aulas (100 minutos)

Materiais: Notebook Colab, microfones, caixa de som


Dicas de mediação
  • Abertura (10min): Desafio "Quanto barulho tem na nossa sala?" - estimativa coletiva
  • Conceituação (15min): Explique decibéis (dB) e como o computador "escuta" (PCM, amostragem)
  • Codificação (40min): Implemente o código em duplas, incentive comentários irreverentes
  • Teste prático (20min): Organize estações: sussurro, conversa, grito, palmas
  • Fechamento (15min): Gere o gráfico e debata "O robô reagiu certo?"
👩‍🏫🧑‍🏫

Kit do Professor

Códigos RCP - Paraná

Física - Ondulatória - Relacionar frequência e intensidade sonora com aplicações práticas
Matemática - Tratamento da Informação - Construir e interpretar gráficos de dados coletados