Tag: Python

  • LLMs Locais: Sua IA, Seu Hardware, Suas Regras

    LLMs Locais: Sua IA, Seu Hardware, Suas Regras

    Toda vez que você pergunta algo ao ChatGPT, Gemini ou Claude, seu texto viaja até um datacenter, atravessa camadas de roteamento, é processado por clusters de GPUs que consomem megawatts e volta com uma resposta. É mágica — mas também significa que um terceiro leu, processou e potencialmente armazenou sua pergunta. Para um maker, isso levanta uma questão inevitável: e se eu pudesse rodar isso aqui, no meu hardware, com zero dependência externa?

    A resposta em 2026 é: pode. E é mais fácil do que parece.

    O Que Mudou: De Gigantes a Anões Poderosos

    Em 2022, rodar um LLM decente localmente exigia uma GPU de US$ 3000. Em 2023, a Meta lançou o Llama 2, o primeiro modelo de código aberto competitivo. Em 2024, o Llama 3 chegou com variantes de 8B a 70B de parâmetros — a versão de 8 bilhões roda confortavelmente em 8 GB de RAM. A Mistral AI, startup francesa fundada por ex-engenheiros da Meta e DeepMind, lançou o Mistral 7B e o Mixtral 8x7B com arquitetura MoE (Mixture of Experts), eficientes e com desempenho próximo a modelos muito maiores.

    Mas o catalisador foi o Ollama: um projeto de código aberto que empacota modelos de linguagem em containers prontos para executar. Instalou, rodou. Sem configurar Python, sem compilar CUDA, sem dependências exóticas. O Ollama fez para LLMs o que o Docker fez para serviços web e o que o Arduino fez para microcontroladores: eliminou a fricção.

    Instalando e Rodando em 5 Minutos

    O Ollama roda em Linux, macOS e Windows. A instalação é um comando:

    # Linux
    curl -fsSL https://ollama.com/install.sh | sh
    
    # Windows
    # Baixe o instalador em https://ollama.com/download/windows
    

    Para baixar e rodar um modelo:

    # Llama 3 8B — ~4.7 GB de download
    ollama pull llama3
    ollama run llama3
    

    Pronto. Você está conversando com uma IA que roda integralmente na sua máquina. O prompt aparece no terminal. Sem navegador. Sem internet. Sem latência de rede. O zumbido dos coolers da sua GPU lembrando que você é o dono do datacenter agora.

    Outros modelos que recomendo testar:

    • Mistral 7B: ollama pull mistral — mais leve, excelente para código, roda em máquinas com 8 GB de RAM.
    • Phi-3 Mini (Microsoft): ollama pull phi3 — 3.8B parâmetros, surpreendentemente bom, cabe em 4 GB.
    • CodeGemma (Google): ollama pull codegemma — especializado em código, autocompleta Python como ninguém.
    • DeepSeek Coder V2: ollama pull deepseek-coder-v2 — open-source da DeepSeek, rival de peso para GPT-4 em código.

    Integrando com Python: Sua API Pessoal

    O Ollama expõe uma API REST na porta 11434. Com Python, é trivial:

    import requests
    import json
    
    def ask_llama(prompt):
        """Pergunta ao Llama 3 rodando localmente"""
        url = "http://localhost:11434/api/generate"
        payload = {
            "model": "llama3",
            "prompt": prompt,
            "stream": False
        }
        response = requests.post(url, json=payload)
        return response.json()["response"]
    
    # Exemplo: pergunte o que quiser
    resposta = ask_llama("Explique o que é um transistor MOSFET em duas frases.")
    print(resposta)
    

    Agora imagine um sistema maker que lê sensores (temperatura, umidade, presença) e consulta o LLM local para gerar um resumo do ambiente em linguagem natural: “Está quente e úmido no quarto, típico de tarde de verão. Recomendo ligar o ventilador e fechar a cortina.” Isso é IA no mundo físico — e é possível hoje.

    Casos de Uso Reais para o Maker

    • Assistente de código offline: o Ollama + Continue.dev (plugin VS Code) substitui o GitHub Copilot com zero custo e zero telemetria.
    • Interface em linguagem natural para projetos: em vez de um dashboard com 20 botões, uma caixa de texto: “acenda a luz da sala e regule para 50%” → o LLM interpreta → chama a API do Home Assistant.
    • Documentação automática: um script Python que lê os comentários do seu código e gera README.md com explicações em português.
    • Classificador de imagens local: com o LLaVA (modelo multimodal), você pergunta “tem alguém na porta?” e ele analisa o frame da ESP32-CAM sem enviar nada pra nuvem.
    • Tradutor embarcado: um display ePaper que traduz placas e menus em tempo real, offline.

    Hardware: Quanto Você Precisa Investir

    Uso Modelo RAM Mínima GPU Recomendada Investimento (~BR)
    Básico (chat, código simples) Phi-3 Mini / Mistral 7B (Q4) 8 GB Integrada serve R$ 0 (seu PC atual)
    Intermediário (projetos makers) Llama 3 8B / DeepSeek Coder 16 GB RTX 3060 12GB ~R$ 2000-3000 (GPU)
    Avançado (multimodal, código complexo) Llama 3 70B (Q4) / Mixtral 8x7B 32 GB+ RTX 3090/4090 24GB ~R$ 6000-10000

    A boa notícia: para a maioria dos casos de uso maker, um notebook com 16 GB de RAM já roda Llama 3 8B quantizado a 4 bits com velocidade aceitável (~10 tokens/s em CPU, ~50 tokens/s com GPU). Você não precisa montar um cluster.

    A Questão da Privacidade (E Por Que Ela Importa)

    Quando você usa um LLM na nuvem, está compartilhando seu contexto — seus projetos, suas ideias, seu código proprietário — com uma corporação. Para um hobby, talvez não importe. Para uma startup desenvolvendo um produto, importa muito. Para um jornalista ou ativista trabalhando com dados sensíveis, é existencial.

    LLMs locais resolvem isso por definição: os dados nunca saem da sua máquina. Você pode desconectar o cabo de rede e continuar usando. Pode auditar o modelo. Pode fazer fine-tuning com seus próprios dados. É a diferença entre alugar um quarto e ser dono da casa.

    Fontes e Referências

  • Robótica com ROS 2: O Sistema Operacional Que os Robôs Merecem

    Robótica com ROS 2: O Sistema Operacional Que os Robôs Merecem

    Se você já programou um Arduino para seguir linha com sensor infravermelho, sabe que robótica “bare metal” é deliciosa — e rapidamente insustentável. Adicione uma câmera. Depois um LIDAR. Depois um IMU. Depois planejamento de trajetória. De repente você está gerenciando dezenas de threads, timestamps, transformadas de coordenadas e fusão de sensores — e seu código virou um spaghetti que só você entende (e olhe lá). Foi exatamente para resolver isso que nasceu o ROS.

    O Que É ROS (E Por Que a Versão 2)

    ROS (Robot Operating System) não é um sistema operacional no sentido tradicional — não substitui Linux, não faz boot. É um middleware: uma camada de comunicação que organiza os componentes de software de um robô como uma rede de nós (nodes) que trocam mensagens por tópicos (topics). Criado em 2007 no laboratório de Inteligência Artificial de Stanford e mantido pela Open Robotics, o ROS tornou-se o padrão de fato para robótica acadêmica e industrial.

    O ROS 1, porém, tinha falhas fundamentais: dependia de um nó central (roscore) — se ele caísse, o robô inteiro parava. Não havia segurança de rede. A comunicação era frágil em WiFi. Não havia suporte a sistemas em tempo real. Não rodava nativamente no Windows. E era monolítico: você não conseguia atualizar um componente sem recompilar o sistema inteiro.

    O ROS 2, lançado oficialmente em 2020 com a distribuição Foxy Fitzroy, reescreveu a arquitetura do zero sobre o DDS (Data Distribution Service), um padrão industrial de comunicação publish-subscribe descentralizado. Resultado: sem nó central, TLS nativo, QoS configurável, suporte a múltiplos sistemas operacionais (Ubuntu, Windows, macOS) e, crucialmente, arquitetura de microsserviços.

    Três Conceitos Que Você Precisa Entender

    A metáfora que eu uso nas aulas é uma redação de jornal:

    • Node (nó): é um repórter. Cada nó faz uma coisa específica: um lê o LIDAR, outro processa odometria, outro controla os motores. Cada nó é um processo independente — pode ser em Python, C++, até Rust.
    • Topic (tópico): é o quadro de avisos onde os repórteres publicam. Um nó publica mensagens num tópico (publisher); outros nós assinam esse tópico (subscriber). O sensor de temperatura publica em /temp; o nó do painel assina e mostra no display.
    • Service (serviço): é quando você precisa de uma resposta pontual. Enquanto tópicos são streams contínuas, serviços são request-reply. “Tira uma foto agora” → serviço. “Mande todos os frames de vídeo” → tópico.

    Mão na Massa: Instalando o ROS 2 Humble

    Vamos usar o ROS 2 Humble Hawksbill, a distribuição LTS atual, rodando no Ubuntu 22.04. Se você usa Windows, recomendo instalar via WSL2 — funciona perfeitamente com acesso a GPU e USB.

    # Adiciona o repositório da Open Robotics
    sudo apt update && sudo apt install curl gnupg lsb-release
    sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
    echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list
    
    # Instala o ROS 2 Humble (versão desktop completa)
    sudo apt update
    sudo apt install ros-humble-desktop python3-colcon-common-extensions
    

    Após a instalação, configure o ambiente:

    # Adicione isso ao seu ~/.bashrc
    echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
    source ~/.bashrc
    

    Primeiro Robô: TurtleSim

    O Turtlesim é o “Hello World” do ROS — e, como toda boa ferramenta de aprendizado, é simples por fora e profundo por dentro. É uma simulação 2D de uma tartaruga que você controla por mensagens ROS.

    Abra três terminais. Em cada um, rode source /opt/ros/humble/setup.bash (se não estiver no bashrc).

    Terminal 1 — Rode o simulador:

    ros2 run turtlesim turtlesim_node
    

    Uma janela azul se abre com uma tartaruga no centro. Viva — seu primeiro robô virtual está rodando.

    Terminal 2 — Controle a tartaruga via teclado:

    ros2 run turtlesim turtle_teleop_key
    

    Use as setas para mover a tartaruga. A cada tecla pressionada, o nó teleop publica mensagens no tópico /turtle1/cmd_vel (velocidade linear e angular). O nó turtlesim assina esse tópico e atualiza a posição.

    Terminal 3 — Inspecione o sistema:

    # Lista todos os nós rodando
    ros2 node list
    
    # Lista todos os tópicos
    ros2 topic list
    
    # Mostra o conteúdo de um tópico em tempo real
    ros2 topic echo /turtle1/cmd_vel
    
    # Mostra o grafo de nós e tópicos
    rqt_graph
    

    O rqt_graph é mágico: você vê visualmente que o nó teleop publica em /turtle1/cmd_vel e o nó turtlesim assina. É a arquitetura do seu robô desenhada automaticamente.

    Programando Seu Próprio Nó em Python

    Crie um workspace ROS 2 e um package Python:

    mkdir -p ~/robot_ws/src && cd ~/robot_ws
    colcon build
    source install/setup.bash
    
    cd ~/robot_ws/src
    ros2 pkg create --build-type ament_python meu_robo --dependencies rclpy geometry_msgs
    

    Crie o arquivo ~/robot_ws/src/meu_robo/meu_robo/quadrado.py:

    import rclpy
    from rclpy.node import Node
    from geometry_msgs.msg import Twist
    import time
    
    class SquareMover(Node):
        def __init__(self):
            super().__init__('square_mover')
            # Publisher para o tópico de velocidade da tartaruga
            self.publisher = self.create_publisher(Twist, '/turtle1/cmd_vel', 10)
            self.timer = self.create_timer(0.5, self.move_square)
            self.step = 0
    
        def move_square(self):
            msg = Twist()
            if self.step % 2 == 0:
                # Anda reto
                msg.linear.x = 2.0
                msg.angular.z = 0.0
            else:
                # Gira 90°
                msg.linear.x = 0.0
                msg.angular.z = 1.57  # ~π/2 radianos
            self.publisher.publish(msg)
            self.step += 1
            self.get_logger().info(f'Step {self.step}: linear={msg.linear.x}, angular={msg.angular.z}')
    
    def main():
        rclpy.init()
        node = SquareMover()
        rclpy.spin(node)
        node.destroy_node()
        rclpy.shutdown()
    
    if __name__ == '__main__':
        main()
    

    Adicione o entry point no setup.py do package e compile:

    cd ~/robot_ws && colcon build && source install/setup.bash
    ros2 run meu_robo quadrado
    

    Sua tartaruga começa a desenhar quadrados na tela. O que está acontecendo: seu nó Python publica mensagens Twist (velocidade linear + angular) no tópico /turtle1/cmd_vel. O nó turtlesim assina esse tópico e move a tartaruga. Você não mexeu no código do simulador — só publicou na interface certa.

    Isso é a essência do ROS: componentes desacoplados que conversam por mensagens padronizadas. Você pode trocar o simulador por um robô real, mantendo o mesmo código de controle — é só o tópico que muda de nome.

    Por Que Isso Importa Para o Maker

    ROS 2 não é só para Boston Dynamics e NASA. Com a popularização de plataformas como TurtleBot 4, Leo Rover e até kits baseados em ESP32 + micro-ROS, a robótica com ROS está chegando ao orçamento maker. Um robô diferencial com LIDAR, IMU e câmera, rodando ROS 2 e fazendo SLAM (mapeamento simultâneo) pode ser montado por menos de R$ 2000 em 2026.

    O aprendizado de ROS 2 é um investimento de carreira: vagas de engenharia robótica que pedem ROS pagam consistentemente acima da média, e a demanda só cresce com logística autônoma, agricultura de precisão e inspeção industrial. E tudo começa com uma tartaruga desenhando quadrados no Ubuntu.

    Fontes e Referências

  • Raspberry Pi: O Computador Que Cabe na Palma

    Raspberry Pi: O Computador Que Cabe na Palma

    Em 2006, Eben Upton trabalhava como diretor de estudos no St. John’s College, Cambridge. O problema que ele via ano após ano era desanimador: os candidatos ao curso de Ciência da Computação chegavam sabendo fazer websites e planilhas, mas nunca tinham mexido com hardware, nunca tinham programado em baixo nível, nunca tinham ligado um LED com código. Eles sabiam usar computadores, mas não sabiam o que eles eram.

    Raspberry Pi: O Computador Que Cabe na Palma
    Foto: rail fox ( flufftech.net ) — CC0 (via Wikimedia Commons, arquivo File:Raspberry Pi 4 on a network switch.jpg)

    Upton reuniu um time no Laboratório de Computação de Cambridge e passou seis anos projetando um computador que fosse barato o suficiente para qualquer adolescente comprar com a mesada, poderoso o suficiente para programar de verdade, e aberto o suficiente para hackear sem medo. Em 29 de fevereiro de 2012, o Raspberry Pi Modelo B foi lançado. O site da fundação caiu em minutos. Em 2026, mais de 60 milhões de unidades depois, o “pequeno computador que podia” virou um ecossistema.

    Do Pi 1 ao Pi 5: Uma Evolução Impressionante

    A primeira versão do Pi tinha um processador ARM de 700 MHz, 256 MB de RAM e uma porta HDMI. Parece piada hoje, mas em 2012 era revolucionário por US$ 35. A evolução foi consistente:

    • Raspberry Pi 1 (2012): 700 MHz, 256 MB RAM, 2 USB, Ethernet 100Mbps, HDMI
    • Raspberry Pi 2 (2015): 900 MHz quad-core, 1 GB RAM — finalmente utilizável como desktop leve
    • Raspberry Pi 3 (2016): 1.2 GHz, WiFi e Bluetooth integrados — IoT sem dongles USB
    • Raspberry Pi 4 (2019): 1.5 GHz, até 8 GB RAM, USB 3.0, dual HDMI 4K — um computador de verdade
    • Raspberry Pi 5 (2023): 2.4 GHz, até 16 GB RAM, PCIe 2.0, RTC integrado, GPU VideoCore VII — performance comparável a um laptop de entrada

    Hoje, para o maker, recomendo o Raspberry Pi 4 com 4 GB como ponto ideal custo-benefício. O Pi 5 é mais rápido, mas para servidores, automação e projetos maker, o Pi 4 já é overkill. Se você quer desktop replacement, vá de Pi 5 com 8 GB.

    O Que Um Raspberry Pi Pode Ser

    Diferente do Arduino (que é um microcontrolador — roda um programa de cada vez, sem sistema operacional), o Raspberry Pi é um computador completo rodando Linux. Isso expande radicalmente os casos de uso:

    • Servidor web: com Nginx ou Apache2, você hospeda sites, APIs, dashboards. Um Pi 4 aguenta tráfego moderado sem suar.
    • Home Assistant: a central de automação residencial mais popular do mundo roda que à uma beleza num Pi 4. Controle luzes, sensores, câmeras, tudo local, sem nuvem.
    • Pi-hole: bloqueador de anúncios e rastreadores para toda a rede doméstica. Instala em 10 minutos e transforma sua navegação.
    • Media center: com LibreELEC/Kodi, o Pi vira uma central multimédia que toca qualquer codec, de H.264 a HEVC (Pi 5 suporta 4K60 HEVC por hardware).
    • Console retrô: RetroPie ou Batocera emulam de Atari 2600 a PlayStation 1. O Pi 5 emula até Dreamcast e PSP com folga.
    • Estação meteorológica: sensores de temperatura, umidade, pressão barométrica e qualidade do ar conectados via GPIO, com dados armazenados em InfluxDB, visualizados no Grafana.
    • Cluster de Kubernetes: junte 3 ou 4 Raspberry Pis em um cluster com K3s para aprender orquestração de containers como se fosse um datacenter em miniatura.
    • Cérebro de robô: com ROS (Robot Operating System), o Pi processa visão computacional e tomada de decisão enquanto delega controle de motores para Arduinos conectados via serial.

    Primeiro Projeto em 15 Minutos

    Vamos instalar o Raspberry Pi OS, conectar via SSH e acender um LED com Python. Você vai precisar de: Raspberry Pi (qualquer modelo), cartão microSD de 16 GB+, fonte USB-C 5V 3A, um LED 5mm, resistor 220é, jumpers fêmea-macho e breadboard.

    1. Gravar o Sistema

    Baixe o Raspberry Pi Imager no seu computador principal. Insira o microSD, abra o Imager e escolha: Raspberry Pi Device > seu modelo, Operating System > Raspberry Pi OS (64-bit), Storage > seu cartão SD. Antes de gravar, clique na engrenagem para configurar: hostname (ex: piprojeto.local), usuário/senha, WiFi e — essencial — habilite SSH. Grave.

    2. Conectar via SSH

    Insira o microSD no Pi, conecte a fonte e espere 1-2 minutos. No seu computador, abra o terminal e conecte:

    ssh usuario@piprojeto.local

    Se não encontrar o hostname, descubra o IP do Pi no roteador ou use um scanner como nmap. Quando o prompt aparecer, você está dentro de um servidor Linux que cabe na palma da mão.

    3. Acender LED com Python

    Monte o circuito no GPIO: ânodo do LED (perna longa) no pino GPIO 17 (pino físico 11), cátodo via resistor de 220é no GND (pino físico 9). Agora instale a biblioteca GPIO e crie o script:

    sudo apt update
    sudo apt install python3-gpiozero -y
    nano led.py
    

    Dentro do nano, escreva:

    from gpiozero import LED
    from time import sleep
    
    led = LED(17)
    
    while True:
        led.on()
        sleep(1)
        led.off()
        sleep(1)
    

    Salve (Ctrl+O, Enter, Ctrl+X) e execute: python3 led.py. O LED pisca. Você acabou de conectar o mundo da computação Linux ao mundo físico dos componentes eletrônicos. Isso é extraordinário.

    Fontes e Referências

  • Visão Computacional com OpenCV e Raspberry Pi: A Campainha Que Sabe Quem Chegou

    Visão Computacional com OpenCV e Raspberry Pi: A Campainha Que Sabe Quem Chegou

    Reconhecimento facial era coisa de filme de espionagem em 2010. Em 2026, é uma biblioteca Python de 15 linhas rodando num computador de R$ 400 que cabe na palma da mão. O que mudou não foi só o hardware — foi o OpenCV, o projeto de visão computacional open-source mais importante do planeta, que transformou processamento de imagem de especialidade acadêmica em commodity para makers. Hoje vou mostrar como montar uma campainha inteligente que reconhece quem está na porta, notifica seu celular e mantém um registro de visitantes — tudo rodando localmente num Raspberry Pi 5.

    Visão Computacional com OpenCV e Raspberry Pi: A Campainha Que Sabe Quem Chegou
    Wikimedia Commons — CC BY-SA 4.0, autor the Raspberry Pi Foundation

    OpenCV: 25 Anos de Olhos de Máquina

    O OpenCV (Open Source Computer Vision Library) nasceu em 1999 como um projeto interno da Intel Research, liderado por Gary Bradski. A ideia original era acelerar aplicações de visão computacional usando as instruções MMX dos processadores Intel da época. Em 2000, foi liberado como open-source sob licença BSD. Desde então, tornou-se a biblioteca mais usada do mundo para processamento de imagem: mais de 2500 algoritmos otimizados, suporte a GPUs via CUDA e OpenCL, bindings para Python, C++, Java, MATLAB.

    Em 2001, Paul Viola e Michael Jones publicaram um paper que mudou a história da detecção facial: um algoritmo capaz de detectar rostos em tempo real usando classificadores em cascata baseados em características Haar-like. Esse algoritmo foi incorporado ao OpenCV e, duas décadas depois, ainda é o ponto de entrada mais comum para quem quer brincar com visão computacional. Ele não é o mais preciso (redes neurais convolucionais são melhores), mas é absurdamente rápido e funciona em hardware modesto.

    O Hardware: Por Que Raspberry Pi 5

    O Raspberry Pi 5, lançado em outubro de 2023, é um salto geracional significativo. Com o chip BCM2712 quad-core ARM Cortex-A76 a 2.4 GHz, 4 ou 8 GB de RAM e suporte a PCIe 2.0 x1, ele tem potência para rodar detecção facial em tempo real a 15-30 FPS sem GPU externa. A versão de 4 GB custa ~R$ 400-500 no Brasil (via importadores como FilipeFlop ou Mercado Livre). Com uma câmera oficial Raspberry Pi Camera Module 3 (8 MP, autofoco, ~R$ 150), você tem uma plataforma de visão computacional poderosa por menos de R$ 600.

    Materiais

    • Raspberry Pi 5 (4 GB) com cartão microSD de 32 GB+
    • Raspberry Pi Camera Module 3 (ou uma webcam USB compatível com Linux)
    • Fonte 5V/3A USB-C
    • Um buzzer ativo 5V — para a campainha física
    • Um botão táctil — o “botão de campainha”
    • Resistor 10kΩ para pull-up do botão

    Mão na Massa: O Código

    Assumindo Raspberry Pi OS Bookworm instalado e Python 3.11 (vem de fábrica), instale as dependências:

    sudo apt update
    sudo apt install python3-opencv python3-picamera2
    pip install opencv-python face-recognition numpy
    

    O face-recognition é uma biblioteca construída sobre o dlib e o OpenCV por Adam Geitgey. Ela abstrai a complexidade de deep learning com uma API de três linhas — literalmente.

    Crie o arquivo campainha.py:

    import cv2
    import face_recognition
    import numpy as np
    from picamera2 import Picamera2
    from datetime import datetime
    import json
    import os
    
    # Inicializa a câmera
    picam2 = Picamera2()
    config = picam2.create_preview_configuration(main={"size": (640, 480)})
    picam2.configure(config)
    picam2.start()
    
    # Carrega fotos de referência (rostos conhecidos)
    known_encodings = []
    known_names = []
    
    # Crie uma pasta 'faces' com fotos nomeadas: joao.jpg, maria.jpg
    faces_dir = "faces"
    if os.path.exists(faces_dir):
        for filename in os.listdir(faces_dir):
            if filename.endswith((".jpg", ".png")):
                img = face_recognition.load_image_file(f"{faces_dir}/{filename}")
                encodings = face_recognition.face_encodings(img)
                if encodings:
                    known_encodings.append(encodings[0])
                    known_names.append(os.path.splitext(filename)[0])
    
    print(f"Rostos carregados: {known_names}")
    
    # Variáveis de estado
    last_detection = {}
    cooldown = 30  # segundos entre notificações da mesma pessoa
    
    def log_visit(name):
        """Registra a visita em JSON"""
        entry = {
            "timestamp": datetime.now().isoformat(),
            "person": name
        }
        print(f"VISITA: {name} às {entry['timestamp']}")
        # Salva no arquivo de log
        try:
            with open("visits_log.json", "r") as f:
                log = json.load(f)
        except:
            log = []
        log.append(entry)
        with open("visits_log.json", "w") as f:
            json.dump(log, f, indent=2)
    
    print("Campainha Inteligente Iniciada. Pressione Ctrl+C para sair.")
    
    while True:
        frame = picam2.capture_array()
        
        # OpenCV usa BGR, face_recognition usa RGB
        rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        
        # Reduz resolução para acelerar processamento
        small_frame = cv2.resize(rgb_frame, (0, 0), fx=0.25, fy=0.25)
        
        # Detecta localizações dos rostos
        face_locations = face_recognition.face_locations(small_frame)
        face_encodings = face_recognition.face_encodings(small_frame, face_locations)
        
        for (top, right, bottom, left), encoding in zip(face_locations, face_encodings):
            name = "Desconhecido"
            color = (0, 0, 255)  # Vermelho para desconhecidos
            
            # Compara com rostos conhecidos
            if known_encodings:
                matches = face_recognition.compare_faces(known_encodings, encoding, tolerance=0.6)
                if True in matches:
                    idx = matches.index(True)
                    name = known_names[idx]
                    color = (0, 255, 0)  # Verde para conhecidos
            
            # Escala de volta para o tamanho original
            top, right, bottom, left = [x * 4 for x in (top, right, bottom, left)]
            
            # Desenha o retângulo
            cv2.rectangle(frame, (left, top), (right, bottom), color, 2)
            cv2.putText(frame, name, (left, top - 10),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.7, color, 2)
            
            # Log com cooldown
            now = datetime.now().timestamp()
            if name not in last_detection or (now - last_detection[name]) > cooldown:
                log_visit(name)
                last_detection[name] = now
        
        # Mostra o frame
        cv2.imshow("Campainha Inteligente", frame)
        
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    cv2.destroyAllWindows()
    picam2.stop()
    

    Esse código faz cinco coisas: captura frames da câmera a 640×480, reduz para 160×120 para processar mais rápido, detecta rostos (Haar cascade acelerado por CNN via face_recognition), compara com uma base de rostos conhecidos e registra as visitas num arquivo JSON. Tudo local. Nada vai pra nuvem.

    Indo Além: Notificação no Celular

    O próximo passo é fazer a campainha notificar o celular quando alguém chega. Use o Pushover (app pago, US$ 5 vitalício) ou Telegram Bot API (grátis). Inclua isso no laço principal:

    import requests
    
    def notify(name):
        # Usando Telegram Bot API
        bot_token = "SEU_TOKEN"
        chat_id = "SEU_CHAT_ID"
        msg = f"Alguém na porta: {name}"
        url = f"https://api.telegram.org/bot{bot_token}/sendMessage"
        requests.post(url, json={"chat_id": chat_id, "text": msg})
    

    Agora você recebe uma notificação no celular com o nome de quem está na porta. Se for desconhecido, você decide se atende ou não — direto da notificação.

    Onde Isso Vai Parar

    A campainha que reconhece rostos é o portal de entrada para visão computacional maker. A partir daqui, você pode: detectar placas de carro no portão (EasyOCR + OpenCV), contar pessoas numa loja, identificar objetos numa esteira de produção, fazer leitura de medidores analógicos (gás, água, luz), classificar frutas numa máquina agrícola. O OpenCV é a biblioteca, o Raspberry Pi 5 é o cérebro — o limite é o problema que você quer resolver.

    E a pergunta filosófica que fica: se sua campainha sabe quem é você, quem mais precisa saber?

    Fontes e Referências