# Arduino課堂學習 112 201 17 ## LED閃爍實驗 ch4_1 設定13號接角為輸出接角 重複: 控制13接腳輸出高電壓及低電壓 插入延遲時間1秒,使觀察者看到LED燈間隔1秒持續亮滅。 #### 電路圖 ![擷取](https://hackmd.io/_uploads/B1EZZlJxR.jpg) #### 程式碼 ```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 #### 電路圖 ![擷取](https://hackmd.io/_uploads/S1c2ll1xA.jpg) #### 程式碼 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改變電位 #### 電路圖 ![擷取](https://hackmd.io/_uploads/r15glx1gA.jpg) #### 程式碼 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) ![擷取](https://hackmd.io/_uploads/ByF4W11l0.jpg) #### 程式碼 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) ![擷取](https://hackmd.io/_uploads/Sk2k1l1eR.jpg) #### 程式碼 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) ![擷取](https://hackmd.io/_uploads/HybLAJkxA.jpg) ![擷取](https://hackmd.io/_uploads/rJA20kyeR.jpg) #### 程式碼 自製 ```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(); } } } ``` 程式碼 ## 心得感想 我認為這堂課對我來說最困難的部分有兩點,一是對於電路的除錯,因為我時常找不到有問題的電子零件,二是由於的不了解要花點時間才能理解程式運作邏輯,但每次修正錯誤跟了解程式都會帶來成就感。