Chất lượng không khí là một mối quan tâm lớn. Chúng ta coi thường không khí mà chúng ta hít thở, và đôi khi không khí đó đầy ô nhiễm. Cháy rừng ở Canada và cháy đồi ở Vương quốc Anh đều là những ví dụ gần đây về hỏa hoạn gây ô nhiễm không khí, vậy làm thế nào chúng ta có thể kiểm tra xem có an toàn để ra ngoài không?
Trong phần này, chúng ta sẽ xây dựng một dự án sử dụng dữ liệu chất lượng không khí từ API thời tiết mở để cung cấp cho chúng tôi một dấu hiệu về chất lượng không khí trước khi chúng tôi rời khỏi nhà. Dữ liệu được hiển thị trực quan bằng Raspberry Pi Pico W, một bộ vi điều khiển trị giá 6 đô la có thể truy cập trực tuyến, lấy dữ liệu và sau đó hiển thị dữ liệu bằng dải đèn LED NeoPixel RGB.
Xây dựng mạch
Mạch được tạo thành từ hai phần. Đầu vào và đầu ra. Đầu vào là một nút ấn đơn giản được kết nối với GPIO14 và với chân 3V3 của Pico W. Trạng thái bình thường của GPIO14 được kéo xuống Ground, về cơ bản là 0V. Khi chúng ta nhấn nút, chúng ta kết nối chân 3V3 với GPIO14, khiến nó kéo chân lên cao (lên 3,3V). Sự thay đổi trạng thái này là những gì mã của chúng tôi tìm kiếm. Đầu ra là một dải NeoPixel được kết nối với 3V3, GND và GPIO16. GPIO16 được sử dụng để gửi dữ liệu đến NeoPixels, thay đổi màu của chúng theo yêu cầu.
Các Chân GPIO trên Raspberry Pi Pico W và thanh NeoPixel sẽ cần được hàn và sử dụng một trong các bàn hàn hoặc trạm hàn tốt nhất sẽ làm cho công việc trở nên dễ dàng.
Đối với dự án này, bạn sẽ cần
Viết Mã
Mã cho dự án này được chia thành những phần cần thiết để tạo kết nối với Internet và tải xuống dữ liệu từ API, mã để chờ người dùng nhập và cuối cùng là mã để diễn giải dữ liệu qua đèn LED RGB.
1. Thực hiện theo các bước sau để tải xuống phiên bản MicroPython mới nhất cho Raspberry Pi Pico W. Các bước quan trọng nhất là tải xuống và cài đặt hình ảnh chương trình cơ sở UF2 và thiết lập Thonny. Phần còn lại là tùy chọn.
2. mở Thonny Và nhấp vào nút Dừng để làm mới kết nối. Điều này đảm bảo rằng Python Shell đang mở và hoạt động bình thường.
3. Tạo một tệp mới và dán nội dung của liên kết này. Lưu tệp dưới dạng neopixel.py vào thư mục gốc của Raspberry Pi Pico W.
4. Tạo một tệp mới cho mã dự án.
5. Nhập một loạt các mô-đun cần thiết cho dự án. Mạng cho phép Pico W kết nối với Wi-Fi, thời gian được sử dụng để kiểm soát thời gian của mã dự án, urequest được sử dụng để tìm nạp dữ liệu từ API. Máy chứa “Pin” được sử dụng để lấy và đặt trạng thái của chân GPIO, NeoPixel cho phép điều khiển dải đèn LED NeoPixel RGB.
import network
import time
import urequests
from machine import Pin
from neopixel import Neopixel
6. Tạo một đối tượng, nút và tạo kết nối với GPIO14 và sử dụng điện trở bên trong cho chân đó, kéo chân xuống (đến GND).
button = Pin(14, Pin.IN, Pin.PULL_DOWN)
7. Tạo một đối tượng, pixel, tạo kết nối giữa mã và tám NeoPixels được kết nối với GPIO16. Lưu ý rằng các pixel theo thứ tự GRB (Xanh lá cây, Đỏ, Xanh lam) cho mô-đun của chúng tôi. Nếu của bạn khác, hãy thay đổi điều này thành RGB.
pixels = Neopixel(8, 0, 16, "GRB")
số 8. Tạo một đối tượng, wlan và sử dụng nó để tạo kết nối với điểm truy cập Wi-Fi của bạn. Thay đổi SSID và MẬT KHẨU để phù hợp với AP của bạn. Thêm một khoảng tạm dừng ngắn để cho phép kết nối được thực hiện và ổn định.
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("SSID", "PASSWORD")
time.sleep(5)
9. In trạng thái kết nối tới trình bao Python.
print(wlan.isconnected())
10. Sử dụng câu lệnh có điều kiện, đặt NeoPixels nhấp nháy màu xanh lục 10 lần để biểu thị rằng kết nối đã thành công.
if wlan.isconnected() == True:
for i in range(10):
pixels.fill((0, 64, 0))
pixels.show()
time.sleep(0.1)
pixels.fill((0, 0, 0))
pixels.show()
time.sleep(0.1)
11. Nếu không thành công, hãy sử dụng vòng lặp for để nhấp nháy màu đỏ NeoPixels 10 lần.
else:
for i in range(10):
pixels.fill((64, 0, 0))
pixels.show()
time.sleep(0.1)
pixels.fill((0, 0 , 0))
pixels.show()
time.sleep(0.1)
12. Tạo một vòng lặp vô hạn và kiểm tra trạng thái của nút. Nếu không được nhấn, mã sẽ dừng ở đây. Sau khi nhấn, thụt lề sẽ chạy.
while True:
if button.value():
13. Tạo một đối tượng, aq và lưu trữ dữ liệu chất lượng không khí mới nhất. Nhấn nút sẽ kích hoạt mã để tải xuống dữ liệu ô nhiễm không khí mới nhất từ OpenWeather bằng khóa API miễn phí. Lưu ý rằng bạn sẽ phải đăng kí tài khoản miễn phí, sau đó nhấp vào tên người dùng của bạn và chọn Khóa API của tôi. Tạo khóa API mới có tên là AirPollution. Sao chép khóa API và thay thế nó trong URL dưới. Cũng thay đổi lat (vĩ độ) Và lon (kinh độ) để phù hợp với vị trí của bạn. Điều này có thể được tìm thấy qua Google Maps, của chúng tôi được đặt thành Thành phố New York.
aq = urequests.get("http://api.openweathermap.org/data/2.5/air_pollution/forecast?lat=40.714272&lon=-74.005966&appid=YOUR API KEY HERE").json()
14. Từ dữ liệu được trả về, hãy tách Chỉ số chất lượng không khí và lưu nó vào đối tượng, air_quality_index. Dữ liệu trả về có định dạng JSON, gần giống với các đối tượng lưu trữ dữ liệu từ điển của Python. Điều này có nghĩa là chúng ta có thể đọc dữ liệu chính xác bằng cách sử dụng một chuỗi khóa cụ thể. Chúng được ghi lại trong tài liệu tham khảo API OpenWeather.
air_quality_index = aq['list'][0]['main']['aqi']
15. In giá trị chỉ số chất lượng không khí ra Python shell dưới dạng một câu. Điều này là dành cho mục đích gỡ lỗi. Giá trị có thể nằm trong khoảng từ 1 đến 5. Trong đó 1 = Tốt, 2 = Khá, 3 = Trung bình, 4 = Kém, 5 = Rất Kém.
print("The Air Quality index is: ",str(air_quality_index))
16. Nếu chất lượng không khí là 1, Tốt. Đặt đèn LED nhấp nháy màu xanh lục 10 lần với độ trễ nửa giây.
if air_quality_index == 1:
for i in range(10):
pixels.fill((0, 64, 0))
pixels.show()
time.sleep(0.5)
pixels.fill((0, 0, 0))
pixels.show()
time.sleep(0.5)
17. Nếu chất lượng không khí là 2, Khá. Đặt đèn LED nhấp nháy màu xanh lam 10 lần với độ trễ nửa giây.
elif air_quality_index == 2:
for i in range(10):
pixels.fill((51,255,255))
pixels.show()
time.sleep(0.5)
pixels.fill((0, 0, 0))
pixels.show()
time.sleep(0.5)
18. Nếu chất lượng không khí là 3, Trung bình. Đặt đèn LED nhấp nháy màu tím 10 lần với độ trễ nửa giây.
elif air_quality_index == 3:
for i in range(10):
pixels.fill((153, 51, 255))
pixels.show()
time.sleep(0.5)
pixels.fill((0, 0, 0))
pixels.show()
time.sleep(0.5)
19. Nếu chất lượng không khí là 4, Kém. Đặt đèn LED nhấp nháy màu cam 10 lần với độ trễ nửa giây.
elif air_quality_index == 4:
for i in range(10):
pixels.fill((255,153,51))
pixels.show()
time.sleep(0.5)
pixels.fill((0, 0, 0))
pixels.show()
time.sleep(0.5)
20. Nếu chất lượng không khí là 5, Rất Kém. Đặt đèn LED nhấp nháy màu đỏ 10 lần với độ trễ nửa giây.
elif air_quality_index == 5:
for i in range(10):
pixels.fill((255, 0, 0))
pixels.show()
time.sleep(0.5)
pixels.fill((0, 0, 0))
pixels.show()
time.sleep(0.5)
21. Cuối cùng, đặt điều kiện khác, được kích hoạt nếu không có dữ liệu chất lượng không khí trả về, để vượt qua, cho phép vòng lặp quay lại và đợi đầu vào của người dùng.
else:
pass
22. Lưu mã dưới dạng main.py vào Raspberry Pi Pico W. Trong MicroPython, tệp main.py được chạy mỗi khi Pico khởi động.
23. Nhấp vào Chạy để bắt đầu mã. NeoPixels sẽ nhấp nháy màu xanh lục để xác nhận kết nối Wi-Fi. Nếu không, hãy kiểm tra SSID và mật khẩu của bạn có đúng không.
24. Nhấn nút để kích hoạt Pico W để truy cập trực tuyến và tải xuống dữ liệu ô nhiễm không khí mới nhất. NeoPixels sẽ hiển thị dữ liệu qua năm màu và vỏ Python sẽ hiển thị giá trị chất lượng không khí chính xác.
Hoàn thành danh sách mã
import network
import time
import urequests
from machine import Pin
from neopixel import Neopixel
button = Pin(14, Pin.IN, Pin.PULL_DOWN)
pixels = Neopixel(8, 0, 16, "GRB")
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("SSID", "PASSWORD")
time.sleep(5)
print(wlan.isconnected())
if wlan.isconnected() == True:
for i in range(10):
pixels.fill((0, 64, 0))
pixels.show()
time.sleep(0.1)
pixels.fill((0, 0, 0))
pixels.show()
time.sleep(0.1)
else:
for i in range(10):
pixels.fill((64, 0, 0))
pixels.show()
time.sleep(0.1)
pixels.fill((0, 0 , 0))
pixels.show()
time.sleep(0.1)
while True:
if button.value():
aq = urequests.get("http://api.openweathermap.org/data/2.5/air_pollution/forecast?lat=40.714272&lon=-74.005966&appid=282f4cee730d75261ae4855ee7719e44").json()
air_quality_index = aq['list'][0]['main']['aqi']
print("The Air Quality index is: ",str(air_quality_index))
if air_quality_index == 1:
for i in range(10):
pixels.fill((0, 64, 0))
pixels.show()
time.sleep(0.5)
pixels.fill((0, 0, 0))
pixels.show()
time.sleep(0.5)
elif air_quality_index == 2:
for i in range(10):
pixels.fill((51,255,255))
pixels.show()
time.sleep(0.5)
pixels.fill((0, 0, 0))
pixels.show()
time.sleep(0.5)
elif air_quality_index == 3:
for i in range(10):
pixels.fill((153, 51, 255))
pixels.show()
time.sleep(0.5)
pixels.fill((0, 0, 0))
pixels.show()
time.sleep(0.5)
elif air_quality_index == 4:
for i in range(10):
pixels.fill((255,153,51))
pixels.show()
time.sleep(0.5)
pixels.fill((0, 0, 0))
pixels.show()
time.sleep(0.5)
elif air_quality_index == 5:
for i in range(10):
pixels.fill((255, 0, 0))
pixels.show()
time.sleep(0.5)
pixels.fill((0, 0, 0))
pixels.show()
time.sleep(0.5)
else:
pass