ในช่วงไม่กี่ปีที่ผ่านมา อุปกรณ์สมาร์ทโฮมได้เพิ่มจากน้อยกว่า 300,000 เครื่องในปี 2015 เป็นเกือบ 1.2 พันล้านเครื่องในปี 2020 และคาดว่าจะเพิ่มขึ้นเป็น 1.5 พันล้านเครื่องภายในปี 2021
ดังนั้นจึงเป็นไปได้ว่าบ้านของคุณน่าจะมีอุปกรณ์อัจฉริยะอยู่บ้าง โดยโดยเฉลี่ยจะสูงถึง 8.7 อุปกรณ์ต่อบ้านภายในปี 2564
ในฐานะนักพัฒนา เรามีข้อได้เปรียบบางประการในโดเมนนี้ เนื่องจากเราสามารถสร้างอุปกรณ์สมาร์ทโฮมของเราเองได้
ไม่ใช่แค่อุปกรณ์ที่มีการพัฒนาอย่างรวดเร็วเท่านั้น บอร์ดพัฒนาที่ใช้สำหรับพวกเขาได้เริ่มมีมากขึ้นในเชิงพาณิชย์และเข้าถึงได้
ในบทความนี้ เราจะมาดูกันว่าเราจะใช้ Raspberry Pi, หน้าจอ LCD และโค้ดสองสามบรรทัดเพื่อตรวจสอบสภาพอากาศภายนอกหรือสถานที่เฉพาะได้อย่างไร
เนื่องจากเป็นโครงการ Do It Yourself (DIY) เราจึงมีข้อกำหนดเบื้องต้นบางประการสำหรับอุปกรณ์นี้
ข้อกำหนดเบื้องต้น
- Raspberry Pi 3 (หรือสูงกว่า)
- จอ LCD
- สายเชื่อมต่อ
- โพเทนชิออมิเตอร์ (อุปกรณ์เสริม)
- เขียงหั่นขนม (ไม่จำเป็น)
วิธีการสร้าง
ทันทีที่เรามีทุกสิ่งที่เราต้องการ เราก็สามารถเริ่มต้นได้ ค่อยเป็นค่อยไป
ขั้นตอนที่ 1 - การกำหนดค่าพื้นฐาน
ขั้นตอนแรกประกอบด้วยการตั้งค่าพื้นฐานและการตรวจสอบส่วนประกอบทั้งหมด
สำหรับการสาธิตนี้ เราจะใช้ ClimaCell Weather API เป็นผู้ให้บริการข้อมูลสภาพอากาศ เนื่องจากมีตัวบ่งชี้จำนวนมาก รวมถึงตัวบ่งชี้คุณภาพอากาศให้เราใช้
ในการใช้ API เราต้องเปิดบัญชีบนแพลตฟอร์มและรับคีย์ API ซึ่งเราจะใช้ลงนามในคำขอของเรา
บัญชีนี้เปิดได้ฟรีและจำกัดการเรียก API ไว้ที่ 100 ชั่วโมง ซึ่งเพียงพอสำหรับโครงการของเรา
ทันทีที่เรามีคีย์ API นี้ เราสามารถย้ายไปยังการกำหนดค่าฮาร์ดแวร์และเชื่อมต่อหน้าจอ LCD กับ Raspberry Pi ของเรา คุณควรปิด Raspberry Pi ในขณะที่คุณทำการต่อสาย
เลย์เอาต์พินสำหรับ Raspberry Pi 3 สามารถเห็นได้ในภาพถัดไป
การเชื่อมต่อสายไฟระหว่าง LCD และบอร์ดพัฒนามีดังต่อไปนี้:
การเชื่อมต่อฮาร์ดแวร์นี้จะทำให้หน้าจอ LCD มีความสว่างเต็มที่และความคมชัดเต็มที่ ระดับความสว่างไม่ใช่ปัญหา แต่คอนทราสต์เป็นเพราะเราจะไม่สามารถเห็นตัวอักษรบนหน้าจอได้
นั่นเป็นเหตุผลที่เราต้องแนะนำโพเทนชิออมิเตอร์อย่างน้อยหนึ่งตัวเพื่อกำหนดระดับคอนทราสต์
ณ จุดนี้ เราสามารถเปิด Raspberry Pi ของเรา และเราควรจะเห็นหน้าจอ LCD ที่ยังมีชีวิตอยู่ ด้วยความช่วยเหลือของความต้านทานตัวแปร เราควรจะสามารถควบคุมความคมชัดได้
ขั้นตอนที่ II - การกำหนดค่าโครงการ
ในภาษาการเขียนโปรแกรม เราจะใช้ NodeJS เพื่อเขียนโค้ด หากคุณยังไม่ได้ติดตั้ง NodeJS บน Raspberry ของคุณ คุณสามารถทำตามคำแนะนำง่ายๆ เหล่านี้ได้
ในโฟลเดอร์ใหม่ ให้รันคำสั่ง npm init -y
เพื่อตั้งค่าแพ็คเกจ npm ใหม่ ตามด้วยคำสั่ง npm install lcd node-fetch
เพื่อติดตั้งการพึ่งพาที่จำเป็น 2 นี้
lcd
จะใช้ในการสื่อสารกับหน้าจอ LCDnode-fetch
จะใช้เพื่อส่งคำขอ HTTP ไปยัง ClimaCell API
เราบอกว่าเราต้องการคีย์ API เพื่อสื่อสารกับผู้ให้บริการข้อมูลสภาพอากาศ คุณวางคีย์ API ลับของคุณโดยตรงในรหัสหลัก หรือคุณสามารถสร้าง config.json
ไฟล์ที่คุณสามารถวางคีย์นี้และการกำหนดค่าอื่น ๆ ที่เกี่ยวข้องกับรหัสที่คุณอาจมี
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"));
ขั้นตอนที่ III - จอ LCD
การเขียนบนหน้าจอเป็นเรื่องง่ายๆ โดยใช้โมดูล LCD ไลบรารีนี้ทำหน้าที่เป็นชั้นของสิ่งที่เป็นนามธรรมเกี่ยวกับวิธีที่เราสื่อสารกับอุปกรณ์ ด้วยวิธีนี้ เราจึงไม่จำเป็นต้องจัดการทีละเล็กทีละน้อย
รหัสทั้งหมดสำหรับหน้าจอ LCD ของเรามีดังต่อไปนี้:
ขั้นตอนแรกคือการสร้าง lcd
. ใหม่ วัตถุและเพื่อส่งผ่านเป็นอาร์กิวเมนต์พินที่เราใช้
กุญแจ cols
และ rows
แสดงถึงจำนวนคอลัมน์และแถวของจอ LCD ของเรา 16x2 คืออันที่ฉันใช้ในตัวอย่างนี้ หาก LCD ของคุณมีเพียง 8 คอลัมน์และ 1 แถว ให้แทนที่ 16 และ 2 ด้วยค่าของคุณ
ในการเขียนบางอย่างบนจอแสดงผล เราจำเป็นต้องใช้สองวิธีนี้ตามลำดับ:
- lcd.setCursor() - เลือกตำแหน่งที่จะเริ่มเขียน
- lcd.print()
ในเวลาเดียวกัน เราได้รวมฟังก์ชันทั้งสองนี้ไว้ในสัญญาว่าจะใช้ async/away
คีย์เวิร์ด
ณ จุดนี้ คุณสามารถใช้ฟังก์ชันนี้และพิมพ์บางอย่างบนจอแสดงผลของคุณได้ writeToLcd(0,0,'Hello World')
ควรพิมพ์ข้อความ Hello World
ในแถวแรกโดยเริ่มจากคอลัมน์แรก
ขั้นตอนที่ IV - ข้อมูลสภาพอากาศ
ขั้นตอนต่อไปคือการรับข้อมูลสภาพอากาศและพิมพ์บนจอแสดงผล
ClimaCell ให้ข้อมูลสภาพอากาศจำนวนมาก แต่ยังรวมถึงคุณภาพอากาศและละอองเกสร ไฟ และข้อมูลอื่นๆ ข้อมูลมีมากมาย แต่โปรดทราบว่าหน้าจอ LCD ของคุณมีเพียง 16 คอลัมน์และ 2 แถว นั่นคืออักขระเพียง 32 ตัว
หากคุณต้องการแสดงข้อมูลประเภทต่างๆ มากขึ้นและขีดจำกัดนี้น้อยเกินไปสำหรับคุณ คุณสามารถใช้เอฟเฟกต์การเลื่อนได้
สำหรับการสาธิตนี้ เราจะทำให้มันเรียบง่าย และเราจะพิมพ์ข้อมูลต่อไปนี้บนหน้าจอ LCD:
- วันที่ปัจจุบัน (ชั่วโมง นาที วินาที)
- อุณหภูมิ
- ความเข้มของฝน
ในการรับข้อมูลจาก ClimaCell สำหรับตำแหน่งเฉพาะ คุณจะต้องส่งพิกัดทางภูมิศาสตร์ ละติจูด และลองจิจูดของสถานที่นั้น
หากต้องการค้นหาพิกัดของเมือง คุณสามารถใช้เครื่องมือฟรี เช่น latlong.net แล้วบันทึกไว้ใน config.json
ไฟล์พร้อมกับคีย์ API ของคุณ หรือคุณสามารถเขียนโดยตรงในโค้ด
ณ จุดนี้ รูปแบบข้อมูลที่ส่งคืนจากการเรียก 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' }
}
เราสามารถแยกโครงสร้างวัตถุนี้และรับค่าอุณหภูมิและปริมาณน้ำฝนแล้วพิมพ์ในแถวที่หนึ่งและสอง
ขั้นตอนที่ V - สรุป
สิ่งที่เราต้องทำตอนนี้คือเขียนตรรกะสำหรับสคริปต์ของเรา และอัปเดตหน้าจอ LCD เมื่อมีข้อมูลใหม่เข้ามา
ข้อมูลสภาพอากาศจะอัปเดตทุก ๆ 5 นาที แต่เนื่องจากเรามีการจำกัดการโทร API 100 ครั้ง/ชั่วโมงที่กำหนดโดย ClimaCell เราจึงสามารถดำเนินการเพิ่มเติมและอัปเดตข้อมูลสภาพอากาศในแต่ละนาทีได้
สำหรับวันที่ปัจจุบัน เรามีสองตัวเลือก:
- สามารถใช้คุณสมบัติ
observation_time
และแสดงวันที่ที่ได้รับข้อมูล หรือ - เราสามารถสร้างนาฬิกาจริงและแสดงเวลาปัจจุบันได้
ฉันเลือกตัวเลือกที่ 2 แล้วแต่คุณเลือกได้ตามใจชอบ
ในการพิมพ์เวลาที่มุมขวาบน ก่อนอื่นเราต้องคำนวณคอลัมน์เริ่มต้นเพื่อให้ข้อความพอดี สำหรับสิ่งนี้ เราสามารถใช้สูตรต่อไป total columns number
ลบ text to display length
วันที่มี 8 ตัวอักษร และเนื่องจากเขามี 16 คอลัมน์ เราจึงต้องเริ่มจากคอลัมน์ที่ 8
การตั้งค่า LCD เป็นแบบอะซิงโครนัส จึงต้องใช้วิธี lcd.on()
จัดทำโดยห้องสมุดที่เกี่ยวข้อง เราจึงทราบเมื่อ LCD ได้รับการเตรียมใช้งานและพร้อมใช้งาน
แนวทางปฏิบัติที่ดีที่สุดอีกประการหนึ่งในระบบฝังตัวคือการปิดและทำให้ทรัพยากรที่คุณใช้ว่าง นั่นเป็นเหตุผลที่เราใช้ SIGNINT
เหตุการณ์ที่จะปิดหน้าจอ LCD เมื่อโปรแกรมหยุดทำงาน เหตุการณ์อื่นเช่นนี้ ได้แก่ :
SIGUSR1
และSIGUSR2
- เพื่อจับ "kill pid" เช่น nodemon restartuncaughtException
- เพื่อจับข้อยกเว้นที่ตรวจไม่พบ
ขั้นตอนที่ VI - เรียกใช้ตลอดไป
สคริปต์เสร็จสมบูรณ์และ ณ จุดนี้เราสามารถเรียกใช้โปรแกรมของเราได้ เรามีอีกหนึ่งสิ่งที่เราต้องทำก่อนจะเสร็จ
ณ จุดนี้คุณอาจเชื่อมต่อกับ Raspberry Pi โดยใช้ SSH หรือโดยตรงด้วยสาย HDMI และจอภาพ ไม่ว่าอะไรจะเกิดขึ้น เมื่อคุณปิดเทอร์มินัล โปรแกรมจะหยุดทำงาน
ในเวลาเดียวกัน หากคุณปิดอุปกรณ์และหลังจากผ่านไประยะหนึ่งหรือเปิดเครื่องอีกครั้งทันที สคริปต์จะไม่เริ่มทำงานและคุณจะต้องดำเนินการด้วยตนเอง
เพื่อแก้ปัญหานี้ เราสามารถใช้ตัวจัดการกระบวนการ เช่น pm2
นี่คือขั้นตอน:
sudo npm install pm2 -g
- ติดตั้ง pm2sudo pm2 startup
- สร้างสคริปต์เริ่มต้นสำหรับผู้จัดการ pm2pm2 start index.js
- เริ่มแอปพลิเคชันpm2 save
- บันทึกรายการกระบวนการของคุณในการรีสตาร์ทเซิร์ฟเวอร์
ตอนนี้คุณสามารถรีบูตบอร์ดและสคริปต์จะเริ่มทำงานโดยอัตโนมัติเมื่ออุปกรณ์พร้อม
บทสรุป
จากจุดนี้ คุณสามารถปรับแต่งอุปกรณ์ใหม่ได้ตามต้องการ หากคุณพบว่าข้อมูลสภาพอากาศนี้สำคัญสำหรับคุณ (หรือข้อมูลอื่นๆ จาก ClimaCell เช่น มลพิษทางอากาศ ละอองเกสร ดัชนีอัคคีภัย หรือความเสี่ยงบนท้องถนน) คุณสามารถสร้างเคสแบบกำหนดเองเพื่อใส่ Raspberry Pi และจอ LCD ลงไปได้ หลังจากที่คุณเพิ่มแบตเตอรี่แล้ว คุณสามารถวางอุปกรณ์ไว้ในบ้านได้
Raspberry Pi เป็นเหมือนคอมพิวเตอร์ส่วนบุคคล คุณจึงทำอะไรกับมันได้มากกว่าที่คุณทำบนไมโครคอนโทรลเลอร์ทั่วไป เช่น Arduino ด้วยเหตุนี้ คุณจึงใช้ร่วมกับอุปกรณ์อื่นๆ ในบ้านได้ง่าย