เทคโนโลยีโดย milo อ่าน 6 นาทีเรียบเรียงโดยมี AI ช่วย

เปลี่ยนธีม Linux เป็นโหมดมืดอัตโนมัติตามแสงจริงรอบตัวคุณ

หยุดสลับธีมมืด-สว่างด้วยมือ ลองใช้เซ็นเซอร์วัดแสงบน Linux สั่งเปลี่ยนธีมอัตโนมัติตามสภาพแสงจริงในห้อง ทำครั้งเดียวจบ

สารบัญ

ทำไมนักพัฒนาควรสนใจโหมดมืดอัตโนมัติ

เคยไหมที่นั่งโค้ดดึกๆ แล้วจอสว่างจนตาบอด หรือกลางวันเปิดธีมมืดแล้วมองไม่เห็นตัวอักษรเพราะแสงทะลุหน้าต่างเข้ามาจัดๆ

การสลับธีมด้วยมือทุกครั้งเป็นเรื่องน่ารำคาญ และส่วนใหญ่เราก็ลืมทำจนได้ แต่ถ้าเครื่องเปลี่ยนให้เองตามแสงจริงรอบตัว ชีวิตจะง่ายขึ้นมาก

บน Linux เราทำได้ครับ เพราะมีเครื่องมือและเซ็นเซอร์ที่พร้อมใช้งาน และเราเขียนสคริปต์ควบคุมเองได้ทุกอย่าง

สิ่งที่ต้องเตรียม

ก่อนเริ่ม เช็คก่อนว่าเครื่องคุณมีอะไรพร้อมแค่ไหน

1. เซ็นเซอร์วัดแสง (Ambient Light Sensor)

โน้ตบุ๊กหลายรุ่นมีเซ็นเซอร์วัดแสงในตัว เช่น ThinkPad, Dell XPS, MacBook ที่ลง Linux ฯลฯ

วิธีเช็คว่ามีหรือไม่ ลองดูในไดเรกทอรีนี้

ls /sys/bus/iio/devices/iio:device*/in_illuminance_raw

ถ้าเจอไฟล์ in_illuminance_raw แปลว่าเซ็นเซอร์พร้อมใช้งาน

2. ติดตั้ง iio-sensor-proxy

เป็นแพ็กเกจที่เป็นสะพานเชื่อมระหว่างเซ็นเซอร์กับเดสก์ท็อป

# Ubuntu / Debian
sudo apt install iio-sensor-proxy

# Fedora
sudo dnf install iio-sensor-proxy

# Arch
sudo pacman -S iio-sensor-proxy

จากนั้นเปิดใช้งาน service

sudo systemctl enable --now iio-sensor-proxy.service

3. ตรวจสอบค่าแสง

ลองอ่านค่าแสงดู

monitor-sensor

ถ้าติดตั้งถูก จะเห็นค่า Light: 123.45 lux เปลี่ยนตามแสงในห้องจริง ลองบังเซ็นเซอร์ด้วยมือ ค่าควรลดลง

เขียนสคริปต์สลับธีมตามแสง

ตัวอย่างนี้ใช้กับ GNOME เพราะรองรับการเปลี่ยนธีมผ่าน gsettings ได้ง่าย แต่ปรับใช้กับ KDE หรือ XFCE ได้เช่นกัน

สคริปต์อ่านค่าแสงและสลับธีม

สร้างไฟล์ auto-theme.sh

#!/bin/bash

# อ่านค่าแสงจากเซ็นเซอร์
LIGHT=$(cat /sys/bus/iio/devices/iio:device0/in_illuminance_raw 2>/dev/null)

# ถ้าอ่านไม่ได้ ให้ใช้ค่าเริ่มต้น
if [ -z "$LIGHT" ]; then
    echo "ไม่พบเซ็นเซอร์ ข้ามการทำงาน"
    exit 1
fi

# ค่า threshold (ปรับตามความเหมาะสม)
THRESHOLD=100

echo "ค่าแสงปัจจุบัน: $LIGHT lux"

if [ "$LIGHT" -lt "$THRESHOLD" ]; then
    # แสงน้อย → โหมดมืด
    gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark'
    gsettings set org.gnome.desktop.interface gtk-theme 'Adwaita-dark'
    echo "เปลี่ยนเป็นโหมดมืด"
else
    # แสงมาก → โหมดสว่าง
    gsettings set org.gnome.desktop.interface color-scheme 'prefer-light'
    gsettings set org.gnome.desktop.interface gtk-theme 'Adwaita'
    echo "เปลี่ยนเป็นโหมดสว่าง"
fi

อย่าลืมให้สิทธิ์ execute

chmod +x auto-theme.sh

ตั้งให้รันอัตโนมัติทุก 30 วินาที

ใช้ systemd timer เพื่อให้เสถียรกว่า cron

สร้างไฟล์ ~/.config/systemd/user/auto-theme.service

[Unit]
Description=Auto switch theme based on ambient light

[Service]
Type=oneshot
ExecStart=/home/youruser/scripts/auto-theme.sh

สร้างไฟล์ ~/.config/systemd/user/auto-theme.timer

[Unit]
Description=Run auto-theme every 30 seconds

[Timer]
OnBootSec=10
OnUnitActiveSec=30
AccuracySec=5

[Install]
WantedBy=timers.target

เปิดใช้งาน

systemctl --user daemon-reload
systemctl --user enable --now auto-theme.timer

ตรวจสอบสถานะ

systemctl --user list-timers | grep auto-theme

ปรับใช้กับ KDE Plasma

KDE ใช้ plasma-apply-colorscheme แทน gsettings

#!/bin/bash

LIGHT=$(cat /sys/bus/iio/devices/iio:device0/in_illuminance_raw 2>/dev/null)
THRESHOLD=100

if [ -z "$LIGHT" ]; then
    exit 1
fi

if [ "$LIGHT" -lt "$THRESHOLD" ]; then
    plasma-apply-colorscheme BreezeDark
else
    plasma-apply-colorscheme BreezeLight
fi

กรณีไม่มีเซ็นเซอร์วัดแสง

ถ้าเครื่องไม่มีเซ็นเซอร์ ยังพอมีทางเลือก

ใช้เวลากลางวัน-กลางคืนแทน

#!/bin/bash

HOUR=$(date +%H)

if [ "$HOUR" -ge 19 ] || [ "$HOUR" -lt 6 ]; then
    gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark'
else
    gsettings set org.gnome.desktop.interface color-scheme 'prefer-light'
fi

วิธีนี้ไม่แม่นยำเท่าเซ็นเซอร์จริง แต่ก็ดีกว่าสลับด้วยมือ

ใช้ webcam วัดแสง

ถ้ามี webcam สามารถจับภาพแล้วคำนวณความสว่างเฉลี่ยของภาพได้

#!/bin/bash

# จับภาพ 1 เฟรม แล้วคำนวณค่าเฉลี่ย
BRIGHTNESS=$(ffmpeg -i /dev/video0 -frames:v 1 -f image2 - 2>/dev/null | \
    convert - -format "%[mean]" info: 2>/dev/null)

# ค่า mean อยู่ในช่วง 0-65535
THRESHOLD=30000

if [ "$(echo "$BRIGHTNESS < $THRESHOLD" | bc)" -eq 1 ]; then
    gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark'
else
    gsettings set org.gnome.desktop.interface color-scheme 'prefer-light'
fi

ต้องติดตั้ง ffmpeg และ imagemagick ก่อน

sudo apt install ffmpeg imagemagick bc

ทำให้การเปลี่ยนธีมลื่นไหลขึ้น

การเปลี่ยนธีมแบบกระทันหันอาจรบกวนสายตา ลองเพิ่มการเปลี่ยนแบบค่อยเป็นค่อยไป

เพิ่ม Hysteresis ป้องกันการสลับไปมา

ปัญหาที่พบบ่อยคือแสงอยู่ใกล้ค่า threshold แล้วธีมสลับไปมาไม่หยุด

แก้โดยใช้ค่า threshold คนละค่าสำหรับการเปลี่ยนแต่ละทิศทาง

#!/bin/bash

LIGHT=$(cat /sys/bus/iio/devices/iio:device0/in_illuminance_raw 2>/dev/null)

# ค่า threshold คนละทิศทาง
DARK_THRESHOLD=80   # ต่ำกว่านี้ → มืด
LIGHT_THRESHOLD=150 # สูงกว่านี้ → สว่าง

STATE_FILE=/tmp/theme-state

# อ่านสถานะปัจจุบัน
CURRENT=$(cat "$STATE_FILE" 2>/dev/null || echo "light")

if [ -z "$LIGHT" ]; then
    exit 1
fi

if [ "$LIGHT" -lt "$DARK_THRESHOLD" ] && [ "$CURRENT" != "dark" ]; then
    gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark'
    echo "dark" > "$STATE_FILE"
    echo "เปลี่ยนเป็นโหมดมืด (lux: $LIGHT)"
elif [ "$LIGHT" -gt "$LIGHT_THRESHOLD" ] && [ "$CURRENT" != "light" ]; then
    gsettings set org.gnome.desktop.interface color-scheme 'prefer-light'
    echo "light" > "$STATE_FILE"
    echo "เปลี่ยนเป็นโหมดสว่าง (lux: $LIGHT)"
fi

วิธีนี้ทำให้ธีมเปลี่ยนเฉพาะตอนแสงเปลี่ยนชัดเจนจริงๆ ไม่กระตุก

ข้อควรระวัง

  • เซ็นเซอร์บางรุ่นอ่านค่าไม่ตรง ควรทดสอบและปรับ threshold ให้เหมาะกับสภาพแวดล้อมของคุณ
  • อย่าลืมเปลี่ยน path ของเซ็นเซอร์ในสคริปต์ให้ตรงกับเครื่องของคุณ (iio:device0 อาจเป็น iio:device1 หรือตัวเลขอื่น)
  • แอปบางตัวไม่ตอบสนองต่อ gsettings ต้องตั้งค่าแยก เช่น VS Code ใช้ window.autoDetectColorScheme ได้
  • systemd user timer จะหยุดทำงานถ้า logout ใช้ loginctl enable-linger ถ้าต้องการให้รันต่อแม้ไม่ได้ login
sudo loginctl enable-linger $USER

สรุป

การตั้งค่าโหมดมืดอัตโนมัติบน Linux ตามแสงจริงไม่ยากอย่างที่คิด ขั้นตอนหลักคือ

  1. ติดตั้ง iio-sensor-proxy
  2. เช็คว่าเซ็นเซอร์ทำงาน
  3. เขียนสคริปต์อ่านค่าแสงและสลับธีม
  4. ตั้ง systemd timer ให้รันเป็นระยะ
  5. เพิ่ม hysteresis ป้องกันการสลับไปมา

ลองทำเองดู แล้วปรับ threshold ให้เข้ากับไลฟ์สไตล์ของคุณ ถ้าทำสำเร็จแล้วอยากแชร์ค่า threshold ที่ใช้ หรือมีวิธีที่ดีกว่านี้ มาคุยกันได้ในคอมเมนต์เลยครับ

เนื้อหาที่จัดทำโดยมี AI ช่วยจะมีป้ายกำกับ "เรียบเรียงโดยมี AI ช่วย" เพื่อให้คุณทราบอย่างชัดเจน เราถือว่าความโปร่งใสเรื่องการใช้ AI เป็นสิ่งสำคัญต่อความไว้วางใจของผู้อ่าน

พบข้อมูลที่ไม่ถูกต้องหรือคลาดเคลื่อน?เข้าสู่ระบบเพื่อทักท้วง
บทความนี้เป็นอย่างไร?

ยังไม่มีความคิดเห็น — มาเป็นคนแรกกันเถอะ!