Try   HackMD

基礎電路設計參考程式碼

基礎電路設計

LED

// 控制燈泡閃爍(單色) // Sample code // LED 燈泡閃爍 void setup() { pinMode(13,OUTPUT); // 設定pin13為輸出腳位 } void loop() { digitalWrite(13,HIGH); // 設定pin13高電位(5V) delay(1000); // 延遲1000毫秒 digitalWrite(13,LOW); // 設定pin13低電位(0V) delay(1000); // 延遲1000毫秒 }
// TRY IT ! // 呼吸燈 void setup() { pinMode(3,OUTPUT); // 設定pin3為輸出腳位 } void loop() { for (int i=0; i<=255; i++){ // 讓亮度從最暗到最亮 analogWrite(3,i); // 在pin3寫入類比訊號 delay(10); // 延遲10毫秒 } for (int i=255; i>=0; i--){ // 讓亮度從最亮到最暗 analogWrite(3,i); // 在pin3寫入類比訊號 delay(10); // 延遲10毫秒 } }
// TRY IT ! // RGB LED 燈泡閃爍 void setup() { pinMode(3,OUTPUT); // 設定pin3為輸出腳位 pinMode(5,OUTPUT); // 設定pin5為輸出腳位 pinMode(6,OUTPUT); // 設定pin6為輸出腳位 } void loop() { digitalWrite(3,HIGH); // 在pin3寫入高電位 digitalWrite(5,HIGH); // 在pin5寫入高電位 digitalWrite(6,LOW); // 在pin6寫入低電位 delay(1000); // 延遲1000毫秒 digitalWrite(3,HIGH); // 在pin3寫入高電位 digitalWrite(5,LOW); // 在pin5寫入低電位 digitalWrite(6,HIGH); // 在pin6寫入高電位 delay(1000); // 延遲1000毫秒 digitalWrite(3,LOW); // 在pin3寫入低電位 digitalWrite(5,HIGH); // 在pin5寫入高電位 digitalWrite(6,HIGH); // 在pin6寫入高電位 delay(1000); //延遲1000毫秒 }
// TRY IT ! // RGB LED 燈泡閃爍 // define #define Red 3 // 定義Red為3 #define Green 5 // 定義Green為5 #define Blue 6 // 定義Blue為6 void setup() { pinMode(Red,OUTPUT); // 設定Red為輸出腳位 pinMode(Green,OUTPUT); // 設定Green為輸出腳位 pinMode(Blue,OUTPUT); // 設定Blue為輸出腳位 } void loop() { digitalWrite(Red,HIGH); // 在Red寫入高電位 digitalWrite(Green,HIGH); // 在Green寫入高電位 digitalWrite(Blue,LOW); // 在Blue寫入低電位 delay(1000); // 延遲1000毫秒 digitalWrite(Red,HIGH); // 在Red寫入高電位 digitalWrite(Green,LOW); // 在Green寫入低電位 digitalWrite(Blue,HIGH); // 在Blue寫入高電位 delay(1000); // 延遲1000毫秒 digitalWrite(Red,LOW); // 在Red寫入低電位 digitalWrite(Green,HIGH); // 在Green寫入高電位 digitalWrite(Blue,HIGH); // 在Blue寫入高電位 delay(1000); // 延遲1000毫秒 }
// ADD // 控制燈泡閃爍(單色) bool var; // 宣告一變數為var,型態為bool void setup() { pinMode(3,OUTPUT); // 設定pin3為輸出腳位 var = true; // 令var等於true } void loop() { if (var == true){ // 判斷式:var = true digitalWrite(3,HIGH); // 在pin3寫入高電位 var = false; // 令var等於false } else{ digitalWrite(3,LOW); // input low potential var = true; // 令var等於true } delay(500); // 延遲500毫秒 }
// ADD // 隨機顏色 int randomnumber; // 宣告一變數randomnumber void setup() { Serial.begin(9600); // 設定傳輸速度 pinMode(3,OUTPUT); // 設定pin3為輸出腳位 pinMode(5,OUTPUT); // 設定pin5為輸出腳位 pinMode(6,OUTPUT); // 設定pin6為輸出腳位 analogWrite(3,0); // 在pin3寫入類比訊號0 analogWrite(5,0); // 在pin5寫入類比訊號0 analogWrite(6,0); // 在pin6寫入類比訊號0 randomSeed(analogRead(A0)); // 以analogRead(A0)取亂數種子 } void loop() { Serial.print("random = "); // 印出文字"random = ",不換行 randomnumber = random(255); // 令變數randomnumber等於一隨機數(最高255) Serial.println(randomnumber); // 印出變數randomnumber,換行 analogWrite(3,randomnumber); // 在pin3寫入類比訊號 randomnumber = random(255); // 令變數randomnumber等於一隨機數(最高255) Serial.println(randomnumber); // 印出變數randomnumber,換行 analogWrite(5,randomnumber); // 在pin5寫入類比訊號 randomnumber = random(255); // 令變數randomnumber等於一隨機數(最高255) Serial.println(randomnumber); // 印出變數randomnumber,換行 analogWrite(6,randomnumber); // 在pin6寫入類比訊號 delay(1000); // 延遲1000毫秒 }
// ADD // 霓虹燈 int r,g,b; #define Red 9 // 定義Red為9 #define Green 10 // 定義Green為10 #define Blue 11 // 定義blue為11 #define FADESPEED 10 // 定義延遲時間為10毫秒 void setup() { pinMode(Red,OUTPUT); // 設定Red腳位為輸出腳位 pinMode(Green,OUTPUT); // 設定Green腳位為輸出腳位 pinMode(Blue,OUTPUT); // 設定Blue腳位為輸出腳位 } void fadein(int sign, int pin) // 讓燈逐漸變亮 { for(sign=0; sign<256; sign++){ analogWrite(pin,sign); delay(FADESPEED); } } void fadeout(int sign, int pin) // 讓燈逐漸變暗 { for(sign=255; sign>=0; sign--){ analogWrite(pin,sign); delay(FADESPEED); } } void loop() { fadein(r,Red); fadein(b,Blue); fadein(g,Green); fadeout(r,Red); fadeout(b,Blue); fadeout(g,Green); }

蜂鳴器

// LAB // 利用蜂鳴器依序發出特定頻率 #define pin 2 // 取代‘pin’為‘2’ int frequency[7] = {262,294,330,369,415,466,523}; // Do-Si的頻率 void setup() { pinMode(pin,OUTPUT); // 設定pin腳位為輸出模式 } void loop() { for(int i=0; i<7; i++) { tone(pin, frequency[i]); // 播放特定頻率 delay(500); // 延遲 noTone(pin); // 不播放任何頻率 } }
// ADD // 倒轉 #define pin 2 // 取代‘pin’為‘2’ int frequency[7] = {262,294,330,369,415,466,523}; // Do-Si 頻率 void setup() { pinMode(pin,OUTPUT); // 設定pin腳位為輸出模式 } void loop() { for(int i=0; i<7; i++){ tone(pin, frequency[i]); // 播放特定頻率 delay(500); // 延遲 noTone(pin); // 不播放任何頻率 } for(int i=5; i>0; i--){ tone(pin, frequency[i]); // 播放特定頻率 delay(500); // 延遲 noTone(pin); // 不播放任何頻率 } }

可變電阻

// ADD // 換行顯示 void setup() { Serial.begin(9600); // 序列通訊速度為9600位元 } void loop() { Serial.println(analogRead(A0)); // 換行(ln) // analogRead(A0) 讀取腳位A0的數值 delay(500); // 每0.5秒讀一次 }
// ADD // 不換行顯示 void setup() { Serial.begin(9600); // 序列通訊速度為9600位元 } void loop() { Serial.print(analogRead(A0)); // 讀取腳位A0的數值 delay(500); // 每0.5秒讀一次 }

光敏電阻

// lab // LAB // 改變環境的亮度 → 讓光敏電阻讀值並印出結果 int ini,cur; // 宣告變數ini,fin,分別用來存取最初數值與現在數值 void setup() { pinMode(A0,INPUT); // 設定A0腳位為讀取模式 ini = analogRead(A0); // 將最初讀取的值給ini存取 Serial.begin(9600); // 設定傳輸速度為9600baud Serial.println("Ready!!"); // 印出文字 } void loop() { cur = analogRead(A0); // 讀取現在數值 if(cur - ini > 30){ // 如果現在比最初的數值大30以上 (代表有一定亮度差) Serial.println("getting lighter"); // 印出文字 } else if(ini - cur > 30){ // 如果最初的數值比現在的大30以上 (代表有一定亮度差) Serial.println("getting darker"); // 印出文字 } delay(500); // 每0.5秒取值一次 }
// TRY IT ! // 光敏電阻改變環境亮度變化 → 控制 LED 燈泡亮暗 #define pin 2 // 取代‘pin’為‘2’ int now; // 宣告變數now void setup() { //pinMode(A0,INPUT); 設定A0為讀取模式 pinMode(pin,OUTPUT); // 設定pin腳位為輸出模式 digitalWrite(pin,LOW); // 一開始不要亮 Serial.begin(9600); // 設定傳輸速度為9600baud } void loop() { now = analogRead(A0); // 將A0腳位讀到的數值設給變數now Serial.print("Right now value is : "); // 印出文字 Serial.println(now); //印出now if( now < 100 ){ // 如果now小於100 digitalWrite(pin,HIGH); // LED燈亮 } else{ // 如果now大於100 digitalWrite(pin,LOW); // LED燈暗 } }

伺服馬達

// LAB // 讓伺服馬達轉動 #include <Servo.h> // 需要匯入函式庫 Servo #define pin 9 // 選擇信號腳位為9 Servo servo_9; // 建立SERVO物件 void setup() { servo_9.attach(pin); // 將信號接至腳位9 } void loop() { servo_9.write(0); // 旋轉到0度 delay(1000); // servo_9.write(90); // 旋轉到90度 delay(1000); servo_9.write(180); // 旋轉到180度 delay(1000); }

超音波測距儀

// LAB // 在有效範圍內測量距離 // 需要匯入函式庫 #include <NewPing.h> //需匯入 NewPing 函式庫 #define TRIGpin 12 // TRIGpin 接到12腳位 #define ECHOpin 11 // ECHOpin 接到11腳位 #define Max_D 200 // 設定有效範圍為200cm NewPing m(TRIGpin, ECHOpin, Max_D); // 宣吿一個物件'm','m'為新的超音波感測器 void setup() { Serial.begin(9600); // 傳輸速度為9600baud } void loop() { int us = m.ping(); // 取得波行進的秒數 if (us>0){ Serial.print(m.convert_cm(us)); // 將時間轉換成距離 Serial.println("cm"); // 印出單位 } delay(100); // 每0.1s讀一次 }
// ADD // 不須匯入函式庫 #define trigPin 12 // Trig Pin(發出觸發訊號) #define echoPin 11 // Echo Pin long duration, cm, inches; // 宣告變數名稱 void setup() { Serial.begin (9600); // 設定傳輸速度(輸出速度與輸入速度需要一致) pinMode(trigPin, OUTPUT); // 定義此腳位為輸出 pinMode(echoPin, INPUT); // 定義此腳位為輸入 } void loop() { digitalWrite(trigPin, LOW); // 給 Trig 低電位,持續 5 微秒 delayMicroseconds(5); digitalWrite(trigPin, HIGH); // 給 Trig 高電位,持續 10 微秒 delayMicroseconds(10); digitalWrite(trigPin, LOW); // 給 Trig 低電位 pinMode(echoPin, INPUT); // 讀取 echo 的電位 duration = pulseIn(echoPin, HIGH); // 收到高電位時的時間 cm = (duration/2) / 29.1; // 將時間換算成距離 cm inches = (duration/2) / 74; // 將時間換算成距離 inch Serial.print("Distance : "); // 印出字串: Distance : Serial.print(inches); // 印出inches的數值 Serial.print("in, "); // 印出字串: in, Serial.print(cm); // 印出cm的數值 Serial.print("cm"); // 印出字串: cm Serial.println(); // 換行 delay(250); // 延遲250毫秒 }

Arduino筆記(19):HC-SR04超音波測距模組

  • 補充

    1. 採用I/O觸發測距,給至少為10us的高電位信號
    2. 模組自動發送 8個 40KHZ的方波,自動檢測是否有信號返回
    3. 有信號返回,通過I/O輸出一高電位,高電位持續的時間就是超聲波從發射到返回的時間
    4. 測試距離 =(高電位時間 x 聲速(340M / S))/ 2
    5. 聲速在攝氏20度的值為331 * 0.607t = 343.64 m/s,轉成公分每微秒為343.63 * 100(cm)/100000(us) = 3.43 * 10 E-2 cm/us,意即聲波走一公分需要的時間為1(cm) / 3.43 * 10 E-2 cm/us = 29.1 us
  • 規格

    1. 電源:DC5V/2mA
    2. 輸出電位(1/0): 5V/ 0V
    3. 精度:3mm
    4. 距離範圍:2 ~ 450cm
    5. 有效的⻆度 < 15°C
    6. 觸發輸入信號:10uS TTL pulse
    7. ECHO輸出信號: Input TTL lever signal and the range in proportion
    8. 接線方式:VCC、trig (控制端)、echo (接收端)、GND

液晶顯示器

// LAB // 顯示自己想要顯示的文字 #include <LiquidCrystal_I2C.h> // 需要下載函式庫 LiquidCrystal I2C LiquidCrystal_I2C lcd(0x27,16,2); // 宣吿一個物件'lcd','lcd'為新的液晶顯示器 void setup() { lcd.init(); // 初始化'lcd' lcd.backlight(); // 開啟背光 lcd.setCursor(0,0); // 設定游標位置(起始位置) lcd.print("Hi! I‘m Sophia!"); // 印出文字 delay(1000); // 持續1秒鐘 } void loop() { lcd.clear(); // 每次開始印之前,先清除一次 lcd.setCursor(0,0); // 設定游標位置(起始位置) lcd.print("I'm pretty!"); // 印出文字 delay(1000); // 持續1秒鐘 lcd.clear(); for (int i=0; i<16; i++){ lcd.setCursor(i, 1); // 設定游標位置(起始位置) lcd.print("Just kidding :)"); // 印出文字 delay(100); // 一個位置持續0.1秒 lcd.clear(); // 清除文字顯示 } delay(1000); // 持續一秒鐘 }
  • 補充
    1. VCC: 5V
    2. GND: for GND
    3. SDA: analog pin 4
    4. SCL: analog pin 5

溫溼度感測器

// LAB // 感測環境中的溫溼度並印出結果 #include <DHT.h> // 需要下載函式庫 DHT sensor library #define DHTTYPE DHT11 //模組名稱 // 有其他種DHT,不只有DHT11 #define pin 9 DHT dht9 (pin, DHTTYPE); // 宣吿一個物件'dht9','dht9'為新的超音波感測器 void setup() { Serial.begin(9600); // 設定傳輸速度為9600baud dht9.begin(); // 初始化dht9 } void loop() { Serial.print(dht9.readTemperature()); // 印出讀到的溫度數值 Serial.print("C,"); // 印出單位 Serial.print(dht9.readHumidity()); // 印出讀到的濕度數值 Serial.println("%"); // 印出單位 delay(2000); // 每2秒讀一次 }

RFID

[Arduino範例] RFID RC522辨識系統入門,讀取UID和比對
阿玉maker研究區

// LAB // 讀卡機 #include <SPI.h> #include <MFRC522.h> // 需下載MFRC522函式庫 #define RST_PIN 9 // RST接到9 #define NSS_PIN 10 // NSS接到10 MFRC522 mfrc522 (NSS_PIN,RST_PIN); void setup() { Serial.begin(9600); // 通訊 baud 值 SPI.begin(); mfrc522.PCD_Init(); // 初始化 MFRC522 讀卡機模組 Serial.print(F("Reader ")); // 印出文字 Serial.print(F(": ")); // 印出文字 mfrc522.PCD_DumpVersionToSerial(); // 顯示讀卡設備的版本 } void loop() { if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()){ // 檢查是否讀到卡片 // 顯示卡片內容 Serial.print(F("Card UID:")); // 印出'Card UID:' byte *id = mfrc522.uid.uidByte; // 取得卡片的UID byte idSize = mfrc522.uid.size; // 取得UID的長度 Serial.println(); for (byte i=0; i<idSize; i++){ Serial.print(id[i]+String(" ")); // 印出卡片UID } Serial.println(); // 換行 byte Card[4] = {82,244,212,26}; // 正確的卡片UID for (byte i=0; i<4; i++){ if (id[i]!=Card[i]){ // 判斷卡片UID符合 Serial.print("Access Denied!"); // 拒絕進入 break; } if (i==3){ Serial.print("Access Granted!"); // 歡迎回來 } } mfrc522.PICC_HaltA(); // 讓卡片進入停止模式 } }

LED矩陣

Arduino 8*8 LED Matrix MAX7219 實習

#include <LedControl.h> // 需下載 LedControl 函式庫 #define DIN 8 // 定義接DIN的腳位在8 #define CS 7 // 定義接CS的腳位在7 #define CLK 6 // 定義接CLK的腳位在6 #define Width 8 // 8*8矩陣 #define Height 8 LedControl LC = LedControl(DIN,CLK,CS,1); // data pin/ clock pin/ // 決定是否要傳資料/ 連接幾個led矩陣 // 設定每個燈的亮暗 8*8次 void Update(int Map[Height][Width]) { for(int i=0; i<Height; i++) { for(int j=Width-1; j>=0; j--) { LC.setLed(0,j,i,Map[7-i][j]); // 更新亮暗 } } } // 設定圖案 int On[8][8]={{0,0,1,1,1,1,0,0}, {0,1,0,0,0,0,1,0}, {1,0,1,0,0,1,0,1}, {1,0,0,0,0,0,0,1}, {1,0,1,0,0,1,0,1}, {1,0,0,1,1,0,0,1}, {0,1,0,0,0,0,1,0}, {0,0,1,1,1,1,0,0}}; void setup() { pinMode(DIN,OUTPUT); // 設定DIN腳位為輸出模式 pinMode(CS,OUTPUT); // 設定CS腳位為輸出模式 pinMode(CLK,OUTPUT); // 設定CLK腳位為輸出模式 LC.shutdown(0,false); // 供電 LC.setIntensity(0,5); // 設定亮暗 (0~15) Update(On); // 更新圖案到顯示器上 } void loop() { // 如果只想讓他亮 → 進入迴圈,但不跑任何程式 }

熱敏電阻

int now; int prev = 0; void setup() { pinMode(A0, INPUT); Serial.begin(9600); } void loop() { now = analogRead(A0); //類比輸入接到 A0 if (prev > now) { Serial.println((String(now) + String("it\'s getting colder"))); } else if (prev < now) { Serial.println((String(now) + String("it\'s getting warmer"))); } prev = now; delay(100); }
  • Same as photoresistance

LCD + LED matrix

#include <LedControl.h> #define CIN 0 #define CS 1 #define CLK 2 #define Width 8 #define Height 8 #include <LiquidCrystal_I2C.h> #include <Wire.h> LiquidCrystal_I2C lcd(0x27,16,2); //設定LCD位置0x27,設定LCD大小為16*2 LedControl LC = LedControl(CIN,CLK,CS,1); //data pin/ clock pin/ ?/ 最多控制幾個設備 void Update(int Map[Height][Width]) { for(int i=0;i<Height;i++) { for(int j=0;j<Width;j++) { LC.setLed(0,i,j,Map[i][j]); //更新亮暗 } } } //設定圖案 int On[8][8]={{0,0,1,1,1,1,0,0}, {0,1,0,0,0,0,1,0}, {1,0,1,0,0,1,0,1}, {1,0,0,0,0,0,0,1}, {1,0,1,0,0,1,0,1}, {1,0,0,1,1,0,0,1}, {0,1,0,0,0,0,1,0}, {0,0,1,1,1,1,0,0}}; int Off[8][8]={{0,0,1,1,1,1,0,0}, {0,1,0,0,0,0,1,0}, {1,0,1,0,0,1,0,1}, {1,0,0,0,0,0,0,1}, {1,0,0,1,1,0,0,1}, {1,0,1,0,0,1,0,1}, {0,1,0,0,0,0,1,0}, {0,0,1,1,1,1,0,0}}; void setup() { pinMode(CIN,OUTPUT); pinMode(CS,OUTPUT); pinMode(CLK,OUTPUT); LC.shutdown(0,false); //供不供電 LC.setIntensity(0,5); //設定亮暗 (0~15) Update(On); //更新圖案到顯示器上 lcd.init(); //初始化LCD lcd.backlight(); //開啟背光 lcd.print("Hello, World!"); //顯示Hello, World! delay(3000); } void loop() { Update(On); lcd.clear(); lcd.setCursor(0, 0);// (column,row) lcd.print("Smile"); delay(1000); Update(Off); lcd.clear(); lcd.setCursor(0, 1); lcd.print("Cry"); delay(1000); }

LCD + LED matrix + RGB LED

#include <LedControl.h> #define CIN 5 #define CS 6 #define CLK 7 #define Width 8 #define Height 8 #include <LiquidCrystal_I2C.h> #include <Wire.h> LiquidCrystal_I2C lcd(0x27,16,2); //設定LCD位置0x27,設定LCD大小為16*2 int randnumber; #define R 9 #define G 10 #define B 11 LedControl LC = LedControl(CIN,CLK,CS,1); //data pin/ clock pin/ ?/ 最多控制幾個設備 void Update(int Map[Height][Width]) { for(int i=0;i<Height;i++) { for(int j=0;j<Width;j++) { LC.setLed(0,i,j,Map[i][j]); //更新亮暗 } } } //設定圖案 int On[8][8]={{0,0,1,1,1,1,0,0}, {0,1,0,0,0,0,1,0}, {1,0,1,0,0,1,0,1}, {1,0,0,0,0,0,0,1}, {1,0,1,0,0,1,0,1}, {1,0,0,1,1,0,0,1}, {0,1,0,0,0,0,1,0}, {0,0,1,1,1,1,0,0}}; int Off[8][8]={{0,0,1,1,1,1,0,0}, {0,1,0,0,0,0,1,0}, {1,0,1,0,0,1,0,1}, {1,0,0,0,0,0,0,1}, {1,0,0,1,1,0,0,1}, {1,0,1,0,0,1,0,1}, {0,1,0,0,0,0,1,0}, {0,0,1,1,1,1,0,0}}; void setup() { pinMode(CIN,OUTPUT); pinMode(CS,OUTPUT); pinMode(CLK,OUTPUT); LC.shutdown(0,false); //供不供電 LC.setIntensity(0,5); //設定亮暗 (0~15) Update(On); //更新圖案到顯示器上 lcd.init(); //初始化LCD lcd.backlight(); //開啟背光 lcd.print("Hello, World!"); //顯示Hello, World! Serial.begin(9600); pinMode(R, OUTPUT); pinMode(G, OUTPUT); pinMode(B, OUTPUT); analogWrite(R, 0); analogWrite(G, 0); analogWrite(B, 0); randomSeed(analogRead(0)); delay(3000); } void loop() { Serial.print("random = "); randnumber = random(255); Serial.println(randnumber); analogWrite(R, randnumber); randnumber = random(255); Serial.println(randnumber); analogWrite(G, randnumber); randnumber = random(255); Serial.println(randnumber); analogWrite(B, randnumber); Update(On); lcd.clear(); lcd.setCursor(0, 0);// (column,row) lcd.print("Smile"); delay(1000); Update(Off); lcd.clear(); lcd.setCursor(0, 1); lcd.print("Cry"); delay(1000); }