Cytron Technologies
Giờ làm việc: 8:00 - 17:00
Thứ 2 - Thứ 6 (trừ ngày lễ)
Hotline 0362917357
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.
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
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
Để 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.
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.
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.