七千二百袋水泥
七千二百袋水泥
Published on 2025-06-07 / 0 Visits

深入教程:树莓派Pico与Ethernet HAT通过ChatGPT4.0实现MQTT智能家居项目——RGB灯远程控制开发全流程与优化指南

![MQTT project with Pico and EthernetHat using ChatGPT Prompts](https://watermelonwater.tech/upload/imgs/树莓派与EthernetHat用ChatGPT实现的MQTT智能家居项目1.webp)MQTT project with Pico and EthernetHat using ChatGPT Prompts

项目所需组件清单

本项目涉及多个硬件和软件元素,确保系统完整运行。

核心硬件设备

  • PicoBricks 扩展板 x 1

  • WIZnet W5100S-EVB-Pico x 1

  • WIZnet W5500-EVB-Pico

  • WIZnet以太网HAT x 1

  • 树莓派Pico x 1

软件工具与在线服务

项目开发背景与动机

关于ChatGPT在编码领域的应用已有广泛讨论,作者曾尝试利用该工具构建简单示例或生成特定逻辑代码。然而,是否存在仅依赖ChatGPT即可完成整个项目开发的可能性?最近,ChatGPT4开放了代码解释器功能,促使我们测试这一新特性。作者采用即时书写方式,未借助任何命令或扩展应用,结果取得了显著成功。项目代码主要由ChatGPT协助完成,仅需对少量基础代码进行微调。

Pico遥控灯实现

![Image](https://watermelonwater.tech/upload/imgs/树莓派与EthernetHat用ChatGPT实现的MQTT智能家居项目2.webp)Image

项目开发通过编写并验证基础库及示例代码,再将必要部分整合实现。以下关键策略确保了效率:

  1. 使用特定模块或库时,需明确声明其名称。

  2. 执行代码后若出现错误,将错误信息和疑似问题代码告知GPT并请求修正;即使修改后错误持续,也应持续寻求解答。

  3. 清晰描述期望功能、触发条件和执行时机,以确保结果接近预期。

  4. 创建新类时,提供功能与结构相似的示例类以指导生成。

  5. 组合多个类时,分别请求各功能示例再整合,优于直接输入类信息要求完整功能。

  6. 为相同结果应用不同逻辑时,提供参考逻辑并请求适配。 这些策略可简化为:“识别提示如何解决此类问题?”若某部分效果良好,记录并尝试在个人项目中应用。

配置代码解释器环境

![Image](https://watermelonwater.tech/upload/imgs/树莓派与EthernetHat用ChatGPT实现的MQTT智能家居项目4.webp)Image ![Image](https://watermelonwater.tech/upload/imgs/树莓派与EthernetHat用ChatGPT实现的MQTT智能家居项目5.webp)Image ![Image](https://watermelonwater.tech/upload/imgs/树莓派与EthernetHat用ChatGPT实现的MQTT智能家居项目6.webp)Image

系统功能定义

创建有效提示需清晰定义功能特性,这对开发和提示编写至关重要。理解功能特性有助于提出精确问题,并划分处理模块。由于项目常需分部分开发后整合,掌握整体结构尤为关键。 Image

  • 控制设备功能

  1. 设备通过MQTT协议传输JSON格式数据至RGB灯,包含颜色和亮度调整信息。

  2. 配备按钮控制RGB颜色:按压时间短于0.5秒时切换颜色。

  3. 使用可变电阻调节灯具亮度,电阻值映射至1~100的亮度级别。

  4. OLED显示屏实时显示RGB灯颜色和亮度信息。

  • RGB灯设备功能

  1. 通过MQTT协议接收控制设备的JSON数据,解析颜色和亮度信息。

  2. 基于JSON数据调整RGB值和亮度。

  3. OLED显示屏同步显示状态信息。

  • 网络:MQTT协议

  1. 初始化设置需明确声明模块或库。请求网络与MQTT基础示例,相关信息通过define声明。默认设置包括:设备静态IP为192.168.11.101,网关192.168.11.1,子网掩码255.255.255.0,DNS服务器8.8.8.8;MQTT代理IP为192.168.11.100,主题ctrl_state,无用户名密码,保持连接60秒;SPI配置:波特率2,000,000,MOSI:19,MISO:16,SCK:18,CS:17,RESET:20。添加默认订阅与发布功能。提示中需定义用户名、IP、网关等参数。 ChatGPT一次性完成此任务,作者使用Mosquitto测试订阅和发布功能。 ![Image](https://watermelonwater.tech/upload/imgs/树莓派与EthernetHat用ChatGPT实现的MQTT智能家居项目8.webp)Image 鉴于MQTT常用于其他项目,将其封装为库:

  • 提示:将代码封装为WIZnetMQTT.py库,修改为类格式便于API使用。

  • 提示:初始化函数中拆分网络初始化部分,仅保留MQTT初始化。 收到更新库和测试示例后验证运行正常。

  1. 订阅回调机制 为提升MQTT库灵活性,允许注册回调函数处理订阅消息;若无回调,则直接返回主题和消息。

  • 提示:修改sub_cb函数增强通用性,若提供回调则使用之,否则返回数据。 代码示例:

class WIZnetMQTT:      def __init__(self, username, broker_ip, topic, keep_alive, callback=None):          …self.callback = callback      def sub_cb(self, topic, msg):          if self.callback:              return self.callback(topic, msg)          else:              return topic, msg  

测试目的下创建订阅回调函数,并添加JSON解析功能(接收消息如{"color":"R", "brightness": 0},颜色值R/G/B,亮度0.01~1)。

  • 提示:提供回调示例,解析JSON消息。 代码示例:

def example_callback(topic, msg):      try:          data = json.loads(msg)          color = data.get("color", None)          brightness = data.get("brightness", None)          …          print(f"Received color: {color}, brightness: {brightness}")      except json.JSONDecodeError:          print("Error decoding JSON!")  

执行后出现错误:

  • 提示:报告“AttributeError: 'module' object has no attribute 'JSONDecodeError'”,请求修正。 解决方案:捕获通用异常而非特定错误。 代码修正:

…except Exception:   # Catch any exception, not just JSONDecodeError…  

验证运行正常。

关键模块实现

对于模块,作者复用或扩展现有库;缺失类则创建匹配格式的版本(大部分库由ChatGPT生成)。

  1. 电位器模块 电位器逻辑简单,基于PicoBricks示例和picobricks_utils.py类结构。

  • 提示:按类格式编写电位器功能代码。 代码实现:

import machine  from machine import ADC, Pin  class Potentiometer:      ...  

Image 修改成功但输出值为1~21间小数,需映射至0~100整数。

  • 提示:添加映射函数,支持参数配置默认范围。 代码优化:

def __init__(self, pot_pin=26, read_timer=2, min_val=0, max_val=100):      self.min_val = min_val      self.max_val = max_val  def _map_value(self, value):      return ((value - 1) / (21 - 1)) * (self.max_val - self.min_val) + self.min_val  

Image

  1. 按钮模块 已有按钮类,但仅支持切换模式,添加按压模式及回调函数,并支持模式选择。

  • 提示:在类中添加按压按钮识别与控制功能。

  • 提示:拆分set_toggle_button_state为“开/关”和“按压”模式。 代码实现:

class picobricks_button:      def __init__(self, btn_pin=10, detect_time_ms=500, mode="on/off"):          self.push_callback = None          self.mode = mode  

![Image](https://watermelonwater.tech/upload/imgs/树莓派与EthernetHat用ChatGPT实现的MQTT智能家居项目11.webp)Image 验证正常后创建回调函数:基于按压动作循环RGB状态(R→G→B)。

  • 提示:创建按压回调注册函数,实现状态循环。

  • 提示:初始值设为“红(R)”,添加get函数读取RGB值。 代码示例:

class RGBController:      def __init__(self):      def cycle_rgb_state(self):  def main():      btn =picobricks_button(mode="push")      btn.set_button_callback(push_callback=rgb_controller.cycle_rgb_state)      while True:          btn.set_toggle_button_state()          time.sleep_ms(50)  

请求函数但收到类,因RGB循环复用性高,直接整合至picobricks_utils.py。 Image

  1. 斜坡控制模块 组合按钮与电位器功能时,分步请求示例再整合效果更佳。过程中修正错误。

  • 提示:创建主程序函数,在按钮按压或电位器值变化时打印RGB值和电位器值/100。

  • 提示:值变化未实时更新,请求诊断。

  • 提示:每秒读取值,仅当变化时打印。

  • 提示:修复电位器值变化时RGB自动更改的漏洞。 使用time.sleep(1)延迟非最优:

  • 提示:应用定时器逻辑,每500毫秒读取值。 代码逻辑:

current_pot_value = pot_value_scaled()  if current_pot_value != prev_pot_value:      print f"亮度值已更改为: {current_pot_value:.2f}"      prev_pot_value = current_pot_value  
  1. OLED显示模块 已有OLED类,添加多行内容显示函数。因函数名冗余,请求重命名。

  • 提示:添加oled函数支持五行独立输入。

  • 提示:未输入行不调用显示。

  • 提示:重命名函数。 利用按钮和电位器变量在OLED显示颜色和亮度:

  • 提示:创建函数在第一行打印'Color: {rgb}',第二行'Brightness: {current_pot_value}%'。

  • 提示:值变化时更新显示,仅刷新变化部分。 同时创建JSON编码函数生成消息。

  1. 灯具控制模块 基于虚拟数据生成JSON消息,整合类和函数控制RGB LED。

  • 提示:创建函数解析JSON消息,当颜色或亮度变化时控制Neopixel灯带(参考Neopixel类)。 测试正常后完善MQTT控制:输入已完成代码请求合并。分功能开发后整合更高效。

  • 提示:合并两个代码。

  • 提示:调用update_oled_display时使用相同参数执行generate_json_message和publish。

  • 提示:重命名update_oled_display以反映功能。

  • 提示:修正NameError: name 'mqtt'未定义错误。 控制设备功能分类为MQTT发布、按钮、电位器、OLED;灯具设备分类为MQTT订阅、OLED、RGB LED控制。

作者分享了提示编写日志供参考: https://chat.openai.com/share/5039b460-f0fb-4347-854a-ba2503c17311 详细内容: https://maker.wiznet.io/scarlet/projects/simple-mqtt-project-with-pico-and-ethernet-hat-using-prompt-feat-w5100s-evb-pico/?serob=rd&serterm=month 提示编写工具虽有效,但本项目提示均为作者原创。 项目完成:这是一个简单但完全由ChatGPT开发的项目。如同编码,提示使用需持续练习;小型项目从始至终的实践至关重要。首次全提示开发虽有生疏,但提升了熟练度,未来将分享更多案例。

代码资源

项目代码托管于GitHub: https://github.com/wiznetmaker/RP2040-PicoBricks-HAT-Micropython/tree/main/example/AI_Lamp 原文地址: https://www.hackster.io/wizscarlet5986/mqtt-project-with-pico-and-ethernethat-using-chatgpt-prompts-0c44eb