Trong kỷ nguyên IoT (Internet of Things), việc giám sát dữ liệu môi trường như nhiệt độ và độ ẩm là vô cùng quan trọng. Các thông số này không chỉ giúp tối ưu hóa điều kiện sống trong nhà thông minh, mà còn ứng dụng trong nông nghiệp, kho hàng, phòng thí nghiệm và nhiều lĩnh vực công nghiệp khác. Với FPGA board Z2 (PYNQ-Z2), chúng ta có thể triển khai một hệ thống đo lường mạnh mẽ: hiển thị dữ liệu lên LCD I²C và đồng thời gửi dữ liệu lên ThingsBoard để giám sát từ xa qua Internet.
Bài viết này sẽ hướng dẫn chi tiết cách thực hiện, từ phần cứng, phần mềm, lập trình cho đến triển khai ứng dụng thực tế. Đây là tài liệu chuẩn SEO dành cho người dùng quan tâm đến FPGA, IoT và giám sát môi trường.
1. Giới thiệu FPGA board Z2 (PYNQ-Z2)
Bo mạch PYNQ-Z2 là một Zynq Development Board được thiết kế để hoạt động với PYNQ framework – nền tảng mã nguồn mở giúp kết hợp lập trình Python với FPGA. Điểm mạnh của PYNQ-Z2 nằm ở sự kết hợp giữa CPU ARM Cortex-A9 dual-core và FPGA Xilinx XC7Z020, cho phép xử lý cả phần mềm và phần cứng song song.

Các tính năng nổi bật của PYNQ-Z2【22†pynqz2_user_manual_v1_0.pdf】:
- Vi xử lý: ARM Cortex-A9 dual-core, tốc độ 650 MHz.
- Bộ nhớ: 512MB DDR3, 16MB Quad-SPI Flash, hỗ trợ MicroSD.
- Kết nối: Gigabit Ethernet, Micro USB, USB-UART, HDMI In/Out.
- Âm thanh và hình ảnh: Codec ADAU1761, cổng HDMI input/output.
- Mở rộng: 2 cổng Pmod, 1 Arduino Shield connector, 1 Raspberry Pi header.
- I/O hỗ trợ analog: 6 chân analog input (0–3.3V) qua XADC.
Nhờ hệ thống cổng mở rộng đa dạng, PYNQ-Z2 có thể dễ dàng kết nối với LCD, cảm biến, module IoT và các thiết bị ngoại vi khác.
2. Phần cứng cần chuẩn bị
Để xây dựng hệ thống hiển thị nhiệt độ, độ ẩm và truyền dữ liệu lên ThingsBoard, chúng ta cần:
- FPGA board Z2 (PYNQ-Z2)
- Cảm biến nhiệt độ & độ ẩm: SHT31 (I²C), BME280 hoặc DHT22
- LCD 16×2 I²C (PCF8574 driver)
- Dây cắm Dupont (đực-cái)
- Nguồn cấp Micro USB hoặc adapter 12V
- Kết nối mạng: Ethernet hoặc USB WiFi (nếu hệ điều hành hỗ trợ)
3. Kết nối phần cứng
Các module LCD và cảm biến đều sử dụng giao tiếp I²C, do đó có thể mắc song song trên cùng một bus.
- 3V3 → VCC của LCD và cảm biến
- GND → GND chung
- SCL → SCL của LCD và cảm biến
- SDA → SDA của LCD và cảm biến
Kiểm tra địa chỉ thiết bị bằng lệnh:
sudo i2cdetect -y 1
Nếu LCD hiển thị 0x27/0x3F và cảm biến hiển thị 0x44/0x76, nghĩa là kết nối thành công.
4. Cài đặt phần mềm
Trên hệ điều hành PYNQ (Ubuntu ARM hoặc tương tự), cần cài đặt thư viện hỗ trợ:
sudo apt-get update
sudo apt-get install -y python3-pip python3-smbus i2c-tools
pip3 install RPLCD paho-mqtt
- python3-smbus: giao tiếp I²C
- RPLCD: điều khiển LCD I²C
- paho-mqtt: kết nối MQTT để gửi dữ liệu lên ThingsBoard
5. Hiển thị dữ liệu lên LCD
Dùng thư viện RPLCD để in chuỗi ký tự lên LCD:
from RPLCD.i2c import CharLCD
lcd = CharLCD('PCF8574', 0x27)
lcd.clear()
lcd.write_string("Nhiet do: 25.5C")
lcd.crlf()
lcd.write_string("Do am: 60%")
Kết quả: LCD hiển thị nhiệt độ và độ ẩm theo thời gian thực.
6. Đọc dữ liệu từ cảm biến nhiệt độ, độ ẩm
Ví dụ với SHT31 (I²C):
from smbus2 import SMBus, i2c_msg
import time
I2C_BUS = 1
SHT31_ADDR = 0x44
def read_sht31():
with SMBus(I2C_BUS) as bus:
bus.write_i2c_block_data(SHT31_ADDR, 0x2C, [0x06])
time.sleep(0.015)
read = i2c_msg.read(SHT31_ADDR, 6)
bus.i2c_rdwr(read)
data = list(read)
raw_t = data[0] << 8 | data[1]
raw_h = data[3] << 8 | data[4]
temp = -45 + (175 * (raw_t / 65535.0))
hum = 100 * (raw_h / 65535.0)
return round(temp, 2), round(hum, 2)
7. Gửi dữ liệu lên ThingsBoard
7.1 Tạo thiết bị trên ThingsBoard
- Truy cập ThingsBoard (VD: https://demo.thingsboard.io)
- Đăng nhập → Devices → Add new device
- Mở thiết bị vừa tạo → Device credentials → copy Access Token
7.2 Code gửi dữ liệu bằng MQTT
import paho.mqtt.client as mqtt
import json
TB_HOST = "demo.thingsboard.io"
TB_PORT = 1883
TB_TOKEN = "<ACCESS_TOKEN>"
TB_TOPIC = "v1/devices/me/telemetry"
client = mqtt.Client()
client.username_pw_set(TB_TOKEN)
client.connect(TB_HOST, TB_PORT, 60)
client.loop_start()
payload = {"temperature": 25.5, "humidity": 60}
client.publish(TB_TOPIC, json.dumps(payload), qos=1)
Sau khi chạy, dữ liệu sẽ xuất hiện trong tab Latest Telemetry của ThingsBoard.
8. Tích hợp toàn bộ: cảm biến + LCD + ThingsBoard
Kết hợp tất cả lại thành một chương trình chạy liên tục:
import time
import json
from smbus2 import SMBus, i2c_msg
from RPLCD.i2c import CharLCD
import paho.mqtt.client as mqtt
I2C_BUS = 1
SHT31_ADDR = 0x44
LCD_ADDR = 0x27
TB_HOST = "demo.thingsboard.io"
TB_PORT = 1883
TB_TOKEN = "<ACCESS_TOKEN>"
TB_TOPIC = "v1/devices/me/telemetry"
# Hàm đọc dữ liệu từ SHT31
def read_sht31():
with SMBus(I2C_BUS) as bus:
bus.write_i2c_block_data(SHT31_ADDR, 0x2C, [0x06])
time.sleep(0.015)
read = i2c_msg.read(SHT31_ADDR, 6)
bus.i2c_rdwr(read)
data = list(read)
raw_t = data[0] << 8 | data[1]
raw_h = data[3] << 8 | data[4]
temp = -45 + (175 * (raw_t / 65535.0))
hum = 100 * (raw_h / 65535.0)
return round(temp, 2), round(hum, 2)
# LCD
lcd = CharLCD('PCF8574', LCD_ADDR)
lcd.clear()
# MQTT client
client = mqtt.Client()
client.username_pw_set(TB_TOKEN)
client.connect(TB_HOST, TB_PORT, 60)
client.loop_start()
while True:
t, h = read_sht31()
# Hiển thị LCD
lcd.clear()
lcd.write_string(f"Nhiet do: {t}C")
lcd.crlf()
lcd.write_string(f"Do am: {h}%")
# Gửi ThingsBoard
payload = {"temperature": t, "humidity": h}
client.publish(TB_TOPIC, json.dumps(payload), qos=1)
time.sleep(5)
9. Ứng dụng thực tế
- Nhà thông minh: Theo dõi nhiệt độ/độ ẩm trong phòng, bật/tắt máy lạnh, quạt, máy hút ẩm tự động.
- Nông nghiệp thông minh: Giám sát nhà kính, tự động điều chỉnh tưới tiêu dựa trên độ ẩm.
- Kho hàng & logistics: Cảnh báo khi nhiệt độ/độ ẩm vượt ngưỡng an toàn.
- Phòng thí nghiệm: Đảm bảo điều kiện ổn định cho thí nghiệm khoa học.
10. Mở rộng hệ thống
- Thay SHT31 bằng BME280 để có thêm dữ liệu áp suất.
- Dùng LCD 20×4 để hiển thị nhiều thông tin hơn.
- Tích hợp Dashboard ThingsBoard với biểu đồ, gauge, cảnh báo.
- Kết hợp công nghệ AI trên FPGA để dự đoán xu hướng nhiệt độ/độ ẩm.
11. Lỗi thường gặp và cách xử lý
- Không thấy thiết bị khi i2cdetect → kiểm tra dây nối, nguồn, địa chỉ I²C.
- LCD hiển thị ký tự lạ → chỉnh biến trở contrast trên module LCD.
- MQTT không kết nối → kiểm tra Access Token, server ThingsBoard, cổng mạng.
- LCD không sáng → thử đổi địa chỉ LCD 0x27 ↔ 0x3F.
12. Kết luận
Với FPGA board Z2 (PYNQ-Z2), chúng ta có thể xây dựng hệ thống IoT mạnh mẽ: đọc dữ liệu cảm biến, hiển thị lên LCD và truyền lên ThingsBoard để giám sát từ xa theo thời gian thực. Đây là nền tảng tuyệt vời để phát triển các ứng dụng nhà thông minh, nông nghiệp, công nghiệp và nghiên cứu khoa học.
13. Gợi ý từ khóa SEO
- fpga board z2 hiển thị nhiệt độ độ ẩm
- pynq z2 đo nhiệt độ độ ẩm i2c
- kết nối lcd i2c 16×2 với fpga zynq
- gửi dữ liệu cảm biến lên thingsboard mqtt
- dự án iot với fpga board z2
- đọc cảm biến sht31 bme280 trên pynq
- lcd i2c cho fpga zynq
- mqtt python cho fpga board z2
👉 Với hướng dẫn trên, bạn đã có thể tự tay triển khai một dự án IoT hoàn chỉnh với PYNQ-Z2, từ phần cứng đến phần mềm, hiển thị LCD và kết nối ThingsBoard. Đây chính là bước đệm để bạn mở rộng sang các ứng dụng IoT nâng cao trong tương lai.
