กลับไปหน้ารวมไฟล์
mkr-fox-1200-weather-monitor-7b94a7.md

ชื่อโปรเจกต์: MKR FOX 1200 Weather Monitor (สถานีตรวจอากาศแบบหล่อเท่)

เฮ้ยน้อง! เนื้อหานี้อาจจะเก่าไปหน่อย ถ้าอยากได้แบบอัปเดตล่าสุดให้กดไปดูที่นี่เลย (แต่ตัวนี้ก็ยังใช้ได้อยู่นะ)

โปรเจกต์นี้พี่จะสอนพวกแกเปลี่ยน Board MKR FOX 1200 กับ [Sensor](https://s.shopee.co.th/7VBG2rX65j) แบบ I2C ให้กลายเป็นสถานีตรวจอากาศแบบใช้แบตเตอรี่แบบง่ายๆ

เราจะใช้อุปกรณ์ตามนี้:

  • Temperature Sensor บน Board (อันนี้ความแม่นยำต่ำนะ ประมาณ ± 1 °C เอาไว้ดูขำๆ)
  • Sensor HTU21D (I2C) เอาไว้ดูความชื้น (Humidity)
  • Bosch BMP280 เอาไว้ดูความกดอากาศ (Barometric Pressure) กับอุณหภูมิแบบเป๊ะๆ
  • Sensor แสง TSL2561 เอาไว้เช็คความสว่าง (Luminosity)

Hardware Setup (การต่อวงจร)

การต่อ Hardware ไม่ยากเลยว่ะวัยรุ่น ทุกตัวใช้ I2C และทำงานที่ไฟ 3.3V เหมือนกันหมด

ใช้สายแค่ 4 เส้นจาก MKR FOX 1200: GND, 3.3V, SDA ต่อที่ Pin 11 และ SCL ต่อที่ Pin 12 ต่อขนานกันไปเลย 3 Sensor เพราะแต่ละตัวมี I2C Address เฉพาะตัวอยู่แล้ว เดี๋ยว Library กับ Code มันจัดการแยกแยะให้เอง ไม่ต้องห่วง ห้ามต่อช็อตนะตัวนี้!

ทั้งโปรเจกต์นี้ใช้แบตเตอรี่ AA หรือ AAA แค่สองก้อนต่ออนุกรมกัน (ได้ไฟ 3V) แล้วเสียบเข้า Terminal Block บน Board ได้เลย ประหยัดไฟสุดๆ

Sigfox Messages (การส่งข้อมูล)

เนื่องจากเครือข่าย Sigfox ส่งได้สูงสุดแค่ 140 ข้อความต่อวัน เราเลยต้องส่งแบบประหยัดหน่อย โดยใช้ฟอร์แมต Binary แบบอัดแน่น

การ Pack ข้อมูลสำคัญมากนะน้อง เพราะส่งได้สูงสุดแค่ 12 Bytes ต่อข้อความ ถ้าใช้ Float ปกติมันกินไปตัวละ 4 Bytes แล้ว เดี๋ยวที่เต็ม! เราเลยต้องบีบอัดข้อมูลให้เล็กลง

ค่า Float มันกว้างเกินความจำเป็น (ระดับ 3.4e+38 เลยนะ) เราไม่ได้ใช้เยอะขนาดนั้น เราแค่กำหนดขีดจำกัดความปลอดภัย (ขึ้นอยู่กับว่าเราจะเอาสถานีไปตั้งที่ไหน) แล้วค่อยไปถอดรหัสคืนค่าเดิมที่ฝั่ง Backend เอา

Configuration of the Cloud Services (ตั้งค่า Cloud)

เราจะใช้ Cloud 2 ตัวคู่กัน:

  • Sigfox backend
  • Thingspeak

ไปลงทะเบียน Board ใน Sigfox backend ซะ ใช้ PAC กับ ID จากตัวอย่าง FirstConfiguration (ถ้าเคยทำแล้วในโปรเจกต์ก่อนก็ข้ามไปได้เลย)

เราต้องตั้งค่าให้มันคุยกันให้รู้เรื่องทั้งสองฝั่งนะ ไปสมัครแล้วสร้าง Channels ใน Thingspeak ไว้ด้วย ดูตามรูปด้านล่างเลย

Channel แรกที่เราสร้างเอาไว้รับ Raw Data (readChannelID) ส่วนอันที่สองเอาไว้เก็บข้อมูลที่แปลงค่ากลับมาแล้ว (writeChannelID)

ได้เวลา Upload Sketch ผ่าน [Arduino](https://s.shopee.co.th/7fUgFAWSki) Create Editor แล้ว Code นี้จะช่วยให้เราทดสอบระบบได้จนหนำใจก่อนเอาไปวางใช้งานจริง

อย่าลืมแก้บรรทัดนี้:

oneshot  = false

ตอนที่แกมั่นใจว่าระบบหลังบ้านตั้งค่าเป๊ะแล้วนะ ตัว Sketch มันรอ Serial Port อยู่ ดังนั้นอย่าเพิ่งรีบร้อน ให้ไปเปิด SigFox backend แล้วไปตั้งค่า Callback ก่อน:

คลิกที่ DEVICE TYPE -> LIST -> คลิกขวาที่ Board ของเราแล้วกด Edit.

คลิกที่ CALLBACKS ตรงเมนูฝั่งซ้าย:

มันจะขึ้นหน้าต่างแบบนี้มา:

กดปุ่ม New ตรงมุมขวาบนเลย:

เลือก Custom callback:

ตั้งค่าตามนี้ให้เป๊ะนะน้อง:

  • TYPE: DATA/UPLINK
  • Channel: URL
  • Http method: GET

ตรง Custom Payload ให้ใส่ตามนี้ (นี่คือโครงสร้างข้อมูลที่เรา Pack ไว้ใน Code):

status::uint:8 temp1::int:16:little-endian temp2::int:16:little-endian press::uint:16:little-endian hum::uint:16:little-endian light::uint:16:little-endian lastMsg::uint:8 

ส่วน URL Pattern ก็จัดไปตามนี้:

https://api.thingspeak.com/update?api_key=XXXXXXXXXXXX&field1={customData#temp1}&field2={customData#press}&field3={customData#temp2}&field4={customData#hum}&field5={customData#light}&field6={customData#status}&field7={customData#lastMsg} 

พอตั้งค่าเสร็จแล้ว หน้าตาควรจะเป็นประมาณนี้:

Callback ในหน้า SigFox backend (อย่าลืมใส่ API Key ของตัวเองนะเว้ย!)

ย้ำอีกรอบ! อย่าลืมเปลี่ยน api_key เป็นตัวที่ได้จาก Thingspeak ตรงส่วน Write API Key สำหรับ Channel1 นะจ๊ะ

กด Save แล้วปิดได้เลย ทีนี้ก็เปิด Serial Port รอดูข้อความแรกที่ถูกส่งไปได้เลย... จัดไปวัยรุ่น!

From Raw to Graphics (จากเลขดิบๆ สู่กราฟหล่อเท่)

ค่าที่เราตั้งไว้จะส่งข้อมูลไป Thingspeak แต่แม่มยังเป็นเลขดิบๆ (Raw Data) อยู่ เราต้องใช้เครื่องมือ Analysis ของ Thingspeak กับ Code Snippet นี้เพื่อแปลงค่ากลับมา

% TODO - ใส่ Channel ID ของแกเพื่ออ่านข้อมูล: 
readChannelID = [];
% TODO - ใส่ Read API Key ในเครื่องหมาย ' ' :
readAPIKey = 'T6UK7XO6A4H2AGT7';
% TODO - ใส่ Channel ID สำหรับเขียนข้อมูล:
writeChannelID = [];
% TODO - ใส่ Write API Key ในเครื่องหมาย ' ' :
writeAPIKey = 'XU4TGY261P6B5USN';
%% Read Data %%
data = thingSpeakRead(readChannelID, 'ReadKey', readAPIKey,'OutputFormat','table');
analyzedData = data;
%% Analyze Data %%
INT16_t_MAX = 32767;
UINT16_t_MAX = 65536;
analyzedData.('Temperature1') = data.('Temperature1') / INT16_t_MAX * 120 ;
analyzedData.('Temperature2') = data.('Temperature2') / INT16_t_MAX * 120 ;
analyzedData.('Pressure') = data.('Pressure') / UINT16_t_MAX * 200000 ;
analyzedData.('Light') = data.('Light') / UINT16_t_MAX * 100000 ;
analyzedData.('Humidity') = data.('Humidity') / UINT16_t_MAX * 110 ;
%% Write Data %%
thingSpeakWrite(writeChannelID, analyzedData, 'WriteKey', writeAPIKey);
%% Schedule action: React -> every 10 minutes

แค่เอา Channel IDs ของตัวเองไปใส่แทนที่ เราก็จะได้ค่าจริงกลับมาแล้ว และอย่าลืมตั้งค่าให้มันวิเคราะห์ข้อมูลทุกๆ 10 นาทีด้วย React ด้วยนะ ไม่งั้นมันไม่ทำงานนะน้อง!

ในที่สุดเราก็ได้กราฟสวยๆ มาดูแล้ว!

มีใครแอบเปิดฮีตเตอร์ตอน 11 โมงครึ่งป่าววะเนี่ย? :)

รายละเอียดทางเทคนิคเพิ่มเติม (อ่านด้วยนะวัยรุ่น)

การส่งข้อมูลระยะไกลด้วย Sigfox

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

  • การทำงานของ Sigfox LPWAN: เจ้า Arduino MKR FOX 1200 จะใช้โมดูลวิทยุ Sigfox ในตัวส่งข้อมูลขนาดเล็ก (Uplink) ที่มีค่าอุณหภูมิและความดันอากาศตรงขึ้น Cloud ได้เลย
  • ศูนย์บัญชาการ ThingSpeak: ตัว Backend ของ Sigfox จะโยนข้อมูลมาที่ ThingSpeak ผ่าน REST API ซึ่งจะช่วยเก็บประวัติข้อมูล ทำกราฟ และวิเคราะห์สภาพอากาศย้อนหลังให้เราดูได้จากที่ไหนก็ได้ในโลก

ความอึดระดับพระกาฬ

  • Logic แบตเตอรี่อยู่ยาว 365 วัน: ตัว Arduino จะถูกสั่งให้อยู่ในโหมด Deep Sleep เกือบตลอดเวลา ซึ่งกินไฟน้อยกว่า 10µA (โคตรน้อย!) มันจะตื่นขึ้นมาแค่ชั่วโมงละครั้งเพื่ออ่านค่าจาก Sensor และส่งข้อความ Sigfox แล้วกลับไปนอนต่อ งานนี้ใช้ยาวๆ ไปเลยน้อง!

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

title: "MKR FOX 1200 Weather Monitor"
description: "Turn your MKR FOX 1200 into a battery-powered weather monitor that you can deploy EVERYWHERE."
author: "Arduino_Genuino"
category: "Internet of Things, BT & Wireless"
tags:
  - "weather"
  - "radio"
views: 38535
likes: 17
price: 2990
difficulty: "Intermediate"
components:
  - "1x TSL2561 digital luminosity light sensor"
  - "1x Arduino MKR Fox 1200"
  - "1x HTU 1D"
  - "1x SparkFun Atmospheric Sensor Breakout - BME280"
tools: []
apps:
  - "1x Sigfox"
  - "1x ThingSpeak API"
  - "1x Arduino Web Editor"
downloadableFiles:
  - "https://create.arduino.cc/editor/Arduino_Genuino/f025cb10-c6a7-41d5-911a-0ecad82bbcbb"
documentationLinks: []
passwordHash: "d12b6787401e10722e5d2c0dcbe7ad7a5f742fe914bd9ae7bf54dbf6cd7b3c81"
encryptedPayload: "U2FsdGVkX1/Ru6jlebP6+0Mc2VPOaE7joSBsR5nWut/99YagB/OGkJa5FqF8ue2tUN7R51jaaFwuabALbm4itj1VD36JY+uOVEqlSDeDJWCr2xFHwzv7CCD0On71Cp7FoPVnWLwqr/KOZxuNuHWNRg=="
seoDescription: "Build a battery-powered weather monitor using MKR FOX 1200 for remote deployment anywhere."
videoLinks: []
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/mkr-fox-1200-weather-monitor-7b94a7_cover.jpg"
lang: "th"