Nota

Hola, ¡bienvenido a la comunidad de entusiastas de SunFounder Raspberry Pi, Arduino y ESP32 en Facebook! Sumérgete más profundamente en Raspberry Pi, Arduino y ESP32 junto a otros entusiastas.

¿Por qué unirse?

  • Soporte experto: Resuelve problemas postventa y desafíos técnicos con la ayuda de nuestra comunidad y equipo.

  • Aprender y compartir: Intercambia consejos y tutoriales para mejorar tus habilidades.

  • Avances exclusivos: Accede anticipadamente a nuevos anuncios de productos y adelantos exclusivos.

  • Descuentos especiales: Disfruta de descuentos exclusivos en nuestros productos más recientes.

  • Promociones y sorteos festivos: Participa en sorteos y promociones navideñas.

👉 ¿Listo para explorar y crear con nosotros? Haz clic en [Aquí] y únete hoy mismo.

4.1.5 Timbre Visual Inteligente

Introducción

En este proyecto, vamos a crear un timbre visual inteligente DIY.

Componentes Necesarios

En este proyecto, necesitamos los siguientes componentes.

../_images/3.1.19components.png

Es muy conveniente comprar un kit completo, aquí está el enlace:

Nombre

ELEMENTOS EN ESTE KIT

ENLACE

Kit Raphael

337

Raphael Kit

También puedes comprarlos por separado en los enlaces a continuación.

INTRODUCCIÓN DEL COMPONENTE

ENLACE DE COMPRA

Placa de Extensión GPIO

COMPRAR

Protoboard

COMPRAR

Cables de Puente

COMPRAR

Resistor

COMPRAR

Botón

COMPRAR

Módulo de Audio y Altavoz

-

Módulo de Cámara

COMPRAR

Diagrama Esquemático

Nombre T-Board

cableado físico

wiringPi

BCM

GPIO27

Pin 13

2

27

../_images/3.1.19_schematic.png

Procedimientos Experimentales

Paso 1: Construye el circuito.

../_images/3.1.19fritzing.png

Antes de este proyecto, debes asegurarte de haber completado 3.1.3 Módulo de Audio y 3.1.2 Módulo de Video. Paso 2: Accede a la carpeta del código.

cd ~/raphael-kit/python/

Paso 3: Ejecuta.

python3 4.1.5_DoorBell.py

Después de ejecutar el código:

  • El programa espera a que se presione el botón del timbre.

  • Cuando se presiona, se reproduce un sonido de timbre y se graba un video de 5 segundos.

  • El video se guarda como visitor.mp4 en el directorio personal del usuario.

  • El sistema vuelve al modo de espera hasta la siguiente pulsación del botón.

  • Presiona Ctrl+C para salir y liberar los recursos.

Código

Nota

Puedes Modificar/Restablecer/Copiar/Ejecutar/Detener el código a continuación. Pero antes de eso, necesitas ir a la ruta del código fuente como raphael-kit/python. Después de modificar el código, puedes ejecutarlo directamente para ver el efecto.

#!/usr/bin/env python3
import time
import os
import RPi.GPIO as GPIO
from pygame import mixer
from picamera2 import Picamera2, Preview
from picamera2.encoders import H264Encoder
from picamera2.outputs import FfmpegOutput

# --------------------------------------------------
# USER DIRECTORY
# --------------------------------------------------
user = os.getlogin()
user_home = os.path.expanduser(f"~{user}")

# --------------------------------------------------
# CAMERA SETUP (Picamera2)
# --------------------------------------------------
camera = Picamera2()

# Create a video configuration WITHOUT the deprecated "video=" argument
video_config = camera.create_video_configuration(
    main={"size": (1280, 720), "format": "XBGR8888"}
)
camera.configure(video_config)

# Create H264 encoder (10 Mbps is good quality for doorbell)
encoder = H264Encoder(bitrate=10_000_000)

# --------------------------------------------------
# GPIO SETUP
# --------------------------------------------------
BtnPin = 18
status = False

def setup():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    mixer.init()

def button_pressed(pin):
    """Button callback"""
    global status
    status = True

# --------------------------------------------------
# MAIN LOOP
# --------------------------------------------------
def main():
    global status
    GPIO.add_event_detect(BtnPin, GPIO.FALLING,
                        callback=button_pressed, bouncetime=250)

    print("Doorbell system running... Press the button to record.")

    while True:
        if status:
            print("Visitor detected!")

            # Play doorbell sound
            mixer.music.load(f"{user_home}/raphael-kit/music/doorbell.wav")
            mixer.music.set_volume(0.7)
            mixer.music.play()

            # Use QTGL preview
            camera.start_preview(Preview.QTGL)

            # Output file
            output_path = f"{user_home}/visitor.mp4"
            output = FfmpegOutput(output_path)

            # Start recording
            camera.start_recording(encoder, output)
            print(f"Recording video to {output_path}")

            time.sleep(5)  # Record for 5 seconds

            # Stop everything
            mixer.music.stop()
            camera.stop_recording()
            camera.stop_preview()

            print("Recording finished.\n")

            status = False

        time.sleep(0.05)

# --------------------------------------------------
# CLEAN EXIT
# --------------------------------------------------
def destroy():
    print("\nExiting...")

    mixer.quit()
    GPIO.cleanup()
    camera.close()

    print("Program exited cleanly.")

if __name__ == "__main__":
    setup()
    try:
        main()
    except KeyboardInterrupt:
        destroy()

Explicación del código

  1. Obtiene el directorio personal del usuario actual para almacenar el video grabado.

    user = os.getlogin()
    user_home = os.path.expanduser(f"~{user}")
    
  2. Crea una instancia de Picamera2 y la configura para grabación de video.

    camera = Picamera2()
    video_config = camera.create_video_configuration(
        main={"size": (1280, 720), "format": "XBGR8888"}
    )
    camera.configure(video_config)
    
  3. Configura el botón conectado a GPIO18 como entrada con una resistencia pull-up.

    GPIO.setmode(GPIO.BCM)
    GPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    
  4. Carga e inicializa el mezclador de audio utilizado para reproducir el sonido del timbre.

    mixer.init()
    
  5. Registra una función de callback que establece status en True cuando se presiona el botón.

    GPIO.add_event_detect(BtnPin, GPIO.FALLING,
                          callback=button_pressed, bouncetime=250)
    
  6. Reproduce el sonido del timbre, inicia la ventana de vista previa y comienza la grabación del video.

    mixer.music.load(f"{user_home}/raphael-kit/music/doorbell.wav")
    mixer.music.play()
    camera.start_preview(Preview.QTGL)
    camera.start_recording(encoder, output)
    
  7. Graba un video de 5 segundos y lo guarda como visitor.mp4.

    time.sleep(5)
    camera.stop_recording()
    camera.stop_preview()
    
  8. Libera todos los recursos cuando el programa se detiene con Ctrl+C.

    mixer.quit()
    GPIO.cleanup()
    camera.close()
    

Imagen del Fenómeno

../_images/4.1.5door_bell.JPG