หน้าแรก ดูโปรเจกต์ทั้งหมด
Expert

โปรเจกต์ All In One Clock 2.0

นาฬิกา Alarm clock, ข้อมูล weather ครบถ้วน, time, timer และฟังก์ชันอื่นๆ รวมอยู่ใน All In One Clock เพียงเครื่องเดียว

โปรเจกต์ All In One Clock 2.0

รายการอุปกรณ์และเครื่องมือ

1x Soldering iron (generic)
-
1x 3D Printer (generic)
-
1x Arduino Mega 2560 Rev3
🛒 สั่งซื้อ
1x 3.5 TFT Touch Screen with SD Card Socket for Arduino
🛒 สั่งซื้อ
1x 150 Pc. Jumper Wire Pack, 22AWG
🛒 สั่งซื้อ
1x Arduino Nano RP2040 Connect with headers
-
1x Cutter
-

รายละเอียดและวิธีทำ

All-In-One-Clock-2.0

นี่คือเวอร์ชันที่สองของโปรเจกต์เดิมของฉัน: All In One Clock 1.0 โปรเจกต์นี้จะมีฟังก์ชันที่คล้ายกัน แต่จะมีหน้าจอสัมผัส (touch screen) และให้ข้อมูลที่ละเอียดมากขึ้น

เป้าหมายของโปรเจกต์:

  1. แสดงเวลา (เวลาและวันที่ปัจจุบัน)
  2. นาฬิกาปลุก
  3. อุณหภูมิในปัจจุบัน
  4. ข้อมูลอุณหภูมิแบบครบถ้วน (ความดันอากาศ, ความชื้น และอื่นๆ)
  5. พยากรณ์อากาศล่วงหน้า 3 วัน (วันนี้, พรุ่งนี้ และมะรืนนี้)
  6. ไอคอนแสดงสภาพอากาศปัจจุบัน
  7. นาฬิกาจับเวลา

เพื่อให้สามารถทำฟังก์ชันทั้งหมดนี้ได้ เราจำเป็นต้องมีการเชื่อมต่อกับอินเทอร์เน็ต สำหรับโปรเจกต์นี้ฉันเลือกใช้ Arduino RP2040 Connect และในการใช้งาน RP2040 ฉันจะใช้ https://create.arduino.cc/iot ซึ่งเป็นเครื่องมือทางการของ Arduino ที่ใช้งานง่ายมาก และยอดเยี่ยมสำหรับการใช้งานอินเทอร์เน็ตผ่านอุปกรณ์ที่หลากหลาย

ตอนนี้เรามี Arduino ที่เชื่อมต่อกับอินเทอร์เน็ตแล้ว แต่เราจะดึงข้อมูลมาได้อย่างไร? เรามาแบ่งข้อมูลที่ต้องการออกเป็นสองหมวดหมู่กันครับ:

  • Time: การรับเวลานั้นง่ายมาก เพราะในขณะที่คุณเชื่อมต่อกับอินเทอร์เน็ต คุณสามารถรับ Unix timestamp ได้ ซึ่ง Unix timestamp คือวิธีหนึ่งในการนับเวลา โดยจะนับทุกๆ วินาทีที่ผ่านไปตั้งแต่วันที่ 1 มกราคม 1970 ตัวอย่างเช่น เวลาในขณะที่กำลังเขียนข้อความนี้คือ "1682760531" และเพื่อแปลงเวลานี้ ฉันจะใช้ Library ที่จะเปลี่ยนตัวเลขให้กลายเป็นเวลาที่อ่านง่าย (ชั่วโมง, นาที, ปี, เดือน และอื่นๆ)
    1. Temperature: สำหรับการรับอุณหภูมิ เราจะใช้สิ่งที่เรียกว่า API สรุปสั้นๆ คือ API เป็นเซิร์ฟเวอร์ชนิดหนึ่งที่เมื่อฉันทำการ "เรียกใช้" (call it) ฉันจะได้รับข้อมูลกลับมาในรูปแบบ JSON ตัวอย่างเช่น ลองไปที่ลิงก์นี้เพื่อใช้ NASA API ที่แสดงตำแหน่งของสถานีอวกาศนานาชาติ ณ เวลานี้ http://api.open-notify.org/iss-now.json สำหรับโปรเจกต์นี้ ฉันจะใช้ https://www.weatherapi.com ซึ่ง API นี้มีข้อมูลมากมายสำหรับโปรเจกต์ แต่ฉันจะเลือกใช้เพียงบางส่วนเท่านั้น เนื่องจาก Arduino ไม่สามารถรับข้อมูลปริมาณมหาศาลขนาดนั้นได้ (เรากำลังพูดถึงตัวอักษรกว่า 20,000 ตัว) ดังนั้นในส่วนการตั้งค่า API ฉันจึงปรับให้รับข้อมูลเฉพาะส่วนที่จำเป็น นอกจากนี้ API ยังให้ลิงก์รูปภาพมาด้วย เช่น cdn.weatherapi.com/weather/64x64/day/116.png ซึ่งการจะดึงรูปภาพมาแสดงได้นั้น ฉันต้องทำสองอย่างคือ รับหมายเลขรูปภาพ และตรวจสอบว่าเป็นช่วงเวลากลางวันหรือกลางคืน

    ข้อมูลทั้งหมดที่กล่าวมาข้างต้นจะถูกส่งผ่าน ISP โดย Arduino จะรับข้อมูลเหล่านั้นและทำการถอดรหัส (decode)

    temperature = doc.containsKey("tw") ? doc["tw"] : temperature;

    ในตัวอย่างนี้ Arduino จะอ่านข้อมูลที่ส่งเข้ามา และหากข้อมูลนั้นมี Keyword ว่า "tw" (ซึ่งถูกเข้ารหัสมาในรูปแบบ JSON) ข้อมูลดังกล่าวจะถูกบันทึกไว้ใน Variable ที่ชื่อว่า temperature

    ฉันยังได้ส่งหมายเลขรูปภาพและสถานะ Day/Night มาด้วย แต่จะแสดงรูปภาพได้อย่างไร? ใน SD Card ที่เชื่อมต่อกับหน้าจอนั้น จะมีโฟลเดอร์สองโฟลเดอร์ที่เก็บรูปภาพทั้งหมดของช่วงกลางวันและกลางคืนในรูปแบบไฟล์ bmp (bit map images) ดังนั้นฉันจึงสั่งให้ไปดึงข้อมูลจาก SD Card และแสดงรูปภาพตามหมายเลขหรือเวลาที่กำหนด

    ในโปรเจกต์นี้ ฉันแสดงไอคอนด้วยสองวิธี วิธีแรกคือการใช้สคริปต์ .h ซึ่งจะทำงานได้เร็วกว่า แต่ฉันไม่สามารถเก็บรูปภาพจำนวนมากด้วยวิธีนี้ได้เพราะมันใช้พื้นที่หน่วยความจำหลาย MB ส่วนวิธีที่สองคือการใช้ SD card

    Dashboard:

    Arduino IoT Cloud ช่วยให้เราสามารถใช้งาน Dashboard ได้ แล้ว Dashboard คืออะไร? มันคือช่องทางที่ทำให้ฉันสามารถดูข้อมูลได้จากทุกที่และผ่านอุปกรณ์ใดก็ได้

    ใน Dashboard จะมี Widget มากมาย โดยเราจะใช้บางส่วนเพื่อแสดงข้อมูล เช่น เราใช้ Widget แบบปุ่ม (button) เพื่อสร้างปุ่มสำหรับอัปเดตค่าอุณหภูมิ (ปกติใช้สำหรับการ Debug) และ Widget อื่นๆ อีกสองสามตัวเพื่อแสดงข้อมูล (อุณหภูมิ, ความชื้น, ความดันอากาศ และเวลา)

    โปรดทราบว่าหาก Arduino ได้รับข้อมูลที่มีค่าเป็น null (0) หรือมีการ Restart มันอาจจะทำให้อัปเดตค่าในกราฟผิดเพี้ยนไปดังที่เห็น (ในอนาคตฉันจะเพิ่มวิธีป้องกันไม่ให้เกิดเหตุการณ์นี้)

    Fonts:

    ฉันได้ใช้ Font พิเศษเพิ่มเติมบางส่วนซึ่งได้รวมไว้ในไฟล์สำหรับดาวน์โหลดแล้ว

    หน้าจอ (The screen):

    ฉันใช้หน้าจอ TFT ขนาด 3.5 นิ้ว ซึ่งเป็นหน้าจอสัมผัส (touch screen) และใช้ Library MCUFRIEND_kbv ในการควบคุมการทำงาน

    เรามีหน้าจอที่แตกต่างกัน 5 หน้าจอ มาดูรายละเอียดกันทีละหน้าจอครับ:

    1. Main Screen: ในหน้าจอนี้ จะแสดงเวลาและวันที่ปัจจุบัน อุณหภูมิ และไอคอนแสดงสภาพอากาศ นอกจากนี้ยังมีปุ่มสำหรับกดไปยังหน้าจออื่นๆ ทั้งหมดด้วย
    2. Forecast Screen: หน้าจอนี้แสดงการพยากรณ์อากาศของวันนี้ พรุ่งนี้ และมะรืนนี้ โดยในแต่ละวันจะมีไอคอนพร้อมบอกอุณหภูมิต่ำสุดและสูงสุด
    3. Temperature Screen: ในหน้าจอนี้จะมีข้อมูลรายละเอียดต่างๆ ได้แก่ อุณหภูมิ, ความชื้น, ความดันอากาศ, UV, ความเร็วลม และ Feels like (ความรู้สึกจริงของอุณหภูมิ)
    4. Alarm Screen: ในหน้าจอนี้ เราสามารถตั้งเวลาปลุกได้โดยใช้ปุ่มสองปุ่ม
    5. Timer Screen: หน้าจอนี้จะแสดงนาฬิกาจับเวลา ซึ่งคุณสามารถตั้งเวลาที่ต้องการและเริ่มนับถอยหลังได้

    การเชื่อมต่อ (Connections):

    ในโปรเจกต์นี้เราไม่ได้เชื่อมต่ออุปกรณ์หลายอย่างมากนัก แต่มีจุดที่ต้องเชื่อมต่อดังนี้:

    1. เชื่อมต่อ Arduino ทั้งสองเครื่องเข้าด้วยกันโดยใช้ ISP จาก RP2040 พิน A4-D21 และ A5-D20
    2. ต่อจาก Mega 5V ไปยัง RP2040 VIN
    3. ต่อจาก Mega GND ไปยัง RP2040 GND
    4. ต่อจาก Mega 5V ไปยัง VCC ของ Buzzer
      1. ต่อจาก Mega GND ไปยัง GND ของ Buzzer
      2. ต่อจาก Mega D44 ไปยัง Buzzer

    กล่อง (Box):

    มีโมเดล 3D เพิ่มเติมสำหรับกล่องที่ฉันใช้ใส่หน้าจอ

    GitHub:

    คุณสามารถดู Code และไฟล์ทั้งหมดได้ที่ GitHub ของฉัน

    Code

    🔒 ปลดล็อก Code

    สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้

    รหัสอ้างอิงโปรเจกต์: all-in-one-clock-20-e16d7a
    2450 บาท
    PromptPay QR Code