กลับไปหน้ารวมไฟล์
classic-style-arduino-weather-station-with-three-oled-displays-0c3e57.md

เอาเข้าจริงๆ พี่ก็ทำ Weather Station มาหลายตัวแล้ว ทั้งแบบแสดงค่าจากเซ็นเซอร์ตรงๆ และแบบดึงข้อมูลจากเน็ตมาโชว์ อยากดูก็ไปหาดูเอาเองนะวัยรุ่น (ล้อเล่นน่า)

คราวนี้พี่จะพาน้องไปดูวิธีทำ Weather Station แบบตั้งโต๊ะเจ๋งๆ อีกแบบนึง ที่แสดงค่าพารามิเตอร์อากาศพื้นฐานสามอย่าง คือ ความดันบรรยากาศ, ความชื้นในอากาศ, และอุณหภูมิ บนจอ OLED แยกกันสามจอ ไอเดียคืออยากให้มันดูคลาสสิกเหมือนสถานีอากาศรุ่นเก่า ที่มีเครื่องวัดแยกเป็นสามอันเลย

เพราะจอเล็กและอ่านง่ายไง นี่เลยเป็นแกดเจ็ตติดโต๊ะที่ทั้งเจ๋งและมีประโยชน์สุดๆ

ส่วนวิธีทำนั้นง่ายมากกก เหมาะกับน้องมือใหม่หัดเล่นสุดๆ

อุปกรณ์ที่ใช้มีประมาณนี้:

- ด้านหลังมีช่องเสียบไฟ, สวิตช์ และโมดูลเซ็นเซอร์ BME280

- Arduino Nano

- จอ OLED แบบ SSD1306 ที่สื่อสารผ่าน I2C สามจอ

- และโมดูลมัลติเพล็กเซอร์ TCA9548a

Multi-Screen Dashboards: Classic Weather Station

โปรเจค Arduino ส่วนใหญ่ชอบยัดข้อมูลทุกอย่างลงจอเดียว จนอ่านไม่รู้เรื่อง Classic Style Weather Station ตัวนี้พี่ได้แรงบันดาลใจมาจากหน้าปัดเครื่องบินรุ่นเก่าๆ แบบอนาล็อก โดยใช้ระบบที่เรียกว่า I2C bus addressing ส่งสัญญาณข้อมูลสิ่งแวดล้อมแยกสายกันไปยังจอ OLED สามจอที่แยกจากกันโดยสมบูรณ์

มาควบคุม I2C Multiplexer (TCA9548A) กันดีกว่า

จอ OLED ขนาด 0.96 นิ้ว ทุกจอมักมี Address I2C เฉพาะตัว (ฮาร์ดโค้ด) เหมือนกันเป๊ะ (ส่วนใหญ่จะเป็น 0x3C)

  1. ปัญหาความขัดแย้ง: ถ้าน้องเสียบจอ OLED สามจอเข้าที่ขา SDA/SCL ของ Arduino Uno พอ Arduino ส่งคำว่า "Temperature" ไป ทั้งสามจอจะแสดงคำว่า "Temperature" พร้อมกันเลย น้องคุยกับมันแยกกันไม่ได้
  2. ทางแก้ด้วยฮาร์ดแวร์: น้องต้องต่อ I2C Multiplexer (TCA9548A) ระหว่าง Arduino กับจอ OLED
  3. ตัวมัลติเพล็กเซอร์นี่ทำงานเหมือนพนักงานสับรางรถไฟ มันมีช่องทางออก (Channel) ถึง 8 ช่อง
  4. การทำงานในโค้ด C++: tcaselect(0); display1.print(Temperature); — ชิปตัวนี้จะปิดการเชื่อมต่อทางไฟฟ้ากับจอที่ 2 และ 3 ชั่วคราว บังคับให้ข้อมูลวิ่งเข้าไปที่จอที่ 1 เท่านั้น!

จริงๆ แล้ว พี่ทำอุปกรณ์นี้ขึ้นมาก็เพื่อโชว์การทำงานของมัลติเพล็กเซอร์แบบนี้นี่แหละ เพราะ Arduino Nano มีขา I2C (A4 กับ A5) แค่ชุดเดียว เวลาจะต่อจอ I2C เราเลยถูกจำกัดให้ใช้ได้แค่จอเดียว ในกรณีพิเศษที่จอมีตัวเลือกให้เปลี่ยน Address I2C ได้ เราอาจต่อได้สูงสุดสองจอ แต่ในเคสแบบนี้ที่ต้องการจอมากกว่านั้น การใช้โมดูลมัลติเพล็กเซอร์ตัวนี้จึงเป็นทางที่ practical ที่สุด เพราะมันสามารถต่ออุปกรณ์ I2C ได้ถึง 8 ตัวเข้าไปที่ไมโครคอนโทรลเลอร์ตัวเดียว

การแยกข้อมูลสภาพแวดล้อม (BME280)

ถ้าอยากได้ข้อมูลสภาพแวดล้อมสามแบบจากเซ็นเซอร์ตัวเดียวแบบจัดเต็ม เราก็ต้องใช้ตัวเทพประจำวงการอย่าง เซ็นเซอร์ BME280 ตัวนี้แหละ

  • เซ็นเซอร์ BME280 วัดอุณหภูมิ ความชื้น และความกดอากาศแบบแม่นยำได้หมดในชิปตัวเดียว
  • Arduino ของเราก็แค่ส่งคำสั่งไปถามข้อมูลจากชิปนี้
  • แล้วก็แปลงข้อมูลมาแสดงผลบนจอสามตัวแบบนี้:
    • จอที่ 1: วาดไอคอนเทอร์โมมิเตอร์ตัวเบิ้ม พร้อมตัวเลข 24°C
    • จอที่ 2: วาดรูปหยดน้ำ พร้อมตัวเลข 65% Hum
    • จอที่ 3: วาดหน้าปัดอัลติมิเตอร์ พร้อมตัวเลข 1013 hPa

รายการอะไหล่สำหรับสร้างสถานีอากาศ (Meteorological Build Manifest)

  • Arduino Nano (ตัวเล็กพริกขี้หนู เอาไปแปะหลังแผงไม้ได้พอดี)
  • จอ OLED ขนาด 0.96 นิ้ว แบบ SSD1306 (สามตัว)
  • บอร์ด TCA9548A I2C Multiplexer Breakout (ตัวจัดการจอหลายตัว)
  • โมดูลเซ็นเซอร์ BME280
  • โครงหรือเบรลสำหรับยึดจอ ทำจากไม้มะฮอกกานีหรือพิมพ์ 3D มาให้จอสามตัวเรียงรายสวยงาม

การเขียนโค้ดก็ไม่ได้ยากเย็นอะไร แค่ต้องกำหนดให้ชัดเจนว่าเอาต์พุตหมายเลขไหนของมัลติเพล็กเซอร์ ต้องส่งข้อมูลอะไรไปแสดงบนจอที่ต่ออยู่กับเอาต์พุตนั้น

มาดูกันดีกว่าว่าอุปกรณ์นี้ทำงานยังไงในสภาพจริง

หลังจากเปิดเครื่องไม่กี่วินาทีแรก แต่ละจอจะแสดงชื่อพารามิเตอร์ด้วยตัวอักษรขนาดใหญ่ จากนั้นค่าปัจจุบันของอุณหภูมิ ความดัน และความชื้นอากาศจะปรากฏขึ้นมาแสดงทศนิยมสองตำแหน่ง และบนแถบสีเหลือง จะแสดงชื่อพารามิเตอร์และหน่วยวัดด้วยตัวอักษรขนาดเล็กอีกครั้ง

ถ้าเราอยากแสดงค่าความดันบรรยากาศสัมพัทธ์ (Relative value) ที่ปรับแล้วสำหรับพื้นที่ที่เราอยู่ (เช่น ระดับความสูงจากน้ำทะเล) เราต้องไปแก้ไขในส่วนของโค้ดนี้

pressure = bme.seaLevelForAltitude(700.0, bme.readPressure())/100.0;

โดยเปลี่ยนค่า 700.0 เป็นระดับความสูงของพื้นที่เราจริงๆ (ตัวอย่างนี้ใช้ 700 เมตร) ตัวพี่ยังทำโค้ดอีกเวอร์ชันนึงที่แสดงตัวเลขใหญ่ๆ แต่ไม่มีทศนิยมด้วย เอาไว้เลือกใช้ตามสไตล์

สุดท้ายนี้ สรุปแบบสั้นๆ เลยนะน้อง อุปกรณ์ชิ้นนี้ดูเรียบง่ายแต่ให้เอฟเฟกต์การแสดงผลที่ชัดเจน และมีประโยชน์มาก เพราะมันแสดงพารามิเตอร์ทางอุตุนิยมวิทยาพื้นฐานสามอย่างได้อย่างแม่นยำ โดยใช้เซ็นเซอร์ราคาประหยัดแค่ตัวเดียว หลังจากประกอบเสร็จก็หาตัวบ้านหรือเคสพลาสติก PVC มาใส่ แล้วตกแต่งด้วยวอลเปเปอร์ติดเองสีสันสดใส ก็จะได้ของใช้ที่ทั้งสวยและใช้งานได้จริงเลย สู้งานนะน้อง!

ข้อมูล Frontmatter ดั้งเดิม

apps:
  - "1x Arduino IDE"
author: "mircemk"
category: "Sensors & Environment"
components:
  - "1x Soldering kit"
  - "3x SSD1306 OLED Display"
  - "1x BME280/BMP280"
  - "1x I2C Hub 1 to 6 Expansion TCA9548A Module"
  - "1x Arduino Nano"
description: "Aeronautical aesthetics! Build a stunning, multi-screen meteorological dashboard that splits temperature, humidity, and barometric pressure across three distinct, beautifully coded I2C graphical outputs."
difficulty: "Intermediate"
documentationLinks: []
downloadableFiles: []
encryptedPayload: "U2FsdGVkX1/oAXaUNfkSgm6VyK5ol47KDj4jxKftLqiSjqr1hW2l2MEmsGLWA9NO3LIoCU6s12vFjTg9lx+AInVmUTYhtc5R1Wl2QuFu2Ww="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/classic-style-arduino-weather-station-with-three-oled-displays-0c3e57_cover.jpg"
lang: "en"
likes: 4
passwordHash: "3858980b13042d56c539c2623f327a3ae8f264a50282379acbbebb473897ccfa"
price: 2450
seoDescription: "Classic Arduino Weather Station with three OLED Displays. Accurate monitoring using a single inexpensive sensor."
tags:
  - "Monitoring"
  - "Weather"
  - "Data Collection"
title: "สถานีพยากรณ์อากาศ Arduino สไตล์คลาสสิก จอ Oled สามจอ งานง่ายแต่หล่อ!"
tools: []
videoLinks:
  - "https://youtu.be/UkQjucC2W98"
views: 10734