2024.10.14 (Snowman)
今天的課程主要為3D列印的內容,在製圖方面我們學了如何使用tinkercad這個程式來畫出我們所需的列印件,而在繪圖時較為重要的是在最後圖形繪製完成後要記得將所有物件選起來並且連為群組,在將所繪製完成的列印件匯出後還要再放到Snapmaker Luban上切層並匯到隨身碟內(檔名只能是英文或數字,且盡量不要有空格或其他符號以免影響列印機判讀檔名),匯出選擇STL檔,在列印前還要記得先確定3D列印機的線材沒有纏繞的問題且PLA有正常擠出,接著要校正列印機,使噴頭距列印機四個點的z軸介於熱床的間距約為一張白紙所能抽出但不能塞回其中的距離,確認一切無誤後就可以點選檔案開始列印。其中,若想參考其他人的設計也可以搜尋thingiverse找到大家的作品。
課程心得與收穫:在第一次的VIP課程中就能學到3D的製圖以及列印機的操作使我對這次的上課內容感到印象深刻,雖然最後因為出了點技術上的問題未能如願的列印出自己畫出的可愛雪人,但能夠在升大學之後接觸到3D列印相關的東西還是很令人感到開心的,也從中學到了很多在列印前後所需要注意的小地方,例如在繪製3D圖時,要注意所繪製的各個元素是否都有在同樣的圖層之中,以免在切層時出現錯誤無法列印,在使用列印機前的校正也非常重要,關乎到了是否能列印成功的關鍵,這次雖未能如願拿到自己所繪製的雪人模型,但能一次學到這麼多東西我已心滿意足。
2024.10.21 (LED)
這次的課程內容主要為介紹基礎的電子元件:麵包板和LED(長腳為正)以及Arduino板的構造,例如電源以及類比(連續)、數位(非連續)訊號的腳位位置等,還有Arduino程式的大致架構及簡單的定義、變數與函式庫概念。其中在程式的註解方法我新學到了原來可以在開頭/* 以及結尾加上*/ ,或是在最開始的地方加入//,這兩種方式都是可行的註解方法,註解可以讓我們更直觀的理解各行程式碼的用途。在這次的課程中我們要學習自己運用Arduino、麵包版、杜邦線以及LED燈來設計一個可以點亮兩個LED燈泡並且讓兩個燈泡輪流閃爍,控制閃爍的頻率在2秒一次的小成果。
自己實際操作:運用Arduino點亮兩個LED燈泡,並讓兩個燈泡能夠輪流閃爍,控制閃爍的頻率在兩秒一次。
接線:第一個 LED 的長腳(正極)連接到 Arduino 的數位引腳 9,短腳(負極)連接到電阻,然後再接地。接著將第二個 LED 的長腳連接到 Arduino 的數位引腳 10,短腳連接到另一個電阻,然後接地。
程式碼:
// 定義 LED 腳位
const int led1Pin = 9; // LED 1 連接到引腳 9
const int led2Pin = 10; // LED 2 連接到引腳 10
void setup() {
// 設定引腳為輸出
pinMode(led1Pin, OUTPUT);
pinMode(led2Pin, OUTPUT);
}
void loop() {
// 點亮 LED 1,熄滅 LED 2
digitalWrite(led1Pin, HIGH); // LED 1 亮
digitalWrite(led2Pin, LOW); // LED 2 熄滅
delay(2000); // 等待 2 秒
// 點亮 LED 2,熄滅 LED 1
digitalWrite(led1Pin, LOW); // LED 1 熄滅
digitalWrite(led2Pin, HIGH); // LED 2 亮
delay(2000); // 等待 2 秒
}
課程心得與收穫:這次的課程讓我更加熟悉了Arduino的接線以及程式碼的各個架構等細節,其中自己找出程式碼的腳位錯誤以及自己獨立寫出一段控制LED燈閃爍時間的程式碼令我感到特別有成就感,其中要注意就算只有單獨連接LED燈與Arduino也要記得連接電阻以免因整個線路沒有電阻而導致電線燒壞短路等問題。
2024.11.11 (Button)
今天的課程是有關按鈕的原理以及實際操作的課程,首先我們學習到的第一個東西是鮑率(Serial.begin),放在void setup()區域,主要功能為告訴Arduino 要以多少的鮑率來傳送訊號,其中要注意的是電腦在序列埠也要選到相同的鮑率才可以接收到正確的訊號,不然會接收到亂碼 ;接著學到的是腳位(digitalRead),這是相對來說比較熟悉的部分,其主要功能是用來讀取Arduino在該腳位所獲得的訊號 ;再來是內容(Serial.println),在序列埠監控視窗中 print 出你想要print的東西,若是想要print 完後不換行則是將 Serial.println() 更改為 Serial.print() ;最後是if(條件){程式},如果符合所訂的條件則執行放在if 裡面的程式碼,在條件中會常常用到的符號為 不等於: != 、 等於: == 。
自己實際操作:讓按鈕按下去時LED燈會亮,沒按按鈕時LED燈不會亮的小裝置。
接線:將 LED 的長腳(正極)連接到 Arduino 的數位腳 9,短腳(負極)接到 GND,接著再將按鈕的一端連接到數位腳 2,另一端接到 GND。
程式碼:
const int buttonPin = 2; // 按鈕連接到數位腳 2
const int ledPin = 9; // LED 連接到數位腳 9
void setup() {
pinMode(buttonPin, INPUT_PULLUP); // 設定按鈕腳為輸入,並啟用內部上拉電阻
pinMode(ledPin, OUTPUT); // 設定 LED 腳為輸出
}
void loop() {
int buttonState = digitalRead(buttonPin); // 讀取按鈕狀態
if (buttonState == LOW) { // 如果按鈕被按下
digitalWrite(ledPin, HIGH); // 點亮 LED
} else {
digitalWrite(ledPin, LOW); // 熄滅 LED
}
}
課程心得與收穫:在此次的課程當中,我學到了要如何在裝置加裝按鈕來作控制,其中要注意的是按鈕的腳有分1和2如果把兩邊接錯了會形成斷路無法發揮作用,所以在接線時要特別注意,在實作的過程中我覺得要特別注意的是按鈕的方向以及LED燈的正負極還有要接電阻這些問題。在完成小小實作功課之後我們還學到了按鈕其實可以用來當上拉電阻的這項功用,以及按鈕訊號的抖動與去抖動在Arduino中序列阜監控視窗中的顯示,總而言之這節課讓我多學到了按鈕的其他公用以及按鈕實際的應用。
按鈕的原理
按鈕實作成果
(用按鈕控制 按下使LED燈發亮)
按鈕訊號的抖動
(序列阜監控視窗)
按鈕可以用來去除抖動
(按下按鈕)
2024.11.18 (Clock)
這次的課程內容是教我們運用Arduino來記錄時間 , 但在拿Arduino來看時間之前我們要先學會下載所需的模組,DS1302模組是常用於時間記錄的選擇,搭配程式庫可透過一個簡易的顯示螢幕來完成時鐘功能,在開始接線前需要先下載DS1302跟TM1637這兩個函數,DS1302利用Arduino程式庫管理員找到內管理程式庫Rtc by Makuna 直接在Arduino程式管理員下載就可以了,TM1637在Arduino程式管理員上沒有所以要自己下載並且安裝,其中管理程式庫可以從草稿碼中的匯入程式庫裡面找到,另外的下載方式是ZIP函式庫匯入,先到網路上找到要用的函式庫,在網頁上打Arduino libraryname github,就可以找到想要的函式庫資源了。
自己實際操作:透過匯入模組來運用Arduino來記錄時間,並且以外接的簡易小螢幕來顯示當前時間
程式碼:
第一部分 (用Arduino來記錄時間) (以序列阜監控視窗看時間)
#include <Wire.h>
#include <ThreeWire.h>
#include <RtcDS1302.h>
ThreeWire myWire(A6, A5, A7); //接腳: DAT/IO, SCLK/CLK, RST/CE (DS1302的接線自行更改)
RtcDS1302<ThreeWire> Rtc(myWire);
void setup ()
{
Serial.begin(9600);
Serial.print("compiled: ");
Serial.print(__DATE__);
Serial.println(__TIME__);
Rtc.Begin();
//__DATE__,__TIME__,是程式碼編譯時的日期和時間
RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
printDateTime(compiled);
Serial.println();
//判斷DS1302是否接好
if (!Rtc.IsDateTimeValid())
{
// Common Causes:
// 1) first time you ran and the device wasn't running yet
// 2) the battery on the device is low or even missing
Serial.println("RTC lost confidence in the DateTime!");
Rtc.SetDateTime(compiled);
}
if (Rtc.GetIsWriteProtected())
{
Serial.println("RTC was write protected, enabling writing now");
Rtc.SetIsWriteProtected(false);
}
if (!Rtc.GetIsRunning())
{
Serial.println("RTC was not actively running, starting now");
Rtc.SetIsRunning(true);
}
//判斷DS1302上紀綠的時間和編譯時的時間,哪個比較新
//如果編譯時間比較新,就進行設定,把DS1302上的時間改成新的時間
//now:DS1302上紀綠的時間,compiled:編譯時的時間
RtcDateTime now = Rtc.GetDateTime();
if (now < compiled)
{
Serial.println("RTC is older than compile time! (Updating DateTime)");
//編譯時間比較新,把DS1302上的時間改成編譯的時間
Rtc.SetDateTime(compiled);
}
else if (now > compiled)
{
Serial.println("RTC is newer than compile time. (this is expected)");
}
else if (now == compiled)
{
Serial.println("RTC is the same as compile time! (not expected but all is fine)");
}
}
void loop ()
{
RtcDateTime now = Rtc.GetDateTime();
printDateTime(now);
Serial.println();
//判斷DS1302是否正常,如果不正常,一般是線沒接好,或是電池沒電了
if (!now.IsValid())
{
Serial.println("RTC lost confidence in the DateTime!");
}
delay(10000); // 10秒更新一次
}
#define countof(a) (sizeof(a) / sizeof(a[0]))
//顯示完整年月日時間的副程式
void printDateTime(const RtcDateTime& dt)
{
char datestring[20];
snprintf_P(datestring,
countof(datestring),
PSTR("%02u/%02u/%04u %02u:%02u:%02u"),
dt.Month(),
dt.Day(),
dt.Year(),
dt.Hour(),
dt.Minute(),
dt.Second() );
Serial.print(datestring);
}
第二部分 (以外接的簡易小螢幕來顯示當前時間)
#include <ThreeWire.h>
#include <RtcDS1302.h>
#include <TM1637Display.h>
#define countof(a) (sizeof(a) / sizeof(a[0]))
#define CLK 11
#define DIO 12
TM1637Display display(CLK, DIO);
ThreeWire myWire(7, 6, 5); //接腳: DAT/IO, SCLK/CLK, RST/CE (DS1302的接線自行更改)
RtcDS1302<ThreeWire> Rtc(myWire);
void setup()
{
Serial.begin(9600);//鮑率57600
display.setBrightness(7);
Serial.print("compiled: ");
Serial.print(__DATE__);
Serial.println(__TIME__);
Rtc.Begin();
RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
printDateTime(compiled);
Serial.println();
if (!Rtc.IsDateTimeValid())
{
// Common Causes:
// 1) 第一次使用但設備還沒跑好
// 2) 電池電量低
Serial.println("RTC lost confidence in the DateTime!");
Rtc.SetDateTime(compiled);
}
if (Rtc.GetIsWriteProtected())
{
Serial.println("RTC was write protected, enabling writing now");
Rtc.SetIsWriteProtected(false);
}
if (!Rtc.GetIsRunning())
{
Serial.println("RTC was not actively running, starting now");
Rtc.SetIsRunning(true);
}
//判斷DS1302上紀綠的時間和編譯時的時間,哪個比較新
//如果編譯時間比較新,就進行設定,把DS1302上的時間改成新的時間
//now:DS1302上紀綠的時間,compiled:編譯時的時間
RtcDateTime now = Rtc.GetDateTime();
if (now < compiled)
{
Serial.println("RTC is older than compile time! (Updating DateTime)");
Rtc.SetDateTime(compiled);
}
else if (now > compiled)
{
Serial.println("RTC is newer than compile time. (this is expected)");
}
else if (now == compiled)
{
Serial.println("RTC is the same as compile time! (not expected but all is fine)");
}
}
void loop()
{
RtcDateTime now = Rtc.GetDateTime();
printDateTime(now);//呼叫副函數
Serial.println();
if (!now.IsValid())
{
// Common Causes:
// 1) the battery on the device is low or even missing and the power line was disconnected
Serial.println("RTC lost confidence in the DateTime!");
}
}
void printDateTime(const RtcDateTime &dt)
{
char datestring[20];
snprintf_P(datestring,
countof(datestring),
PSTR("%02u/%02u/%04u %02u:%02u:%02u"),
dt.Month(),//月
dt.Day(),//日
dt.Year(),//年
dt.Hour(),//小時
dt.Minute(),//分鐘
dt.Second());//秒
Serial.println(dt.Minute());
display.showNumberDecEx(dt.Hour(), 0b11100000, 2, 2); //前兩位數設定為小時
display.showNumberDecEx(dt.Minute(), 0b11100000, true, 2, 2); //後兩位數設定為分鐘
delay(1000);
}
課程心得與收穫:人有失足,馬有亂蹄,這次的課程可以算是目前上課以來最災難的一次,不知為何這次的板子在接好線後Arduino序列阜監控視窗所顯示的時間無論如何都是錯誤的,在換了不下五個不同的板子並獲得了五種不一樣的未來時間後,我檢查了我的線路是否有接錯或是有線路不小心鬆脫,也嘗試了換電池或是重新連接Arduino板,但最後得出來的依舊是遙遠未來時間,完全不知道問題是出在板子還是電池抑或是我自己電腦的問題,不過在經過助教們的幫忙後終於成功得出了正確的時間,而最後的第二部分接上外接小顯示螢幕的步驟也非常順利的完成了,寫序列阜監控視窗所偵測的時間也有好好地按照程式所寫的那樣每十秒跳一次數據,非常規律沒有其他問題,雖然多花了不少時間但很幸運地完成了所有實驗內容。
超級大失敗
(時間日期完全不對,類似案例*7)
正確時間
調整後顯示的正確時間
一部分裝置圖;)
(忘記拍完全體了爛掉)
正確時間
小螢幕顯示的正確時間
2024.11.25 (Dinosaur)
今天的課程是學習以伺服馬達來製作小恐龍的自動破解裝置,在小恐龍的遊戲中我們要以空白鍵控制小恐龍閃避仙人掌與飛鳥等障礙物,伺服馬達若能夠當作按下空白鍵使小恐龍跳起,光敏電阻當作眼睛來告訴伺服馬達何時應該跳過仙人掌等障礙物,就能完成自動小恐龍破解裝置,其中,光敏電阻是運用光電效應的一種特殊的電阻,當有光線照射時,電阻內原本處於穩定狀態的電子受到激發,成為自由電子。 所以光線越強,產生的自由電子也就越多,電阻就會越小,透過會變化的電阻值,進一步產生輸出強弱訊號 。
自己實際操作:運用光敏電阻以及伺服馬達來製作小恐龍破解裝置
程式碼:
#include <Servo.h> //載入函式庫,這是內建的,不用安裝
Servo myservo; // 建立SERVO物件
int r = A0 ; //假設一個字母R代替A0的孔洞
int sensorValue;
void setup() {
Serial.begin(9600);
myservo.attach(9); // 設定要將伺服馬達接到哪一個PIN腳
myservo.write(0); //歸零
// put your setup code here, to run once:
}
void loop() {
sensorValue = analogRead(r);
Serial.println(sensorValue);
if(sensorValue <= 0){ //如果光敏電阻的數值小於或大於某一數值時,則伺服馬達轉動。
myservo.write(50); //旋轉到50度
delay(100); //延遲0.1秒
myservo.write(0); //旋轉到0度
delay(100); //延遲0.1秒 可自行更改
}
}
課程心得與收穫:今天上課的內容是我覺得目前為止最有趣的一次,雖然我覺得最後的成果並不是特別理想,我覺得在接線上不是很困難,自己實際動手操作過後遇到最大的困難是要如何調整光敏電阻的數值(數值越大越敏感,有一點點黑色就帶動伺服馬達)以及整個裝置應該怎麼放會比較方便使用。在調整光敏電阻的值上面遇到的問題是有時候會遇到光敏電阻在偵測時數值沒有條好而沒有帶動伺服馬達的問題,所以要找出最好的臨界值而不讓光敏電阻太敏感甚至是太遲鈍是個小小具有挑戰的事情。第二個遇到的問題是我的伺服馬達在數值被光敏電阻偵測到後沒辦法很好的帶動塑膠片並按下電腦的空白鍵,我最後選擇調整下壓的角度試著讓塑膠片往下轉的角度再大一點,算有成功解決問題但延伸出的問題是伺服馬達會整個失控在我的空白鍵上面飄移,變成需要用手扶著他讓他不要這麼失控 ;))。最後是延遲的問題,不知道為甚麼有時候會有延遲,變成沒辦法很好的跳過障礙物,需要再調整。總而言之,原本以為作出這個裝置之後就能快樂的無情獲得超級高的分數,結果做出來之後才發現光敏電阻要手拿,另一隻手要扶著伺服馬達,還會有延遲或是沒偵測到的問題,如果成功跑到夜晚模式還要另外調整數值,所以感覺還不如自己玩比較省力。
小恐龍破解裝置
馬達與光敏電阻測試
2024.12.02 (DHT11 + Reversing radar)
今天上課的內容分為兩部分,第一部分是DHT11溫溼度模組 ,第二部分則是倒車雷達模擬。DHT11 是一種數位式的溫度溼度感測器,它的測量範圍為 0°C 到 50°C,濕度 20% 到 90%;溫度測量精度為正負2°C,濕度測量精度則是正負 5%。每次讀取訊號時間必須間隔2秒以上。工作原理量測濕度:當環境中的溼度發生變化,感濕元件會吸收或釋放濕氣,讓感測器的電容值發生變化,而通過測量電容值變化,DHT11可以透過先前校準的數值,判斷出當前的溼度值,且與此同時,熱敏電阻會測量環境的溫度。內建的控制器會將濕度和溫度值轉換為數位訊號,並將訊號輸出;微控制器會用通訊腳位與DHT11進行通訊,發出請求並接收感測器返回的數據。第二部分則是運用超聲波感測器以聲音脈衝撞擊物體,而部分聲波會反射回到接收器的特性,再加上蜂鳴器以及LED燈來製作一個倒車雷達裝置,其偵測不同距離時會發出不同頻率的聲音來做區隔,LED燈的顏色也會隨著距離而改變,其中要注意超聲波感測器的有效感測距離為2 cm ~ 200 cm。
自己實際操作 (第一部分_DHT11溫溼度感測器):藉由函式庫與DHT11溫溼度感測器來製作檢測溫濕度的裝置
程式碼:
//使用DHT11函式庫
#include <SimpleDHT.h>
//定義腳位自行更改
int pinDHT11 = 18;
//建立DHT11函式庫物件
SimpleDHT11 dht11;
void setup() {
Serial.begin(9600);
}
void loop() {
byte temperature = 0;
byte humidity = 0;
int err = SimpleDHTErrSuccess;
// start working...
Serial.println("=================================");
if ((err = dht11.read(pinDHT11, &temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
Serial.print("Read DHT11 failed, err="); Serial.println(err);delay(1000);
return;
}
Serial.print("Humidity = ");
Serial.print((int)humidity);
Serial.print("% , ");
Serial.print("Temperature = ");
Serial.print((int)temperature);
Serial.println("C ");
delay(1000); //每1秒顯示一次
}
自己實際操作 (第二部分_倒車雷達):利用蜂鳴器、超聲波感測器以及LED燈,製作類似倒車雷達的裝置。
程式碼:
#define m1 294 //頻率1
#define m5 440 //頻率2
#define h5 880 //頻率3
int red = 2;
int yellow = 3;
int green = 4;
int v=5; //蜂鳴器輸出
int trigPin = 12; //定義 觸發輸出腳位 Trig Pin
int echoPin = 11; //定義 回音接收腳位 Echo Pin
float duration, distance; //定義 時間長度duration 與 距離distance 格式為 浮點數
void setup(){
Serial.begin(9600); //設定 序列埠 鮑率
while (!Serial){ ;} //等待序列埠接通
pinMode(red, OUTPUT);
pinMode(yellow, OUTPUT);
pinMode(green, OUTPUT);
pinMode(v, OUTPUT);
pinMode(trigPin, OUTPUT); //設定 觸發輸出腳位(trigPin)的功能為 輸出(OUTPUT)
pinMode(echoPin, INPUT); //設定 回音接收腳位(echoPin)的功能為 輸入(INPUT)
}
void loop(){
//於 觸發輸出腳位 Trig Pin 產生觸發脈衝(應大於 10微秒)
digitalWrite(trigPin, LOW); // 讓觸發腳位trigPin 確實降回低電位,持續 20微秒 (us)
delayMicroseconds(20);
digitalWrite(trigPin, HIGH); // 觸發腳位trigPin 變成高電位,持續 20微秒 (us)
delayMicroseconds(20);
digitalWrite(trigPin, LOW); // 觸發腳位trigPin 再降回低電位,完成脈衝,使HC-SR04產生聲音脈衝出去
duration = pulseIn(echoPin, HIGH); // 於回音接收腳位(Echo Pin) 收到高電位(High) 的時間 (微秒 us)
distance = duration*0.0170; // 將聲音 "來回" 時間(us) 換算成距離 (cm) [ 假設聲波速率為 340 m/s ]
if (distance >= 25 ){
digitalWrite(green, HIGH);
digitalWrite(yellow, LOW); digitalWrite(red, LOW);
tone(v, m1, 200);
delay(250);
}
else if (distance >= 10 and distance <= 25){
digitalWrite(yellow, HIGH);
digitalWrite(green, LOW); digitalWrite(red, LOW);
tone(v, m5, 150);
delay(200);
}
else {
digitalWrite(red, HIGH);
digitalWrite(green, LOW); digitalWrite(yellow, LOW);
tone(v, h5, 100);
delay(150);
}
//Serial.println(distance); // 將 距離distance 傳送到序列埠暫存器
Serial.flush(); // 等待序列埠暫存器中的數據傳送至電腦完畢
delayMicroseconds(duration*1.5); //避免收到更早發出的聲音脈衝 回音
}
課程心得與收穫:今天的DHT11也要在Arduino中先裝函式庫才能使用,一樣從草稿碼裡面選擇匯入程式庫,裡面有一個管理程式庫,在搜尋框輸入「DHT11」就可以找到所需的函式庫並安裝,安裝完成並接好線後就可以打開Arduino貼上程式碼並打開序列阜監控視窗查看所偵測到的溫溼度結果,算是相當簡單易上手的一個小實作成品。第二部分則是自己動手製作一個倒車雷達裝置,雖然沒有接線圖有點難過但經過了這堂課的訓練後,我學會觀察給定的程式碼來接線,算是對於接線越來越熟練的感覺,所以在接線部分完全沒有遇到困難,算是非常順利的完成了課堂上的任務,有讓LED燈紅色代表距離較近,蜂鳴器頻率最高、間隔最短,代表汽車不可再後退;黃色代表距離尚可,蜂鳴器頻率次高、間隔次短,汽車需小心後退直到變紅色;綠色代表距離較遠,蜂鳴器頻率最低、間隔最長,汽車可放心後退,但因為我沒有黃色和綠色LED燈,所以以橘色和白色LED燈作代替。這次的課程是這學期的最後一次課了,我覺得自己的動手能力有因為這門課而變得更加熟練,令我感到最有成就感的是這次的倒車雷達接線部分,我發現我就算沒有接線圖也可以自己順利的把所有線接好,而且接的不慢!!算是跟所有器材培養好了關係 (應該啦)。
溫濕度感測器
溫濕度感測結果
倒車雷達裝置
倒車雷達裝置成果
組員: 411214208柯采彤、411214202 屠玟綺
一、理念
隨著現代生活節奏加快,倒數計時器成為日常生活中的實用工具,可用於提醒時間分配、控制流程或作為活動結束的提示。我們想利用簡單的電子元件(蜂鳴器、按鈕與時鐘面板)製作一個可自訂倒數時間的計時器,透過按鈕設定時間,倒數結束時發出蜂鳴提示音,實現低成本、高效能的創意設計。
二、材料清單
硬體材料
Arduino Uno x 1
蜂鳴器(有源或無源均可)x 1
按鈕 x 2(增加時間/啟動與減少時間/重設)
時鐘面板(7段顯示器或LCD屏) x 1
電阻(220Ω 和 10kΩ)若干
面包板 x 1
杜邦線 若干
電源供應器或USB線 x 1
軟體需求
Arduino IDE(程式開發與上傳)
LiquidCrystal或適配的顯示器驅動程式庫
三、預期結果
倒數計時器能透過按鈕設定時間並倒數,顯示剩餘時間。當倒數結束,蜂鳴器發出明顯的提示音。用戶能快速設定時間並啟動倒數,界面清晰直觀。計時器可用於烹飪、運動、會議等多場景,提升時間管理效率。