ChatGPT + TinkerCAD + 計時器設計

最近火紅的 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厲害與不足之處。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *