Raspberry Pi 5 wired to an AHT20 sensor on a breadboard with a laptop dashboard nearby

ขั้นสูง

สร้างแดชบอร์ดเซ็นเซอร์ SBC

คอมพิวเตอร์บอร์ดเดียวเซ็นเซอร์จอแสดงผล

คอมพิวเตอร์ Linux ขนาดเล็กพอที่จะถือได้ด้วยมือเดียว สร้างแดชบอร์ดของแท้ด้วยซอฟต์แวร์จริง ไม่ใช่แค่โปรแกรมที่อัปโหลดเพียงโปรแกรมเดียว

รวมชิ้นส่วนจริง 5 รายการ

ราคารวมชุดนี้: 3,782.00 ฿

ยังไม่รวมส่วนลดคำสั่งซื้อที่คุณอาจได้รับตอนชำระเงิน

สิ่งที่คุณต้องใช้

เป้าหมายของโครงการ

โครงการอื่น ๆ ในแคตตาล็อกของร้านค้านี้ส่วนใหญ่จะรันโปรแกรมที่อัปโหลดเพียงโปรแกรมเดียวบนไมโครคอนโทรลเลอร์ แต่โครงการนี้แตกต่างอย่างแท้จริง: มันบูตระบบปฏิบัติการ Linux เต็มรูปแบบจาก MicroSD การ์ด และสร้างแดชบอร์ดเซ็นเซอร์จริงขึ้นมา ความแตกต่างนี้มีความสำคัญในทางปฏิบัติ — เป็นเดสก์ท็อปจริงหากคุณต้องการ, มีทางเลือกภาษาโปรแกรมจริง, มีบริการพื้นหลังจริง, และมีการทำงานหลายอย่างพร้อมกันจริง, ทั้งหมดนี้ทำงานพร้อมกันบนฮาร์ดแวร์ขนาดเล็กพอที่จะถือได้ด้วยมือเดียว

สิ่งที่คอนโทรลเลอร์ทำ

Raspberry Pi 5 ไม่ใช่ไมโครคอนโทรลเลอร์ที่รันโปรแกรมเดียวแบบวนซ้ำ — มันเป็นคอมพิวเตอร์ที่สมบูรณ์ที่รันระบบปฏิบัติการ Linux เต็มรูปแบบจาก MicroSD การ์ด นั่นหมายความว่า "โปรแกรม" สำหรับแดชบอร์ดนี้สามารถเป็นสคริปต์ Python, เว็บเซิร์ฟเวอร์ขนาดเล็ก, บริการพื้นหลังที่ตั้งเวลาไว้, หรือหลายอย่างพร้อมกัน, เช่นเดียวกับแอปพลิเคชันเดสก์ท็อปหรือเซิร์ฟเวอร์ใด ๆ

ชิ้นส่วนที่คุณจะต้องจัดหาเอง

โครงการนี้ต้องการสองสิ่งที่ร้านนี้ยังไม่มีจำหน่ายแยก: MicroSD การ์ด (16GB หรือใหญ่กว่า) สำหรับจัดเก็บระบบปฏิบัติการ และแหล่งจ่ายไฟสำหรับ Pi MicroSD การ์ดขนาด 16GB+ ที่น่าเชื่อถือใด ๆ ก็ใช้ได้สำหรับโครงการนี้ — ไม่จำเป็นต้องรวมอยู่ในคำสั่งซื้อของคุณ เพียงแค่มีติดตัวไว้ก่อนที่คุณจะเริ่มแฟลชระบบปฏิบัติการ

สิ่งที่เซ็นเซอร์อุณหภูมิและความชื้นทำ

AHT20 วัดอุณหภูมิและความชื้น และรายงานค่าทั้งสองแบบดิจิทัลผ่าน I2C ซึ่งเป็นโปรโตคอลพื้นฐานเดียวกันกับที่ใช้ในโครงการเซ็นเซอร์ที่ใช้ไมโครคอนโทรลเลอร์ในส่วนอื่น ๆ ของแคตตาล็อกนี้ แนวคิดไม่เปลี่ยนแปลง — สิ่งที่เปลี่ยนแปลงคือวิธีการเข้าถึง: แทนที่จะเป็นไลบรารีเฉพาะไมโครคอนโทรลเลอร์ คุณจะเข้าถึงผ่านสแต็กไดรเวอร์ I2C ของ Linux เอง (เข้าถึงได้จาก Python หรือภาษาใด ๆ ที่มีการผูก I2C) เพื่ออ่านรีจิสเตอร์เดียวกัน

ระบบปฏิบัติการจริง ไม่ใช่แค่โปรแกรมเดียว

บนไมโครคอนโทรลเลอร์ มีโปรแกรมเดียว และเมื่อหยุดทำงาน ก็จะไม่มีอะไรทำงานอีกต่อไป บนระบบ Linux เต็มรูปแบบ โค้ดการอ่านเซ็นเซอร์สามารถเป็นส่วนเล็ก ๆ ในหลายส่วน: บริการระบบจะคอยรันมันอยู่เบื้องหลัง, เว็บเซิร์ฟเวอร์สามารถแสดงข้อมูลในเบราว์เซอร์บนเครือข่ายของคุณ, และคุณสามารถ SSH เข้าไปตรวจสอบ, อัปเดต, หรือเพิ่มคุณสมบัติใหม่ได้โดยไม่ต้องแฟลชซ้ำทางกายภาพ นี่คือความแตกต่างเชิงปฏิบัติที่สำคัญที่โครงการนี้มีจุดมุ่งหมายที่จะสอน

แนวคิดเกี่ยวกับซอฟต์แวร์และไลบรารี

บน Linux การเข้าถึง I2C โดยทั่วไปจะผ่านไลบรารี Python ที่สื่อสารกับไดรเวอร์ I2C ของเคอร์เนล (แทนที่จะเป็นไลบรารี Wire/I2C สไตล์ไมโครคอนโทรลเลอร์) บวกกับไลบรารีเฉพาะเซ็นเซอร์ หรือโค้ดการอ่านรีจิสเตอร์เล็กน้อยสำหรับ AHT20 เอง เนื่องจากเป็นระบบปฏิบัติการจริง คุณมีทางเลือกในการสร้างแดชบอร์ดบนนั้น — สคริปต์เทอร์มินัลง่าย ๆ ที่พิมพ์ค่าที่อ่านได้แบบวนซ้ำเป็นจุดเริ่มต้นที่ดีก่อนที่จะเพิ่มอินเทอร์เฟซเว็บหรือการบันทึก

การทดสอบและการแก้ไขปัญหา

  • Pi จะไม่บูตเลย — สาเหตุที่แท้จริงที่พบบ่อยที่สุดคือ MicroSD การ์ดเสีย หรืออิมเมจ OS ที่เขียนไม่เสร็จสมบูรณ์ แฟลชการ์ดใหม่ตั้งแต่ต้นและยืนยันว่าการเขียนเสร็จสมบูรณ์จริงก่อนที่จะสรุปว่าฮาร์ดแวร์มีข้อบกพร่อง
  • ไม่พบเซ็นเซอร์ I2C — ยืนยันว่า I2C เปิดใช้งานจริงในการกำหนดค่า OS ของ Pi โดยปกติจะปิดใช้งานโดยค่าเริ่มต้นในการติดตั้งใหม่ และการลืมขั้นตอนนี้เป็นเรื่องที่พบบ่อยและมองข้ามได้ง่าย
  • แดชบอร์ดทำงานช้าลงเมื่อเวลาผ่านไป — นี่เป็นพฤติกรรมการใช้ทรัพยากรของ Linux ปกติ ไม่ใช่ข้อบกพร่องของฮาร์ดแวร์ ตรวจสอบว่ามีอะไรทำงานอยู่เบื้องหลังจริง ๆ (บันทึก, การอัปเดต, บริการอื่น ๆ) ก่อนที่จะสรุปว่า Pi กำลังเสีย
  • ค่าที่อ่านได้จากเซ็นเซอร์ค้างหรือไม่เปลี่ยนแปลง — ยืนยันว่าลูปการอ่านหรือบริการพื้นหลังของคุณกำลังสำรวจเซ็นเซอร์ใหม่ตามกำหนดเวลาจริง ๆ แทนที่จะแคชหรือใช้ค่าเก่าซ้ำ

การอัปเกรดในอนาคต (ไม่บังคับ): แดชบอร์ดบนเว็บ

เมื่อการอ่านค่าเซ็นเซอร์พื้นฐานทำงานได้อย่างน่าเชื่อถือผ่าน I2C ขั้นตอนต่อไปคือการให้บริการผ่านหน้าเว็บในเครื่องขนาดเล็กที่โฮสต์โดยตรงบน Pi เพื่อให้แดชบอร์ดสามารถดูได้จากอุปกรณ์ใด ๆ บนเครือข่ายของคุณ แทนที่จะจำกัดอยู่แค่บน Pi เท่านั้น

การเดินสาย

  • AHT20 VCC → Raspberry Pi 5 3.3V (พินจริง 1)
  • AHT20 GND → Raspberry Pi 5 GND (พินจริง 6, หรือพิน GND ใด ๆ)
  • AHT20 SDA → Raspberry Pi 5 GPIO2 / SDA1 (พินจริง 3)
  • AHT20 SCL → Raspberry Pi 5 GPIO3 / SCL1 (พินจริง 5)
  • Raspberry Pi 5 → คอมพิวเตอร์/แหล่งจ่ายไฟผ่านสาย USB-C

เปิดใช้งาน I2C ก่อน: `sudo raspi-config` → Interface Options → I2C → Enable จากนั้นรีบูต (หรือแก้ไข `/boot/firmware/config.txt`) ติดตั้งไลบรารีด้วย `pip install smbus2` (หรือ `sudo apt install python3-smbus2`) บัส I2C1 ของส่วนหัว 40 พินของ Pi คือบัส 1 เสมอ ดังนั้น `SMBus(1)` จึงถูกต้องในทุกรุ่นของ Pi ที่มีส่วนหัวนี้ — คุณไม่จำเป็นต้องตรวจจับมัน

แผนภาพการต่อสาย

VCC → 3.3V GND SDA → SDA1 SCL → SCL1 Raspberry Pi AHT20

โค้ดเริ่มต้น

#!/usr/bin/env python3
"""
SBC Sensor Dashboard - Raspberry Pi 5 + AHT20 (I2C)
Before running: sudo raspi-config -> Interface Options -> I2C -> Enable, then reboot.
Install dependency: pip install smbus2   (or: sudo apt install python3-smbus2)
"""

import time
from smbus2 import SMBus, i2c_msg

AHT20_ADDR = 0x38
I2C_BUS = 1  # Pi 5's dedicated 40-pin header I2C1 bus is always bus 1

def read_aht20(bus):
    # Trigger measurement: 0xAC 0x33 0x00
    bus.write_i2c_block_data(AHT20_ADDR, 0xAC, [0x33, 0x00])
    time.sleep(0.08)  # wait ~80ms for measurement to complete

    read = i2c_msg.read(AHT20_ADDR, 6)
    bus.i2c_rdwr(read)
    data = list(read)

    humidity_raw = ((data[1] << 16) | (data[2] << 8) | data[3]) >> 4
    temp_raw = ((data[3] & 0x0F) << 16) | (data[4] << 8) | data[5]

    humidity_pct = humidity_raw / 1048576 * 100
    temp_c = temp_raw / 1048576 * 200 - 50

    return temp_c, humidity_pct

def main():
    with SMBus(I2C_BUS) as bus:
        print("SBC Sensor Dashboard - reading AHT20 every 3 seconds. Ctrl+C to stop.")
        while True:
            try:
                temp_c, humidity_pct = read_aht20(bus)
                print(f"Temp: {temp_c:.1f} C  |  Humidity: {humidity_pct:.1f}%")
            except OSError as e:
                print(f"I2C read error: {e} — check wiring/address")
            time.sleep(3)

if __name__ == "__main__":
    main()

ไม่แน่ใจขั้นตอนไหน? ถามเรา