使用Raspberry Pi Pico W和MicroPython开发物联网应用

电子说

1.2w人已加入

描述

物联网

当我们提及物联网(IoT, Internet of Things)开发,可能首先想到的是Arduino或是ESP8266这样的微控制器开发板。然而,Raspberry Pi的微控制器开发板——Raspberry Pi Pico W,也是一个很好的选择。

在本项目中,将会介绍如何使用Raspberry Pi Pico W和MicroPython,并用Thonny IDE的平台来撰写程序。

Raspberry Pi Pico W 简介

Raspberry Pi Pico W是由RaspberryPi基金会出品的微控制器开发板。它配备了一个RP2040微控制器,有264KB的内部RAM,并且支持MicroPython程序语言,这让我们可以更方便地开发物联网应用。

使用上和Raspberry Pi Pico没有多大差别,只是Raspberry Pi Pico W 还支持Wi-Fi 802.11n无线网络和蓝牙,更多Raspberry Pi Pico相关介绍连结如下:

Raspberry Pi Pico family

Raspberry Pi Pico介绍(含使用ArduinoIDE和扩充板)

MicroPython简介

MicroPython是一种针对微控制器和受限环境设计的Python 3 程序语言编译程序和执行环境。这种程序语言实现了Python 3的大部分语法和特性,并对于开发板所需的低功耗和实时响应有进一步优化。MicroPython提供了丰富的API,可以直接控制微控制器的GPIO、I2C、SPI等各种硬件资源。

Thonny IDE简介

Thonny是一个专为Python初学者设计的集成开发环境(IDE)。它的介界面简单,功能强大,对于学习Python语言非常有帮助。而且,Thonny IDE 也支持 MicroPython,我们可以直接在Thonny IDE中编写MicroPython 程序,并上传到Raspberry Pi Pico W上执行。

请由  Thonny 官方网站下载 Thonny。

电路接线图

本次项目分享如何透过Thonny IDE来撰写MicroPython程序,并使用PMS5003粉尘传感器取得数值和经由Raspberry Pi Pico W的Wi-Fi功能取得目前台湾时间,并显示在OLED中。

以下介绍Raspberry Pi Pico W、Raspberry Pi Pico W扩充板、OLED、PMS5003接线图。

Raspberry Pi Pico与扩充板接法(扩充板可兼容于Raspberry Pi Pico W)

https://cavedu.gitbook.io/cavedu/raspberry_pi_pico_info/pico_breakout

物联网

Raspberry Pi Pico W扩充板与OLED接线图

物联网

Raspberry Pi Pico W扩充板与PMS5003接线图

接下来使用 Thonny IDE 来编写程序,请先下载 Raspberry Pi Pico W 的 uf2 韧体档,除非有更新版本的韧体,否则更新只要一次即可。

物联网

如何上传Raspberry Pi Pico W的uf2檔

按住 Raspberry Pi Pico W 的 BOOTSET 按钮时,插上USB连接到计算机。

物联网

Raspberry Pi Pico W 会被计算机辨识为一个磁盘,将 uf2 韧体档拖放到其中就会自动更新韧体。

物联网

Raspberry Pi Pico W连接Thonny IDE

●将Thonny IDE下载至计算机,并解压缩后开启,请选择执行>设定直译器

物联网

●选Micro Python (RP2040)

物联网

●端口选择USB序列装置(COM X)

物联网

[注] COM号要记住,后续上传程序需要正确指定 COM 号,概念如同 Aduino IDE

●确认是否抓到 Raspberry Pi Pico W

检查 Thonny IDE 下方的互动环境(Shell),如果没有红字错误讯息即可上传程序,这时候还没写,继续看下去吧。

物联网

汇入OLED函式库至 Raspberry Pi Pico W

本项目需要透过 OLED 显示模块来显示数值,故需要先汇入OLED 函式库

1. 下载 OLED 函式库,档名ssd1306.py到您的计算机

2. 在 Thonny IDE 中安装套件

我们可由 Thonny IDE 呼叫系统命令行来安装 python 套件,请由工具–> 开启系统命令行

物联网

开启系统命令行,如下图

物联网

3. 安装 adafruit-ampy 套件

为了顺利执行程序,我们需要安装 adafruit-ampy 套件,用于透过串行端口与 CircuitPython 或 MicroPython 开发板互动,

安装方式就是一般的 pip 指令,相当简单:

4. 汇入OLED函式库到RaspberryPi Pico W

cd module_library

ampy --port COMX put ssd1306.py

[注]请注意,并不是开启下方的窗口,若出现下方窗口,则要再按一次开启系统命令行。

物联网

5. 如何查看已汇入的函式库

在 Thonny IDE 中,点选检视 -> 档案,可以查看Raspberry Pi Pico W中汇入的档案

物联网

确认已汇入先前所操作的档案

物联网

执行程序

本专题有两个程序 (或下载原始码,或由以下复制也可以):

在 OLED 显示时间(

OLED_wifitime.py

)

在 OLED 显示 PMS5003 粉尘传感器数值(

PMS5003_OLED.py

)

OLED_wifitime.py

import machine

import utime

import ssd1306

from time import sleep

import network

import ntptime

import urequests

i2c = machine.SoftI2C(scl=machine.Pin(15),sda=machine.Pin(4))

oled_width = 128

oled_height = 64

oled = ssd1306.SSD1306_I2C(oled_width,oled_height, i2c)

# 初始化 UART

uart = machine.UART(0, baudrate=9600,tx=machine.Pin(0), rx=machine.Pin(1), timeout=1000)

uart.init(9600, bits=8, parity=None,stop=1)

# 初始化WiFi

sta_if = network.WLAN(network.STA_IF)

sta_if.active(True)

wifi_ssid = "XXXXX"

wifi_password = "XXXXXXX"

sta_if.connect(wifi_ssid, wifi_password)

# 显示WiFi连接状态

oled.fill(0)

oled.text('WiFi:', 0, 0)

if sta_if.isconnected():

oled.text('connected', 40, 0)

else:

oled.text('connceting', 40, 0)

oled.show()

#设定时区

TIME_ZONE = 8

# 取得NTP时间

#ntptime.settime()

for i in range(5):

try:

ntptime.settime()

break

except OSError:

print('Error connecting to NTP server, retrying...')

utime.sleep(5)

else:

print('Could not connect to NTP server after 5 retries.')

# 等待一段时间

utime.sleep(3)

while True:

t= utime.localtime(utime.time() + TIME_ZONE * 3600)

oled.fill(0)

oled.text(str("%d/%02d/%02d" % (t[0], t[1], t[2])), 0, 0)

oled.text(str("%02d:%02d:%02d" % (t[3], t[4], t[5])), 0, 16)

oled.show()

utime.sleep(1)

PMS5003_OLED.py

import machine

import utime

import ssd1306

from time import sleep

i2c = machine.SoftI2C(scl=machine.Pin(15),sda=machine.Pin(4))

oled_width = 128

oled_height = 64

oled = ssd1306.SSD1306_I2C(oled_width,oled_height, i2c)

# 初始化 UART

uart = machine.UART(0, baudrate=9600,tx=machine.Pin(0), rx=machine.Pin(1), timeout=1000)

uart.init(9600, bits=8, parity=None,stop=1)

while True:

#读取 PMS5003 数据

data = bytearray(uart.read(32))

# 判断是否为正确的PMS5003 资料

if data is not None and len(data) >= 10 and data[0] == 0x42 anddata[1] == 0x4d:

pm1_cf = int.from_bytes(data[4:6], 'big')

pm25_cf = int.from_bytes(data[6:8], 'big')

pm10_cf = int.from_bytes(data[8:10], 'big')

#清除 OLED

oled.fill(0)

# 显示 PMS5003 数据

oled.text("PM1.0: %d ug/m3" % pm1_cf, 0, 22)

oled.text("PM2.5: %d ug/m3" % pm25_cf, 0, 38)

oled.text("PM10 : %d ug/m3" % pm10_cf, 0, 54)

# 更新 OLED

oled.show()

utime.sleep(1)

实际展示

执行程序之后,可在 OLED 显示模块上看到相关信息,恭喜成功啰!

物联网

物联网

 

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分