Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ระบบ >> Mac

สร้างสถานีวัดสภาพอากาศด้วย Node.js Raspberry Pi และ LCD - คู่มือทีละขั้นตอน

ไม่กี่ปีที่แล้ว อุปกรณ์ Smart Home เพิ่มจากน้อยกว่า 300,000 (2015) เป็นเกือบ 1.2 พันล้าน (2020) คาดว่าจะถึง 1.5 พันล้านในปี 2021

คุณน่าจะมีอุปกรณ์ Smart Home อยู่บ้างแล้ว โดยเฉลี่ยจะถึง 8.7 อุปกรณ์ต่อบ้านในปี 2021

ในฐานะนักพัฒนา เรามีข้อได้เปรียบ เพราะสามารถสร้างอุปกรณ์ Smart Home เองได้

ไม่ใช่แค่อุปกรณ์ Development Board ก็พัฒนาอย่างรวดเร็ว กลายเป็น Commercial และเข้าถึงง่ายขึ้น

บทความนี้จะแสดงวิธีใช้ Raspberry Pi, จอ LCD และโค้ดไม่มากมาย ติดตามสภาพอากาศนอกบ้าน หรือตำแหน่งที่กำหนด

สร้างสถานีวัดสภาพอากาศด้วย Node.js Raspberry Pi และ LCD - คู่มือทีละขั้นตอน

ข้อกำหนดเบื้องต้น

  • Raspberry Pi 3 (หรือใหม่กว่า)
  • จอ LCD
  • สายเชื่อมต่อ
  • Potentiometer (ตัวปรับแรงดัน - ไม่บังคับ)
  • Breadboard (ไม่บังคับ)

วิธีสร้าง

ขั้นตอนที่ 1 - การตั้งค่าพื้นฐาน (Base Configuration)

ตั้งค่าพื้นฐานและตรวจสอบอุปกรณ์ทั้งหมด

ใช้ ClimaCell Weather API เป็นแหล่งข้อมูลสภาพอากาศ มีตัวชี้วัดมาก รวมถึงคุณภาพอากาศ

ต้องสมัครบัญชีบน Platform ของพวกเขา และได้ API Key สำหรับลงนาม Request

สร้างสถานีวัดสภาพอากาศด้วย Node.js Raspberry Pi และ LCD - คู่มือทีละขั้นตอน
ขีดจำกัด API ของ ClimaCell

สมัครฟรี ได้ 100 ชั่วโมง API Calls - พอสำหรับโปรเจคนี้

ได้ API Key แล้ว ไปต่อ Hardware Configuration เชื่อม LCD กับ Raspberry Pi ปิด Raspberry Pi ก่อนต่อสาย

Pin Layout ของ Raspberry Pi 3:

สร้างสถานีวัดสภาพอากาศด้วย Node.js Raspberry Pi และ LCD - คู่มือทีละขั้นตอน
Pin Layout Raspberry Pi 3

การต่อสายระหว่าง LCD และ Raspberry Pi:

สร้างสถานีวัดสภาพอากาศด้วย Node.js Raspberry Pi และ LCD - คู่มือทีละขั้นตอน
การต่อสาย Raspberry Pi และ LCD

การต่อแบบนี้ทำให้ LCD สว่างสุดและ Contrast สูงสุด สว่างไม่เป็นปัญหา แต่ Contrast สูงเกินไปทำให้มองตัวอักษรไม่เห็น

จึงต้องใช้ Potentiometer อย่างน้อย 1 ตัว เพื่อปรับระดับ Contrast

สร้างสถานีวัดสภาพอากาศด้วย Node.js Raspberry Pi และ LCD - คู่มือทีละขั้นตอน
Schematic แผนผังวงจร

ตอนนี้เปิด Raspberry Pi ควรเห็น LCD ทำงาน ปรับ Contrast ได้ด้วยตัวปรับแรงดัน

ขั้นตอนที่ 2 - การตั้งค่าโปรเจค (Project Configuration)

ใช้ NodeJS เขียนโค้ด หากยังไม่มี NodeJS บน Raspberry ติดตั้งตามคำแนะนำ

ในโฟลเดอร์ใหม่ รัน:

npm init -y          # สร้าง npm package ใหม่
npm install lcd node-fetch  # ติดตั้ง 2 dependencies
  • lcd - ใช้สื่อสารกับจอ LCD
  • node-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:

สร้างสถานีวัดสภาพอากาศด้วย Node.js Raspberry Pi และ LCD - คู่มือทีละขั้นตอน
โค้ด 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

สร้างสถานีวัดสภาพอากาศด้วย Node.js Raspberry Pi และ LCD - คู่มือทีละขั้นตอน

สำหรับ Demo แสดงข้อมูล 3 อย่าง:

  • วันที่/เวลาปัจจุบัน (ชั่วโมง นาที วินาที)
  • อุณหภูมิ
  • ความเข้มของฝนตก
สร้างสถานีวัดสภาพอากาศด้วย Node.js Raspberry Pi และ LCD - คู่มือทีละขั้นตอน
โค้ดดึงข้อมูลสภาพอากาศ

ต้องส่งพิกัด جغرافيا (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 เมื่อมีข้อมูลใหม่

สร้างสถานีวัดสภาพอากาศด้วย Node.js Raspberry Pi และ LCD - คู่มือทีละขั้นตอน
โค้ด Logic หลัก

ข้อมูลสภาพอากาศอัปเดตทุก 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:

  1. sudo npm install pm2 -g - ติดตั้ง PM2
  2. sudo pm2 startup - สร้าง Startup script
  3. pm2 start index.js - เริ่ม Application
  4. pm2 save - บันทึก Process list ร้อน Reboot

ตอนนี้ Reboot Board โปรแกรมจะรันอัตโนมัติเมื่ออุปกรณ์พร้อม

สรุป

จากนี้ปรับแต่งอุปกรณ์ได้ตามต้องการ หากข้อมูลสภาพอากาศสำคัญ (หรือข้อมูลอื่นจาก ClimaCell: มลพิษ ไพลิน ดัชนีไฟ ความเสี่ยงถนน) สร้าง Case ใส่ Raspberry Pi และ LCD เพิ่มแบตเตอรี่ วางไว้ในบ้าน

Raspberry Pi เหมือน PC ส่วนตัว ทำได้มากกว่า Microcontroller อย่าง Arduino รวมกับอุปกรณ์อื่นในบ้านได้ง่าย