layout: post title: "Tesla Charge Reminder: ระบบแจ้งเตือนการลืมเสียบชาร์จอัจฉริยะด้วย ATtiny85/Arduino" date: 2021-12-31 categories: Arduino, Electronics, Tesla
โปรเจกต์นี้เกิดขึ้นจากปัญหาใกล้ตัวที่ผมและภรรยามักจะลืมเสียบปลั๊กชาร์จไฟให้รถ Tesla หลังจากนำรถเข้าจอดในโรงรถ (จริงๆ คือผมลืม ส่วนเธอก็แค่ไม่ได้ทำเป็นปกติอยู่แล้ว) ปัญหานี้มักเกิดตอนที่เราขนของกินของใช้เข้าบ้าน ซึ่งผมตั้งใจจะรอให้ขนของเสร็จก่อนถึงจะเสียบปลั๊ก เพื่อป้องกันไม่ให้สายชาร์จกลายเป็นอุปสรรคในการเดินสะดุด หรือตัวหัวชาร์จโดนกระแทกเสียหาย แต่สุดท้ายเราก็ลืมกันอยู่ดี แม้จะลองตั้งนาฬิกาปลุกเตือนตอนสองทุ่มทุกวัน แต่นานไปเสียงปลั๊กนั้นก็กลายเป็นแค่เสียงพื้นหลังที่เราเริ่มเพิกเฉย
แม้ผู้ใช้งานจะมีการเรียกร้องใน Tesla forums ให้เพิ่มฟีเจอร์แจ้งเตือนในแอป แต่จนถึงปัจจุบันก็ยังไม่มีความคืบหน้า ส่วนแอปเสริมอย่าง “Stats” แม้จะทำหน้าที่นี้ได้ดีแต่ก็มีราคาสูงถึง 50 ดอลลาร์
ในฐานะวิศวกร ผมตัดสินใจแก้ปัญหานี้ด้วยฮาร์ดแวร์ โดยการสร้างระบบแจ้งเตือนโดยใช้ Arduino Nano หรือไมโครคอนโทรลเลอร์ขนาดเล็กอย่าง ATtiny85 ซึ่งใช้สัญญาณ I/O เพียง 5 ช่องเท่านั้น โปรเจกต์นี้ผมเน้นการใช้ชิ้นส่วนที่มีอยู่ในสต็อก ทำให้แทบไม่มีค่าใช้จ่ายนอกจาก "เวลา" ในการลงมือทำครับ
หลักการทำงานและเซนเซอร์ที่ใช้
ระบบต้องการข้อมูลสำคัญสองส่วนเพื่อให้ทำงานได้อย่างแม่นยำ:
- รถอยู่ในโรงรถหรือไม่?: ผมเลือกใช้ HC-SR04 Ultrasonic Distance Sensor ติดตั้งไว้ที่ผนังโรงรถเพื่อวัดระยะห่าง หากรถจอดอยู่ เซนเซอร์จะอ่านค่าได้ในระยะใกล้ (ประมาณ 3 ฟุต) แต่หากรถไม่อยู่ มันจะวัดระยะไปจนถึงผนังฝั่งตรงข้ามที่ไกลกว่ามาก
- สายชาร์จถูกใช้งานอยู่หรือไม่?: ผมดัดแปลงที่แขวนสายชาร์จโดยติดตั้ง Push Button Switch ไว้ที่ฐาน เมื่อเราแขวนสายชาร์จเก็บไว้ น้ำหนักของสายจะกดสวิตช์ให้ทำงาน หมายถึงรถไม่ได้ถูกเสียบชาร์จนั่นเอง
เป้าหมายคือ หากรถจอดอยู่ในโรงรถเกิน 30 นาที แต่สายชาร์จยังคงถูกแขวนอยู่บนผนัง ระบบจะส่งเสียงแจ้งเตือนทันที เพื่อป้องกันปัญหา Vampire Battery Drain หรือการสูญเสียพลังงานขณะจอดทิ้งไว้นั่นเอง
การวิเคราะห์การทำงานของวงจร (Circuit Analysis)
วงจรนี้ถูกออกแบบมาให้กินไฟต่ำ (น้อยกว่า 100mA ที่ 5V DC) โดยรับไฟจาก Wall Wart หรืออะแดปเตอร์แปลงไฟเก่าๆ ที่ผมเก็บไว้ หากใช้ Arduino Nano ก็สามารถจ่ายไฟผ่านสาย USB ได้โดยตรง
การทำงานเมื่อเริ่มเดินเครื่อง (Startup): เมื่อจ่ายไฟเข้าสู่ระบบ โปรแกรมจะสั่งให้ Buzzer ทำงานเป็นเวลา 1 วินาที เพื่อเป็นการ Self-test ยืนยันว่าอุปกรณ์พร้อมใช้งานและเสียงแจ้งเตือนยังปกติดี
การทำงานของ Loop หลัก: โปรแกรมจะทำงานวนซ้ำทุกๆ 10 วินาที โดยจะอ่านค่าจากสวิตช์ที่แขวนสายและเซนเซอร์ Ultrasonic:
- หากเงื่อนไขครบ (รถอยู่ + ไม่ได้ชาร์จ) ตัวนับเวลา (Counter) จะเพิ่มขึ้นเรื่อยๆ
- เมื่อตัวนับสะสมครบ 30 นาที (180 รอบ) ระบบจะสั่งให้ Buzzer (แบบ Active) ทำงานผ่าน NPN Transistor เพื่อขยายกระแส
กลไกป้องกันการผิดพลาด (False Positive Protection): ผมใส่ลอจิกพิเศษเข้าไปเพื่อป้องกันกรณีเซนเซอร์ Ultrasonic อ่านค่าผิดพลาด (เช่น อ่านได้ระยะไกลชั่วขณะเนื่องจากสัญญาณรบกวน) โดยระบบจะรีเซ็ตตัวนับเวลาและปิดเสียงเตือนก็ต่อเมื่อ:
- สายชาร์จถูกดึงออกจากที่แขวน (เสียบชาร์จแล้ว)
- เซนเซอร์อ่านค่าระยะไกลต่อเนื่องกัน 2 ครั้ง เพื่อยืนยันว่ารถได้ออกจากโรงรถไปแล้วจริงๆ
เจาะลึกลอจิกใน Source Code
หัวใจสำคัญอยู่ในฟังก์ชันการวัดระยะและการสื่อสารกับผู้ใช้:
การวัดระยะ (Function
measure):digitalWrite(Trig, HIGH); delayMicroseconds(10); digitalWrite(Trig, LOW); int roundtrip = pulseIn(Echo, HIGH); return (roundtrip / 1776); // แปลงเวลาเป็นระยะทางหน่วยฟุตโปรแกรมจะส่งพัลส์เสียงออกไปและรอรับพัลส์สะท้อนกลับ ค่าที่ได้คือเวลาเดินทางไป-กลับ ซึ่งนำมาหารด้วย 1776 เพื่อแปลงเป็นหน่วย "ฟุต" ตามสภาพแวดล้อมที่ผมติดตั้ง
ระบบ User Interface ผ่าน LED (Function
blink_led): เพื่อใช้ในการ Debug และดูสถานะโดยไม่ต้องต่อคอมพิวเตอร์ ผมเขียนลอจิกให้ LED กระพริบตามระยะทางที่วัดได้:- ระยะน้อยกว่า 1 ฟุต: LED ดับสนิท
- ระยะ 1-9 ฟุต: กระพริบตามจำนวนฟุตที่วัดได้ (เช่น 3 ฟุต กระพริบ 3 ครั้ง) ในรอบ 10 วินาที
- ระยะ 10 ฟุตขึ้นไป: กระพริบช้าๆ (ติด 5 วินาที / ดับ 5 วินาที) เพื่อบอกว่าโรงรถว่าง
คุณสามารถดาวน์โหลดซอร์สโค้ดทั้งเวอร์ชัน ATtiny85 (Attiny_Buzzer.ino) และ Arduino Nano (Arduino_Buzzer.ino) ได้ที่ GitHub repo ของผม
การประกอบและติดตั้ง
ในการสร้างตัวต้นแบบ ผมใช้เทคนิค "Ugly Wiring" บนแผ่นโพรโทบอร์ดสำหรับ ATtiny85 ดังรูปด้านล่าง:


เพื่อให้การประกอบในอนาคตง่ายขึ้น ผมได้ออกแบบแผ่น PCB ขนาดจิ๋ว (20.4mm x 28.2mm) ซึ่งสามารถสั่งผลิตผ่าน OSH Park ได้ในราคาประหยัด แผ่นวงจรนี้ออกแบบมาให้มี Ground Plane ที่ด้านหลังและ Power Plane ที่ด้านหน้าเพื่อให้การบัดกรีเชื่อมต่อมั่นคงที่สุด ไฟล์ Eagle (.brd) และ Gerber สามารถโหลดได้จาก Repo เช่นกัน

การทดสอบเบื้องต้นทำแบบนอกกล่อง (Out of the box) เพื่อปรับแต่งค่าระยะทางในโค้ดให้แม่นยำกับตำแหน่งการจอดรถจริง

สำหรับการติดตั้งลงกล่องโปรเจกต์ ผมใช้สว่านเจาะรูสำหรับตัวรับ-ส่งสัญญาณของเซนเซอร์ HC-SR04 และรูสำหรับ LED จากนั้นยึดติดด้วยกาวอีพ็อกซี่ JB Weld เพื่อความแข็งแรง ส่วนตัวกล่องถูกยึดเข้ากับแผ่นไม้กระดานโดยตรงโดยไม่ใช้ฝาปิดเพื่อความสะดวกในการเซอร์วิส

ตัวแขวนสายชาร์จทำจากฉากเหล็กเสริมมุม (Corner Brace) และติดตั้ง Push Button Switch ไว้ที่รูด้านใน เมื่อแขวนสายน้ำหนักจะกดสวิตช์ลง ผมเพิ่มบล็อกไม้รองไว้ใต้เหล็กเพื่อป้องกันการดัดงอเมื่อใช้งานระยะยาว และใช้ไม้ไอติม 4 อันพันเทปพันสายไฟเพื่อเสริมความหนาให้พอดีกับช่องว่างของสายชาร์จ (หากต้องการความสวยงามสามารถใช้ท่อหดขนาดใหญ่แทนได้ครับ)

สุดท้าย ผมยึดแผ่นไม้เข้ากับโครงสร้างผนัง (Studs) และเดินสายไฟผ่านรูด้านหลังกระดาน เพื่อความมั่นใจว่าเสียงเตือนจะดังเข้าไปถึงในบ้าน ผมจึงย้ายตัว Buzzer ไปติดตั้งไว้อีกฝั่งของผนังบ้านโดยใช้กาวติดและเจาะรูเล็กๆ เพื่อเดินสายไฟเชื่อมต่อกลับมายังกล่องควบคุม

หากคุณสนใจจะสร้างระบบนี้ใช้เองหรือมีข้อสงสัยเกี่ยวกับส่วนประกอบใด สามารถติดต่อสอบถามผมได้ตลอดเวลาครับ!