这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【彩屏贪吃蛇小游戏】Let'sDo第2期活动-过程贴-PICO W网页点亮板载L

共2条 1/1 1 跳转至

【彩屏贪吃蛇小游戏】Let'sDo第2期活动-过程贴-PICO W网页点亮板载LED

助工
2024-08-13 12:48:08     打赏

一、树莓派PICO W

1.1

    PICO W和PICO的区别是前者加入了WIFI及低功耗蓝牙功能,因此PICO W无需外接其他无线模块就能开发出一些网络即时通讯、蓝牙通信等应用。以下是对PICO W参数的一些说明

    树莓派Pico W在保留 Pico 外形尺寸的同时,使用英飞凌 CYW43439 增加了板载单频 2.4GHz 无线接口(802.11n)。板载 2.4GHz 无线接口具有以下功能:

  • 无线(802.11n),单频(2.4 千兆赫)WPA3软接入点,最多支持四个客户端

  • 蓝牙 5.2

    • 支持蓝牙 LE 中央和外设功能

    • 支持经典蓝牙

    天线采用 ABRACON(前 ProAnt)授权的板载天线。无线接口通过 SPI 与 RP2040 微控制器连接。

    由于引脚限制,部分无线接口引脚是共享的。CLK 与 VSYS 监视器共享,因此只有在没有 SPI 传输时,才能通过 ADC 读取 VSYS。英飞凌 CYW43439 DIN/DOUT 和 IRQ 均共享 RP2040 上的一个引脚。只有当 SPI 没有进行传输时,才适合检查 IRQ。接口的运行频率通常为 33MHz。

为获得最佳无线性能,天线应位于较少阻碍物的空间。例如,在天线下方或附近放置金属会降低天线的增益和带宽性能。在天线两侧添加接地金属可提高天线的带宽。

    注意

CYW43439 无线芯片通过 SPI 与 RP2040 连接。CYW43439 通过该接口支持 802.11 无线和蓝牙。

image.png

PICO、PICO W实物图

PICO W 引脚布局图

image.png


1.2

PICO W支持的开发环境和PICO一样,C/C++、Python、Lua等,这里使用Python语言实现通过网页控制PICO W板载LED亮灭,

二、

IDE工具选用Thony

image.png

Python源码:

# Filename: main.py
# Raspberry Pi Pico W
# 导入Pico W MicroPython模块
import rp2 # 导入rp2模块,该模块包含专门用于RP2040的函数和类
import network  # 导入network模块,用于连接WiFi
import ubinascii # 导入ubinascii模块,用于将MAC地址转换为十六进制字符串
import machine # 导入machine模块,用于GPIO控制
import urequests as requests # 导入urequests模块,用于HTTP请求
import time # 导入time模块,用于延时
import socket # # 导入socket模块,用于建立套接字
# 设置国家/地区代码以避免发生可能的错误
# CN/US/DE/DK/GB/JP(国家或地区代码:中国/美国/德国/丹麦/英国/日本)
rp2.country('CN') # 这里设置Pico W的国家/地区代码为中国
wlan = network.WLAN(network.STA_IF) # 创建WLAN连接对象
wlan.active(True) # 激活WLAN接口

# 查看Pico W开发板无线WiFi的MAC地址
# 获取MAC地址,并将其转换为十六进制字符串
mac = ubinascii.hexlify(network.WLAN().config('mac'),':').decode()
print('Pico W MAC地址=' + mac)   # 显示Pico W开发板十六进制MAC地址

ssid = 'WIFI热点名称' # 设置WiFi名称 (ssid: service set identifier)
psw = 'WIFI热点名称'  # 设置WiFi密码

wlan.connect(ssid, psw)  # 连接到WiFi网络

timeout = 10   # 设置最长等待连接时间为10秒
while timeout > 0:
    if wlan.status() < 0 or wlan.status() >= 3: # 如果WiFi连接成功或者失败
        break # 跳出循环
    timeout -= 1
    print('等待连接!')
    time.sleep(1) # 延时1秒

# 定义Pico W板载LED闪亮函数
def onboard_led_blink(blink_numbers):
    onboard_led = machine.Pin('LED', machine.Pin.OUT) # 创建GPIO控制对象
    for i in range(blink_numbers):
        onboard_led.value(1)  # 点亮LED
        # onboard_led.on()  # 另一种点亮LED的方法
        time.sleep(0.5)  
        onboard_led.value(0) # 熄灭LED
        # onboard_led.off() # 另一种熄灭LED的方法
        time.sleep(0.5)

wlan_status = wlan.status() # 获取当前WiFi连接状态
onboard_led_blink(wlan_status) # 根据WiFi连接状态控制LED

# 处理连接错误
if wlan_status != 3: # 如果WiFi连接失败
    raise RuntimeError('WiFi连接失败!') # 抛出异常
else:
    print('WiFi已连接...')
    status = wlan.ifconfig() # 获取WiFi接口配置信息
    print('IP地址=' + status[0]) # 输出IP地址

# 定义加载HTML页面函数  
def get_html(html_name):
    with open(html_name, 'r') as file: # 打开HTML文件
        html = file.read() # 读取HTML内容
    return html

# 打开HTTP Web服务器套接字socket
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1] # 获取IP地址和端口号
s = socket.socket() # 创建socket对象
s.bind(addr) # 绑定socket到IP地址和端口号
# 开始监听端口号,最多只允许1个客户端连接
s.listen(1)

print('正在监听', addr)

onboard_led = machine.Pin('LED', machine.Pin.OUT)

# 进入循环,监听连接
while True:
    try:
        # 接受客户端连接,获取连接和地址
        cl, addr = s.accept()
        print('客户机连接来自', addr)
        # 接收客户端请求消息
        r = cl.recv(1024)
        r = str(r)
        # 在请求消息中查找是否有开/关LED的命令
        onboard_led_on = r.find('?onboard_led=1')
        onboard_led_off = r.find('?onboard_led=0')
        #DIYprint('LED=', onboard_led_on)
        #DIYprint('LED=', onboard_led_off)
        # 若找到'?onboard_led=1',则开LED
        if onboard_led_on > -1:
            print('开LED')
            onboard_led.value(1)
        # 若找到'?onboard_led=0',则关LED
        if onboard_led_off > -1:
            print('关LED')
            onboard_led.value(0)
        # 获取HTML文件内容
        response = get_html('index.html')
        # 发送HTTP响应头
        cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
        # 发送HTML文件内容
        cl.send(response)
        # 关闭客户端套接字
        cl.close()
    # 若发生OSError错误,则关闭客户端套接字并输出相关信息
    except OSError as e:
        cl.close()
        print('关闭连接')

网页HTML源码:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title>树莓派Pico W开发板</title>
        <link rel="stylesheet" href="https://www.html5tricks.com/demo/css3-gelatin-button/css/normalize.css">
        <link rel="stylesheet" href="https://www.html5tricks.com/demo/css3-gelatin-button/css/style.css" media="screen" type="text/css" />
    </head>
    <body style="background-color:#E7F8F9">
        <h3>树莓派Pico W</h3>
        <p>网页控制板载LED亮灭</p>
        <a href=\"?onboard_led=1\" class="btn"><button>ON</button></a>&nbsp;
        <a href=\"?onboard_led=0\" class="btn"><button>OFF</button></a>
        
        <script src='https://www.html5tricks.com/demo/css3-gelatin-button/js/jquery.js'></script>
        <script src="https://www.html5tricks.com/demo/css3-gelatin-button/js/index.js"></script>   
        <div style="text-align:center;clear:both;margin-top:50px">
            
            <script src="https://www.html5tricks.com/follow.js" type="text/javascript"></script>
        </div>
    </body>
    
</html>

三、实验效果

使用浏览器输入PICO W连接热点后获取的IP地址,IP地址为192.168.0.127

image.png

浏览器地址栏直接输入192.168.0.127并回车,出现如下网页

image.png

点击ON、OFF按钮可以看到PICO W板载LED的点亮、熄灭情况,同时控制台输出按键按下信息

image.png

动态GIF

HTML.gif

LED.gif





关键词: PICO W     WIFI     HTML    

专家
2024-08-14 09:27:01     打赏
2楼

学习学习


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]