Nota

Ciao, benvenuto nella community di appassionati di SunFounder Raspberry Pi & Arduino & ESP32 su Facebook! Approfondisci Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.

Perché unirti a noi?

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

  • Impara & Condividi: Scambia suggerimenti e tutorial per migliorare le tue competenze.

  • Anteprime Esclusive: Accedi in anteprima agli annunci di nuovi prodotti e alle anticipazioni.

  • Sconti Speciali: Approfitta di sconti esclusivi sui nostri nuovi prodotti.

  • Promozioni Festive e Giveaway: Partecipa a promozioni festive e giveaway.

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

4.1.19 Sistema di Presenze

Introduzione

Creiamo un semplice sistema di presenze. Quando si scansiona la carta, il Raspberry Pi registrerà le informazioni e genererà un file CSV.

Componenti Necessari

In questo progetto, ci servono i seguenti componenti.

../_images/4.1.20components2.png

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

Nome

ELEMENTI IN QUESTO KIT

LINK

Raphael Kit

337

Raphael Kit

Puoi anche acquistare i componenti separatamente dai link qui sotto.

INTRODUZIONE COMPONENTI

LINK ACQUISTO

Scheda di estensione GPIO

ACQUISTA

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Modulo Audio e Altoparlante

-

Modulo Matrice LED

ACQUISTA

Modulo MFRC522

ACQUISTA

Schema Elettrico

T-Board Name

physical

wiringPi

BCM

GPIO25

Pin 22

6

25

SPIMOSI

Pin 19

12

MOSI

SPIMISO

Pin 19

12

MISO

SPICE0

pin 24

10

CE0

SPICE1

pin 26

11

CE1

SPISCLK

Pin 23

14

SCLK

../_images/4.1.20_schematic.png

Procedure Sperimentali

Nota

Attiva SPI prima di iniziare l’esperimento, fai riferimento a Configurazione SPI per i dettagli.

Sono necessarie anche le librerie Luma.LED_Matrix e Spidev e MFRC522.

Passo 1: Costruisci il circuito.

../_images/atten1.png

Passo 2: Esegui il file 2.2.10_write.py per modificare il contenuto della carta RFID.

cd ~/raphael-kit/python
sudo python3 2.2.10_write.py

Passo 3: Inserisci il nome (qui usiamo John come esempio) e premi Enter per confermare, quindi avvicina la carta al modulo MFRC522, aspetta che appaia «Data writing is complete» e rimuovi la carta, oppure riscrivi il messaggio su un’altra carta ed esci con Ctrl+C.

../_images/write_card.png

Passo 4: Vai nella cartella del codice ed esegui.

cd ~/raphael-kit/python
sudo python3 4.1.19_Attendance_Machine.py

Dopo aver avviato il programma, avvicina la carta RFID al modulo MFRC522 RFID, il Raspberry Pi ti invierà un saluto vocale e lo visualizzerà sulla matrice LED.

Troveremo anche un file .csv che registra il tempo e l’elenco nella stessa directory. Aprilo con il comando nano e vedrai il record appena creato.

sudo nano attendance_sheet.2021.06.29.csv
../_images/atten3.png

Codice

Nota

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

import time
from tts import TTS
import RPi.GPIO as GPIO
from mfrc522 import SimpleMFRC522
from luma.core.interface.serial import spi, noop
from luma.core.render import canvas
from luma.core.virtual import viewport
from luma.led_matrix.device import max7219
from luma.core.legacy import text
from luma.core.legacy.font import proportional, CP437_FONT, LCD_FONT

serial = spi(port=0, device=1, gpio=noop())
device = max7219(serial, rotate=1)
virtual = viewport(device, width=200, height=400)

reader = SimpleMFRC522()

tts = TTS(engine="espeak")
tts.lang('en-US')

attendance_statistics = {}

def get_time():
    time.time()
    year = str(time.strftime('%Y',time.localtime(time.time())))
    month = str(time.strftime('%m',time.localtime(time.time())))
    day = str(time.strftime('%d',time.localtime(time.time())))
    hour = str(time.strftime('%H',time.localtime(time.time())))
    minute = str(time.strftime('%M',time.localtime(time.time())))
    second = str(time.strftime('%S',time.localtime(time.time())))
    present_time = year + '.' + month + '.' + day + '.' + hour + '.' + minute + '.' + second
    present_date = year + '.' + month + '.' + day
    return present_date, present_time

def main():
    while True:
        print("Reading...Please place the card...")
        id, name = reader.read()
        print(id,name)
        greeting = name.rstrip() + ", Welcome!"
        present_date, present_time = get_time()
        attendance_statistics[name.rstrip()] = present_time
        tts.say(greeting)
        with open('attendance_sheet.' + present_date + '.csv', 'w') as f:
            [f.write('{0}  {1}\n'.format(key, value)) for key, value in attendance_statistics.items()]
        with canvas(virtual) as draw:
            text(draw, (0, 0), greeting, fill="white", font=proportional(CP437_FONT))
        for offset in range(95):
            virtual.set_position((offset,0))
            time.sleep(0.1)

def destroy():
    GPIO.cleanup()
    pass

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

Spiegazione del Codice

Per comprendere meglio il programma, potrebbe essere necessario completare prima 1.1.6 Matrice a Punti LED, 2.2.10 Modulo RFID MFRC522 e 3.1.4 Sintesi vocale (Text-to-speech).

def get_time():
        time.time()
        year = str(time.strftime('%Y',time.localtime(time.time())))
        month = str(time.strftime('%m',time.localtime(time.time())))
        day = str(time.strftime('%d',time.localtime(time.time())))
        hour = str(time.strftime('%H',time.localtime(time.time())))
        minute = str(time.strftime('%M',time.localtime(time.time())))
        second = str(time.strftime('%S',time.localtime(time.time())))
        present_time = year + '.' + month + '.' + day + '.' + hour + '.' + minute + '.' + second
        present_date = year + '.' + month + '.' + day
        return present_date, present_time

Usa la funzione get_time() per ottenere il timestamp corrente e restituire due valori. Tra questi, present_date è preciso al numero di giorni del timestamp corrente e present_time è preciso al numero di secondi del timestamp corrente.

id, name = reader.read()
greeting = name.rstrip() + ", Welcome!"
present_date, present_time = get_time()
attendance_statistics[name.rstrip()] = present_time

La funzione reader.read() legge le informazioni sul nome, quindi crea un saluto. Successivamente viene generato un dizionario attendance_statistics, e name.rstrip() e present_time vengono memorizzati come chiavi e valori.

tts.say(greeting)

Pronuncia un saluto tramite l’altoparlante.

with open('attendance_sheet.' + present_date + '.csv', 'w') as f:
    [f.write('{0}  {1}\n'.format(key, value)) for key, value in attendance_statistics.items()]

Scrivi i dati di attendance_statistics nel file .csv.

with canvas(virtual) as draw:
    text(draw, (0, 0), greeting, fill="white", font=proportional(CP437_FONT))
for offset in range(95):
    virtual.set_position((offset,0))
    time.sleep(0.1)

Fai scorrere questo saluto sul display.

Immagine del Fenomeno

../_images/attend_system.JPG