กลับไปหน้ารวมไฟล์
sg-20-wireless-weather-station-a3eb2f.md

ในบทความนี้ เราจะมาเจาะลึกการพัฒนา "สถานีตรวจวัดสภาพอากาศอัจฉริยะ (Wireless Weather Station)" ซึ่งถูกออกแบบมาเพื่อเฝ้าระวังและเก็บข้อมูลสภาพแวดล้อมที่สำคัญในพื้นที่ที่เราต้องการ โดยระบบนี้มีความสามารถในการตรวจวัดค่าพารามิเตอร์ต่างๆ ดังนี้:

  • อุณหภูมิ (Temperature): ครอบคลุมทั้งภายในและภายนอกอาคาร
  • ความชื้นสัมพัทธ์ (Humidity): ทั้งในพื้นที่ปิดและพื้นที่เปิด
  • ความกดอากาศ (Atmospheric Pressure): สำหรับการพยากรณ์อากาศเบื้องต้น
  • ระดับความสูง (Altitude): คำนวณจากความกดอากาศโดยรอบ

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


โครงสร้างและส่วนประกอบของระบบ (System Components)

การสร้างสถานีตรวจวัดอากาศที่ใช้งานได้จริงนั้น จำเป็นต้องมีการเลือกใช้เซนเซอร์ที่เหมาะสมกับลักษณะงาน ดังนี้:

  1. NRF24L01 (Radio-Communications): ทำหน้าที่เป็นเสมือน "สะพานเชื่อมไร้สาย" โดยใช้คลื่นความถี่ 2.4GHz (SPI Interface) มีความโดดเด่นที่การใช้พลังงานต่ำมาก และสามารถส่งข้อมูลได้ไกลถึง 1,000 เมตรในที่โล่ง (หากใช้รุ่นที่มีสายอากาศภายนอก)
  2. DHT22 (Digital Humidity & Temperature Sensor): เซนเซอร์วัดอุณหภูมิและความชื้นที่เหนือกว่ารุ่น DHT11 โดยใช้ Thermistor (NTC) ในการวัดอุณหภูมิ และ Capacitive sensor ในการวัดความชื้น ให้ค่าแบบดิจิทัลที่มีความละเอียดสูงและทำงานในสภาวะติดลบได้ถึง -40 °C
  3. BMP180 (Barometric Pressure & Altitude Sensor): เซนเซอร์วัดความกดอากาศที่มีความแม่นยำสูง (Digital Barometer) ทำงานผ่านโปรโตคอล I2C โดยสามารถคำนวณหาค่าระดับความสูง (Altitude) ได้จากการเปรียบเทียบความกดอากาศที่ระดับน้ำทะเล
  4. DS3231 (Real Time Clock Module): โมดูลฐานเวลาที่มีความแม่นยำสูงมาก เนื่องจากมีระบบ Temperature Compensated Crystal Oscillator (TCXO) ช่วยให้เวลาไม่คลาดเคลื่อนแม้จะมีการเปลี่ยนแปลงของอุณหภูมิในสภาพอากาศต่างๆ
Indor Unity - หน่วยประมวลผลภายในอาคาร
Outdoor Unity - หน่วยวัดค่าภายนอกอาคาร

เจาะลึกวิศวกรรมของเซนเซอร์

เซนเซอร์ความกดอากาศและระดับความสูง BMP180

BMP180 เป็นโมดูลที่เหมาะอย่างยิ่งสำหรับการวัดความกดอากาศในสภาพแวดล้อมจริง โดยใช้หลักการ Piezoresistive ในการตรวจวัด มีจุดเด่นที่การใช้กระแสไฟฟ้าเพียง 0.3uA ซึ่งต่ำมาก ทำให้ประหยัดพลังงานในกรณีที่ต้องใช้แบตเตอรี่ การเชื่อมต่อทำได้ง่ายผ่านขา I2C (SDA และ SCL)

เซนเซอร์อุณหภูมิและความชื้น DHT22

ในโปรเจคนี้เราเลือกใช้ DHT22 แทน DHT11 เนื่องจากความต้องการความเสถียรในระยะยาว DHT22 มีวงจรประมวลผลภายในที่ทำการ Calibrate ค่ามาให้จากโรงงานแล้ว ส่งสัญญาณออกมาเป็น Digital Signal ทำให้ลดปัญหาสัญญาณรบกวน (Noise) เมื่อต้องเดินสายสัญญาณยาวๆ

การสื่อสารไร้สายด้วย NRF24L01

เราเลือกใช้โมดูลนี้เนื่องจากประสิทธิภาพต่อราคาที่คุ้มค่า การตั้งค่าใน Source Code ของเราจะเน้นไปที่ความเสถียร โดยใช้ Data Rate ที่ 250KBPS ซึ่งเป็นระดับที่ช่วยให้รับส่งสัญญาณได้ไกลและลดการสูญเสียแพ็กเก็ตข้อมูล


วิเคราะห์การทำงานของ Source Code (Code Logic Analysis)

ในส่วนของโปรแกรมควบคุมที่เขียนขึ้นด้วยภาษา C++ บน Arduino IDE มีลอจิกการทำงานที่ซับซ้อนและเป็นระเบียบดังนี้:

1. การกำหนดโครงสร้างข้อมูล (Data Structuring)

มีการใช้ struct package เพื่อรวบรวมข้อมูลจากเซนเซอร์ทุกตัวให้อยู่ในก้อนเดียว (Payload) ทำให้การส่งผ่านคลื่นวิทยุ NRF24L01 ทำได้รวดเร็วและแม่นยำ:

struct package {
  float temperature;
  float humidity;
  float pressure;
  float altitude;
  float bmptemperature;
  float pressureseelevel;
};

2. การตั้งค่าระบบ (Initialization)

ในฟังก์ชัน setup() จะมีการเริ่มการทำงานของเซนเซอร์ทุกตัว และที่สำคัญคือการตั้งค่า NRF24L01:

  • myRadio.setChannel(115);: เลือกช่องสัญญาณที่ 115 เพื่อเลี่ยงการกวนจาก Wi-Fi ทั่วไป
  • myRadio.setPALevel(RF24_PA_MAX);: ตั้งค่ากำลังส่งสูงสุดเพื่อให้ส่งได้ไกลที่สุด
  • myRadio.setDataRate(RF24_250KBPS);: ลดความเร็วในการส่งลงเพื่อเพิ่มระยะทางและความเสถียร

3. ลอจิกการอ่านและส่งข้อมูล (Main Loop)

ตัวโปรแกรมจะทำงานเป็นวงจร (Loop) ทุกๆ 5 วินาที ดังนี้:

  1. Read Sensor: เรียกฟังก์ชัน readSensor() เพื่อดึงค่าจาก DHT22 และ bmpSensor() เพื่อดึงค่าจาก BMP180
  2. Display: แสดงผลค่าที่อ่านได้ผ่าน Serial Monitor เพื่อตรวจสอบความถูกต้อง (Debugging)
  3. Wireless Transmission: ใช้คำสั่ง myRadio.write(&data, sizeof(data)); เพื่อส่งก้อนข้อมูลทั้งหมดไปยังตัวรับภายในอาคาร
  4. Status Indicator: มีการสั่งงาน LED ที่ขา 7 (led_pin) ให้ติดสว่างขณะส่งข้อมูล เพื่อให้ผู้ใช้ทราบสถานะการทำงานของเครื่อง

4. ฟังก์ชันการคำนวณระดับน้ำทะเล

ภายในฟังก์ชัน bmpSensor() มีจุดที่น่าสนใจคือการเรียกใช้ bmp.readSealevelPressure() ซึ่งจะคำนวณหาค่าความกดอากาศที่ปรับเทียบกับระดับน้ำทะเล ช่วยให้เราสามารถนำข้อมูลไปเปรียบเทียบกับพยากรณ์อากาศจากกรมอุตุนิยมวิทยาได้โดยตรง


สรุปผลการพัฒนา

โปรเจค Weather Station นี้ไม่เพียงแต่แสดงให้เห็นถึงการรวบรวมข้อมูลทางกายภาพเข้าสู่โลกดิจิทัล แต่ยังเป็นต้นแบบที่ดีของการใช้ Microcontroller ในการจัดการคอขวดของข้อมูล (Data Bottleneck) ผ่านการใช้ Struct และการบริหารจัดการพลังงานผ่านโมดูลสื่อสารที่มีประสิทธิภาพสูง เหมาะสำหรับการนำไปต่อยอดเป็นระบบ Smart Farm หรือ Home Automation ต่อไปในอนาคต

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

title: "SG-2.0 Wireless Weather Station"
description: "In this paper we have presented how to implement a Weather Station to monitor different parameters."
author: "serafim11"
category: ""
tags:
  - "weather"
  - "home automation"
  - "monitoring"
views: 3955
likes: 1
price: 699
difficulty: "Intermediate"
components:
  - "1x Soldering iron (generic)"
  - "1x Rotary potentiometer (generic)"
  - "2x Arduino Nano R3"
  - "2x SparkFun Transceiver Breakout - nRF24L01+"
  - "1x DHT22 Temperature Sensor"
  - "1x DS3231M - ±5ppm, I2C Real-Time Clock"
  - "1x BMP180"
  - "1x RGB LCD Shield Kit, 16x2 Character Display"
  - "1x DHT11 Temperature & Humidity Sensor (3 pins)"
tools: []
apps:
  - "1x Arduino IDE"
downloadableFiles:
  - "https://projects.arduinocontent.cc/21e338df-05a3-48ca-92e5-4492834953e0.ino"
  - "https://projects.arduinocontent.cc/21e338df-05a3-48ca-92e5-4492834953e0.ino"
  - "https://projects.arduinocontent.cc/60848ace-29a5-4632-921c-0138f54231b0.ino"
documentationLinks: []
passwordHash: "38b5995ba6300ebeccd51abb6bd20e4e421b1f94ddb1390df659d2a8ea69a288"
encryptedPayload: "U2FsdGVkX1/c5dMgNKI7KycLUuhtmIlA6jtiexvDKJ6976+mM6aJmwBB0KQU/tuN+JgQLI0+WTCCzYH0dU6F/wShJzbzP8gWu14f3MoVaqE="
seoDescription: "Learn how to build the SG-2.0 Wireless Weather Station to monitor various parameters using Arduino."
videoLinks: []
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/sg-20-wireless-weather-station-a3eb2f_cover.jpg"
lang: "en"