ในโปรเจคนี้ เราจะมาสร้างนาฬิกาปลุก Arduino ที่มีตัวตั้งเวลาและเซ็นเซอร์วัดอุณหภูมิด้วยกัน งานนี้มันส์แน่ๆ จัดไปวัยรุ่น!
การต่อสาย:

ปุ่ม #1 Mode: ต่อกับขา Digital Pin 2
ปุ่ม #2 Select: ต่อกับขา Digital Pin 4
ปุ่ม #3 Plus: ต่อกับขา Digital Pin 3
ปุ่ม #4 Minus: ต่อกับขา Digital Pin 12
ปุ่ม #5 Timer on/0ff: ต่อกับขา Digital Pin 11
น้องสามารถต่อชิ้นส่วนทั้งหมดเข้ากับเบรดบอร์ดได้เลย หรือถ้าอยากใส่เคสสวยๆ ก็ต่อเข้ากับ Arduino Proto Shield เอาได้นะ สู้งานนะน้อง
Libraries ที่ต้องใช้:
DHT - Library สำหรับเซ็นเซอร์ DHT
LiquidCrystal I2C - Library สำหรับควบคุมจอ LCD ผ่าน I2C
Wire - Library สำหรับการสื่อสารแบบ I2C
virtuabotixRTC - Library สำหรับ RTC รุ่นเก่า
RTCLib - Library สำหรับ RTC จาก Adafruit
วิธีใช้งาน:
- สลับระหว่างหน้าจอต่างๆ โดยกดปุ่ม Mode
- ตั้งเวลาโดยกดค้างปุ่ม Mode ในหน้าจอที่ 1
- หน้าจอ 1: แสดงเวลา, วันที่ และอุณหภูมิ
- หน้าจอ 2: สำหรับตั้งค่าปลุก
- หน้าจอ 3: ตัวตั้งเวลา (Timer)
- หน้าจอ 4: เปิด/ปิด การทำงานของนาฬิกาปลุก
เราจะใช้ปุ่ม Mode เป็นตัวสลับไปมาระหว่างหน้าจอทั้งหมดเลย
ปุ่มแต่ละปุ่มมีหน้าที่ของมันนะ พวกปุ่ม + กับ - จะใช้บ่อยสุดสำหรับเพิ่มหรือลดตัวเลข ส่วนปุ่ม Select มักใช้สำหรับเลือกระหว่างตัวเลือกต่างๆ และปุ่ม Timer ใช้สำหรับเริ่มหรือหยุดตัวตั้งเวลา ห้ามช็อตนะตัวนี้ จำให้แม่น!
รายละเอียดทางเทคนิคเพิ่มเติม
All-in-One Clock 1.0 ตัวนี้เป็นการรวมเซ็นเซอร์หลายๆ ตัวเข้ามาอยู่ในแดชบอร์ดเดียว โดยซิงค์นาฬิกา Real-Time Clock (RTC) ที่แม่นยำกับเซ็นเซอร์วัดสภาพแวดล้อม ทำให้ Arduino ทำหน้าที่เป็นศูนย์รวมข้อมูล แล้วจัดรูปแบบและแสดงผลบนหน้าจอ LCD
การจัดการระบบเซ็นเซอร์
การจัดการเซ็นเซอร์หลายตัวให้มีประสิทธิภาพต้องวางแผนบัสการสื่อสารให้ดี:
- แชร์บัส I2C: โมดูลอย่าง DS3231 RTC และ BMP280 เซ็นเซอร์วัดความดันบรรยากาศ สามารถแชร์บัส I2C เดียวกัน (ขา SDA/SCL) ได้ Arduino จะสื่อสารกับแต่ละตัวแยกกันโดยใช้ที่อยู่ (Device Address) ที่ไม่ซ้ำกัน
- ขา Digital สำหรับ DHT: เซ็นเซอร์วัดอุณหภูมิและความชื้น DHT22 ใช้ขา Digital เพียงขาเดียวสำหรับโปรโตคอลสื่อสารแบบ One-Wire ของมัน
- SPI สำหรับจอแสดงผล: จอแสดงผลแบบ TFT ตามแผนภาพการต่อสายด้านบน โดยทั่วไปจะต้องการบัส Hardware SPI (ขา MOSI, MISO, SCK) สำหรับการถ่ายโอนข้อมูลที่รวดเร็ว
ความท้าทายหลักในการเขียนโปรแกรมคือการอัพเดทหน้าจอโดยไม่ให้เกิดการกระพริบ (Flicker) ที่รบกวนสายตา วิธีง่ายๆ ที่ชอบทำกันคือล้างหน้าจอทั้งหมด (tft.fillScreen(BLACK)) ในทุกๆ ลูป ซึ่งทำให้เกิดการกระพริบ วิธีแบบโปรๆ คือการวาดใหม่เฉพาะส่วน:
- วาดข้อความที่คงที่ทั้งหมด (เช่น ป้าย "TEMP:" หรือ "TIME:") แค่ครั้งเดียวในช่วง Setup
- ในลูปหลัก ก่อนจะอัพเดทค่าที่เปลี่ยนแปลง (เช่น ตัวเลขอุณหภูมิ) ให้ใช้
tft.fillRect()เพื่อวาดกล่องสีดำ เฉพาะ บริเวณที่ตัวเลขนั้นปรากฏ - เขียนค่าใหม่ลงไปในตำแหน่งเดิม วิธีนี้จะอัพเดทเฉพาะพิกเซลที่เปลี่ยนไปเท่านั้น ทำให้การแสดงผลลื่นไหล ไม่กระพริบ
ฐานฮาร์ดแวร์เทเลเมทรีแบบบูรณาการ
ถ้าอยากอัพเกรดโปรเจคนี้ให้จัดเต็มแบบสุดๆ ลองใช้ชุดฮาร์ดแวร์นี้ดู:
- Arduino Mega 2560: หน่วยความจำเพียบ พอให้ไลบรารีกราฟิกและเซ็นเซอร์หลายตัวทำงานลื่นๆ
- จอสี LCD TFT แบบ SPI รุ่น ILI9341: สำหรับแสดงผลกราฟิกสวยคมชัดระดับ HD
- โมดูลนาฬิกาจริง (RTC) แบบ I2C รุ่น DS3231: ไว้รักษาเวลาให้แม่นยำ
- เซ็นเซอร์วัดอุณหภูมิและความชื้น DHT22
- เซ็นเซอร์วัดความกดบรรยากาศ BMP280 แบบ I2C: เพิ่มข้อมูลความดันอากาศและความสูงได้
เวอร์ชัน 2.0
สำหรับเวอร์ชัน 2.0 ที่อัพเกรดกว่าเดิม สามารถไปดูรายละเอียดเพิ่มเติมได้
GitHub:
ลิงก์สำหรับโค้ดและไฟล์ทั้งหมด