ChatGPT帮写Arduino代码初体验

最近ChatGPT很火,可是我都只拿来聊天和问一下乱七八糟的东西。最近工作需要写一段Arduino代码,一向讨厌编程的我拖拉了很久都没有动笔动键盘。昨天准备入眠的时候躺在床上我突然想到,不是说ChatGPT写代码很厉害吗?让它帮我写这部分代码试试看咯?看看人工智能是不是真的进化到了威胁辅助我们的工作的步。

我的需求:

我需要利用控制两个继电器来模拟我新设计的OTP动态令牌原型机上面的两个按键。当继电器的电极闭合时,相当于按键的两个引脚被导通,视为按键按下。当继电器的电极分离时,相当于按键的两个引脚断开,视为按键松开。

以下面这张产品照片为例,我的测试流程可以简化为:按下电源开关、输入开机密码、按键选择内置程序、等待动态令牌生成、等待自动关机。反复重复这个过程。

某厂家的OTP动态令牌,仅为示意之意,非本人设计

开机键和数字键两个按键有不同的时序,“按下”“松开”的动作要反复、自动地进行1万次以上。中途我需要停下测量原型机电池的电量。有时我还想临时停止自动按键,改为手动按键操作几次。

我希望利用电脑上菜单选择、键盘输入的方式来控制Arduino Relay Shield开发板上的两个继电器。

所以,我的需求可以总结成下面几点:

Arduino在系统开始时会弹出一个菜单列表供我选择想进行的操作:手动模式、自动模式以及测量电池电量

  • 手动模式里,Arduino可以及时响应我的键盘输入来操作对应的继电器
  • 自动模式里,Arduino首先询问我需要生成动态令牌的个数,再预估完成的时间,并且自动执行。当我想要退出自动模式时可以随时退出。
  • 测量电池电量里,Arduino可以自动读取电池电量值并且转换成伏特单位输出。

ChatGPT没有办法帮我们搭建实际的硬件电路,所以我需要先把电路搭建好之后再让ChatGPT帮我写代码。

我的硬件:

我用一块树莓派Raspberry Pi 3 来控制Arduino Uno开发板,Arduino Relay Shield直接插在开发板上。继电器的两个电极用焊接的方式连接到原型机的按键上。原型机电池电压通过一个上位开关(P-MOSFET做的High Side Switch)连接到Arduino Uno开发板的A0口。

大致的连接图

我和ChatGPT的对话:

ChatGPT是一款聊天机器人,只能通过文字的形式与它交互。它的训练语言是英文,因此我决定用英文与它对话。

下面是我第一次发给它的内容:

【礼貌告诉ChatGPT我需要一段Arduino代码】

I need an Arduino code to control my prototype built by Arduino Relay Shield board and Arduino Uno Board Rev3. In this code, I need following functions:

【告诉ChatGPT我需要调用Arduino上的第8和第12脚来控制继电器,并且高电平继电器闭合,低电平继电器打开】

1. I want to control two relays by pin 12 and pin 8 on Arduino Uno.

The first relay on pin 12 should be called “RELAY_1”, the second relay on pin 8 should be called “RELAY_2”.

All pins should be configured as output and their stats should be LOW by default.

If I want to activate the relay, the relay pin should be set to HIGH for 100ms with notification message on serial output then go back to LOW again; The messages should be like this:

  • when “RELAY_1” is activated, it displays “*ENTER* \t is pressed”
  • when “RELAY_2” is activated, it displays “*1* \t is pressed”

【告诉ChatGPT我要在A0脚测量VDD电压,并且测量开关设置在Arduino第2脚】

2. I need also measure VDD voltage value on pin A0. So I need to set pin A0 to analog input. The pin 2 of Arduino Uno is used active the measurement, I’d call it “VDD_Measure_CMD”. It has to be configured as output but it should be HIGH by defaut.

【让Arduino启动时显示选择菜单】

3. When I open Serial Monitor of Arduino IDE, the program starts. It displays a menu on serial output for me to choose.

The menu should ask me to choose among 3 functions : “Manual Mode”, “Automatic Mode”, “VDD Measurement”; I’d enter “1” for “Manual Mode”, “2” for “Automatic Mode”, “3” for “VDD Measurement”. If I enter anything else, the program asks me to enter again because it is not a valid command for it.

【手动模式的操作】

4. If I choose “Manual Mode”, the program tell me that “Manual Mode is chosen” and it waits for my input again to decide what to do by asking “which relay do you want to active ? Enter “q” to quit”

  • If my input is “1”, RELAY_1 will be activated once, then disactivated.
  • If my input is “2”, RELAY_2 will be activated once, then disactivated.
  • If my input is “3”, RELAY_3 will be activated once, then disactivated. It will continue to ask me “which relay do you want to active ?” until I decide to quit “manual mode”;

I can quit “Manual Mode” at any moment by enter “q” and go back to menu. If I enter anything else, the program asks me to enter again because it is not a valid command for it.

【自动模式的操作】

5. If I choose “Automatic Mode”, I can generate OTP tokens automatically.

The program will first tell me that “Automatic Mode is chosen” and then ask me “HOW many OTP tokens do you want to generate ?” I’ll then enter the number of OTP tokens for it to run in a loop. This number can be greater than 100000. In the loop do the following:

  • a. tell me how many OTP tokens left to be generate, and how long does it take to finish it in format of DD:HH:MM:SS.
  • b. generate OTP tokens by execute “OTP_Generation” function.
  • c. quit “Automatic Mode” at any moment if I enter “q”;

To generate OTP tokens, “OTP_Generation” function should do following:

  • a. activate “RELAY_1”, wait for 5 secondes;
  • b. activate “RELAY_2”, wait for 1 secondes;
  • c. activate “RELAY_2”, wait for 1 secondes;
  • d. activate “RELAY_2”, wait for 1 secondes;
  • e. activate “RELAY_2”, wait for 1.5 secondes;
  • f. activate “RELAY_2”, wait for 5.5 secondes;

【VDD测量】

6. If I choose “VDD Measurement”, the program tell me that “VDD Measurement is chosen”. VDD_Measure_CMD should first be set to LOW for 10ms, the the program reads the voltage value of VDD at pin A0, convert it from bit to volt, and print it on serial output. VDD_Measure_CMD should be set back to HIGH after analog read.

【设置退出模式】

7. When I quit any of these three modes, the program will ask me to choose again from the menu.

第一次尝试:

当所有需求一次提出时, 代码生成一半就中断,不知道是不是免费用户算力受限制的原因,打算等待到夜间需求不高的时候再尝试。

第二次尝试:

我在夜间ChatGPT需求不高的时候重复了之前的问题,代码还是无法完整生成。询问ChatGPT是否是因为代码长度过长的原因,ChatGPT回答并不是。

于是尝试让ChatGPT直接生成一个.ino文件,但是ChatGPT无法生成文件只能回复文字类内容:

于是让ChatGPT生成可以直接下载的文字代码。ChatGPT返回了三个github的链接,但是全部无法打开(404 Page Not Found),即使我已经登录Github账号。不知道是不是这项服务不稳定还是因为我是免费用户。

再次尝试让ChatGPT把代码分段在对话框里发给我,ChatGPT开始说胡话了。明明是关于继电器的代码,ChatGPT开始返回伺服马达和液晶显示的代码:

第三次尝试:

我决定减轻一点ChatGPT的负担,把我的需求分成多次提出,以便ChatGPT可以生成较简短的代码,之后我再手动将它们合并。

于是,我对ChatGPT提出了新的要求:

  • 帮我写一个选择菜单的代码
  • 帮我写一个手动控制继电器的代码
  • 帮我写一个自动控制继电器的代码
  • 帮我写一个测量VDD电压的代码

这次ChatGPT就有用多了,帮我生成了四部分的代码,每段代码都可以独立正常使用,而且代码结构简洁,注释清楚明白,比我写的代码可读性好多了(笑)。

手动将四段代码在Arduino IDE合并在一起,统一四段代码的变量名,编译,运行,测试,成功!

心得

ChatGPT可以帮助我们写代码,但是需要我们的需求提出得非常清晰,而且需要具体到每个参数和每个函数。在完善我的文字版需求之后,这段需求文字的长度甚至会比最后的代码长度长出不少。

对于一个专业成熟的软件工程师来说,借助目前的ChatGPT生成代码所需要花费的时间肯定会比自己直接动手写要久的多;对于一个完全不懂代码的人,通常都无法精确提出需求,就算ChatGPT勉强写出了代码,他/她也无法检查ChatGPT所生成的代码是否可以正常使用没有错误。

目前来看,ChatGPT生成代码(更精确地说,生成Arduino代码)适用人群是有一点代码基础,但是并不精通或者说并不熟练于编程的用户。比如软件产品的项目经理或者需要自己写一部分代码的硬件工程师。

对目前版本的ChatGPT来说,想借助它来帮助我们写代码,需要注意以下几点:

  • 给ChatGPT提需求需要明确、清晰到几乎等于白话文版本的代码
  • 尽量把完整需求切成几个小部分,分部分实现。否则ChatGPT无法顺利生成完整代码
  • 整合完整代码时需要检查统一不同部分的变量与函数

《ChatGPT帮写Arduino代码初体验》有2个想法

  1. 我也试过让ChatGPT帮我实现某个具体设计思路(写网页代码或者PLC的),总体来说相当于一个实习生,能干点简单的事,但没法独立完成工作,代码多半有点小问题,比如有时候给我两份几乎一模一样的代码然后告诉我这是两种不同的实现。。或者有时候代码根本跑不通,你必须指出来问题在哪他才会给你改。当然大部分情况下认错态度还是不错的。。虽然偶尔会嘴硬坚持犯错。。
    拿来写邮件、改语法、润色或者翻译这类文科工作相当好用,但绝对不能让他做计算的事,百分之八十的概率会信心满满语气坚定地给你一个错误答案……所以不要问他那种你自己都没把握的问题,或者稍后自己谷歌验证一下答案。。
    给出链接是错的这个问题我也遇到过。毕竟他不是搜索引擎且没有接入互联网的能力。
    另外代码不完整是因为回答有5000字限制,他停下来你得发continuer才能让他继续输出后面的内容,付费用户也是一样的。注意代码中断后继续的部分也可能不太完整,也要自己检查……
    新的版本GPT-4似乎支持输出更长的文本了(好像2w字?)

    1. 代码中断之后我让它继续发,它说它发完了……再问它是不是它的回答有字数长度限制,它说没有……
      你的比喻很恰当,它现在的水平确实相当于做简单工作的实习生,但是也很厉害了。第四次技术革命已经开始了

发表评论