User Tools

Site Tools


fluidcanvas_r2pi:tft_boot_splash_and_status_display_guide

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
fluidcanvas_r2pi:tft_boot_splash_and_status_display_guide [2026/03/21 23:25] hyjeongfluidcanvas_r2pi:tft_boot_splash_and_status_display_guide [2026/03/27 21:40] (current) – [9. 문제 해결] hyjeong
Line 4: Line 4:
 ## 개요 ## 개요
  
-이 문서는 Raspberry Pi에서 SPI TFT (/dev/fb1)에 다음 기능을 구현하는 방법을 설명합니다.+이 문서는 Raspberry Pi에서 부팅 과정에서 다음의 정보를 SPI TFT-LCD(/dev/fb1)에 순차적으로 표시하는 방법을 설명합니다. 다음의 두 기능을 수행하는 홈 영역의 스크립트를 systemd에서 순차적으로 실행하는 것에 해당합니다.
  
-1. 부팅 시 splash 이미지 표시 +1. 부팅 시 splash 이미지 표시 - /home/pi/scripts/tft-splash.sh 
-2. 부팅 완료 후 shell에서 fluidardule_status.py를 실행하여 시스템 정보(시간, IP address, CPU 등)을 화면에 표시+2. 부팅 완료 후 시스템 정보(시간, IP address, CPU 등)를 화면에 표시 - /home/pi/scripts/fluidardule_status.py
  
 --- ---
Line 13: Line 13:
 ## 1. 필요한 패키지 설치 ## 1. 필요한 패키지 설치
  
 +fbi는 이미 설치되어 있다고 가정한다.
  
 ```bash ```bash
Line 21: Line 22:
 --- ---
  
-## 2. Splash 이미지 준비+## 2. Splash 이미지 
 + 
 +[480x320p Splash 이미지]( 
 +https://genoglobe.com/dokuwiki/_media/fluidcanvas_r2pi/custom_boot_splash_for_fluid_ardule.png?w=400&tok=2212af)
  
 ```bash ```bash
-ls -l /home/pi/sf2/Fluidardule.png+ls -l /home/pi/sf2/FluidArdule.png
 ``` ```
  
 --- ---
  
-## 3. Splash 스크립트+## 3. Splash 표시용 스크립트(~/scripts/tft-splash.sh)
  
 ```bash ```bash
-sudo nano /usr/local/bin/tft-splash.sh+nano 
 + ~/scripts/tft-splash.sh
 ``` ```
  
Line 43: Line 48:
  
 ```bash ```bash
-sudo chmod +x /usr/local/bin/tft-splash.sh+sudo chmod +x ~/scripts/tft-splash.sh
 ``` ```
  
Line 50: Line 55:
 ## 4. 상태 화면 스크립트(~/scripts/fluidardule_status.py) ## 4. 상태 화면 스크립트(~/scripts/fluidardule_status.py)
  
 +````
 +#!/usr/bin/env python3
 +from PIL import Image, ImageDraw, ImageFont
 +import subprocess
 +from pathlib import Path
  
 +W, H = 480, 320
 +OUT = Path("/home/pi/fluidardule_status.png")
 +
 +FONT_BOLD = "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf"
 +FONT_REG  = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"
 +
 +def run_cmd(cmd):
 +    try:
 +        result = subprocess.run(
 +            cmd, shell=True, capture_output=True, text=True
 +        )
 +        return result.stdout.strip()
 +    except Exception:
 +        return ""
 +
 +def get_status():
 +    hostname = run_cmd("hostname")
 +    time_str = run_cmd("date '+%Y-%m-%d %H:%M:%S'")
 +    ip_str = run_cmd("hostname -I 2>/dev/null | awk '{print $1}'")
 +    if not ip_str:
 +        ip_str = "no network"
 +
 +    cpu_load = run_cmd("awk '{print $1}' /proc/loadavg")
 +    cpu_temp = run_cmd("vcgencmd measure_temp | sed 's/temp=//'")
 +    mem = run_cmd("free -m | awk '/Mem:/ {print $3\"/\"$2\"MB\"}'")
 +
 +    return {
 +        "hostname": hostname or "-",
 +        "time": time_str or "-",
 +        "ip": ip_str,
 +        "cpu_load": cpu_load or "-",
 +        "cpu_temp": cpu_temp or "-",
 +        "mem": mem or "-",
 +    }
 +
 +def render(status):
 +    img = Image.new("RGB", (W, H), "black")
 +    draw = ImageDraw.Draw(img)
 +
 +    font_title = ImageFont.truetype(FONT_BOLD, 26)
 +    font_label = ImageFont.truetype(FONT_BOLD, 18)
 +    font_text  = ImageFont.truetype(FONT_REG, 18)
 +
 +    # 제목
 +    draw.text((W // 2, 18), "FluidArdule Status", font=font_title, fill="white", anchor="ma")
 +    draw.line((20, 45, W - 20, 45), fill="white", width=2)
 +
 +    items = [
 +        ("HOST", status["hostname"]),
 +        ("TIME", status["time"]),
 +        ("IP", status["ip"]),
 +        ("LOAD", status["cpu_load"]),
 +        ("TEMP", status["cpu_temp"]),
 +        ("MEM", status["mem"]),
 +    ]
 +
 +    y = 70
 +    for label, value in items:
 +        draw.text((24, y), f"{label:5}", font=font_label, fill="white")
 +        draw.text((110, y), f": {value}", font=font_text, fill="white")
 +        y += 36
 +
 +    draw.line((20, H - 40, W - 20, H - 40), fill="white", width=1)
 +    draw.text((W // 2, H - 28), "READY", font=font_label, fill="white", anchor="ma")
 +
 +    img.save(OUT)
 +
 +def show():
 +    subprocess.run(
 +        ["sudo", "fbi", "-T", "1", "-d", "/dev/fb1", "--noverbose", "-a", str(OUT)],
 +        check=False
 +    )
 +
 +def main():
 +    status = get_status()
 +    render(status)
 +    show()
 +
 +if __name__ == "__main__":
 +    main()
 +````
 +
 +```bash
 +sudo chmod +x ~/scripts/fluidardule_status.py
 +```
 --- ---
  
Line 67: Line 162:
 [Service] [Service]
 Type=oneshot Type=oneshot
-ExecStart=/usr/local/bin/tft-splash.sh+ExecStart=/home/pi/scripts/tft-splash.sh
 RemainAfterExit=yes RemainAfterExit=yes
  
Line 79: Line 174:
  
 ```bash ```bash
-sudo nano /etc/systemd/system/tft-status.service+sudo nano /etc/systemd/system/fluid_ardule.service
 ``` ```
  
Line 90: Line 185:
 [Service] [Service]
 Type=oneshot Type=oneshot
-ExecStart=/usr/local/bin/tft-status.sh+ExecStart=/home/pi/scripts/fluidardule_status.py
  
 [Install] [Install]
Line 103: Line 198:
 sudo systemctl daemon-reload sudo systemctl daemon-reload
 sudo systemctl enable tft-splash.service sudo systemctl enable tft-splash.service
 +sudo systemctl enable fluid_ardule.service
 ``` ```
  
Line 120: Line 216:
 systemctl status tft-splash.service systemctl status tft-splash.service
 journalctl -u tft-splash.service -b journalctl -u tft-splash.service -b
 +systemctl status fluid_ardule.service -b
 +journalctl -u fluid_ard
 +ule.service -b
 ``` ```
 +---
  
 +## 서비스를 아예 끄려면(재부팅 후에도 불활성화)
 +````
 +sudo systemctl stop tft-splash.service
 +sudo systemctl stop fluid_ardule.service
 +sudo systemctl disable tft-splash.service
 +sudo systemctl disable fluid_ardule.service
 +````
 --- ---
  
Line 135: Line 242:
 ## 핵심 요약 ## 핵심 요약
  
-* splash는 fbi로 빠르게 표시+* splash는 fbi로  
 +빠르게 표시
 * systemd로 자동 실행 * systemd로 자동 실행
 * fbi는 항상 덮어쓰기 방식 사용 * fbi는 항상 덮어쓰기 방식 사용
fluidcanvas_r2pi/tft_boot_splash_and_status_display_guide.1774103131.txt.gz · Last modified: by hyjeong