ไม่กี่ปีที่แล้ว อุปกรณ์ Smart Home เพิ่มจากน้อยกว่า 300,000 (2015) เป็นเกือบ 1.2 พันล้าน (2020) คาดว่าจะถึง 1.5 พันล้านในปี 2021
คุณน่าจะมีอุปกรณ์ Smart Home อยู่บ้างแล้ว โดยเฉลี่ยจะถึง 8.7 อุปกรณ์ต่อบ้านในปี 2021
ในฐานะนักพัฒนา เรามีข้อได้เปรียบ เพราะสามารถสร้างอุปกรณ์ Smart Home เองได้
ไม่ใช่แค่อุปกรณ์ Development Board ก็พัฒนาอย่างรวดเร็ว กลายเป็น Commercial และเข้าถึงง่ายขึ้น
บทความนี้จะแสดงวิธีใช้ Raspberry Pi, จอ LCD และโค้ดไม่มากมาย ติดตามสภาพอากาศนอกบ้าน หรือตำแหน่งที่กำหนด
ข้อกำหนดเบื้องต้น
- Raspberry Pi 3 (หรือใหม่กว่า)
- จอ LCD
- สายเชื่อมต่อ
- Potentiometer (ตัวปรับแรงดัน - ไม่บังคับ)
- Breadboard (ไม่บังคับ)
วิธีสร้าง
ขั้นตอนที่ 1 - การตั้งค่าพื้นฐาน (Base Configuration)
ตั้งค่าพื้นฐานและตรวจสอบอุปกรณ์ทั้งหมด
ใช้ ClimaCell Weather API เป็นแหล่งข้อมูลสภาพอากาศ มีตัวชี้วัดมาก รวมถึงคุณภาพอากาศ
ต้องสมัครบัญชีบน Platform ของพวกเขา และได้ API Key สำหรับลงนาม Request
สมัครฟรี ได้ 100 ชั่วโมง API Calls - พอสำหรับโปรเจคนี้
ได้ API Key แล้ว ไปต่อ Hardware Configuration เชื่อม LCD กับ Raspberry Pi ปิด Raspberry Pi ก่อนต่อสาย
Pin Layout ของ Raspberry Pi 3:
การต่อสายระหว่าง LCD และ Raspberry Pi:
การต่อแบบนี้ทำให้ LCD สว่างสุดและ Contrast สูงสุด สว่างไม่เป็นปัญหา แต่ Contrast สูงเกินไปทำให้มองตัวอักษรไม่เห็น
จึงต้องใช้ Potentiometer อย่างน้อย 1 ตัว เพื่อปรับระดับ Contrast
ตอนนี้เปิด Raspberry Pi ควรเห็น LCD ทำงาน ปรับ Contrast ได้ด้วยตัวปรับแรงดัน
ขั้นตอนที่ 2 - การตั้งค่าโปรเจค (Project Configuration)
ใช้ NodeJS เขียนโค้ด หากยังไม่มี NodeJS บน Raspberry ติดตั้งตามคำแนะนำ
ในโฟลเดอร์ใหม่ รัน:
npm init -y # สร้าง npm package ใหม่
npm install lcd node-fetch # ติดตั้ง 2 dependencies
lcd- ใช้สื่อสารกับจอ LCDnode-fetch- ใช้ส่ง HTTP Request ไป ClimaCell API
เก็บ API Key ใน config.json:
{
"cc_key": "<your_ClimaCell_API_key>"
}
สร้างไฟล์หลักของโปรเจค:
// * Dependencies
const Lcd = require("lcd");
const fs = require("fs");
const fetch = require("node-fetch");
// * Globals
const { cc_key } = JSON.parse(fs.readFileSync("./config.json"));
ขั้นตอนที่ 3 - จอ LCD
เขียนข้อความบนจอ LCD ง่ายด้วยโมดูล lcd Library นี้เป็น Abstraction layer ไม่ต้องจัดการคำสั่งแต่ละคำสั่ง
โค้ดสำหรับ LCD:
1. สร้าง object lcd ส่ง pins ที่ใช้
2. cols และ rows = จำนวนคอลัมน์และแถวของ LCD (ตัวอย่าง 16x2)
3. เขียนข้อความใช้ 2 เมธอดติดกัน:
lcd.setCursor()- เลือกตำแหน่งเริ่มเขียนlcd.print()- พิมพ์ข้อความ
4. ห่อ 2 ฟังก์ชันนี้ใน Promise ใช้ async/await
ทดสอบ: writeToLcd(0,0,'Hello World') จะพิมพ์ "Hello World" แถวแรก คอลัมน์แรก
ขั้นตอนที่ 4 - ข้อมูลสภาพอากาศ
ดึงข้อมูลสภาพอากาศและแสดงบน LCD
ClimaCell ให้ข้อมูลมาก: สภาพอากาศ คุณภาพอากาศ ไพลิน ไฟ และอื่นๆ แตจอ LCD มีแค่ 16 คอลัมน์ 2 แถว = 32 ตัวอักษร
หากต้องการแสดงข้อมูลมากกว่า ใช้ Scroll effect
สำหรับ Demo แสดงข้อมูล 3 อย่าง:
- วันที่/เวลาปัจจุบัน (ชั่วโมง นาที วินาที)
- อุณหภูมิ
- ความเข้มของฝนตก
ต้องส่งพิกัด جغرافيا (Latitude, Longitude) หาพิกัดเมืองได้จาก latlong.net เก็บใน config.json หรือโค้ดโดยตรง
รูปแบบข้อมูลที่ API คืนค่า:
{
lat: 45.658, lon: 25.6012,
temp: { value: 17.56, units: 'C' },
precipitation: { value: 0.3478, units: 'mm/hr' },
observation_time: { value: '2020-06-22T16:30:22.941Z' }
}
แยกค่า temp และ precipitation แสดงบนแถวที่ 1 และ 2
ขั้นตอนที่ 5 - รวมทุกอย่าง (Wrap it Up)
เขียน Logic สคริปท และอัปเดต LCD เมื่อมีข้อมูลใหม่
ข้อมูลสภาพอากาศอัปเดตทุก 5 นาที แต่ขีดจำกัด 100 API Calls/ชั่วโมง สามารถอัปเดตทุก 1 นาทีได้
สำหรับเวลา มี 2 ทางเลือก:
- ใช้
observation_timeจาก API - สร้างนาฬิกาจริง แสดงเวลาปัจจุบัน (ตัวเลือกนี้)
พิมพ์เวลามุมขวาบน: คำนวณคอลัมน์เริ่มต้น = total columns - text length = 16 - 8 = เริ่มคอลัมน์ที่ 8
LCD การตั้งค่าเป็น Asynchronous ใช้ lcd.on() รอจน LCD พร้อม
Best Practice ระบบฝังตัว: ปิดและปล่อย Resource ใช้ Event SIGINT ปิด LCD ตอนหยุดโปรแกรม Event อื่นๆ: SIGUSR1, SIGUSR2 (nodemon restart), uncaughtException
ขั้นตอนที่ 6 - รันตลอดเวลา (Run it Forever)
สคริปทเสร็จแล้ว แต่ติดต่อ Raspberry Pi ผ่าน SSH หรือ HDMI ตอนปิด Terminal โปรแกรมหยุด รีบูทก็ต้องรันเองใหม่
แก้ด้วย Process Manager PM2:
sudo npm install pm2 -g- ติดตั้ง PM2sudo pm2 startup- สร้าง Startup scriptpm2 start index.js- เริ่ม Applicationpm2 save- บันทึก Process list ร้อน Reboot
ตอนนี้ Reboot Board โปรแกรมจะรันอัตโนมัติเมื่ออุปกรณ์พร้อม
สรุป
จากนี้ปรับแต่งอุปกรณ์ได้ตามต้องการ หากข้อมูลสภาพอากาศสำคัญ (หรือข้อมูลอื่นจาก ClimaCell: มลพิษ ไพลิน ดัชนีไฟ ความเสี่ยงถนน) สร้าง Case ใส่ Raspberry Pi และ LCD เพิ่มแบตเตอรี่ วางไว้ในบ้าน
Raspberry Pi เหมือน PC ส่วนตัว ทำได้มากกว่า Microcontroller อย่าง Arduino รวมกับอุปกรณ์อื่นในบ้านได้ง่าย