Weather Station ออฟไลน์ด้วย XIAO SAMD21 Plus, Lark, OLED และ microSD

GlobalByte / Arduino / Weather Sensor / Data Logging / Offline Project

ทำ Offline Weather Station ด้วย XIAO SAMD21 Plus และ DFRobot Lark

Weather Station หลายแบบดูข้อมูลได้ดีตอนมี Wi-Fi แต่พอ Network หรือ Cloud มีปัญหา Dashboard ก็อาจหายตามไปด้วย

Project ของ Pradeep เลือกแนวทาง Local-first: ใช้ DFRobot Lark วัดสภาพอากาศ แล้วส่งข้อมูลผ่าน I²C ไปยัง XIAO SAMD21 Plus เพื่อแสดงผลบน OLED และบันทึกลง microSD โดยตรง

ระบบอ่านข้อมูลใหม่ทุก 2 วินาที มีกราฟย้อนหลัง 10 Samples, RGB LED, Buzzer, USER Button และสามารถโหลดข้อมูลล่าสุดจากไฟล์ LARK.CSV กลับมาแสดงหลังเปิดเครื่องใหม่

Offline Weather Station ด้วย XIAO SAMD21 Plus และ DFRobot Lark
ภาพจากวิดีโอสาธิต Offline Weather Station ที่ใช้ XIAO SAMD21 Plus, OLED และ microSD Logging
Key Takeaways
  • ทำงานได้โดยไม่ต้องเชื่อม Wi-Fi หรือ Cloud
  • ใช้ DFRobot Lark EDU0157 เป็น Weather Sensor Head
  • ใช้ XIAO SAMD21 Plus เป็น Main Controller
  • ใช้ XIAO Expansion Board สำหรับ OLED, microSD, Button, Buzzer และ RTC
  • เชื่อม Lark ผ่าน Grove I²C Cable เพียงเส้นเดียว
  • อ่าน Sensor ใหม่ทุก 2 วินาที
  • แสดงกราฟ 10 Samples ล่าสุด
  • บันทึกข้อมูลลงไฟล์ LARK.CSV บน microSD
  • โหลด 10 Records ล่าสุดกลับเข้าสู่ Graph Buffer หลัง Restart
  • ตรวจ I²C ก่อนอ่านค่าเพื่อหลีกเลี่ยงการรอ Timeout เมื่อ Lark หลุด

ทำไมต้องเป็น Offline Weather Station?

จุดแข็งของระบบ Offline คือข้อมูลพื้นฐานยังถูกแสดงและบันทึกต่อได้ แม้ไม่มี Router, Internet หรือ Cloud Dashboard

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

Local-first ไม่ได้แปลว่าฟังก์ชันน้อย

Project นี้ยังมี OLED, Graph, CSV Logging, RGB Status, Buzzer และ Persistent History โดยทั้งหมดทำงานอยู่บน Hardware ตรงหน้า

ระบบทำงานอย่างไร?

DFRobot Lark
↓ I²C
XIAO SAMD21 Plus
├── OLED Display
├── Graph Buffer 10 Samples
├── RGB LED
├── USER Button / Buzzer
└── microSD → LARK.CSV

เมื่อครบ Interval 2 วินาที Firmware จะตรวจว่า Lark ยังตอบบน I²C หรือไม่ ถ้าพบ Sensor จึงอ่านข้อมูล Weather ชุดใหม่

ค่าที่อ่านได้จะถูกเพิ่มเข้า History Buffer, เขียนลง microSD และนำไป Refresh หน้าจอ

Hardware ที่ใช้

อุปกรณ์ หน้าที่
DFRobot Lark Weather Station EDU0157 วัด Wind Speed, Wind Direction, Temperature, Humidity และ Pressure
Seeed Studio XIAO SAMD21 Plus Main Controller, OLED Rendering, Logging และ UI Logic
Expansion Board Base for XIAO OLED, microSD, USER Button, Buzzer, RTC และ Grove Ports
Grove / Gravity Cable เชื่อม Lark เข้ากับ Grove I²C Port
microSD Card เก็บ LARK.CSV และข้อมูลย้อนหลังสำหรับกราฟ
USB-C Data Cable Power, Upload และ Serial Monitor
CR1220 Optional สำหรับ RTC บน Expansion Board
3.7V LiPo Optional สำหรับ Portable Power
Tripod Optional สำหรับวาง Lark ในตำแหน่งวัด

รู้จัก DFRobot Lark Weather Station

DFRobot Lark Weather Station พร้อม Tripod
Lark เป็น Weather Sensor Head แบบ All-in-one ที่รวม Anemometer, Wind Vane และ Sensor ภายใน Housing เดียว
Specification ค่า
Working Voltage 3.3–5.5V DC
Working Current 40mA
Sleep Current 2mA
Communication I²C / UART
Wind Speed 0.5–12 m/s
Wind Direction 8 Directions
Temperature -20–60°C ±0.2°C
Humidity 0–99%RH ±2%RH
Pressure 300–1100 hPa
Built-in Storage 16 MB
Main Body Size 160 × 55 mm
Main Body Weight 270 g
ส่วนประกอบของ DFRobot Lark Weather Station
ตำแหน่งส่วนประกอบของ Lark เช่น Anemometer, Wind Vane, Gravity Interface, Type-C Port และ Tripod Mount
ตัว Lark มีการป้องกันสภาพแวดล้อม แต่พอร์ตด้านล่างยังต้องระวังน้ำ

เอกสารทางการระบุว่าบอร์ดภายในมี Protective Coating แต่ Type-C และ Gravity Interface อยู่ด้านล่าง จึงควรป้องกันน้ำฝนเข้าสู่ Connector

XIAO SAMD21 Plus เป็น Controller หลัก

ด้านหน้าของ Seeed Studio XIAO SAMD21 Plus
ด้านหน้าของ XIAO SAMD21 Plus
ด้านหลังของ Seeed Studio XIAO SAMD21 Plus
ด้านหลังและ Additional Pads ของ XIAO SAMD21 Plus

XIAO SAMD21 Plus ใช้ Microchip ATSAMD21G18A Cortex-M0+ พร้อม Flash 256 KB และ SRAM 32 KB

รุ่น Plus เพิ่มสิ่งที่เหมาะกับ Project แบบพกพา เช่น:

  • Li-ion / LiPo Battery Management
  • Reset Button
  • Boot Button
  • Onboard WS2812 RGB LED
  • Additional GPIO ผ่าน Backside Pads
Project ใช้ XIAO SAMD21 Plus ไม่ใช่ Product Card รุ่นเดิม

Hardware Card บน Hackster อาจแสดงชื่อ XIAO SAMD21 แต่เนื้อหา, Firmware และ Board Selection ใช้ Seeed XIAO M0 Plus

XIAO Expansion Board รวม Peripheral สำคัญไว้แล้ว

Expansion Board Base for Seeed Studio XIAO
Expansion Board มี OLED, RTC, microSD, USER Button, Buzzer และ Grove Interfaces อยู่บนบอร์ดเดียว
OLED 128 × 64

ใช้แสดง Home Screen, Sensor Values และ Graph

microSD Slot

ใช้บันทึก LARK.CSV และ Restore History

RTC

มี Hardware อยู่บน Board แม้ Firmware นี้ยังไม่ใช้ RTC ทำ CSV Timestamp

Button + Buzzer

ใช้เปลี่ยน Screen และให้ Audible Feedback

วิธีเสียบ XIAO ลงบน Expansion Board
ต้องเสียบ XIAO ให้ตรงกลาง Header ทั้งสองแถวก่อนต่อสาย USB-C

Wiring และ I²C Bus

ขั้นประกอบหลักมีเพียง:

เสียบ XIAO SAMD21 Plus
ติดตั้งลงบน Expansion Board ให้ Header ตรงตำแหน่ง
ใส่ microSD Card
ใช้เก็บ CSV และ Restore Graph History
ต่อ USB-C Data Cable
ใช้สำหรับ Power, Upload และ Serial Monitor
ต่อ Lark เข้าช่อง Grove I²C
ใช้ Grove / Gravity 4-pin Cable เพียงเส้นเดียว
Device I²C Address
DFRobot Lark 0x42
OLED 0x3C
Expansion Board RTC 0x51
อย่าเสียบ Lark เข้าช่อง Grove UART

Grove Connector บน Expansion Board มีลักษณะใกล้เคียงกัน แต่ Firmware ชุดนี้สื่อสารกับ Lark ผ่าน I²C

Storage สองชั้น: Lark 16 MB และ Project microSD

Lark Internal Storage

ตัว Lark มี Storage 16 MB และสามารถ Export Data ผ่าน Type-C ได้

Expansion Board microSD

Firmware ของ Project เขียน Reading ลง LARK.CSV เพื่อใช้กับ Data Log และ OLED History

DFRobot Lark รองรับการเก็บและ Export ข้อมูล CSV
Lark มี Built-in Storage ของตัวเอง แต่ Project นี้เพิ่ม microSD Logging อีกชั้นบน XIAO Expansion Board
สอง Storage นี้เป็นคนละระบบ

Graph History ใน Firmware ของ Project อ่านจาก LARK.CSV บน microSD ไม่ได้อ่านจาก Internal Storage 16 MB ของ Lark

ติดตั้ง Arduino IDE, Board Package และ Libraries

Board Setting ที่ Project ใช้คือ:

Seeed SAMD → Seeed XIAO M0 Plus

Software และ Library หลัก:

  • Arduino IDE 2.x หรือ arduino-cli
  • Seeed SAMD Boards 1.8.6 หรือใหม่กว่า
  • Adafruit SSD1306
  • Adafruit GFX
  • Adafruit NeoPixel
  • Arduino SD
  • DFRobot_LarkWeatherStation
USB Port อาจเปลี่ยนหลัง Upload หรือ Reset

SAMD21 ใช้ Native USB หาก Arduino IDE หา Board ไม่เจอ ให้ตรวจและเลือก Port ใหม่

Firmware อ่านข้อมูลใหม่ทุก 2 วินาที

ครบ 2 วินาที
↓
Ping Lark Address 0x42
↓
อ่าน Weather Values
↓
เพิ่มเข้า History Buffer
↓
Append ลง LARK.CSV
↓
Refresh OLED
Sampling ทุก 2 วินาที
if (now - lastSample >= 2000) {
  lastSample = now;
  larkLive = takeSample();

  if (!larkLive) {
    Serial.println("Lark: no data, sample skipped");
    drawScreen();
    return;
  }

  pushHist(live);
  logSd(live);
  drawScreen();
}

รับมือ Sensor หลุดโดยไม่รอ Timeout หลายรอบ

ก่อนเรียก getValue() Firmware จะ Ping I²C Address ของ Lark ก่อน

ตรวจว่า Lark ยังตอบหรือไม่
static bool larkPresent() {
  Wire.beginTransmission(LARK_ADDR);
  return Wire.endTransmission() == 0;
}

static bool takeSample() {
  if (!larkPresent()) return false;

  String t = kv("Temp");
  if (t.length() == 0) return false;

  live.temp  = t.toFloat();
  live.humi  = kv("Humi").toFloat();
  live.wind  = kv("Speed").toFloat();
  live.press = kv("Pressure").toFloat();
  live.alt   = kv("Altitude").toFloat();

  return true;
}

ถ้า Lark ไม่ตอบ Firmware จะ Skip Sample และ Home Screen แสดง LOST แทนการอ่าน Sensor ซ้ำทุก Field

ไม่ควรเรียก Firmware ทั้งชุดว่า Non-blocking 100%

Presence Check ช่วยหลีกเลี่ยง Long Timeout จาก Lark Library แต่ Firmware ยังมี Delay และ Operation แบบ Blocking ในส่วนอื่น

บันทึกข้อมูลลง LARK.CSV

แต่ละ Record เก็บ:

  • Temperature
  • Humidity
  • Wind Speed
  • Pressure
  • Altitude
  • Wind Direction
  • millis()
Append Sample ลง microSD
static void logSd(const Sample &s) {
  if (!sdOk) return;

  File f = SD.open("LARK.CSV", FILE_WRITE);
  if (!f) return;

  f.seek(f.size());

  f.print(s.temp, 2);  f.print(',');
  f.print(s.humi, 2);  f.print(',');
  f.print(s.wind, 2);  f.print(',');
  f.print(s.press, 2); f.print(',');
  f.print(s.alt, 2);   f.print(',');
  f.print(s.dir);      f.print(',');
  f.println(millis());

  f.close();
}

Expansion Board มี RTC แต่ CSV ใช้ millis()

Expansion Board มี RTC และรองรับ CR1220 แต่ Firmware ที่อยู่ใน Source ไม่ได้ใช้ RTC ทำ Date/Time Timestamp

Column สุดท้ายใน CSV คือ millis() ซึ่งเริ่มนับใหม่หลัง Reset หรือ Power Cycle

Graph History กลับมาได้ แต่เวลาไม่ได้ต่อเนื่องข้าม Reboot

Firmware โหลด 10 Rows ล่าสุดจาก LARK.CSV กลับเข้ากราฟได้ แต่ Sample ใหม่หลัง Restart จะเริ่มค่า millis() จากศูนย์อีกครั้ง

OLED, Graph, RGB LED และ Buzzer

OLED บน XIAO Expansion Board
OLED 128 × 64 บน Expansion Board ใช้แสดงค่าปัจจุบันและกราฟย้อนหลัง

USER Button ใช้ Cycle ผ่าน Screen:

  • Home
  • Temperature
  • Humidity
  • Wind
  • Pressure
  • Altitude
  • LED Off

แต่ละ Sensor Screen มีกราฟย้อนหลัง 10 Samples และปรับ Scale ตาม Minimum / Maximum ของข้อมูลที่มี

Screen RGB Color ใน Firmware
Home Green
Temperature Red
Humidity Blue
Wind White / Grey
Pressure Purple
Altitude Yellow

ดูวิดีโอทั้งหมดของ Project

Source ที่ตรวจพบมีวิดีโอหลักหนึ่งรายการ แสดงการประกอบ, OLED UI และ SD Card Logging ของระบบจริง

ไฟล์ดาวน์โหลด, Libraries และเอกสารทั้งหมด

Firmware ฉบับเต็มถูกแสดงอยู่ใน Hackster Tutorial แต่ยังไม่พบ Direct Public Attachment ของไฟล์ XIAO_SAMD21_LarkWeather.ino ที่ยืนยันได้ จึงใช้ลิงก์ไปยังบทความต้นฉบับแทนการสร้าง Download URL ขึ้นเอง

Hackster Project

บทความต้นฉบับ พร้อม Firmware, Wiring และ Build Steps

เปิด Tutorial ฉบับเต็ม

Full Build Video

วิดีโอสาธิต OLED, Graph และ SD Logging

ดูวิดีโอต้นฉบับ

DFRobot Lark Arduino Library

Official Repository สำหรับ getValue(), getUnit() และ Lark Communication

เปิด Official GitHub Library

DFRobot Library ZIP

ดาวน์โหลด Library เพื่อนำเข้า Arduino IDE แบบ Add .ZIP Library

ดาวน์โหลด Library ZIP

DFRobot Lark Documentation

Specification, Communication และวิธีใช้งาน EDU0157

อ่าน Official Documentation

DFRobot Lark Product Page

ข้อมูล Product, Shipping List, Documents และ Certification

เปิด Product Page

Arduino IDE

Development Environment ที่ใช้ Compile และ Upload Firmware

ดาวน์โหลด Arduino IDE

Seeed Board Manager JSON

Additional Boards Manager URL สำหรับ Seeed SAMD Boards

เปิด Board Package Index

XIAO SAMD21 Plus Documentation

Official Pinout, Battery, RGB LED และ Board Setup

อ่าน XIAO SAMD21 Plus Guide

XIAO SAMD21 Plus Schematic

Official Schematic PDF ของ Board

เปิด Schematic PDF

XIAO SAMD21 Plus KiCad Files

Official Schematic และ PCB Project Package

ดาวน์โหลด KiCad Project

XIAO SAMD21 Plus Pinout Sheet

Official Pinout Sheet ในรูปแบบ Spreadsheet

ดาวน์โหลด Pinout Sheet

XIAO 3D Model

Official Mechanical 3D Model Package

ดาวน์โหลด 3D Model

XIAO Expansion Board Documentation

OLED, RTC, microSD, USER Button, Buzzer และ Grove Interface

อ่าน Expansion Board Guide

Adafruit SSD1306 Library

Library สำหรับ OLED Display

เปิด SSD1306 Library

Adafruit GFX Library

Graphics Primitive สำหรับวาด Text และ Graph

เปิด Adafruit GFX

Adafruit NeoPixel Library

Library สำหรับ Onboard WS2812 RGB LED

เปิด NeoPixel Library

FAQ — Offline Weather Station ด้วย XIAO และ Lark

1. Project นี้ต้องใช้ Wi-Fi หรือไม่?

ไม่ OLED, Sensor Reading และ microSD Logging ทำงานแบบ Offline

2. ใช้ XIAO รุ่นไหน?

เนื้อหาและ Firmware ใช้ XIAO SAMD21 Plus โดยเลือก Board เป็น Seeed XIAO M0 Plus

3. Lark วัดอะไรได้บ้าง?

วัด Wind Speed, Wind Direction, Temperature, Humidity และ Barometric Pressure

4. Sampling ทุกกี่วินาที?

ทุก 2 วินาทีตาม Firmware ของ Project

5. Lark ต่อกับ XIAO อย่างไร?

ต่อผ่าน Grove I²C Port ด้วย Gravity / Grove 4-pin Cable

6. Lark ใช้ I²C Address อะไร?

0x42

7. OLED ใช้ Address อะไร?

0x3C

8. RTC ใช้ Address อะไร?

0x51 ตาม Expansion Board

9. ข้อมูลถูกเก็บไว้ที่ไหน?

Firmware ของ Project เขียนข้อมูลลง LARK.CSV บน microSD

10. Lark มี Storage ภายในหรือไม่?

มี 16 MB แต่แยกจาก microSD Logging ที่ Project นี้สร้างขึ้น

11. CSV มี Date และ Time จริงหรือไม่?

ไม่มีใน Firmware เวอร์ชันนี้ โดย Field สุดท้ายใช้ millis()

12. RTC บน Expansion Board ถูกใช้หรือไม่?

Hardware มี RTC แต่ Firmware ที่แสดงไม่ได้ใช้ RTC ทำ Timestamp ใน LARK.CSV

13. หลัง Restart กราฟยังอยู่หรือไม่?

Firmware โหลด 10 Rows ล่าสุดจาก LARK.CSV กลับเข้า Graph Buffer

14. Graph แสดงกี่ Sample?

10 Samples ล่าสุด

15. ถ้า Lark หลุด ระบบทำอย่างไร?

Firmware ตรวจ I²C ก่อนอ่านค่า ถ้าไม่พบจะ Skip Sample และ Home Screen แสดง LOST

16. ใช้ LiPo ได้หรือไม่?

Source ระบุว่าใช้เป็น Optional Portable Power ได้ แต่ไม่ได้ระบุ Capacity หรือ Runtime

17. วางทั้งชุดกลางฝนได้หรือไม่?

Source ไม่ได้ระบุ IP Rating ของ XIAO, OLED, Expansion Board และ microSD Assembly ทั้งชุด

18. มี Firmware .ino ให้ดาวน์โหลดโดยตรงหรือไม่?

Source แสดง Firmware เต็มใน Hackster Tutorial แต่ยังไม่พบ Public Direct Attachment ที่ยืนยันได้

สรุป: Weather Station ที่ยังเก็บข้อมูลต่อได้โดยไม่พึ่ง Cloud

จุดเด่นของ Project นี้ คือการวาง Architecture ให้เรียบง่าย: Lark รับผิดชอบ Weather Sensing ส่วน XIAO SAMD21 Plus จัดการ Display, Interaction และ Local Storage

microSD ไม่ได้ทำหน้าที่เป็น Archive อย่างเดียว เพราะ Firmware ยังอ่าน 10 Rows ล่าสุด กลับมาใช้สร้าง Graph หลัง Restart

การตรวจ I²C ก่อนเรียก Sensor Library ยังเป็นตัวอย่างที่ดีของการออกแบบ Embedded UI ให้รับมือกับ Hardware ที่อาจถูกถอดหรือหลุด โดยไม่ทำให้ผู้ใช้ต้องรอ Timeout ซ้ำหลายรอบ

สำหรับ Maker ที่กำลังเริ่มทำ Weather Monitoring, Sensor Display หรือ Data Logger นี่เป็น Project ที่แสดงให้เห็นว่า ระบบ Offline ก็สามารถมีทั้ง UI, History และ Fault Handling ได้ครบในอุปกรณ์ขนาดเล็ก

References / แหล่งข้อมูลต้นฉบับ

กำลังทำ Weather Monitoring หรือ Data Logging Project?

Project แบบนี้ต้องเลือกทั้ง Development Board, Sensor, Display, Storage และ Interface ให้ทำงานร่วมกัน โดยเฉพาะเมื่อต้องการให้ระบบทำงานต่อได้ แม้ไม่มี Wi-Fi

สามารถสอบถามทีม GlobalByte เรื่อง Development Board, Weather Sensor, OLED, microSD หรือ Maker Accessories ที่เหมาะกับ Requirement ของ Project ได้

Disclaimer / ข้อควรทราบ

บทความนี้เป็นการสรุปและเรียบเรียงจากแหล่งข้อมูลภาษาอังกฤษ อาจมีความคลาดเคลื่อน กรุณาตรวจสอบ Source ต้นฉบับและเอกสารทางการก่อนลงมือทำ

Hackster Hardware Card บางส่วนแสดง XIAO SAMD21 รุ่นเดิม แต่เนื้อหา, Firmware และ Board Setting ใช้ XIAO SAMD21 Plus บทความนี้จึงยึดข้อมูลจาก Build และ Firmware เป็นหลัก

Expansion Board มี RTC แต่ Firmware เวอร์ชันที่ Source แสดง บันทึก millis() ลงใน CSV แทน Date / Time จาก RTC

การ Restore History หลัง Restart หมายถึง Sensor Values 10 Records ล่าสุด ถูกโหลดกลับเข้าสู่ Graph Buffer แต่ค่า millis() ของ Sample ใหม่จะเริ่มนับจากศูนย์อีกครั้ง

Lark มี Built-in Storage 16 MB แต่ระบบ microSD Logging ใน Project เป็น Storage Layer อีกชุดหนึ่ง และไม่ได้หมายความว่า LARK.CSV ถูกเขียนลง Internal Storage ของ Lark

Source เรียกค่า Altitude ผ่าน Lark Interface แต่ไม่ได้ระบุ Dedicated Altitude Sensor แยกต่างหาก

แม้ Lark มีโครงสร้างและ Protective Coating สำหรับงานภาคสนาม แต่ Source ไม่ได้ระบุ IP Rating ของ XIAO SAMD21 Plus, Expansion Board, OLED และ microSD Assembly ทั้งชุด

Source ไม่ได้ระบุ Battery Capacity, Battery Runtime, Total Power Consumption, Maximum microSD Capacity, Calibration Interval, Long-term Drift หรือ Maximum Cable Length ของ Build นี้

Firmware ขนาดประมาณ 66 KB เป็นผล Compile ที่ผู้สร้างรายงาน ขนาดจริงอาจเปลี่ยนตาม Library, Board Package และ Compiler Version

ภาพบางส่วนในบทความมาจากวิดีโอ Project และเอกสารทางการของ DFRobot/Seeed เนื่องจาก Source Text ที่เข้าถึงได้ ไม่ได้เปิดเผย Direct URL ของ Hackster Attachments ทุกภาพ จึงไม่มีการสร้าง Attachment URL จากการคาดเดา

 

แท็ก


Blog posts