วันเสาร์, 30 สิงหาคม 2568

ESP8266 แก้การสั่นแสงหน้าจอ LCD จากการอ่านค่าสัญญาณอนาล็อกแปลงเป็นสัญญาณ PWM ด้วยวิธีการ Low-pass filter

27 ส.ค. 2025
18

มีโจทย์ที่ดูเหมือนง่ายแต่พอทำจริง อะ..ทำไมมีปัญหา โจทย์มีอยู่ว่าอยากใช้ตัวความต้านทานแบบปรับค่าได้ ปรับความสว่างหน้าจอ LCD ก็เขียนโปรแกรมภาษา C ง่ายๆ ให้ ESP8266 อ่านค่าสัญญาณอนาล็อกแล้วแปลงค่าเป็นสัญญาณ PWM สั่งปรับความสวางจอ LCD คิดว่างานนี้กินหมูแล้ว โปรแกรมก็ไม่ต้องเขียนเองสั่ง ChatGPT เขียนให้ ทดสอบ คอมพาย อ่าวๆๆ พอปรับแสงน้อยๆจอมีกระพริบเหมือนเจ้าเข้า ได้แต่นั่งทำตาปริบๆ พื้นฐานก็มีน้อย แต่กระบวนการตั้งคำถามขั้นเทพ สะกิด เรียก ChatGPT มาถามด่วน ทำไมๆๆ เพราะอะไร???

ChatGPT ให้คำตอบมาแบบจับปลาได้ทั้งทะเล เช่น มีสัญญาณรบกวนทำให้สัญญาณอนาล็อกที่แปลงเป็นสัญญาณดิจิตอลมีการแกว่งไม่นิ่ง หรืออาจจะเป็นที่ฮาร์ดแวร์ออกแบบไม่ดี ภาคจ่ายไฟก็สำคัญนะ อืม..ทะเลจริงๆ เอางี้ ChatGPT ขอวิธีแก้ไขเลยดีกว่า นี่เลย… ChatGPT ขอนำเสนอหลักการ Exponential Moving Average (EMA) นั่นไงสูตรคณิตศาตร์มาเต็ม หลักการนี้คุ้นๆนะ คล้ายๆการสูตรการเข้าซื้อ ขายออก ในตลาดหุ้นเลย 555 ผ่านๆๆ เจ็บมาเยอะ

ChatGPT บอกว่าให้ใช้หลักการ EMA นี้ทำ Low-pass filter เพื่อกรองผ่านเฉพาะความถี่ต่ำ คือให้สัญญาณที่เปลี่ยนแปลงช้าๆผ่านได้ ส่วนสัญญาณที่เปลี่ยนแปลงเร็วๆ (เช่น Noise) ถูกกดให้เบาลง กระบวนการทำนี้จะเป็นการทำ Low-pass filter ทางซอฟต์แวร์จะง่าย และไม่มีค่าใช้จ่าย

ไม่น่าเชื่อ ChatGPT สามารถเอาหลักการ และเอาสมการทางคณิตศาสตร์มาแก้ปัญหาได้จริงๆ ถ้าเขียนโปรแกรมเอง ก็ใช้วิธีหาค่าเฉลี่ย หรือไม่ก็ไปหาไลบารี่ฟรีเอา อืม…นะ ใช้สมการคณิตศาตร์แบบนี้ดูดีเท่เลยครับบบ

ขอขอบคุณ ChatGPT ที่ให้ทางสว่างครับผม

โปรแกรมอ่านค่าปรกติ จอเกิดการสั่น

#define TFT_BL D6 // Backlight pin

#define ANALOG_PIN A0

void setup() {

Serial.begin(115200);

pinMode(TFT_BL, OUTPUT);

}

void loop() {

int sensorValue = analogRead(ANALOG_PIN); // อ่านค่า A0 (0-1023)

// ส่งค่าไปที่ Backlight (0 = สว่างสุด, 1023 = มืดสุด)

analogWrite(TFT_BL, sensorValue);

// Debug แสดงค่าทาง Serial Monitor

Serial.print(“A0: “);

Serial.print(sensorValue);

Serial.print(” -> Backlight: “);

Serial.println(sensorValue);

delay(50); // หน่วงนิดหน่อยให้ค่าอ่านนิ่ง

}

โปรแกรมที่ใส่ Low-pass filter

Exponential Moving Average (EMA)

#define TFT_BL D6

int smoothValue = 0;

void setup() {

pinMode(TFT_BL, OUTPUT);

}

void loop() {

int sensorValue = analogRead(A0); // อ่านค่า A0

smoothValue = (smoothValue * 9 + sensorValue) / 10; // low-pass filter

analogWrite(TFT_BL, smoothValue); // ปรับความสว่างตามค่าเฉลี่ย

delay(10