0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

树莓派与EthernetHat:用ChatGPT实现的MQTT智能家居项目!

上海晶珩电子科技有限公司 ? 2025-06-03 15:29 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

我们使用Pico、WIZnet W5100S 和 PicoBricks 开发板开发了MQTT RGB灯,通过ChatGPT 4.0生成和优化代码。

项目所需组件

硬件组件

PicoBricks 扩展板 x 1

WIZnet W5100S-EVB-Pico x 1

WIZnet W5500-EVB-Pico

WIZnet以太网HAT x 1

树莓派Pico x 1

软件应用和在线服务

MicroPython

项目背景

有很多关于如何用ChatGPT编码的介绍,我还尝试过用它来创建简单的例子或生成一些逻辑代码。但是有没有可能只用ChatGPT就可以开发一个项目呢?

ChatGPT4最近开放了代码解释器功能,让我们尝试使用这个新功能。我进行了即时书写,没有使用任何命令或扩展应用程序。结果如何?获得了巨大成功。

除了对一些非常简单的代码进行修改之外,大部分代码都是借助 ChatGPT 完成的。

Pico 遥控灯

7370ad22-404c-11f0-986f-92fbcf53809c.jpg


这是一份总结。请牢记这一点,并查看以下文本,看看它是如何被运用的。

这项工作是通过编写并验证基础库和示例代码,然后将必要的部分进行整合来完成的。

1.如果你正在使用特定的模块/库,请明确指出。

2.执行代码后,如果出现错误,请将错误信息以及疑似出错的代码部分告知GPT,并请求其进行修正。即使你应用了修改后的代码后错误仍然存在,也要坚持不懈地寻求解答。之后,会为你提出一个新的方向。

3.你必须清晰明确地写出你期望实现的功能、触发操作的条件、执行时机等信息,这样才能更接近你想要的执行效果。

4.在创建新类时,如果你能提供一个功能与结构相似的类作为示例,那么将会为你创建一个类似的类。

5.当组合使用各种类时,分别请求每个单独功能的示例并将它们组合起来,往往比直接输入类信息并要求得到一个完整功能的效果更好。

6.如果你想为达到同一结果而采用不同的逻辑,请提供一个逻辑示例,并请求将其应用。

与其绞尽脑汁地过度思考,不如就把它读作:“啊,他们这样用提示来解决这样的问题?”

如果你觉得:“这部分不错!”那就把它记下来,并试着在自己的项目中运用。

设置代码解释器

73878538-404c-11f0-986f-92fbcf53809c.png

73a0c85e-404c-11f0-986f-92fbcf53809c.jpg

73afc638-404c-11f0-986f-92fbcf53809c.jpg

功能定义

为了创建一个恰当的提示,需清晰勾勒出功能特性。

这部分对于开发以及编写提示都至关重要。当你对功能特性有清晰的理解时,提出的问题就会更加精确,也就能明确划分并着手处理哪些部分。

由于很多时候需要分部分开展工作然后再进行整合,因此理解整体结构就显得更为关键。

73c82340-404c-11f0-986f-92fbcf53809c.png

- 控制设备

1.控制设备将使用MQTT协议向RGB灯传输JSON格式的数据。这些数据将包含调整灯具RGB颜色和亮度的信息。

2.控制设备将配备一个按钮,用于控制RGB灯的颜色。

当按钮按下时间少于0.5秒时,将选择RGB颜色。

3.控制设备将使用可变电阻来调节灯具的亮度。

电阻值将被映射到1~100的亮度级别。

4.在OLED显示屏上显示RGB灯的颜色和亮度信息。

- RGB灯设备

1.RGB灯设备将通过MQTT协议从控制设备接收JSON格式的数据。

这些数据将包含调整灯具RGB颜色和亮度的信息。

2.RGB灯设备将根据接收到的JSON数据调整其RGB值和亮度。

3.在OLED显示屏上显示RGB灯的颜色和亮度信息。

- 网络:MQTT

1.初始化

如果你正在使用特定的模块/库,请明确指出。

请求网络和MQTT的基础示例。网络和MQTT的相关信息通过define进行声明。

MQTT默认设置

提示1:当然,这里有一个使用MicroPython和WIZNET5K驱动器进行MQTT通信的基础函数示例。在这个函数中,设备被设置为静态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。添加默认订阅和发布功能。

提示2:请在你编写的代码中定义与用户名、IP、网关、子网掩码、DNS和主题相关的内容。

ChatGPT一次性完成了这个任务。我使用Mosquitto测试了订阅和发布功能。

73dccc28-404c-11f0-986f-92fbcf53809c.jpg

由于MQTT经常在其他项目中使用,我们将其创建为一个库。

提示1:我打算将下面的代码封装成一个库,命名为WIZnetMQTT.py。请将其修改为类格式,以便于作为API使用。

提示2:在你编写的类中,我们打算将初始化函数中的网络初始化部分放到另一个函数中使用。请将其拆分,不包括网络初始化部分,仅保留MQTT初始化部分。

在收到库的更新代码以及主程序的测试示例后,我再次检查了其运行情况,它工作得很好。

2.订阅回调

为了更灵活地使用MQTT库,我们允许注册回调函数来处理订阅的消息。

如果没有提供回调函数,则设计为直接返回主题和消息。

提示1:请修改def sub_cb(self, topic, msg)函数,使其更具通用性。如果提供了回调函数,则使用该回调函数;如果没有提供,则返回主题和消息。

classWIZnetMQTT: def__init__(self, username, broker_ip, topic, keep_alive, callback=None):…self.callback = callback…defsub_cb(self, topic, msg): ifself.callback: returnself.callback(topic, msg) else: returntopic, msg

出于测试目的,我将创建一个订阅回调函数。

由于我们计划接收JSON格式的数据,我将添加一个解析函数。

提示2:另外,你能提供一个使用回调函数的示例吗?接收到的消息是JSON格式的,比如{"color":"R", "brightness": 0}。颜色值可以是'R'、'G'或'B',亮度值的范围是从0.01到1。在WIZnetMQTT类中,请包含一个能够解析这种JSON消息的回调函数。

defexample_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}") exceptjson.JSONDecodeError: print("Error decoding JSON!")

如果直接这样运行,将会出现错误。

执行后,如果发生错误,请将错误信息以及疑似存在错误的代码告知GPT,并请求修正。

即使你应用了修改后的代码但错误仍然存在,也要坚持不懈地寻求答案。随后,会提出一个新的解决方向。

提示:我在下面的example_callback函数中遇到了“AttributeError: 'module' object has no attribute 'JSONDecodeError'”错误。可能是哪里出了问题?

…To handlethis, you cancatcha more general exception, like Exception, to capture any kind of error that arises during the JSON decoding process:…except Exception: # Catch any exception,notjust JSONDecodeError…

你需要检查其是否正常运行。

模块

对于模块而言,我拥有一个之前已经创建好的库。

对于现有的类,我直接使用它们或者在其基础上进行扩展;对于不存在的类,我会创建它们以匹配相似的格式。

(这个库的大部分内容也是使用ChatGPT创建的)

1.电位器

电位器的逻辑相对简单。我将把Pico bricks提供的电位器示例,以及从picobricks_utils.py的类(picobricks_hum_temp)中引用的结构添加到提示中。

你必须清楚地写出你想要实现的功能、触发操作的条件、时间安排等,以便更接近期望的动作。

在创建一个新类时,如果你能提供一个功能与结构相似的类作为示例,那么将为你创建一个类似的类。

提示:这是电位器的基本功能代码。“pot=ADC(Pin(26)) pot_val=((pot.read_u16()/65535.0)*20) +1”。请按照下面类的格式来编写。class picobricks_hum_temp: ...

importmachinefrom machineimportADC, PinclassPotentiometer:...

73fb87bc-404c-11f0-986f-92fbcf53809c.jpg

修改虽然成功了,但输出值是一个介于1到21之间的小数

请将其更改为一个函数,使其能够将该值映射到0到100之间的整数(默认范围是0~100)。

如果你想修改输出的某一部分,无需创建新的提示,只需从已写好的输出中请求修正你希望更改的部分即可。

提示:这个函数的结果是最小值和最大值分别为1.0和21.0之间的小数。请添加一个函数,根据输入的最小值和最大值进行映射。默认值应设为1和100,并且应能够通过init方法中的参数进行配置。

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): # Map the value from [1, 21] range to [self.min_val, self.max_val] range return((value -1) / (21-1)) * (self.max_val -self.min_val) +self.min_val

740dee84-404c-11f0-986f-92fbcf53809c.jpg

2.按钮

已经为按钮创建了一个类。

然而,由于目前只有一个切换按钮模式,我将添加一个按压按钮模式以及一个按压回调函数。

此外,我还将添加模式选择功能,以便根据所选模式进行操作。

(由于默认模式是“开/关”,因此与之前编写的示例不会产生冲突)。

提示1:以下是与按钮相关的类。请在此处添加一个新函数,用于识别和控制按压按钮。同时,确保将按压按钮作为回调函数参数接收,并相应地调用它。class picobricks_button:~Omitted~

提示2:请将set_toggle_button_state函数拆分为两种模式:“开/关”(on/off)和“按压”(push)。当处于“按压”模式时,执行按压回调函数。

classpicobricks_button: def__init__(self, btn_pin=10, detect_time_ms=500, mode="on/off"): self.push_callback =None self.mode = mode

7422f022-404c-11f0-986f-92fbcf53809c.jpg

它工作得很好。让我们为这个功能创建一个回调函数。

基于按压动作,让我们将状态从红色(R)变为绿色(G),再变为蓝色(B)...并创建一个函数来读取已设置的RGB值。

提示1:创建一个函数以注册到按压回调中。实现一个逻辑,即当按下按压按钮时,RGB状态按照“红(R)”、“绿(G)”、“蓝(B)”的顺序循环变化。

提示2:使用这个函数时,初始值被设置为“蓝(B)”,请修改为从“红(R)”开始。此外,添加一个“获取(get)”函数,以便能够读取当前设置的RGB值。

classRGBController: def__init__(self): defcycle_rgb_state(self):defmain(): btn =picobricks_button(mode="push") btn.set_button_callback(push_callback=rgb_controller.cycle_rgb_state) whileTrue: btn.set_toggle_button_state() time.sleep_ms(50)

我原本请求的是一个函数,但收到的是一个类。不过,由于RGB循环似乎会以多种形式被使用,因此我会将其以类的格式直接添加到picobricks_utils.py文件中。

743733d4-404c-11f0-986f-92fbcf53809c.jpg

3.斜坡控制

在组合使用各种类时,相较于直接输入类信息并要求一个完整的功能,为每个单独的功能请求示例并将它们组合起来,往往能获得更好的效果。

基于上述内容,我们将两个功能(按钮控制和斜坡控制)组合起来。

同时,我会在过程中修改错误信息。

提示1:我需要按钮按压和电位器的示例。我需要在主程序中使用的函数。创建一个函数,每当按钮被按下或电位器值发生变化时,就打印当前的RGB值和电位器值/100的结果。~示例按钮/电位器~

提示2:当我进行这些修改时,变化并没有实时更新。可能是什么问题?

提示3:每1秒读取一次值,并在按钮和电位器值与前一次不同时打印变化的值。

提示4:存在一个漏洞,即在没有任何按钮操作的情况下,当电位器值变化时,RGB值会自动改变。请修复这个问题。

并且使用[time.sleep(1)]来实现时间延迟。但这并不是最好的方法。

如果你想为相同的结果应用不同的逻辑,请提供一个逻辑示例并请求其应用。

提示5:设置定时器,每1秒读取一次值。使用'get_time'格式而不是'sleep'。current_pot_value = pot_value_scaled() 如果 current_pot_value != prev_pot_value:打印 f"亮度值已更改为: {current_pot_value:.2f}" prev_pot_value = current_pot_value

提示6:将定时器减少到500毫秒。

4. OLED

我已经为OLED创建了一个类,现在我将添加一个新函数,该函数可以在每一行上显示不同的内容。

由于有多个打印函数,函数名变得不太易读。我请求进行修改。

提示1:请在下面的类中添加一个名为'oled'的函数,该函数允许在5行的每一行中输入不同的内容。

提示2:如果某一行没有输入内容,请确保不调用self.oled.text(line5, 5, 48)(或类似针对该行的文本显示调用)。

提示3:请重命名该函数

使用在按钮和电位器中创建的变量,在OLED上显示当前的颜色和亮度值。

由于之前有提示编写历史,因此无需输入额外的变量信息。

提示1:参考下面的函数,请创建一个函数,该函数在OLED的第一行上打印'Color: {rgb}',在第二行上打印'Brightness: {current_pot_value}%',使用提供的cur_rgb和current_pot_value值。

提示2:当值发生变化时,我希望在更改“亮度”时同时更新“颜色”显示,在更改“颜色”时也同时更新“亮度”显示。我希望两者能同时显示,并且只更新发生变化的值。

我们还将使用生成的值创建一个JSON编码函数。

5.灯具控制

创建一个灯具控制设备

首先,我们将使用虚拟数据来生成JSON消息。

利用之前创建的类和函数,根据JSON消息在OLED上显示数据,并控制RGB LED灯。

提示1:这是一个用于解析JSON消息的函数。当“颜色(color)”和“亮度(brightness)”与它们之前的值不同时,创建一个函数来控制Neopixel灯带。请参考Neopixel类。

我已经进行了测试,效果良好。

现在,各个设备的单独功能已经完成,让我们来完善MQTT控制部分。

我将输入两个已完成的代码,并请求将它们合并。

如前所述,与其一开始就要求完整的代码,不如为每个功能编写代码,然后再请求合并,这样更有效率。这种方法可以确保详细功能得到良好实现,并减少尝试次数。

我们还将更改函数名以匹配其功能。

运行代码后,如果出现错误,只需请求修改即可。

提示1:将两个代码合并。

提示2:在调用'update_oled_display'函数时,也使用与'update_oled_display'相同的参数调用'generate_json_message'函数。此外,使用'generate_json_message'返回的消息来执行'publish()'函数。

提示3:修改'update_oled_display'的函数名,以反映其更新后的功能。

提示4:NameError: name 'mqtt' isn't defined(名称错误:未定义名称'mqtt')

对于控制设备,我们将功能分类为MQTT发布、按钮、电位器和OLED。对于灯具设备,我们将功能分类为MQTT订阅、OLED和受控的RGB LED。

由于这是一个简单的任务,我直接编写了代码。

我将与你分享我在项目开发过程中使用的编写提示的过程。

我所有工作的历史记录,请参考这里的chatgpt日志。其中记录了许多尝试和失败。

项目现已完成。这是一个简单的项目,不是吗?

尽管这是一个小项目,但我们完全使用chatGPT进行了开发。

就像编码一样,练习得越多,水平就越高,使用提示似乎也是如此。

虽然体验大型项目的部分开发过程至关重要,但完成小型项目的从始至终也同样重要。

我经常使用chatGPT,但这是我第一次完全使用提示从开始到结束进行开发,我感觉自己比以前更得心应手了。

虽然这是我第一次尝试,还有些生疏,但我会继续更多地使用它。如果将来有更好的项目,我会带着另一个项目回来。

代码

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

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

    关注

    1934

    文章

    9813

    浏览量

    190846
  • 树莓派
    +关注

    关注

    121

    文章

    2024

    浏览量

    107575
  • MQTT
    +关注

    关注

    5

    文章

    687

    浏览量

    23744
  • ChatGPT
    +关注

    关注

    29

    文章

    1590

    浏览量

    9148
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    《电子发烧友电子设计周报》聚焦硬科技领域核心价值 第14期:2025.06.2--2025.06.6

    EthernetHatChatGPT实现MQTT智能家居
    发表于 06-07 16:46

    《电子发烧友电子设计周报》聚焦硬科技领域核心价值 第16期:2025.06.16--2025.06.20

    LoRaWAN 网关 /d/6726620.html 12、树莓EthernetHatCh
    发表于 06-20 19:50

    树莓与Z-wave模块制作一个智能家居的网关

    ` 本帖最后由 l1h2s3 于 2015-6-11 16:04 编辑 谁有树莓与Z-wave模块制作一个智能家居的网关的资料?ZM4101芯片与树莓
    发表于 06-10 17:53

    【NanoPi2申请】智能家居主控中心

    申请理由:我们是青岛科技大学创新科技团队,我们开发过四轴飞行器,3D打印机等多个项目,这次我们希望借助NanoPi2开发一个智能家居主控中心。基本策划是,先由NanoPi2刷入树莓G
    发表于 11-11 11:00

    【NanoPi2申请】智能家居控制系统

    申请理由:原来系统是树莓开发的,但是树莓配套的LCD屏太贵了,主要是看重NANOPI2支持DEBIAN,所以想申请一台,谢谢
    发表于 12-02 16:14

    【品胜云路由申请】智能家居

    申请理由:该项目已完成监控,电视盒,基本开关控制等功能。现暂缺一块私有云存储,存放监控视频,电影音乐文件等。待收到试用,完善整个系统,在论坛发试用心得,和智能家居系统设计教程项目描述:基于树莓
    发表于 12-23 13:42

    【SNIOT506申请】智能家居控制框架

    申请理由:正在实现一个智能家居的框架, demo是树莓3实现的(内置ble和wifi), 需
    发表于 05-24 16:58

    【7寸HDMI显示屏申请】树莓主控之智能家居

    打造一款树莓平板电脑。项目描述:树莓智能家居设计中需要
    发表于 05-31 16:30

    【orangepi zero申请】智能家居中继器

    项目名称:智能家居中继器试用计划:1,作为智能家居的中继器,向下链接各种传感器板,向上连接服务器,以便实现数据的管理与中转2,之前实用树莓
    发表于 12-27 11:16

    【下载】《Linux+树莓玩转智能家居》——亲手进行树莓应用制作

    编辑推荐树莓——最近热门的新兴技术众多爱好者希望能够亲自动手尝试进行的树莓应用制作市面上缺乏系统的中文资料近来比较受关注的智能家居技术研
    发表于 08-21 17:46

    树莓智能家居

    树莓智能家居 实用性咋样 。
    发表于 12-10 10:39

    如何利用树莓让家庭nas和智能家居中控系统进行组合呢

    如何利用树莓让家庭nas和智能家居中控系统进行组合呢?有哪些基本流程呢?
    发表于 02-22 08:34

    利用树莓实现低成本的智能家居系统

    使用树莓 Zero W,花更少的钱,让你家的电器变智能~
    的头像 发表于 05-31 06:04 ?6737次阅读

    使用树莓制作HomeKit安防监控

    树莓3B及树莓摄像头,制作可以与homekit智能家居媲美的安防监控!
    的头像 发表于 05-30 12:54 ?3812次阅读
    使用<b class='flag-5'>树莓</b><b class='flag-5'>派</b>制作HomeKit安防监控

    树莓 Zero 2 W 是开启智能家居生活的理想之选!

    想尝试智能家居自动化,又不想花费太多?树莓Zero2W或许正是你开启智能家居之旅所需的理想设备。小板子大潜力想打造一个智能家居?这想法超棒
    的头像 发表于 06-24 16:24 ?231次阅读
    <b class='flag-5'>树莓</b><b class='flag-5'>派</b> Zero 2 W 是开启<b class='flag-5'>智能家居</b>生活的理想之选!