Nota

Ciao, benvenuto nella SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community su Facebook! Approfondisci le tue conoscenze di Raspberry Pi, Arduino ed ESP32 con altri appassionati.

Perché unirti a noi?

  • Supporto esperto: Risolvi i problemi post-vendita e le sfide tecniche con l’aiuto della nostra comunità e del nostro team.

  • Impara e condividi: Scambia consigli e tutorial per migliorare le tue competenze.

  • Anteprime esclusive: Ottieni accesso anticipato a nuovi annunci di prodotti e anteprime esclusive.

  • Sconti speciali: Approfitta di sconti esclusivi sui nostri prodotti più recenti.

  • Promozioni e omaggi festivi: Partecipa a omaggi e promozioni speciali durante le festività.

👉 Sei pronto a esplorare e creare con noi? Clicca su [Qui] e unisciti oggi stesso!

4.1.5 Campanello intelligente con videocamera

Introduzione

In questo progetto, creiamo un campanello intelligente con videocamera fai-da-te.

Componenti necessari

In questo progetto, avremo bisogno dei seguenti componenti.

../_images/3.1.19components.png

È sicuramente conveniente acquistare un kit completo, ecco il link:

Nome

ELEMENTI IN QUESTO KIT

LINK

Kit Raphael

337

Raphael Kit

Puoi anche acquistarli separatamente dai link sottostanti.

INTRODUZIONE AI COMPONENTI

LINK PER L’ACQUISTO

Scheda di estensione GPIO

ACQUISTA

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Resistore

ACQUISTA

Pulsante

ACQUISTA

Modulo Audio e Altoparlante

-

Modulo Fotocamera

ACQUISTA

Schema elettrico

T-Board Name

physical

wiringPi

BCM

GPIO27

Pin 13

2

27

../_images/3.1.19_schematic.png

Procedura sperimentale

Passo 1: Costruisci il circuito.

../_images/3.1.19fritzing.png

Prima di iniziare questo progetto, assicurati di aver completato 3.1.3 Modulo Audio e 3.1.2 Modulo Video.

Passo 2: Accedi alla cartella del codice.

cd ~/raphael-kit/python/

Passo 3: Esegui.

python3 4.1.5_DoorBell.py

Dopo l’esecuzione del programma:

  • Il sistema attende che venga premuto il pulsante del campanello.

  • Quando il pulsante viene premuto, viene riprodotto il suono del campanello e viene registrato un video di 5 secondi.

  • Il video viene salvato come visitor.mp4 nella directory home dell’utente.

  • Il sistema ritorna quindi in modalità standby in attesa della successiva pressione del pulsante.

  • Premere Ctrl+C per uscire dal programma e liberare correttamente tutte le risorse.

Codice

Nota

Puoi Modificare/Resettare/Copiare/Eseguire/Fermare il codice qui sotto. Ma prima di farlo, devi accedere al percorso del codice sorgente come raphael-kit/python. Dopo aver modificato il codice, puoi eseguirlo direttamente per vedere l’effetto.

#!/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()

Spiegazione del Codice

  1. Recupera la directory home dell’utente corrente per salvare il video registrato.

    user = os.getlogin()
    user_home = os.path.expanduser(f"~{user}")
    
  2. Crea un’istanza di Picamera2 e la configura per la registrazione video.

    camera = Picamera2()
    video_config = camera.create_video_configuration(
        main={"size": (1280, 720), "format": "XBGR8888"}
    )
    camera.configure(video_config)
    
  3. Configura il pulsante su GPIO18 come ingresso con resistenza di pull-up.

    GPIO.setmode(GPIO.BCM)
    GPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    
  4. Carica e inizializza il mixer audio utilizzato per riprodurre il suono del campanello.

    mixer.init()
    
  5. Registra una callback che imposta status su True quando il pulsante viene premuto.

    GPIO.add_event_detect(BtnPin, GPIO.FALLING,
                          callback=button_pressed, bouncetime=250)
    
  6. Riproduce il suono del campanello, avvia la finestra di anteprima e inizia la registrazione 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. Registra un video di 5 secondi e lo salva come visitor.mp4.

    time.sleep(5)
    camera.stop_recording()
    camera.stop_preview()
    
  8. Ripristina tutte le risorse quando il programma viene interrotto con Ctrl+C.

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

Immagine del fenomeno

../_images/4.1.5door_bell.JPG