📑 เนื้อหาในบทความ
🎯 ภาพรวมโปรเจกต์
สถานีตรวจวัดอากาศ DIY นี้เป็นโปรเจกต์ IoT เริ่มต้นที่เหมาะสำหรับผู้เริ่มต้น ใช้ Arduino Uno R4 WiFi ซึ่งเป็นไมโครคอนโทรลเลอร์รุ่นล่าสุดจาก Arduino ที่มาพร้อมกับความสามารถในการเชื่อมต่อ WiFi ในตัว ร่วมกับเซ็นเซอร์ BME280 ที่สามารถวัดอุณหภูมิ ความชื้น และความดันอากาศได้อย่างแม่นยำ
✨ จุดเด่นของโปรเจกต์
- ✓ วัดอุณหภูมิแม่นยำ ±1°C
- ✓ วัดความชื้นสัมพัทธ์ ±3%
- ✓ วัดความดันอากาศ ±1 hPa
- ✓ เชื่อมต่อ WiFi ส่งข้อมูล real-time
- ✓ ใช้งานร่วมกับ CynoIoT Platform
- ✓ ติดตั้งง่าย ไม่ต้องบัดกรี
🔧 อุปกรณ์ที่ต้องใช้
Hardware
| อุปกรณ์ | รายละเอียด | ราคาโดยประมาณ |
|---|---|---|
| Arduino Uno R4 WiFi | ไมโครคอนโทรลเลอร์ + WiFi | ~฿850 |
| BME280 Sensor | เซ็นเซอร์วัดอุณหภูมิ/ความชื้น/ความดัน | ~฿180 |
| Jumper Wires | สายเชื่อมต่อ (M-F) | ~฿40 |
| Breadboard | บอร์ดทดลอง (ไม่บังคับ) | ~฿50 |
| USB Cable | สาย USB Type-C | ~฿60 |
Software
- • Arduino IDE 2.x (ฟรี)
- • Adafruit BME280 Library
- • Arduino Uno R4 WiFi Board Package
- • CynoIoT Account (ฟรี)
💡 เคล็ดลับ: Arduino Uno R4 WiFi ใช้ชิป Renesas RA4M1 32-bit ARM Cortex-M4 ซึ่งเร็วกว่า Arduino Uno รุ่นเดิม (8-bit) ถึง 16 เท่า!
🔌 การต่อวงจร
การต่อ BME280 เข้ากับ Arduino Uno R4 WiFi นั้นง่ายมาก เพราะใช้通信 protocol I2C ซึ่งต้องการเพียง 2 สายเท่านั้น
| BME280 Pin | Arduino Uno R4 WiFi Pin | สีสาย |
|---|---|---|
| VIN (3.3V) | 3.3V | แดง |
| GND | GND | ดำ |
| SCL | SCL (D3) | น้ำเงิน |
| SDA | SDA (D2) | เขียว |
📌 หมายเหตุสำคัญ
- ⚠️ ต้องใช้ 3.3V เท่านั้น ห้ามต่อ 5V เด็ดขาดเพราะจะทำให้เซ็นเซอร์เสียหาย
- • BME280 บางรุ่นอาจมี ADDR pin เพื่อเลือก I2C address (0x76 หรือ 0x77)
- • ถ้าใช้ BME280 breakout board ที่มี voltage regulator สามารถต่อ 3.3V หรือ 5V ก็ได้
💻 การติดตั้งซอฟต์แวร์
ขั้นตอนที่ 1: ติดตั้ง Arduino IDE
- 1
ดาวน์โหลด Arduino IDE 2.x
ไปที่ arduino.cc/en/software และดาวน์โหลดเวอร์ชันสำหรับระบบปฏิบัติการของคุณ
- 2
ติดตั้งและเปิด Arduino IDE
ติดตั้งตามปกติและเปิดโปรแกรม
ขั้นตอนที่ 2: เพิ่ม Board Package
- 1
เปิด Board Manager
ไปที่
Tools → Board → Boards Manager - 2
ค้นหาและติดตั้ง
พิมพ์
arduino uno r4แล้วกดติดตั้ง "Arduino Uno R4 WiFi Boards" จาก Arduino
ขั้นตอนที่ 3: ติดตั้ง BME280 Library
- 1
เปิด Library Manager
ไปที่
Tools → Manage Libraries - 2
ค้นหาและติดตั้ง
พิมพ์
adafruit bme280แล้วกดติดตั้งจาก Adafruit - 3
ติดตั้ง dependencies
ติดตั้ง Adafruit Unified Sensor ด้วย (ถ้า Arduino IDE ถาม)
📝 โค้ดโปรแกรม
นี่คือโค้ดสำหรับอ่านค่าจาก BME280 และแสดงผลทาง Serial Monitor พร้อมคำอธิบายภาษาไทยทุกบรรทัด
// สถานีตรวจวัดอากาศ Arduino Uno R4 WiFi + BME280
// เชื่อมต่อ CynoIoT Platform
// 25 มีนาคม 2026
#include <Wire.h> // ไลบรารีสำหรับ I2C communication
#include <Adafruit_Sensor.h> // ไลบรารีเซ็นเซอร์จาก Adafruit
#include <Adafruit_BME280.h> // ไลบรารี BME280
#include <WiFiS3.h> // ไลบรารี WiFi สำหรับ Arduino Uno R4 WiFi
// ========== การตั้งค่า WiFi ==========
const char* ssid = "YOUR_WIFI_SSID"; // ชื่อ WiFi ของคุณ
const char* password = "YOUR_WIFI_PASSWORD"; // รหัสผ่าน WiFi
// ========== การตั้งค่า CynoIoT ==========
const char* cynoiotServer = "api.cynoiot.com";
const int cynoiotPort = 80;
const char* cynoiotApiKey = "YOUR_CYNOIOT_API_KEY"; // API Key จาก CynoIoT
// ========== สร้างออบเจ็กต์ ==========
Adafruit_BME280 bme; // สร้างออบเจ็กต์ BME280
WiFiClient client; // สร้างออบเจ็กต์ WiFi client
// ตัวแปรสำหรับจับเวลา
unsigned long lastTime = 0;
const long sendDataInterval = 5000; // ส่งข้อมูลทุก 5 วินาที (5000 ms)
void setup() {
// เริ่มต้น Serial communication
Serial.begin(9600);
// รอให้ Serial พร้อม (เฉพาะตอนเชื่อมต่อ USB)
while (!Serial && millis() < 3000);
Serial.println(F("===================================="));
Serial.println(F(" สถานีตรวจวัดอากาศ Arduino Uno R4 WiFi"));
Serial.println(F(" BME280 Weather Station"));
Serial.println(F("====================================\n"));
// เริ่มต้นเซ็นเซอร์ BME280
Serial.print(F("กำลังเริ่มต้น BME280..."));
// BME280 ใช้ I2C address 0x77 (หรือ 0x76 บางรุ่น)
if (!bme.begin(0x77)) {
// ถ้าเริ่มต้นไม่สำเร็จ ลอง address อื่น
if (!bme.begin(0x76)) {
Serial.println(F(" ไม่พบเซ็นเซอร์ BME280!"));
Serial.println(F("ตรวจสอบการต่อสาย"));
while (1) delay(10); // หยุดทำงาน
}
}
Serial.println(F(" เริ่มต้นสำเร็จ!\n"));
// เชื่อมต่อ WiFi
connectToWiFi();
Serial.println(F("\nเริ่มต้นสถานีตรวจวัดอากาศ..."));
Serial.println(F("------------------------------------\n"));
}
void loop() {
// ตรวจสอบเวลาสำหรับส่งข้อมูล
unsigned long currentTime = millis();
if (currentTime - lastTime >= sendDataInterval) {
lastTime = currentTime;
// อ่านค่าจากเซ็นเซอร์
readSensorData();
// ส่งข้อมูลไป CynoIoT
sendToCynoIoT();
}
// รอสักครู่ก่อนวนลูปใหม่
delay(100);
}
// ========== ฟังก์ชันเชื่อมต่อ WiFi ==========
void connectToWiFi() {
Serial.print(F("กำลังเชื่อมต่อ WiFi: "));
Serial.print(ssid);
// เริ่มต้น WiFi ในโหมด Station
WiFi.begin(ssid, password);
// รอจนกว่าจะเชื่อมต่อสำเร็จ
int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < 20) {
delay(500);
Serial.print(F("."));
attempts++;
}
// ตรวจสอบสถานะการเชื่อมต่อ
if (WiFi.status() == WL_CONNECTED) {
Serial.println(F("\n✓ เชื่อมต่อ WiFi สำเร็จ!"));
Serial.print(F(" IP Address: "));
Serial.println(WiFi.localIP());
Serial.print(F(" Signal Strength: "));
Serial.print(WiFi.RSSI());
Serial.println(F(" dBm"));
} else {
Serial.println(F("\n✗ ไม่สามารถเชื่อมต่อ WiFi ได้"));
Serial.println(F(" ตรวจสอบชื่อและรหัสผ่าน WiFi"));
}
Serial.println();
}
// ========== ฟังก์ชันอ่านค่าเซ็นเซอร์ ==========
void readSensorData() {
Serial.println(F("---------- ข้อมูลล่าสุด ----------"));
// อ่านค่าอุณหภูมิ (เซลเซียส)
float temperature = bme.readTemperature();
Serial.print(F("🌡️ อุณหภูมิ: "));
Serial.print(temperature, 1); // แสดง 1 ตำแหน่งทศนิยม
Serial.println(F(" °C"));
// อ่านค่าความชื้นสัมพัทธ์ (เปอร์เซ็นต์)
float humidity = bme.readHumidity();
Serial.print(F("💧 ความชื้น: "));
Serial.print(humidity, 1);
Serial.println(F(" %"));
// อ่านค่าความดันอากาศ (เฮกโตปาสกาล)
float pressure = bme.readPressure() / 100.0F; // แปลงจาก Pa เป็น hPa
Serial.print(F("🔵 ความดัน: "));
Serial.print(pressure, 1);
Serial.println(F(" hPa"));
// คำนวณค่าความสูงจากความดัน (เมตร)
float altitude = bme.readAltitude(1013.25); // ใช้ความดันมาตรฐานที่ระดับน้ำทะเล
Serial.print(F("⛰️ ความสูง: "));
Serial.print(altitude, 1);
Serial.println(F(" ม.รทก."));
Serial.println(F("------------------------------------"));
}
// ========== ฟังก์ชันส่งข้อมูลไป CynoIoT ==========
void sendToCynoIoT() {
// ตรวจสอบว่าเชื่อมต่อ WiFi อยู่หรือไม่
if (WiFi.status() != WL_CONNECTED) {
Serial.println(F("⚠️ WiFi ไม่ได้เชื่อมต่ออยู่ กำลังเชื่อมต่อใหม่..."));
connectToWiFi();
return;
}
// อ่านค่าเซ็นเซอร์อีกครั้งเพื่อส่งข้อมูลล่าสุด
float temperature = bme.readTemperature();
float humidity = bme.readHumidity();
float pressure = bme.readPressure() / 100.0F;
// เชื่อมต่อไปยัง CynoIoT Server
Serial.print(F("กำลังเชื่อมต่อ CynoIoT..."));
if (client.connect(cynoiotServer, cynoiotPort)) {
Serial.println(F(" สำเร็จ!"));
// สร้าง JSON payload
String payload = "{";
payload += "\"temperature\":" + String(temperature, 1) + ",";
payload += "\"humidity\":" + String(humidity, 1) + ",";
payload += "\"pressure\":" + String(pressure, 1) + ",";
payload += "\"device\":\"arduino-uno-r4-wifi\"";
payload += "}";
// ส่ง HTTP POST request
client.println("POST /api/v1/sensor-data HTTP/1.1");
client.println("Host: " + String(cynoiotServer));
client.println("Content-Type: application/json");
client.println("X-API-Key: " + String(cynoiotApiKey));
client.println("Content-Length: " + String(payload.length()));
client.println("Connection: close");
client.println();
client.println(payload);
Serial.print(F("📤 ส่งข้อมูล: "));
Serial.println(payload);
// รอ response จาก server (เพื่อการ debug)
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 5000) {
Serial.println(F("⏱️ หมดเวลาคอบ response"));
client.stop();
return;
}
}
// อ่าน response
while (client.available()) {
String line = client.readStringUntil('\r');
Serial.print(line);
}
client.stop();
Serial.println(F("\n✓ ส่งข้อมูลสำเร็จ!"));
} else {
Serial.println(F(" ล้มเหลว!"));
Serial.println(F("⚠️ ไม่สามารถเชื่อมต่อ CynoIoT Server ได้"));
}
Serial.println();
}✅ การใช้งาน
- แก้ไข WiFi credentials (บรรทัด 16-17)
- แก้ไข CynoIoT API Key (บรรทัด 22)
- อัปโหลดโค้ดไปยัง Arduino
- เปิด Serial Monitor (115200 baud)
- ดูผลลัพธ์และยืนยันการเชื่อมต่อ CynoIoT
🌐 การเชื่อมต่อ CynoIoT Platform
CynoIoT Platform ช่วยให้คุณเก็บข้อมูล แสดงผล และวิเคราะห์ข้อมูลจากเซ็นเซอร์ได้อย่างง่ายดาย
ขั้นตอนที่ 1: สมัครบัญชี CynoIoT
- 1
ไปที่ CynoIoT
เข้าไปที่ cynoiot.com และสมัครใช้งานฟรี
- 2
สร้างโปรเจกต์ใหม่
สร้างโปรเจกต์สำหรับสถานีตรวจวัดอากาศ
- 3
รับ API Key
คัดลอก API Key จากหน้าตั้งค่าโปรเจกต์
ขั้นตอนที่ 2: สร้าง Dashboard
- 1
เพิ่ม Widget
เพิ่ม Gauge chart สำหรับอุณหภูมิ ความชื้น และความดัน
- 2
ตั้งค่า Alert
ตั้งค่าการแจ้งเตือนเมื่ออุณหภูมิสูงเกินกว่าที่กำหนด
- 3
ดูข้อมูลแบบ Real-time
ดูข้อมูลล่าสุดและกราฟประวัติ
💎 ฟีเจอร์ขั้นสูง
- • ส่งการแจ้งเตือนไปยัง LINE / Telegram
- • ส่งออกข้อมูลเป็น CSV / Excel
- • เชื่อมต่อกับ IFTTT / Zapier
- • แชทด้วย AI สำหรับวิเคราะห์ข้อมูล
✅ การทดสอบ
ขั้นตอนที่ 1: ทดสอบเซ็นเซอร์
- เปิด Serial Monitor (Tools → Serial Monitor)
- ตั้ง baud rate เป็น 9600
- ดูผลลัพธ์ — ควรแสดงอุณหภูมิ ความชื้น และความดัน
- ลมเป่าเซ็นเซอร์เพื่อดูการเปลี่ยนแปลงของค่า
ขั้นตอนที่ 2: ทดสอบ WiFi
- ตรวจสอบข้อความ "เชื่อมต่อ WiFi สำเร็จ!"
- บันทึก IP Address ที่ได้
- ping IP address จากคอมพิวเตอร์
- ตรวจสอบความแรงสัญญาณ (dBm)
ขั้นตอนที่ 3: ทดสอบ CynoIoT
- ตรวจสอบข้อความ "ส่งข้อมูลสำเร็จ!"
- เข้าไปที่ Dashboard บน CynoIoT
- ตรวจสอบว่าข้อมูลปรากฏหรือไม่
- ดูกราฟและประวัติข้อมูล
🎯 ค่าที่คาดหวัง
- • อุณหภูมิ: 25-35°C (ภายในห้อง)
- • ความชื้น: 40-80% RH
- • ความดัน: ~1013 hPa (ความดันมาตรฐาน)
- • WiFi สัญญาณ: -30 ถึง -80 dBm
🔧 การแก้ปัญหา
1 ไม่พบเซ็นเซอร์ BME280
อาการ:
แสดงข้อความ "ไม่พบเซ็นเซอร์ BME280!"
สาเหตุที่เป็นไปได้:
- ต่อสายไม่ถูกต้อง
- เซ็นเซอร์เสีย
- I2C address ไม่ถูกต้อง
- ต่อ 5V แทน 3.3V (เซ็นเซอร์อาจเสีย)
วิธีแก้ไข:
- ตรวจสอบการต่อสายทุกขา
- ลองเปลี่ยน I2C address (0x76 หรือ 0x77)
- ใช้สาย jumper สายใหม่
- ลองเซ็นเซอร์ตัวอื่น
2 เชื่อมต่อ WiFi ไม่ได้
อาการ:
แสดงข้อความ "ไม่สามารถเชื่อมต่อ WiFi ได้"
สาเหตุที่เป็นไปได้:
- ชื่อหรือรหัสผ่านผิด
- ระยะห่างจาก Router ไกลเกินไป
- WiFi รองรับเฉพาะ 2.4GHz
- มีการ block MAC address
วิธีแก้ไข:
- ตรวจสอบชื่อและรหัสผ่าน WiFi
- ย้าย Arduino ให้ใกล้ Router
- ตรวจสอบว่า Router รองรับ 2.4GHz
- ปิด-เปิด WiFi Router อีกครั้ง
3 ส่งข้อมูลไป CynoIoT ไม่ได้
อาการ:
แสดงข้อความ "ไม่สามารถเชื่อมต่อ CynoIoT Server ได้"
สาเหตุที่เป็นไปได้:
- API Key ผิด
- ไม่ได้เชื่อมต่ออินเทอร์เน็ต
- Server ปิดปรับปรุง
- Firewall บล็อกการเชื่อมต่อ
วิธีแก้ไข:
- ตรวจสอบ API Key
- ตรวจสอบสถานะการเชื่อมต่ออินเทอร์เน็ต
- ลอง ping ไปที่ api.cynoiot.com
- ติดต่อฝ่ายสนับสนุน CynoIoT
4 ค่าอุณหภูมิ/ความชื้นผิดปกติ
อาการ:
ค่าที่ได้สูงหรือต่ำผิดปกติมาก
สาเหตุที่เป็นไปได้:
- เซ็นเซอร์ร้อนเกินไป (จาก Arduino)
- แสงแดดส่องโดนตรงๆ
- เซ็นเซอร์อยู่ใกล้แหล่งความร้อน
- เซ็นเซอร์ต้องการสอบเทียน
วิธีแก้ไข:
- ย้ายเซ็นเซอร์ห่างจาก Arduino
- ใช้สายยาวขึ้น
- หลีกเลี่ยงแสงแดดโดยตรง
- สอบเทียนเซ็นเซอร์หากจำเป็น
🎉 สรุป
ยินดีด้วย! คุณเพิ่งสร้างสถานีตรวจวัดอากาศ IoT ด้วย Arduino Uno R4 WiFi และ BME280 สามารถวัดอุณหภูมิ ความชื้น และความดันอากาศได้อย่างแม่นยำ และส่งข้อมูลไปยัง CynoIoT Platform เพื่อเก็บและวิเคราะห์ข้อมูลได้
🚀 แนวคิดต่อยอด
เพิ่มเซ็นเซอร์
- • Rain sensor (เซ็นเซอร์ฝน)
- • UV sensor (เซ็นเซอร์แสง UV)
- • Wind sensor (เซ็นเซอร์ลม)
- • Soil moisture (ความชื้นในดิน)
ฟีเจอร์เพิ่มเติม
- • หน้าจอแสดงผล (OLED)
- • แบตเตอรี่สำรอง
- • กล่องกันฝุ่นน้ำ (IP65)
- • Solar panel ชาร์จ
อัตโนมัติฉลาด
- • เปิดปิดพัดลมอัตโนมัติ
- • รดน้ำต้นไม้อัตโนมัติ
- • ปิดม่านบังแดด
- • แจ้งเตือน LINE/Telegram
โปรเจกต์ที่เกี่ยวข้อง
- • บอตรดน้ำอัตโนมัติ
- • Smart Home Controller
- • ระบบควบคุมโรงเรือน
- • Air Quality Monitor