เนื้อหาในบทความ
🌡️ ทำไมต้อง Data Logger?
ในฤดูร้อนแบบนี้ การเฝ้าระวังอุณหภูมิและความชื้นในบ้าน หรือในพื้นที่เกษตรกรรม เป็นสิ่งสำคัญมาก ระบบ Data Logger ที่เราจะสร้างกันวันนี้จะช่วยให้คุณ:
- บันทึกข้อมูลอุณหภูมิและความชื้นทุก 5 วินาที
- เก็บข้อมูลลงใน SD Card ได้นานเป็นเดือน
- นำข้อมูลไปวิเคราะห์ใน Excel หรือ Google Sheets
- เชื่อมต่อ WiFi และส่งข้อมูลขึ้น CynoIoT Platform
- ตรวจสอบข้อมูลผ่าน Serial Monitor แบบ Real-time
💡 เคล็ดลับ: โปรเจกต์นี้เหมาะสำหรับการเฝ้าระวังอุณหภูมิในโรงเรือน, คลังสินค้า, หรือในบ้านที่ต้องการติดตามสภาพอากาศแบบต่อเนื่อง
🔧 อุปกรณ์ที่ต้องใช้
Hardware
| อุปกรณ์ | จำนวน | ราคาโดยประมาณ |
|---|---|---|
| ESP32 Development Board | 1 อัน | ฿150-300 |
| DHT22 Temperature & Humidity Sensor | 1 อัน | ฿80-120 |
| MicroSD Card Module | 1 อัน | ฿40-80 |
| MicroSD Card (4GB ขึ้นไป) | 1 อัน | ฿100-200 |
| Resistor 10kΩ | 1 อัน | ฿1 |
| Breadboard และ Jumper Wires | 1 ชุด | ฿50-100 |
Software
- Arduino IDE (เวอร์ชันล่าสุด)
- Library: DHT sensor library by Adafruit
- Library: SD (built-in)
- Library: FS (built-in)
- CynoIoT Account (ฟรี!)
💡 หมายเหตุ: คุณสามารถใช้ DHT11 แทน DHT22 ได้ แต่ DHT22 จะให้ความแม่นยำสูงกว่าและวัดช่วงอุณหภูมิที่กว้างกว่า
🔌 วงจรการเชื่อมต่อ
DHT22 เชื่อมต่อกับ ESP32
| DHT22 Pin | ESP32 Pin |
|---|---|
| VCC (+) | 3.3V |
| Data | GPIO 4 |
| GND (-) | GND |
MicroSD Card Module เชื่อมต่อกับ ESP32
| SD Module | ESP32 Pin |
|---|---|
| CS | GPIO 5 |
| SCK | GPIO 18 |
| MOSI | GPIO 23 |
| MISO | GPIO 19 |
| VCC | 5V (หรือ 3.3V) |
| GND | GND |
⚠️ คำเตือน: ให้แน่ใจว่า SD Card ได้รับการจัดรูปแบบ (Format) เป็น FAT32 ก่อนใช้งาน
💻 โค้ดโปรแกรม
นี่คือโค้ดที่สมบูรณ์สำหรับ Data Logger ของเรา โค้ดนี้จะ:
- อ่านค่าอุณหภูมิและความชื้นจาก DHT22
- บันทึกข้อมูลลงใน SD Card ทุก 5 วินาที
- แสดงผลใน Serial Monitor แบบ Real-time
- สร้างไฟล์ CSV ที่เปิดใน Excel ได้
// ESP32 Temperature & Humidity Data Logger
// บันทึกข้อมูลลง SD Card พร้อม timestamp
#include <DHT.h>
#include <SD.h>
#include <SPI.h>
// ขา DHT22
#define DHTPIN 4
#define DHTTYPE DHT22
// ขา SD Card
#define SD_CS 5
#define SD_SCK 18
#define SD_MOSI 23
#define SD_MISO 19
// สร้าง object สำหรับ DHT
DHT dht(DHTPIN, DHTTYPE);
// ชื่อไฟล์สำหรับบันทึกข้อมูล
const char* filename = "/datalog.csv";
// ช่วงเวลาในการบันทึก (milliseconds)
unsigned long previousMillis = 0;
const long interval = 5000; // 5 วินาที
void setup() {
// เริ่ม Serial Monitor
Serial.begin(115200);
Serial.println("ESP32 Data Logger เริ่มต้นทำงาน...");
// เริ่ม DHT sensor
dht.begin();
delay(2000); // รอให้ sensor พร้อม
// ตั้งค่า SPI สำหรับ SD Card
SPI.begin(SD_SCK, SD_MISO, SD_MOSI, SD_CS);
// เริ่ม SD Card
if (!SD.begin(SD_CS)) {
Serial.println("❌ ไม่สามารถเริ่ม SD Card ได้!");
Serial.println("ตรวจสอบการเชื่อมต่อ:");
Serial.println(" - SD Card ใส่หรือยัง?");
Serial.println(" - จัดรูปแบบเป็น FAT32 หรือยัง?");
Serial.println(" - ขา CS เชื่อมต่อถูกต้องหรือไม่?");
while (1) {
delay(1000);
}
}
Serial.println("✅ SD Card เริ่มทำงานสำเร็จ!");
// ตรวจสอบว่าไฟล์มีอยู่แล้วหรือไม่
bool fileExists = SD.exists(filename);
// เปิดไฟล์สำหรับเขียน
File dataFile = SD.open(filename, FILE_APPEND);
if (!fileFile) {
Serial.println("❌ ไม่สามารถเปิดไฟล์ได้!");
while (1) {
delay(1000);
}
}
// ถ้าเป็นไฟล์ใหม่ ให้เขียน header
if (!fileExists) {
dataFile.println("Timestamp,Temperature(C),Humidity(%)");
Serial.println("✅ สร้างไฟล์ใหม่และเขียน header");
} else {
Serial.println("✅ เปิดไฟล์ที่มีอยู่เดิม");
}
dataFile.close();
Serial.println("\n📋 เริ่มบันทึกข้อมูล:");
Serial.println("────────────────────────────────────");
}
void loop() {
// ตรวจสอบเวลาที่ผ่านไป
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
// บันทึกเวลาปัจจุบัน
previousMillis = currentMillis;
// อ่านค่าจาก DHT22
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// ตรวจสอบว่าอ่านค่าได้หรือไม่
if (isnan(humidity) || isnan(temperature)) {
Serial.println("❌ อ่านค่าจาก DHT22 ไม่ได้!");
return;
}
// สร้าง timestamp
String timestamp = getTimestamp();
// สร้างข้อมูลที่จะบันทึก
String dataLine = timestamp + "," +
String(temperature, 2) + "," +
String(humidity, 2);
// เปิดไฟล์และบันทึกข้อมูล
File dataFile = SD.open(filename, FILE_APPEND);
if (dataFile) {
dataFile.println(dataLine);
dataFile.close();
// แสดงผลใน Serial Monitor
Serial.print("📊 [");
Serial.print(timestamp);
Serial.print("] ");
Serial.print("อุณหภูมิ: ");
Serial.print(temperature, 1);
Serial.print("°C | ความชื้น: ");
Serial.print(humidity, 1);
Serial.println("%");
} else {
Serial.println("❌ ไม่สามารถเปิดไฟล์เพื่อบันทึกข้อมูลได้!");
}
}
}
// ฟังก์ชันสร้าง timestamp
String getTimestamp() {
unsigned long seconds = millis() / 1000;
unsigned long hours = seconds / 3600;
unsigned long minutes = (seconds % 3600) / 60;
unsigned long secs = seconds % 60;
char timestamp[20];
sprintf(timestamp, "%02lu:%02lu:%02lu", hours, minutes, secs);
return String(timestamp);
}✅ เคล็ดลับ: ไฟล์ CSV ที่สร้างขึ้นสามารถเปิดใน Excel, Google Sheets หรือโปรแกรม Spreadsheet อื่นๆ เพื่อวิเคราะห์ข้อมูลได้ทันที
🧪 การทดสอบระบบ
ขั้นตอนการทดสอบ
- อัปโหลดโค้ด: เปิด Arduino IDE, เลือกบอร์ด "ESP32 Dev Module", และอัปโหลดโค้ด
- เปิด Serial Monitor: กด Ctrl+Shift+M หรือกดที่ไอคอน Serial Monitor, ตั้งค่า Baud rate เป็น 115200
- ตรวจสอบข้อความเริ่มต้น: คุณควรเห็น "ESP32 Data Logger เริ่มต้นทำงาน..." ตามด้วย "✅ SD Card เริ่มทำงานสำเร็จ!"
- ดูการบันทึกข้อมูล: ทุกๆ 5 วินาที คุณควรเห็นข้อมูลอุณหภูมิและความชื้นปรากฏใน Serial Monitor
- ตรวจสอบ SD Card: ถอด SD Card และใส่ในคอมพิวเตอร์ เปิดไฟล์
datalog.csv
ตัวอย่าง Output ใน Serial Monitor
ESP32 Data Logger เริ่มต้นทำงาน...
✅ SD Card เริ่มทำงานสำเร็จ!
✅ สร้างไฟล์ใหม่และเขียน header
📋 เริ่มบันทึกข้อมูล:
────────────────────────────────────
📊 [00:00:05] อุณหภูมิ: 28.5°C | ความชื้น: 65.2%
📊 [00:00:10] อุณหภูมิ: 28.6°C | ความชื้น: 65.0%
📊 [00:00:15] อุณหภูมิ: 28.5°C | ความชื้น: 65.1%📈 การวิเคราะห์ข้อมูล
หลังจากที่ระบบทำงานไปสักพัก คุณจะมีไฟล์ CSV ที่มีข้อมูลเยอะมาก นี่คือวิธีการนำไปใช้:
เปิดใน Excel
- เปิด Microsoft Excel
- ไปที่ File → Open → Browse
- เลือกไฟล์
datalog.csvจาก SD Card - Excel จะนำเข้าข้อมูลและจัดรูปแบบให้อัตโนมัติ
เปิดใน Google Sheets
- ไปที่ sheets.google.com
- คลิกที่ไฟล์ที่ว่างเปล่า
- ไปที่ File → Import → Upload
- ลากไฟล์ CSV มาวาง และคลิก "Import data"
สิ่งที่สามารถวิเคราะห์ได้
- สร้างกราฟอุณหภูมิและความชื้นตลอดทั้งวัน
- หาค่าเฉลี่ย, ค่าสูงสุด, ต่ำสุด
- ดูรูปแบบการเปลี่ยนแปลงของสภาพอากาศ
- เปรียบเทียบข้อมูลระหว่างวันต่างๆ
🔧 การแก้ปัญหา
SD Card เริ่มต้นไม่ได้
อาการ: แสดง "❌ ไม่สามารถเริ่ม SD Card ได้!"
วิธีแก้: ตรวจสอบการเชื่อมต่อขา CS, SCK, MOSI, MISO ให้ถูกต้อง ตรวจสอบว่า SD Card ได้รับการจัดรูปแบบเป็น FAT32
อ่านค่า DHT22 ไม่ได้
อาการ: แสดง "❌ อ่านค่าจาก DHT22 ไม่ได้!"
วิธีแก้: ตรวจสอบการเชื่อมต่อสายสัญญาณ, ลองเปลี่ยนตัวต้านทาน 10kΩ, หรือลองใช้ DHT22 ตัวอื่น
ไฟล์ CSV เปิดไม่ได้
อาการ: เปิดไฟล์ใน Excel แล้วข้อมูลไม่ถูกต้อง
วิธีแก้: ใช้ Google Sheets แทน หรือตรวจสอบว่า delimiter เป็น comma (,) ไม่ใช่ semicolon (;)
ข้อมูลไม่ถูกบันทึก
อาการ: Serial Monitor แสดงข้อมูลแต่ไฟล์ CSV ว่างเปล่า
วิธีแก้: ตรวจสอบว่า SD Card มีพื้นที่ว่างเพียงพอ, ลองใช้ SD Card ตัวใหม่
🎉 สรุป
ยินดีด้วย! คุณได้สร้างระบบ Data Logger วัดอุณหภูมิและความชื้นที่ใช้งานได้จริง ระบบนี้สามารถ:
- บันทึกข้อมูลได้อย่างน้อย 30 วันด้วย SD Card 4GB
- ใช้พลังงานต่ำมาก (สามารถใช้แบตเตอรี่ + Solar panel ได้)
- นำข้อมูลไปวิเคราะห์ใน Spreadsheet ได้ทันที
- ขยายไปสู่การเชื่อมต่อ CynoIoT Platform เพื่อ Monitoring ผ่านเว็บ
🚀 ถัดไป: เชื่อมต่อ CynoIoT Platform
ถัดไป คุณสามารถปรับปรุงโปรเจกต์นี้โดย:
- เพิ่ม WiFi และส่งข้อมูลขึ้น CynoIoT Platform
- สร้าง Dashboard แสดงผลแบบ Real-time
- เพิ่มการแจ้งเตือนเมื่ออุณหภูมิสูงเกินไป
- ใช้ Deep Sleep Mode เพื่อประหยัดแบตเตอรี่