# Arduino課堂學習 112 201 17
## LED閃爍實驗 ch4_1
設定13號接角為輸出接角
重複:
控制13接腳輸出高電壓及低電壓
插入延遲時間1秒,使觀察者看到LED燈間隔1秒持續亮滅。
#### 電路圖

#### 程式碼
```cpp=
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
```
### 一顆LED亮度變化
設定三個變數分別為led(燈泡接角),brightness(亮度),lighten(亮度變化值)
設定13號接角為輸出接角
重複:
用模組analogWrite控制亮度
用if迴圈限定brightness之數值小250若超過250則將亮度降至為0
#### 電路圖

#### 程式碼 ch4_4
```cpp=
int led =13;
int brightness = 0;
int lighten = 5;
void setup()
{
pinMode(led, OUTPUT);
}
void loop()
{
analogWrite(led,brightness);
if(brightness<250)
brightness = brightness + lighten;
else
brightness=0;
delay(50);
}
```
### 一個按鍵開關控制一個LED亮與暗
宣告3個常數分別為sw(按鍵開關接角)=2,led(燈泡接角)=13,debounceDelay(預防開關彈跳輸入多個訊號)=20
設定變數分別為ledStatus(led燈泡相連的初始接角電位)=低電位,int
設定2號接角為開關訊號輸入接角,設定13號接角為led燈泡輸出接角
重複:
藉由模組digitalRead讀取開關的訊號(高電位或低電位)且將狀態訂為int
用if迴圈判定開關是否處低電位,如果相等先延遲預防雜訊
再利用while持續檢查按鈕的狀態是否處於低電位(按下開關是否再次放開),若持續為低電位程式將停於此階段
若不是使變數ledStatus的值反轉且用模組digitalWrite改變電位
#### 電路圖

#### 程式碼 ch5_3
```cpp=
const int sw=2;
const int led=13;
const int debounceDelay=20;
int ledStatus=LOW;
int val;
void setup()
{
pinMode(sw,INPUT_PULLUP);
pinMode(led,OUTPUT);
}
void loop()
{
val=digitalRead(sw);
if(val==LOW)
{
delay(debounceDelay);
while(digitalRead(sw)==LOW)
;
ledStatus=!ledStatus;
digitalWrite(led,ledStatus);
}
}
```
## 串列埠實驗
### Arduino 傳送訊息給電腦
設定變數val為大寫字母A
設定訊息傳輸的速率(波特律)為9600bps
重複:
用for迴圈重複26次以下動作(從i=0開始,每次+1,到i=25)
1.用Serial.write寫出val+i對應字母
2.用Serial.print寫出字串 =
3.用Serial.println寫出val+i計算的數值且換行
4.延遲一秒
#### 操作畫面截圖(Serial Monitor)

#### 程式碼 ch6_1
```cpp=
byte val=65;
void setup()
{
Serial.begin(9600);
}
void loop()
{
for(int i=0;i<26;i++)
{
Serial.write(val+i);
Serial.print('=');
Serial.println(val+i);
delay(1000);
}
}
```
### Arduino 接收電腦訊息
設定變數num數值為0
設定訊息傳輸的速率(波特律)為9600bps
重複:
用if迴圈判定是否有資料可供讀取
用Serial.read模組讀取資料,且令變數num等於資料
用Serial.print寫出字串received:
用Serial.println輸出num且以十進位形式輸(DEC)
#### 操作畫面截圖(Serial Monitor)

#### 程式碼 ch6_3
```cpp=
int num = 0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
if (Serial.available() > 0)
{
num = Serial.read();
Serial.print("received:");
Serial.println(num,DEC);
}
}
```
### 鍵盤控制 LED 亮與暗 6-5
設定變數i(迴圈次數),key(讀取資料儲存處),led[] (每個led燈泡對應燈泡接角得清單),status[] (對應燈泡狀態設定為關閉)
設定訊息傳輸的速率(波特律)為9600bps,用for迴圈設定輸出接角(led[])與狀態(關閉)
重複:
用if迴圈判定是否有資料可供讀取
用Serial.read模組讀取資料,且令變數key等於資料
將變數轉換為相同的整數數字
再次判斷是否為目標設定控制亮與暗的按鍵
若是,則改變key所對應的燈泡狀態
用digitalWrite改變key對應燈泡在status[]中的狀態
用Serial.print寫出字串LED status:
用for迴圈輸出燈泡目前狀態(開=1,閉=0)
3.用Serial.println換行
#### 操作畫面截圖和拍照(Serial Monitor)


#### 程式碼 自製
```cpp=
int i;
int key;
int led[]={7,8,9,10,11,12};
int status[]={0,0,0,0,0,0};
void setup()
{
Serial.begin(9600);
for(i=0;i<5;i++)
{
pinMode(led[i],OUTPUT);
digitalWrite(led[i],LOW);
}
}
void loop()
{
if (Serial.available()>0)
{
key = Serial.read();
key=key-'0';
if(key>=0 && key<=5)
{
status[key]=!status[key];
digitalWrite(led[key],status[key]);
Serial.print("LED status:");
for(i=0;i<5;i++)
{
if(status[i]==1)
Serial.print("1");
else
Serial.print("0");
}
Serial.println();
}
}
}
```
程式碼
## 心得感想
我認為這堂課對我來說最困難的部分有兩點,一是對於電路的除錯,因為我時常找不到有問題的電子零件,二是由於的不了解要花點時間才能理解程式運作邏輯,但每次修正錯誤跟了解程式都會帶來成就感。