#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Advanced GPIO Control - โปรแกรมควบคุม GPIO ขั้นสูง
รวมฟีเจอร์: LED Control, Button Input, PWM, และ Multiple LEDs
Author: Raspberry Pi Thailand
"""
import RPi.GPIO as GPIO
import time
import threading
from datetime import datetime
class GPIOController:
def __init__(self):
# ตั้งค่า GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
# กำหนด Pin
self.BUTTON_PIN = 2
self.LED_PINS = [18, 19, 20] # LED 3 ดวง
self.PWM_PIN = 21 # สำหรับ PWM LED
# ตัวแปรสถานะ
self.button_count = 0
self.current_mode = 0 # โหมดการทำงาน
self.running = True
# ตั้งค่า Pin
GPIO.setup(self.BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
for pin in self.LED_PINS:
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, GPIO.LOW)
GPIO.setup(self.PWM_PIN, GPIO.OUT)
self.pwm = GPIO.PWM(self.PWM_PIN, 1000) # 1kHz PWM
self.pwm.start(0)
# ตั้งค่า Interrupt
GPIO.add_event_detect(self.BUTTON_PIN, GPIO.FALLING,
callback=self.button_callback,
bouncetime=300)
def button_callback(self, channel):
"""Callback สำหรับปุ่มกด - เปลี่ยนโหมด"""
self.button_count += 1
self.current_mode = (self.current_mode + 1) % 4
timestamp = datetime.now().strftime("%H:%M:%S")
modes = ["ปิดทั้งหมด", "LED วิ่ง", "กระพริบสลับ", "PWM Fade"]
print(f"[{timestamp}] โหมด {self.current_mode}: {modes[self.current_mode]}")
def mode_0_all_off(self):
"""โหมด 0: ปิด LED ทั้งหมด"""
for pin in self.LED_PINS:
GPIO.output(pin, GPIO.LOW)
self.pwm.ChangeDutyCycle(0)
def mode_1_running_led(self):
"""โหมด 1: LED วิ่ง"""
for i, pin in enumerate(self.LED_PINS):
if self.current_mode != 1: # ถ้าเปลี่ยนโหมดแล้ว
break
# เปิด LED ปัจจุบัน
GPIO.output(pin, GPIO.HIGH)
time.sleep(0.3)
# ปิด LED ปัจจุบัน
GPIO.output(pin, GPIO.LOW)
time.sleep(0.1)
def mode_2_blink_alternate(self):
"""โหมด 2: กระพริบสลับ"""
# เปิด LED คู่
for i in range(0, len(self.LED_PINS), 2):
GPIO.output(self.LED_PINS[i], GPIO.HIGH)
for i in range(1, len(self.LED_PINS), 2):
GPIO.output(self.LED_PINS[i], GPIO.LOW)
time.sleep(0.5)
# เปิด LED คี่
for i in range(0, len(self.LED_PINS), 2):
GPIO.output(self.LED_PINS[i], GPIO.LOW)
for i in range(1, len(self.LED_PINS), 2):
GPIO.output(self.LED_PINS[i], GPIO.HIGH)
time.sleep(0.5)
def mode_3_pwm_fade(self):
"""โหมด 3: PWM Fade Effect"""
# Fade In
for duty_cycle in range(0, 101, 5):
if self.current_mode != 3:
break
self.pwm.ChangeDutyCycle(duty_cycle)
time.sleep(0.05)
# Fade Out
for duty_cycle in range(100, -1, -5):
if self.current_mode != 3:
break
self.pwm.ChangeDutyCycle(duty_cycle)
time.sleep(0.05)
def run(self):
"""ฟังก์ชันหลักของโปรแกรม"""
print("🚀 เริ่มต้นโปรแกรม GPIO ขั้นสูง")
print("🔘 กดปุ่มเพื่อเปลี่ยนโหมด:")
print(" โหมด 0: ปิดทั้งหมด")
print(" โหมด 1: LED วิ่ง")
print(" โหมด 2: กระพริบสลับ")
print(" โหมด 3: PWM Fade")
print("⏹️ กด Ctrl+C เพื่อหยุด")
try:
while self.running:
if self.current_mode == 0:
self.mode_0_all_off()
time.sleep(0.1)
elif self.current_mode == 1:
self.mode_1_running_led()
elif self.current_mode == 2:
self.mode_2_blink_alternate()
elif self.current_mode == 3:
self.mode_3_pwm_fade()
except KeyboardInterrupt:
print("\n🛑 หยุดการทำงานโดยผู้ใช้")
finally:
self.cleanup()
def cleanup(self):
"""ทำความสะอาด GPIO"""
self.running = False
self.pwm.stop()
GPIO.cleanup()
print("✅ ทำความสะอาด GPIO เรียบร้อย")
# รันโปรแกรม
if __name__ == "__main__":
controller = GPIOController()
controller.run()