Computer >> Hướng Dẫn Máy Tính >  >> Hệ Thống >> Mac

Xây Dựng Trạm Thời Tiết Với Node, Raspberry Pi Và LCD – Hướng Dẫn Chi Tiết

Vài năm qua, thiết bị nhà thông minh tăng từ <300.000 (2015) lên gần 1.2 tỷ (2020). Dự kiến 1.5 tỷ vào 2021.

Chắc chắn bạn đã có vài thiết bị thông minh, vì trung bình 8.7 thiết bị/ngôi nhà vào 2021.

Là lập trình viên, chúng ta có lợi thế: tự xây dựng thiết bị nhà thông minh.

Không chỉ thiết bị, board phát triển (development board) cũng ngày càng thương mại hóa, dễ tiếp cận.

Bài viết hướng dẫn dùng Raspberry Pi, màn hình LCD và vài dòng code để theo dõi thời tiết bên ngoài hoặc vị trí cụ thể.

Xây Dựng Trạm Thời Tiết Với Node, Raspberry Pi Và LCD – Hướng Dẫn Chi Tiết

Chuẩn Bị (Prerequisites)

  • Raspberry Pi 3 (hoặc cao hơn)
  • Màn hình LCD
  • Dây kết nối
  • Potentiometer (biến trở – tùy chọn)
  • Breadboard (bảng mạch thử – tùy chọn)

Cách Xây Dựng

Khi đã có đầy đủ, bắt đầu từng bước.

Bước I – Cấu Hình Cơ Bản

Thiết lập cơ bản và kiểm tra linh kiện.

Dùng ClimaCell Weather API làm nguồn dữ liệu thời tiết – nhiều chỉ số bao gồm chất lượng không khí.

Để dùng API: tạo tài khoản trên nền tảng ClimaCell, lấy API key để ký request.

Xây Dựng Trạm Thời Tiết Với Node, Raspberry Pi Và LCD – Hướng Dẫn Chi Tiết
Giới hạn API ClimaCell

Tài khoản miễn phí, giới hạn 100 giờ gọi API – đủ cho dự án.

Sau khi có API key, chuyển sang cấu hình phần cứng: kết nối LCD với Raspberry Pi. Tắt Raspberry Pi khi đấu dây.

Sơ đồ chân (pinout) Raspberry Pi 3:

Xây Dựng Trạm Thời Tiết Với Node, Raspberry Pi Và LCD – Hướng Dẫn Chi Tiết
Chân Raspberry Pi 3

Kết nối dây giữa LCD và board:

Xây Dựng Trạm Thời Tiết Với Node, Raspberry Pi Và LCD – Hướng Dẫn Chi Tiết
Kết nối Raspberry Pi và LCD

Kết nối này làm LCD sáng tối đa và 대비 (contrast) tối đa. Độ sáng OK, nhưng contrast cao khiến không thấy chữ.

Cần ít nhất một potentiometer để điều chỉnh contrast.

Xây Dựng Trạm Thời Tiết Với Node, Raspberry Pi Và LCD – Hướng Dẫn Chi Tiết
Sơ đồ

Bật Raspberry Pi, LCD nên sáng. Dùng điện trở biến thiên để điều chỉnh contrast.

Bước II – Cấu Hình Dự Án

Ngôn ngữ lập trình: NodeJS. Nếu chưa cài NodeJS trên Raspberry, làm theo hướng dẫn.

Tạo thư mục mới, chạy:

npm init -y
npm install lcd node-fetch
  • lcd: giao tiếp với màn hình LCD
  • node-fetch: gọi HTTP request đến ClimaCell API

Cần API key để giao tiếp với nhà cung cấp dữ liệu thời tiết. Có thể đặt key trực tiếp trong code chính, hoặc tạo file config.json chứa key và các config khác.

config.json

{
  "cc_key": "<your_ClimaCell_API_key>"
}

Tạo file chính của dự án, nhập các dependency:

// * Dependencies
const Lcd = require("lcd");
const fs = require("fs");
const fetch = require("node-fetch");
// * Globals
const { cc_key } = JSON.parse(fs.readFileSync("./config.json"));

Bước III – Màn Hình LCD

Viết lên màn hình rất dễ với module lcd. Thư viện này trừu tượng hóa giao tiếp thiết bị – không cần quản lý từng lệnh riêng lẻ.

Toàn bộ code LCD:

Xây Dựng Trạm Thời Tiết Với Node, Raspberry Pi Và LCD – Hướng Dẫn Chi Tiết
RAW

Đầu tiên tạo object lcd truyền vào các chân đã dùng.

Key cols và rows là số cột và hàng của LCD. Ví dụ dùng 16x2. Nếu LCD của bạn 8 cột 1 hàng, thay 16 và 2 bằng giá trị của bạn.

Để viết lên màn hình, dùng 2 method liên tiếp:

  • lcd.setCursor() – chọn vị trí bắt đầu viết
  • lcd.print()

Cả 2 function được wrap trong Promise để dùng async/await.

Lúc này có thể test: writeToLcd(0,0,'Hello World') in "Hello World" hàng 1 cột 1.

Bước IV – Dữ Liệu Thời Tiết

Bước tiếp theo: lấy dữ liệu thời tiết và in lên màn hình.

ClimaCell cung cấp nhiều dữ liệu: thời tiết, chất lượng không khí, hoa phấn, cháy rừng... Nhưng LCD chỉ 16 cột x 2 hàng = 32 ký tự.

Muốn hiển thị nhiều loại dữ liệu hơn, có thể dùng hiệu ứng cuộn (scroll).

Xây Dựng Trạm Thời Tiết Với Node, Raspberry Pi Và LCD – Hướng Dẫn Chi Tiết

Demo này giữ đơn giản, in lên LCD:

  • Ngày/giờ hiện tại (giờ, phút, giây)
  • Nhiệt độ
  • Cường độ mưa
Xây Dựng Trạm Thời Tiết Với Node, Raspberry Pi Và LCD – Hướng Dẫn Chi Tiết
RAW

Để lấy dữ liệu ClimaCell cho vị trí cụ thể, cần gửi tọa độ địa lý: vĩ độ (latitude) và kinh độ (longitude).

Tìm tọa độ thành phố qua latlong.net (miễn phí), lưu vào config.json cùng API key, hoặc viết cứng trong code.

Định dạng dữ liệu trả về từ 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' }
}

Phân rã object lấy temp và precipitation, in lên hàng 1 và 2.

Bước V – Hoàn Thiện

Viết logic script, cập nhật LCD khi có dữ liệu mới.

Xây Dựng Trạm Thời Tiết Với Node, Raspberry Pi Và LCD – Hướng Dẫn Chi Tiết
RAW

Dữ liệu thời tiết cập nhật 5 phút/lần. Nhưng giới hạn 100 API calls/giờ của ClimaCell, có thể cập nhật mỗi phút.

Đối với giờ hiện tại, 2 lựa chọn:

  • Dùng observation_time – thời điểm nhận dữ liệu
  • Tự làm đồng hồ thực – hiển thị giờ thực

Tôi chọn cách 2, bạn tự quyết.

Để in giờ góc trên bên phải, tính cột bắt đầu: tổng số cột - độ dài text. Giờ có 8 ký tự, LCD 16 cột → bắt đầu cột 8.

LCD thiết lập bất đồng bộ (async), dùng lcd.on() (cung cấp bởi thư viện) để biết khi LCD đã init xong sẵn sàng dùng.

Thói quen tốt trong embedded: giải phóng tài nguyên khi dừng. Dùng event SIGINT để đóng LCD khi dừng chương trình. Các event khác:

  • SIGUSR1, SIGUSR2 – bắt "kill pid" như nodemon restart
  • uncaughtException – bắt exception không xử lý

Bước VI – Chạy Liên Tục (Run Forever)

Script xong, chạy chương trình. Còn một việc quan trọng trước khi kết thúc.

Bạn đang SSH vào Raspberry Pi hoặc cắm HDMI+màn hình. Khi đóng terminal, chương trình dừng. Tắt nguồn bật lại, script không tự chạy – phải chạy thủ công.

Giải pháp: dùng process manager pm2.

Các bước:

  1. sudo npm install pm2 -g – cài pm2 global
  2. sudo pm2 startup – tạo script khởi động cho pm2
  3. pm2 start index.js – chạy ứng dụng
  4. pm2 save – lưu danh sách tiến trình qua reboot

Bây giờ reboot board, script tự chạy khi thiết bị sẵn sàng.

Kết Luận

Từ đây bạn tùy biến thiết bị theo ý thích. Nếu dữ liệu thời tiết này quan trọng (hoặc dữ liệu khác từ ClimaCell: ô nhiễm không khí, hoa phấn, chỉ số cháy, rủi ro đường...), có thể thiết kế vỏ nhựa chứa Raspberry Pi + LCD, gắn pin, đặt ở nhà.

Raspberry Pi như máy tính cá nhân, làm được nhiều việc hơn vi điều khiển Arduino. Dễ kết hợp với thiết bị khác trong nhà.