กลับไปหน้ารวมไฟล์
private-real-time-weather-station-885fd6.md

ชื่อโปรเจกต์: สถานีตรวจอากาศ Real-time ส่วนตัว (ฉบับจัดเต็ม)

ยกเครื่องการเช็กอากาศในบ้าน: สูตรสำเร็จ NodeMCU + Firebase

ปกติสถานีวัดอากาศทั่วไปเขาก็โชว์ค่าแค่บนจอเล็กๆ หน้าเครื่องใช่ป่ะ? แต่โปรเจกต์ Private Real-time Weather Station นี้พี่จะพาน้องทำแบบล้ำๆ คือซิงค์ข้อมูลจากบ้านเราขึ้น Cloud ไปเลย โดยใช้เจ้า NodeMCU (ESP8266) ตัวเก่ง เก็บค่าความสว่าง, อุณหภูมิ และความชื้น แล้วยัดข้อมูลเข้า Database ของ Google Firebase คราวนี้จะดูผ่านมือถือหรือคอมพิวเตอร์จากมุมไหนของโลกก็ทำได้แบบไม่มีหน่วง (Zero Latency) หล่อเท่เลยงานนี้!

ตัวเชื่อมการสื่อสาร: NodeMCU ไปยัง Firebase

ทำไมต้อง NodeMCU? ก็เพราะมันมี WiFi ในตัวไงน้อง เหมาะกับงาน IoT สุดๆ:

  • FirebaseArduino.h Library: โปรเจกต์นี้เราใช้ Library สำเร็จรูปที่ช่วยให้ ESP8266 คุยกับ Firebase REST API ได้ง่ายขึ้น ไม่ต้องมานั่งเขียนคำสั่ง JSON เองให้ปวดกบาล แค่สั่ง Firebase.setFloat("temp", value); สั้นๆ ก็จบงาน
  • Instant Synchronization: ตัว "Real-time Database" ของ Firebase มันทำงานผ่าน WebSockets อยู่เบื้องหลัง พอ NodeMCU อัปเดตค่าปุ๊บ หน้าเว็บที่เราเปิดไว้ก็จะเปลี่ยนตามทันทีแบบไม่ต้องกด Refresh ให้เสียเวลา
  • Hosting ฟรีไม่มีจ่าย: ใช้ "Spark" plan ของ Firebase สิวัยรุ่น สาย Hobby อย่างเราใช้ฟรีสบายๆ Bandwidth เหลือเฟือสำหรับคนเข้ามาดูพร้อมกันได้ถึง 100 คน

มัดรวม Sensor แบบสั่งทำเอง

สถานีนี้ใช้ Sensor 2 ตัวหลักๆ มาฟีเจอริ่งกันเพื่อดูสภาพแวดล้อมในบ้าน:

  1. DHT11 Digital Sensor: ตัวนี้เอาไว้วัดความชื้น (20-90%) และอุณหภูมิ (0-50°C) ถึงจะเป็น Sensor พื้นฐาน แต่โปรเจกต์นี้จะสอนให้น้องใช้ Library DHT.h เพื่อคุมเรื่องจังหวะเวลา (Timing) ในการสื่อสารแบบ Single-wire ให้เป๊ะ
  2. LDR Light Sensor: ตัวต้านทานไวแสงแบบ Analog เอาไว้วัดความสว่างในห้อง เราจะใช้ Resistor 10k ohm มาทำวงจรแบ่งแรงดัน (Voltage Divider) เพื่อให้ขา A0 ของ NodeMCU อ่านค่าแสงออกมาเป็นเปอร์เซ็นต์ จะได้รู้ว่าตอนนี้ในบ้านสว่างหรือมืดแล้ว

สร้างหน้า Web Dashboard แบบโมเดิร์น

ส่วนสำคัญของงานนี้คือการทำ Front-End Development พี่มีแนวทางให้สร้าง Dashboard ของตัวเองด้วย HTML, CSS (Bootstrap), และ JavaScript:

  • Firebase SDK Integration: ในหน้าเว็บจะมีการใส่ Code JavaScript สั้นๆ (app.js) เพื่อให้เว็บมันไปดึงข้อมูลจาก Database มาโชว์
  • Live Data Injection: เราใช้คำสั่ง dbReflight.on('value', ...) เพื่อให้หน้าเว็บคอยดักฟังค่าที่เปลี่ยนไป แล้วยัดค่าอุณหภูมิหรือความชื้นใหม่ๆ ลงไปใน HTML โดยไม่ต้องโหลดหน้าใหม่ ได้ฟีลแบบข้อมูล Streaming สดๆ เลยน้อง
  • เข้าถึงได้ทุกอุปกรณ์: เพราะมันเป็น Web-based Dashboard ไงล่ะ พอได้ URL ส่วนตัวมาแล้ว น้องจะเช็กอากาศจาก Browser ตัวไหนในโลกก็ได้ จัดไปวัยรุ่น!

ในโปรเจกต์นี้เราจะสร้างสถานีตรวจอากาศส่วนตัวสำหรับใช้ในบ้านกัน เราจะใช้บอร์ดตระกูล ESP8266 นั่นก็คือ NodeMCU เพื่อดูค่าแสง, อุณหภูมิ และความชื้น โดยอุปกรณ์หลักคือ [LDR](https://s.shopee.co.th/1BHCUqb0Tt) และ [Sensor](https://s.shopee.co.th/7VBG2rX65j) DHT11

โปรเจกต์นี้แบ่งเป็น 3 ส่วนหลักๆ:

1. การเก็บค่าจาก Sensor ต่างๆ

2. การส่งข้อมูลขึ้น Database ออนไลน์ (ในที่นี้คือ Google Firebase)

3. การโชว์ข้อมูลจาก Database บน Web App ของเรา

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1. การเก็บข้อมูล

เราจะใช้ LDR เพื่อวัดค่าความสว่างของแสงในอากาศ ต่อ LDR เข้ากับขา A0 ของ NodeMCU ตามวงจรด้านล่างเลยน้อง

ต่อสายให้ถูกนะตัวนี้ ระวังช็อตล่ะ เช็กขา A0 ให้ดี

ส่วน Sensor DHT11 เราเอาไว้ใช้วัดความชื้นกับอุณหภูมิ เราจะใช้ Library DHT.h นะ ให้ต่อสายตามนี้:

Vcc ==> 3v

Gnd ==> Gnd

Data ==> D3

(Resistor 10k ohm จะใส่หรือไม่ใส่ก็ได้นะ แล้วแต่ศรัทธา)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

2. การส่งข้อมูลไป Firebase

ก่อนจะอัปข้อมูลขึ้น Firebase ได้เนี่ย น้องต้องต่อเน็ตให้บอร์ดก่อนนะ แล้วค่อยเข้าไปคุยกับ Firebase โดยเราต้องใช้ Library 2 ตัวนี้:

1. ESP8266WiFi.h

2. FirebaseArduino.h

พอเชื่อมต่อ WiFi ตาม Code เสร็จแล้ว เราก็ใช้ฟังก์ชันของ FirebaseArduino.h อัปโหลดข้อมูลได้เลย

ค่าจาก Sensor จะถูกเก็บไว้ในตัวแปร light, temp และ hum ซึ่งเป็นชนิด float (เลขทศนิยม)

เราจะใช้ฟังก์ชัน setFloat() เพื่อดันค่าขึ้นไปบน Real-time Database ของ Firebase ลองดู Code ประกอบจะเข้าใจง่ายขึ้นเยอะ

Firebase.setFloat("light", light);
// เช็ก Error หน่อย
if (Firebase.failed()) {
Serial.print("setting /light failed:");
Serial.println(Firebase.error());
return;
}

พอข้อมูลขึ้น Cloud แล้ว คราวนี้จะเอาไปโชว์บน Web App แบบ Real-time ที่ไหนก็ได้ในโลกแล้วน้องเอ๊ย!

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

3. การโชว์ข้อมูลบน Web App

ส่วนนี้แหละที่น้องจะได้ปล่อยของ ปล่อยความคิดสร้างสรรค์ ถ้าใครพอรู้เรื่อง HTML หรือ CSS ก็จัดหน้าจอ (UI) สวยๆ ได้เลย พี่ใช้ Bootstrap ทำนะ ส่วนใครที่เป็นมือใหม่เว็บ พี่มี Code พื้นฐานให้ดู (แต่พี่ไม่ให้ Code ทั้งหมดหรอกนะ เดี๋ยวจะกลายเป็นการป้อนข้าวป้อนน้ำ พี่อยากให้เราลองงมทำ UI เอง มันสนุกกว่าเยอะ เชื่อพี่!)

ขั้นตอนที่ 1:

ก๊อป Code นี้ไปแปะใน Notepad แล้วเซฟชื่อ index.html ไว้ใน Folder ที่เราต้องการ (เช่น folder ชื่อ web)

<html>
<head>
<script src="https://www.gstatic.com/firebasejs/5.8.4/firebase.js"></script>
<script src="https://www.gstatic.com/firebasejs/5.8.5/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/5.8.5/firebase-database.js"></script>
</head>
<body style="background-color: #4d4d4d;">
<ul>
<li><h1>LIGHT</h1>
<pre id="light" style="font-size:24px;"></pre></li>
<li><h1>TEMPERATURE</h1>
<pre id="temp" style="font-size:24px;"></pre></li>
<li><h1>HUMIDITY</h1>
<pre id="hum" style="font-size:24px;"></pre></li>
</ul>
<script src="app.js"></script>
</body>
</html>

ขั้นตอนที่ 2:

สร้าง Database ใน Firebase ซะ ล็อกอินด้วย Gmail นั่นแหละ แล้วสร้าง Real-time Database จากนั้นดูตามรูปเพื่อไปเอา Secret Key ของเรามา

ขั้นตอนที่ 3:

ก๊อป Code ข้างล่างนี้ไปเซฟเป็นไฟล์ชื่อ app.js ไว้ใน Folder เดียวกับ index.html นะจ๊ะ

(function() {
// Initialize Firebase
var config = {
firebase.initializeApp(config);
//Get element
const prelight= document.getElementById('light');
//Create refences
const dbReflight= firebase.database().ref().child('light');
// sync logs cahnges
dbReflight.on('value', snap => {
prelight.innerText=JSON.stringify(snap.val(),null,3);
});
const pretemp= document.getElementById('temp');
//Create refences
const dbReftemp= firebase.database().ref().child('temperature');
// sync logs cahnges
dbReftemp.on('value', snap => {
pretemp.innerText=JSON.stringify(snap.val(),null,3)+"° C";
});
const prehum= document.getElementById('hum');
//Create refences
const dbRefhum= firebase.database().ref().child('moisture');
// sync logs cahnges
dbRefhum.on('value', snap => {
prehum.innerText=JSON.stringify(snap.val(),null,3)+" %";
});
}());

อย่าลืมแก้ค่าใน var config ให้ตรงกับข้อมูล Database ของน้องเองด้วยนะ

เสร็จแล้วก็พร้อมลุย!

อัปโหลด Code ลง NodeMCU, ต่อวงจรให้ครบ แล้วจ่ายไฟซะ บอร์ดจะเริ่มส่งข้อมูลขึ้น Firebase ทันที

--------------------------------------------------------------------------------------

หมายเหตุ: สำคัญมาก! อย่าลืมแก้ WiFi SSID, รหัสผ่าน WiFi, Secret Code และ Host Name ในไฟล์ .ino ของน้องด้วยนะ ไม่งั้นเชื่อมต่อไม่ได้ พี่ไม่รู้ด้วยนะ!

#define FIREBASE_HOST "ลิงก์ DATABASE ของน้อง"
#define FIREBASE_AUTH "SECRET CODE ของน้อง"
#define WIFI_SSID "ชื่อไวไฟ"
#define WIFI_PASSWORD "รหัสไวไฟ"

--------------------------------------------------------------------------------------

พอเสร็จหมดแล้ว ก็แค่เปิดไฟล์ index.html ขึ้นมาดูข้อมูลแบบ Real-time ได้เลย

หวังว่าน้องๆ จะเข้าใจโปรเจกต์นี้กันนะ ขอบใจมากที่เข้ามาอ่านกัน ใครมีข้อสงสัยหรือตรงไหนทำไม่ได้ ก็ทิ้งคอมเมนต์ไว้ข้างล่างได้เลย เดี๋ยวพี่มาตอบ

สู้งานนะน้อง! โชคดี!

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

title: "Private Real-time Weather Station"
description: "This project is used to monitor the weather conditions of your home in real-time on a web application."
author: "JANAK13"
category: ""
tags:
  - "weather"
  - "iot"
  - "nodemcu"
  - "firebase"
  - "web app"
  - "dashboard"
  - "real-time"
views: 5897
likes: 8
price: 699
difficulty: "Intermediate"
components:
  - "1x DHT11 Temperature & Humidity Sensor"
  - "1x NodeMCU ESP8266"
  - "1x LDR (Light Dependent Resistor)"
  - "1x Resistor 10k ohm"
  - "1x Jumper wires (generic)"
  - "1x Breadboard (generic)"
tools: []
apps:
  - "1x Atom (Text Editor)"
  - "1x Arduino IDE"
  - "1x Firebase"
downloadableFiles:
  - "https://projects.arduinocontent.cc/3c2f44b2-0aaa-4655-9015-e82f4388ebb7.ino"
documentationLinks: []
passwordHash: "2eb5a139b1528eae5736466537fb80d3b45ca0c1ef08bd27579334e22633c151"
encryptedPayload: "U2FsdGVkX1+6F6edfE7lpLFUMGP/sOZalR84yp7Y06khTxitWHspGFPtixNPD5XRsyFC1kmTcaMh1Z1I2fvi7sGrZZtLxktchUjN6btO8vbPawd4ZUVvQiJsT/oKIJgz"
seoDescription: "Monitor home weather in real-time with a Private Real-time Weather Station and web application integration using NodeMCU and Firebase."
videoLinks: []
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/private-real-time-weather-station-885fd6_cover.jpg"
lang: "th"