Cytron Technologies

Giờ làm việc: 8:00 - 17:00

Thứ 2 - Thứ 6 (trừ ngày lễ)

Hotline 0362917357 

IoTRoomCoverPhoto

Giám Sát Phòng IoT Thời Gian Thực Trên Maker Pi Pico Bằng Sử Dụng pyRTOS

Tổng Quát

Trong dự án này, chúng mình sẽ xây dựng một thiết bị có thể giám sát nhiệt độ phòng, độ ẩm và chất lượng không khí bằng sử dụng cảm biến Grove trên Maker Pi Pico. Vì pyRTOS giusp cho chúng ta thêm các tính năng mới dễ dàng hơn, và chúng ta sẽ thêm càng nhiều nhiệm vụ vào hệ thống. Cho ví dụ, phát hiện chuyển động, âm thanh, hiển thị dữ liệu trên màn hình OLED, và thậm chí nhiện vụ IoT sẽ gửi dữ liệu đến Blynk. Biểu đồ chương trình được hiển thi bên dưới.

Program Flowchart

Trước khi bắt đầu..

Nếu bạn chưa đọc hướng dẫn cách cài đặt pyRTOS trên Maker Pi Pico, bn có thể tham khảo tại đây. Trong dự án này, úng ta sẽ sử dụng CircuitPython. Bạn có thể tải xuống tệp .uf2 để cài đặt CircuitPython trên Maker Pi Pico tại đây.

Thành phần sử dụng

 

Phần 1: Thêm nhiệm vụ cho cảm biến & màn hình

Trong phần này, chúng ta sẽ thêm cảm biến vào hệ thống. Chúng ta sẽ bắt đầu với loại dễ hơn, sau đó thêm vào những cái phức tạp hơn. Với pyRTOS, bạn có thể quản lý các chức năng đã thêm của mình dễ dàng hơn vì chusg được phân chia theo nhiệm vụ. Hãy nhớ nhập các thư viện cần thiết và khai báo các biến ở đầu mã code. Thông thường danh sách sẽ phát triển khi bạn thêm nhiều tác vụ vào hệ thống.

import pyRTOS
import board
import digitalio
import adafruit_dht
import analogio
import busio
import adafruit_ssd1306
import adafruit_requests as requests
import adafruit_espatcontrol.adafruit_espatcontrol_socket as socket
from adafruit_espatcontrol import adafruit_espatcontrol

temp = 0.0                                      # Initialize global variables
humidity = 0.0                                  # Initialize global variables
air = 0.0                                       # Initialize global variables
motion = 0                                      # Initialize global variables
sound = 0                                       # Initialize global variables

Đầu tiên, chúng ta sẽ thêm cảm biến chuyển động PIR (Hồng ngoại thụ động) vao chương trình . Kết nối Cảm biến chuyển động PIR Grove  đến cổng GROVE 1 của Maker Pi Pico. Cổng này sử dụng GP1 for the digital inputcho đầu ra kỹ thuật số. 

def DetectMotion(self):
    PIR = digitalio.DigitalInOut(board.GP1)     # Setup PIR sensor pin
    PIR.direction = digitalio.Direction.INPUT   # Setup pin as digital input
    global motion                               # Use the global variable
    yield

    while True:
        if PIR.value:                           # If the PIR sensor detects motion
            motion = 1                          # Update the global variable
        yield [pyRTOS.timeout(0.1)]             # Delay in seconds (Other task can run)

Tiếp theo, chúng ta sẽ thêm Cảm biến âm thanh vào hệ thống. Kết nối Cảm biến âm thanh Grove với cổng GROVE 2 của Maker Pi Pico. Cổng này sử dụng GP3 cho đầu vào kỹ thuật số.

def DetectSound(self):
    mic = digitalio.DigitalInOut(board.GP3)     # Setup sound sensor pin
    mic.direction = digitalio.Direction.INPUT   # Setup pin as digital input
    global sound                                # Use the global variable
    yield

    while True:
        if mic.value:                           # If the sound sensor detects loud sound
            sound = 1                           # Update the global variable
        yield [pyRTOS.timeout(0.1)]             # Delay in seconds (Other task can run)

Chúng tôi cũng sẽ thêm Cảm biến chất lượng không khí Grove. Kết nối cảm biến với cổng GROVE 6 của Maker Pi Pico. Cổng này sử dụng ADC1 trên chân GP27 cho đầu vào tương tự. Chúng ta cần chuyển đổi giá trị tương tự nhận được thành tỷ lệ phần trăm như trong đoạn mã dưới đây. Tỷ lệ phần trăm cao hơn có nghĩa là ô nhiễm cao hơn.

def AirQuality(self):                           
    airq = analogio.AnalogIn(board.A1)          # Setup air quality sensor on pin A1
    conv = 330 / (65535)                        # Formula to convert analog value to percentage
    global air                                  # Use the global variable
    yield

    while True:
        air = round((airq.value * conv), 2)     # Round off the value to 2 decimal places and update
        yield [pyRTOS.timeout(0.2)]             # Delay in seconds (Other task can run)

Chúng tôi sẽ thêm  Cảm biến nhiệt độ và độ ẩm DHT11. Kết nối cảm biến với cổng GROVE 3 của Maker Pi Pico. Cổng này sử dụng GP5 làm đầu vào kỹ thuật số. Tuy nhiên, việc đọc DHT11 không đơn giản như các cảm biến trước đó. Nó có giao thức riêng để gửi dữ liệu đến bộ vi điều khiển. Vì vậy, chúng tôi sẽ sử dụng thư viện được cung cấp trong Cytron’s Github cho DHT11 cho CircuitPython. 

def ReadDHT11(self):
    dhtDevice = adafruit_dht.DHT11(board.GP5)
    global temp
def ReadDHT11(self):
    dhtDevice = adafruit_dht.DHT11(board.GP5)   # Setup DHTT11 on pin GP5
    global temp                                 # Use the global variables
    global humidity
    yield

    while True:
        try:
            temp = dhtDevice.temperature        # Update the global variables
            humidity = dhtDevice.humidity
        except RuntimeError as error:           # Errors happen fairly often,
            print(error.args[0])                # DHT's are hard to read,
            continue                            # just keep going     
        except Exception as error:
            dhtDevice.exit()
            raise error
        yield [pyRTOS.timeout(1)]               # Delay in seconds (Other task can run)

Cuối cùng, chúng tôi sẽ thêm Màn hình OLED để hiển thị thông tin trong thời gian thực. Kết nối Màn hình OLED với cổng GROVE 5 của Maker Pi Pico. Cổng này sử dụng I2C 0, là GP9 (SCL) và GP8 (SDA). chúng tôi sẽ sử dụng thư viện được cung cấp trong Cytron’s Github cho OLED cho CircuitPython.

def DisplayOLED(self):
    i2c = busio.I2C(board.GP9, board.GP8)               # Setup I2C pins with GP9 and GP8
    oled = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c)   # Setup OLED display using the above pins
    global temp                                         # Use global variables
    global humidity
    global air
    yield

    while True:
        oled.fill(0)                             # Erase the OLED display

        oled.text('Temperature = ', 0, 0, 1)     # Write the data
        oled.text(str(temp), 90, 0, 1)
        oled.text('Humidity = ', 0, 25, 1)
        oled.text(str(humidity), 90, 25, 1)
        oled.text('Air Pollution = ', 0, 50, 1)
        oled.text(str(air), 90, 50, 1)

        oled.show()                              # Show the written data
        yield [pyRTOS.timeout(0.5)]              # Delay in seconds (Other task can run)

Bạn có thể thử từng tác vụ một, sử dụng lệnh in để hiển thi dữ liệu và kiểm tra xem nó có hoạt động hay không. Đừng quên thêm các nhiệm vụ và chạy pyRTOS ở cuối mã code của bạn

pyRTOS.add_task(pyRTOS.Task(DetectMotion))  # Add Tasks
pyRTOS.add_task(pyRTOS.Task(DetectSound))
pyRTOS.add_task(pyRTOS.Task(ReadDHT11))
pyRTOS.add_task(pyRTOS.Task(AirQuality))
pyRTOS.add_task(pyRTOS.Task(DisplayOLED))
# pyRTOS.add_task(pyRTOS.Task(SendData))

pyRTOS.start()                              # Start pyRTOS

 

Phần 2: Thêm nhiệm vụ IoT (Blynk 2.0)

Để bắt đầu, chúng ta cần sao chép thư viện IoT vào thư mục Maker Pi Pico lib. Chúng tôi cũng sẽ cần tệp secret.py để kết nối với đám mây Blynk. Để bắt đầu, hãy đăng ký và đăng nhập vào Blynk. Sau khi đăng nhập, hãy thêm một mẫu mới. Sau khi thêm mẫu, bạn có thể thêm thiết bị mới. Tiếp theo, chỉnh sửa trang tổng quan để bắt đầu thêm các chân ảo trong dòng dữ liệu. Cuối cùng, sửa đổi bảng điều khiển để hiển thị giá trị của các chân ảo. Blynk của bạn đã được thiết lập xong! Danh sách luồng dữ liệu, trang tổng quan web và trang tổng quan di động của bạn sẽ trông giống như thế này sau khi thiết lập.

blynk datastream
blynk dashboard
Blynk Mobile

Bạn sẽ cần phải sửa đổi tệp secret.py để đặt SSID, mật khẩu và mã thông báo xác thực blynk của mình. Bạn có thể tìm thấy mã xác thực trong tab “thông tin thiết bị” trong hình trên. Kết nối ESP01 với cổng của nó trên Maker Pi Pico. Cổng sử dụng GP16 là TX và GP17 là RX.

def SendData(self):
    global temp
    global humidity
    global air
    global motion
    global sound
    try:
        from secrets import secrets
    except ImportError:
        print("All secret keys are kept in secrets.py, please add them there!")
        raise
    # Initialize UART connection to the ESP8266 WiFi Module.
    RX = board.GP17
    TX = board.GP16
    uart = busio.UART(TX, RX, receiver_buffer_size=2048)  # Use large buffer as we're not using hardware flow control.
    esp = adafruit_espatcontrol.ESP_ATcontrol(uart, 115200, debug=False)
    requests.set_socket(socket, esp)
    print("Resetting ESP module")
    esp.soft_reset()
    # Connect to WiFi
    print("Connecting to WiFi...")
    esp.connect(secrets)
    print("Connected!")
    yield

    while True:
        # Update the blynk datastream using HTTP GET requests
        requests.get("https://blynk.cloud/external/api/update?token=" + secrets["blynk_auth_token"] + "&v0=" + str(temp))
        yield [pyRTOS.timeout(0.5)]           # Let other tasks run
        requests.get("https://blynk.cloud/external/api/update?token=" + secrets["blynk_auth_token"] + "&v1=" + str(humidity))
        yield [pyRTOS.timeout(0.5)]           # Let other tasks run
        requests.get("https://blynk.cloud/external/api/update?token=" + secrets["blynk_auth_token"] + "&v2=" + str(air))
        yield [pyRTOS.timeout(0.5)]           # Let other tasks run
        requests.get("https://blynk.cloud/external/api/update?token=" + secrets["blynk_auth_token"] + "&v3=" + str(motion))
        yield [pyRTOS.timeout(0.5)]           # Let other tasks run
        requests.get("https://blynk.cloud/external/api/update?token=" + secrets["blynk_auth_token"] + "&v4=" + str(sound))
        yield [pyRTOS.timeout(0.5)]           # Let other tasks run
        # Reset the global variables
        if motion:
            motion = 0
        if sound:
            sound = 0
        yield [pyRTOS.timeout(0.5)]           # Delay in seconds (Other task can run)

Đừng quên nhập các thư viện cần thiết. Nếu bạn vẫn gặp phải các lỗi như “tên ‘cái gì đó’ không được xác định” hoặc mô-đun không được xác định ngay cả khi bạn đã sao chép tệp vào Maker Pi Pico của mình, hãy cố gắng di chuyển tệp vào hoặc ra khỏi tệp lib của Maker Pi Pico . Mã hoàn thiện được sử dụng trong hướng dẫn này có thể được tìm thấy tại đây.

 

Phần 3: In 3D Vỏ (Tùy Chọn)

Giờ đây, hệ thống đã hoạt động ở cấp độ phần mềm, phần cứng cần phải được thu dọn gọn gàng để nó trông giống như một thiết bị thích hợp. Vỏ được thiết kế trong Fusion 360 như một bộ phận duy nhất với bản lề phẳng và các tính năng đóng chặt. Mô hình được cắt trong Cura với cài đặt mặc định cho Ender 3 ở chiều cao lớp 0,28mm. Bạn có thể tải xuống các tệp CAD của phần này tại đây hoặc tại đây. Phần được thiết kế để phù hợp với các cảm biến mà không cần bất kỳ vít hoặc keo. Bạn sẽ chỉ cần vít để gắn Maker Pi Pico vào vỏ. Nếu các lỗ hoặc tính năng đóng nhanh quá chặt / lỏng khi bạn in 3D, bạn có thể cần phải sửa đổi kích thước của các lỗ. Điều chỉnh cài đặt mở rộng ngang ban đầu của bạn trước khi in. Của tôi là -0,15mm.

Fusion 360

Ultimaker Cura

Theo dõi
Thông báo của
guest
0 Comments
Phản hồi nội tuyến
Xem tất cả bình luận