เปลี่ยนธีม 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 ตามแสงจริงไม่ยากอย่างที่คิด ขั้นตอนหลักคือ
- ติดตั้ง
iio-sensor-proxy - เช็คว่าเซ็นเซอร์ทำงาน
- เขียนสคริปต์อ่านค่าแสงและสลับธีม
- ตั้ง systemd timer ให้รันเป็นระยะ
- เพิ่ม hysteresis ป้องกันการสลับไปมา
ลองทำเองดู แล้วปรับ threshold ให้เข้ากับไลฟ์สไตล์ของคุณ ถ้าทำสำเร็จแล้วอยากแชร์ค่า threshold ที่ใช้ หรือมีวิธีที่ดีกว่านี้ มาคุยกันได้ในคอมเมนต์เลยครับ
เนื้อหาที่จัดทำโดยมี AI ช่วยจะมีป้ายกำกับ "เรียบเรียงโดยมี AI ช่วย" เพื่อให้คุณทราบอย่างชัดเจน เราถือว่าความโปร่งใสเรื่องการใช้ AI เป็นสิ่งสำคัญต่อความไว้วางใจของผู้อ่าน
ความคิดเห็น (0)
ยังไม่มีความคิดเห็น — มาเป็นคนแรกกันเถอะ!