มีโจทย์ที่ดูเหมือนง่ายแต่พอทำจริง อะ..ทำไมมีปัญหา โจทย์มีอยู่ว่าอยากใช้ตัวความต้านทานแบบปรับค่าได้ ปรับความสว่างหน้าจอ 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






