这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【换取手持示波器】树莓派PICOW网页烟花

共1条 1/1 1 跳转至

【换取手持示波器】树莓派PICOW网页烟花

助工
2025-02-07 21:54:47     打赏

1、简介

正是新年喜庆日,借此使用PICOW实现Web网站功能,将网页版烟花部署到PICOW Web服务器,此时局域网内所有设备均可访问到该网页版烟花

2、操作步骤

下载Python固件

https://www.raspberrypi.com/documentation/microcontrollers/micropython.html

长按PICOW开发板的boot按键不动将PICOW通过USB数据线连接至PC

image.png


将图中uf2文件拷贝至左边磁盘

3、Thonny编程

通过电脑通过CDC串口连接到PICOW

image.png

Python源码

# Filename: main.py
# Raspberry Pi Pico W
# 导入Pico W MicroPython模块
import micropython
micropython.alloc_emergency_exception_buf(10000)
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)
        # 接收客户端请求消息
 
        # 获取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 charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Realistic Fireworks on ESP32-C3</title>
    <style>
        body {
            margin: 0;
            overflow: hidden;
            background-color: #000;
        }
 
        .particle {
            position: absolute;
            width: 3px;
            height: 3px;
            border-radius: 50%;
            opacity: 0.8;
            animation: fadeOut 1.5s ease-out forwards;
        }
 
        @keyframes fadeOut {
            0% {
                opacity: 0.8;
            }
            100% {
                opacity: 0;
            }
        }
    </style>
</head>
<body>
    <script>
        // 烟花粒子类
        class Particle {
            constructor(x, y, color, angle, speed) {
                this.x = x;
                this.y = y;
                this.color = color;
                this.angle = angle;
                this.speed = speed;
                this.gravity = 0.1; // 重力
                this.element = document.createElement("div");
                this.element.classList.add("particle");
                this.element.style.backgroundColor = this.color;
                this.element.style.left = `${this.x}px`;
                this.element.style.top = `${this.y}px`;
                document.body.appendChild(this.element);
            }
 
            update() {
                this.speed -= this.gravity; // 模拟重力
                this.x += Math.cos(this.angle) * this.speed;
                this.y += Math.sin(this.angle) * this.speed;
                this.element.style.left = `${this.x}px`;
                this.element.style.top = `${this.y}px`;
 
                // 如果粒子超出屏幕或速度过小,移除它
                if (this.y > window.innerHeight || this.speed < 0) {
                    this.element.remove();
                    return false;
                }
                return true;
            }
        }
 
        // 烟花类
        class Firework {
            constructor(x, y) {
                this.x = x;
                this.y = y;
                this.color = this.getRandomColor();
                this.particles = [];
                this.createParticles();
            }
 
            // 生成随机颜色
            getRandomColor() {
                const colors = ["#FF0000", "#00FF00", "#0000FF", "#FFFF00", "#FF00FF", "#00FFFF"];
                return colors[Math.floor(Math.random() * colors.length)];
            }
 
            // 创建粒子
            createParticles() {
                const numParticles = 50; // 粒子数量
                for (let i = 0; i < numParticles; i++) {
                    const angle = (Math.PI * 2) * (i / numParticles); // 均匀分布的角度
                    const speed = Math.random() * 5 + 2; // 随机速度
                    this.particles.push(new Particle(this.x, this.y, this.color, angle, speed));
                }
            }
 
            // 更新烟花状态
            update() {
                this.particles = this.particles.filter(particle => particle.update());
            }
        }
 
        // 烟花管理器
        const fireworks = [];
 
        // 生成烟花
        function createFirework() {
            const x = Math.random() * window.innerWidth;
            const y = Math.random() * (window.innerHeight / 2); // 烟花在屏幕上半部分生成
            fireworks.push(new Firework(x, y));
        }
 
        // 更新所有烟花
        function updateFireworks() {
            fireworks.forEach((firework, index) => {
                firework.update();
                if (firework.particles.length === 0) {
                    fireworks.splice(index, 1); // 移除已完成的烟花
                }
            });
        }
 
        // 定时生成烟花
        setInterval(createFirework, 1000);
 
        // 动画循环
        function animate() {
            updateFireworks();
            requestAnimationFrame(animate);
        }
 
        animate();
    </script>
</body>
</html>

将index.html保存在PICOW中

image.png

4、运行效果

等待客户端连接

image.png

使用电脑浏览器访问192.168.43.143地址,可以看到如下烟花效果

9()O_@WY@SMDHMDXU5J74VX.png

I0`_TUN[X8WEDA%4E})$FX1.png





关键词: PICOW网页烟花    

共1条 1/1 1 跳转至

回复

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