🎤 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.
🎤📊🤣
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?" |
🎤 Nível de som simulado
0.0 dB
📢 Mensagem do Robô:
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
# -*- 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
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