最近火紅的 chatGPT可以寫程式,這真的很有趣。玩了幾天後,我們來試試看是不是能跟最近玩的TinkerCAD結合。來寫一個Arduino的計時器。
我發問的問題是:
我要用i2c的LCD當輸出畫面。只有一個按紐。當我按一下按紐,放開後,會幫我記時,並顯示在LCD上。當我按一下開關後,記時會停止。請用millis()來計時。用arduino寫。
先在ChatGPT輸入我要的問題:
ChatGPT 給了我一段程式碼,因為字數限制,他停在第62行,所以我幫他補完:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
const int buttonPin = 2; // 按鈕引腳號碼
// 初始化 LCD
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// 全局變數,用於記錄按鈕按下的時間、當前時間以及計時器是否正在運行
unsigned long startTime = 0;
unsigned long currentTime = 0;
bool timerRunning = false;
void setup() {
// 初始化腳位為輸入
pinMode(buttonPin, INPUT);
// 初始化 LCD
lcd.begin(16, 2);
}
void loop() {
// 讀取按鈕狀態
int buttonState = digitalRead(buttonPin);
// 如果按鈕被按下,則啟動計時器
if (buttonState == HIGH) {
startTime = millis(); // 記錄按鈕按下的時間
timerRunning = true; // 將計時器設置為正在運行
}
// 如果按鈕被放開,則停止計時器並顯示計時資訊
else if (timerRunning == true) {
timerRunning = false; // 將計時器設置為停止
currentTime = millis(); // 記錄當前時間
unsigned long elapsedTime = currentTime - startTime; // 計算計時時間
// 將計時時間轉換為分鐘和秒
int minutes = elapsedTime / 60000;
int seconds = (elapsedTime % 60000) / 1000;
// 將計時資訊顯示在 LCD 上
lcd.clear();
lcd.print(minutes);
lcd.print(":");
lcd.print(seconds);
}
// 如果計時器正在運行,則每秒更新一次計時資訊
if (timerRunning == true) {
currentTime = millis(); // 記錄當前時間
unsigned long elapsedTime = currentTime - startTime; // 計算計時時間
// 將計時時間轉換為分鐘和秒
int minutes = elapsedTime / 60000;
int seconds = (elapsedTime % 60000) / 1000;
// 將計時資訊顯示在 LCD 上
lcd.clear();
lcd.print(minutes);
lcd.print(":");
lcd.print(seconds);
delay(1000); // 等待 1 秒
}
}
然後我們試著修改成TinkerCAD可以執行的函式庫後執行看看。其實發現他運做方式跟我們想要的是不同的。chatGPT給的程式,是想成按住按鈕的時間長度!
而這程式,雖然好像可以跑,其實是不會計數的,錯誤在第27行的判斷。按住的時候,每次都會重新把時間計入,所以後面顯示,一直為0:0。
簡單更改27跟32行。
if (buttonState == HIGH && timerRunning == false) {
startTime = millis(); // 記錄按鈕按下的時間
timerRunning = true; // 將計時器設置為正在運行
}
// 如果按鈕被放開,則停止計時器並顯示計時資訊
else if (buttonState == LOW && timerRunning == true) {
更改後就可以執行了,我在TinkerCAD上執行畫面:
雖然程式有錯,而且錯的地方不太容易抓,藏在順序邏輯裡,其實在真實模式,我應該會使用序列資料列印來找,TinkerCAD也行,但忘了可以這麼做。但是整個過程是有趣的,也讓我覺得AI厲害與不足之處。