code & files for nfc movie player
Adding code, image and files for raspberry pi nfc movie player
This commit is contained in:
parent
c40878161d
commit
60ecc7e56b
5 changed files with 191 additions and 0 deletions
52
Raspberry_Pi_NFC_Movie_Player/add_movie.py
Normal file
52
Raspberry_Pi_NFC_Movie_Player/add_movie.py
Normal file
|
|
@ -0,0 +1,52 @@
|
||||||
|
# SPDX-FileCopyrightText: Copyright (c) 2024 Liz Clark for Adafruit Industries
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
import csv
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import board
|
||||||
|
import busio
|
||||||
|
from digitalio import DigitalInOut
|
||||||
|
from adafruit_pn532.spi import PN532_SPI
|
||||||
|
|
||||||
|
spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
|
||||||
|
cs_pin = DigitalInOut(board.D24)
|
||||||
|
pn532 = PN532_SPI(spi, cs_pin, debug=False)
|
||||||
|
|
||||||
|
csv_file = "movies.csv"
|
||||||
|
if not os.path.isfile(csv_file):
|
||||||
|
with open(csv_file, mode='w', newline='') as file:
|
||||||
|
writer = csv.writer(file)
|
||||||
|
writer.writerow(['uid', 'movie'])
|
||||||
|
|
||||||
|
def is_duplicate(uid, mov):
|
||||||
|
with open(csv_file, mode='r') as f:
|
||||||
|
reader = csv.DictReader(f)
|
||||||
|
for row in reader:
|
||||||
|
if row['uid'] == uid or row['movie'] == mov:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
ic, ver, rev, support = pn532.firmware_version
|
||||||
|
print("Found PN532 with firmware version: {0}.{1}".format(ver, rev))
|
||||||
|
|
||||||
|
# Configure PN532 to communicate with MiFare cards
|
||||||
|
pn532.SAM_configuration()
|
||||||
|
|
||||||
|
print("Waiting for new RFID/NFC card...")
|
||||||
|
|
||||||
|
while True:
|
||||||
|
the_uid = pn532.read_passive_target(timeout=0.05)
|
||||||
|
if the_uid is not None:
|
||||||
|
uid_str = f"{[hex(i) for i in the_uid]}"
|
||||||
|
movie = input("Enter the name of the new movie: ")
|
||||||
|
movie = f"{movie}"
|
||||||
|
if is_duplicate(uid_str, movie):
|
||||||
|
print("UID {uid_str} or movie {movie} already exists, skipping.")
|
||||||
|
else:
|
||||||
|
with open(csv_file, mode='a', newline='') as file:
|
||||||
|
writer = csv.writer(file)
|
||||||
|
writer.writerow([uid_str, movie])
|
||||||
|
print(f"Added UID {uid_str} with movie title {movie} to movies.csv")
|
||||||
|
sys.exit()
|
||||||
BIN
Raspberry_Pi_NFC_Movie_Player/blinka.png
Normal file
BIN
Raspberry_Pi_NFC_Movie_Player/blinka.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 54 KiB |
1
Raspberry_Pi_NFC_Movie_Player/movies.csv
Normal file
1
Raspberry_Pi_NFC_Movie_Player/movies.csv
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
uid,movie
|
||||||
|
125
Raspberry_Pi_NFC_Movie_Player/nfc_movie_player.py
Normal file
125
Raspberry_Pi_NFC_Movie_Player/nfc_movie_player.py
Normal file
|
|
@ -0,0 +1,125 @@
|
||||||
|
# SPDX-FileCopyrightText: Copyright (c) 2024 Liz Clark for Adafruit Industries
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
import subprocess
|
||||||
|
import csv
|
||||||
|
from datetime import datetime
|
||||||
|
import os
|
||||||
|
import tkinter as tk
|
||||||
|
from PIL import Image, ImageTk
|
||||||
|
import board
|
||||||
|
import busio
|
||||||
|
from digitalio import DigitalInOut
|
||||||
|
from adafruit_pn532.spi import PN532_SPI
|
||||||
|
|
||||||
|
# ---- Update these file paths for your raspberry pi! ----
|
||||||
|
home_path = "/home/YOUR-USERNAME"
|
||||||
|
image_path = f"{home_path}/Pictures/blinka.png"
|
||||||
|
movie_path = f"{home_path}/Videos"
|
||||||
|
csv_file = "movies.csv"
|
||||||
|
# ----
|
||||||
|
|
||||||
|
if not os.path.isfile(csv_file):
|
||||||
|
with open(csv_file, mode='w', newline='') as f:
|
||||||
|
writer = csv.writer(f)
|
||||||
|
writer.writerow(['uid', 'movie'])
|
||||||
|
|
||||||
|
root = tk.Tk()
|
||||||
|
root.attributes("-fullscreen", True)
|
||||||
|
root.configure(background="black")
|
||||||
|
screen_width = root.winfo_screenwidth()
|
||||||
|
screen_height = root.winfo_screenheight()
|
||||||
|
root.geometry(f"{screen_width}x{screen_height}+0+0")
|
||||||
|
|
||||||
|
def toggle_fullscreen():
|
||||||
|
root.attributes("-fullscreen", not root.attributes("-fullscreen"))
|
||||||
|
|
||||||
|
def exit_fullscreen():
|
||||||
|
root.destroy()
|
||||||
|
|
||||||
|
root.bind("<F11>", toggle_fullscreen)
|
||||||
|
root.bind("<Escape>", exit_fullscreen)
|
||||||
|
|
||||||
|
image = Image.open(image_path)
|
||||||
|
photo = ImageTk.PhotoImage(image)
|
||||||
|
|
||||||
|
image_label = tk.Label(root, image=photo, bg="black")
|
||||||
|
image_label.place(x=0, y=0)
|
||||||
|
|
||||||
|
info_label = tk.Label(root, text = "00:00: AM", font=("Helvetica", 68), fg="white", bg="black")
|
||||||
|
info_label.place(x=1870, y = 1030, anchor="se")
|
||||||
|
|
||||||
|
x_pos, y_pos = 100, 100
|
||||||
|
x_speed, y_speed = 1, 1
|
||||||
|
|
||||||
|
spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
|
||||||
|
cs_pin = DigitalInOut(board.D24)
|
||||||
|
pn532 = PN532_SPI(spi, cs_pin, debug=False)
|
||||||
|
|
||||||
|
ic, ver, rev, support = pn532.firmware_version
|
||||||
|
print("Found PN532 with firmware version: {0}.{1}".format(ver, rev))
|
||||||
|
|
||||||
|
# Configure PN532 to communicate with MiFare cards
|
||||||
|
pn532.SAM_configuration()
|
||||||
|
|
||||||
|
print("Waiting for RFID/NFC card...")
|
||||||
|
|
||||||
|
now_playing = False
|
||||||
|
# pylint: disable=global-statement
|
||||||
|
def move():
|
||||||
|
global x_pos, y_pos, x_speed, y_speed
|
||||||
|
x_pos += x_speed
|
||||||
|
y_pos += y_speed
|
||||||
|
if x_pos + photo.width() >= root.winfo_screenwidth() or x_pos <= 0:
|
||||||
|
x_speed = -x_speed
|
||||||
|
if y_pos + photo.height() >= root.winfo_screenheight() or y_pos <= 0:
|
||||||
|
y_speed = -y_speed
|
||||||
|
image_label.place(x=x_pos, y=y_pos)
|
||||||
|
root.after(30, move)
|
||||||
|
|
||||||
|
def get_movie(uid):
|
||||||
|
with open(f"{home_path}/{csv_file}", "r") as file:
|
||||||
|
reader = csv.DictReader(file)
|
||||||
|
for row in reader:
|
||||||
|
if row["uid"] == uid:
|
||||||
|
return row["movie"]
|
||||||
|
return None
|
||||||
|
|
||||||
|
def read_card():
|
||||||
|
global now_playing
|
||||||
|
uid = pn532.read_passive_target(timeout=0.05)
|
||||||
|
# Try again if no card is available.
|
||||||
|
if uid is not None:
|
||||||
|
print("Found card with UID:", [hex(i) for i in uid])
|
||||||
|
title = str([hex(i) for i in uid])
|
||||||
|
movie_name = get_movie(title)
|
||||||
|
if movie_path:
|
||||||
|
video = f"{movie_path}/{movie_name}.mp4"
|
||||||
|
subprocess.run(["sudo", "-u", "adafruit", "vlc", "--fullscreen", video], check=False)
|
||||||
|
now_playing = True
|
||||||
|
else:
|
||||||
|
current_time = datetime.now().strftime("%I:%M %p")
|
||||||
|
info_label.config(text=f"{current_time}")
|
||||||
|
root.after(2000, read_card)
|
||||||
|
|
||||||
|
def vlc_check():
|
||||||
|
global now_playing
|
||||||
|
try:
|
||||||
|
result = subprocess.check_output(["pgrep", "-x", "vlc"])
|
||||||
|
if result:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
now_playing = False
|
||||||
|
return False
|
||||||
|
root.after(5000, vlc_check)
|
||||||
|
|
||||||
|
if not now_playing:
|
||||||
|
move()
|
||||||
|
read_card()
|
||||||
|
if now_playing:
|
||||||
|
vlc_check()
|
||||||
|
|
||||||
|
root.mainloop()
|
||||||
13
Raspberry_Pi_NFC_Movie_Player/nfcmedia_systemd.txt
Normal file
13
Raspberry_Pi_NFC_Movie_Player/nfcmedia_systemd.txt
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
[Unit]
|
||||||
|
Description=NFC Media Player
|
||||||
|
After=x-session-manager.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
User=USERNAME
|
||||||
|
Environment=DISPLAY=:0
|
||||||
|
Environment=XAUTHORITY=/home/USERNAME/.Xauthority
|
||||||
|
ExecStartPre=/bin/sleep 10
|
||||||
|
ExecStart=sudo /home/USERNAME/blinka/bin/python /home/USERNAME/nfc_movie_player.py
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=default.target
|
||||||
Loading…
Reference in a new issue