我们使用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 遥控灯 这是一份总结。请牢记这一点,并查看以下文本,看看它是如何被运用的。 这项工作是通过编写并验证基础库和示例代码,然后将必要的部分进行整合来完成的。 1.如果你正在使用特定的模块/库,请明确指出。 2.执行代码后,如果出现错误,请将错误信息以及疑似出错的代码部分告知GPT,并请求其进行修正。即使你应用了修改后的代码后错误仍然存在,也要坚持不懈地寻求解答。之后,会为你提出一个新的方向。 3.你必须清晰明确地写出你期望实现的功能、触发操作的条件、执行时机等信息,这样才能更接近你想要的执行效果。 4.在创建新类时,如果你能提供一个功能与结构相似的类作为示例,那么将会为你创建一个类似的类。 5.当组合使用各种类时,分别请求每个单独功能的示例并将它们组合起来,往往比直接输入类信息并要求得到一个完整功能的效果更好。 6.如果你想为达到同一结果而采用不同的逻辑,请提供一个逻辑示例,并请求将其应用。 与其绞尽脑汁地过度思考,不如就把它读作:“啊,他们这样用提示来解决这样的问题?” 如果你觉得:“这部分不错!”那就把它记下来,并试着在自己的项目中运用。 设置代码解释器 功能定义 为了创建一个恰当的提示,需清晰勾勒出功能特性。 这部分对于开发以及编写提示都至关重要。当你对功能特性有清晰的理解时,提出的问题就会更加精确,也就能明确划分并着手处理哪些部分。 由于很多时候需要分部分开展工作然后再进行整合,因此理解整体结构就显得更为关键。 - 控制设备 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测试了订阅和发布功能。 由于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:... 修改虽然成功了,但输出值是一个介于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 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 它工作得很好。让我们为这个功能创建一个回调函数。 基于按压动作,让我们将状态从红色(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文件中。 3.斜坡控制 在组合使用各种类时,相较于直接输入类信息并要求一个完整的功能,为每个单独的功能请求示例并将它们组合起来,往往能获得更好的效果。 基于上述内容,我们将两个功能(按钮控制和斜坡控制)组合起来。 同时,我会在过程中修改错误信息。 提示1:我需要按钮按压和电位器的示例。我需要在主程序中使用的函数。创建一个函数,每当按钮被按下或电位器值发生变化时,就打印当前的RGB值和电位器值/100的结果。~示例按钮/电位器~ 提示2:当我进行这些修改时,变化并没有实时更新。可能是什么问题? |
粤公网安备 44030702001224号|关于本站|小黑屋|Archiver|手机版|无线电爱好网
( 粤ICP备15040352号 )
GMT+8, 2025-6-4 09:14 , Processed in 0.140401 second(s), 18 queries .