สวัสดีครับ สําหรับเนื้อหาในบทความนี้เราจะอธิบายถึง Function ที่ Arduino เตรียมไว้ให้เราใช้ ว่าแต่ละ Function มีไว้ทําอะไร ใช้งานอย่างไร โดยผมจะหยิบมาเฉพาะที่ใช้กันบ่อยๆ มาดูกันเลยครับ
สารบัญ
- Digital I/O
- Analog I/O
- Time
- Math
- Trigonometry
- Random Numbers
- Bits and Bytes
digitalRead()
Description
เป็น Function สําหรับอ่านค่าจาก I/O โดยระบุ Pin ที่ต้องการจะอ่าน ค่าที่ได้จะเป็น HIGH หรือ LOW
Syntax
digitalRead(pin);
Parameters
pin: Pin number ที่ต้องการจะอ่าน
Returns
HIGH หรือ LOW
Example Code
Sets pin 13 to the same value as pin 7, declared as an input. กําหนดให้ Pin 13 มีค่าตามที่อ่านได้จาก Pin 7
int ledPin = 13; // LED connected to digital pin 13
int inPin = 7; // pushbutton connected to digital pin 7
int val = 0; // variable to store the read value
void setup() {
pinMode(ledPin, OUTPUT); // sets the digital pin 13 as output
pinMode(inPin, INPUT); // sets the digital pin 7 as input
}
void loop() {
val = digitalRead(inPin); // read the input pin
digitalWrite(ledPin, val); // sets the LED to the button's value
}
digitalWrite()
Description
กําหนดค่า HIGH หรือ LOW ให้กับ digital pin
โดยเราจะต้องกําหนด Pin เป็น OUTPUT ก่อนโดยใช้ Function pinMode()
หลังจากนั้นเมื่อเรากําหนดค่าให้กับ Pin นั้นเป็น HIGH จะมีกระแสไฟฟ้าออกจาก Pin นั้น 3.3V หรือ 5V แล้วแต่ชนิดของ Arduino board และถ้าเรากําหนดค่าให้กับ Pin นั้นเป็น LOW จะมีกระแสไฟฟ้า ออกจาก Pin นั้น 0V
Syntax
digitalWrite(pin, value);
Parameters
pin: the Arduino pin number. value: HIGH or LOW.
Returns
Example Code
ตัวอย่างนี้เป็นโปรแกรมไฟกระพริบโดยจะหน่วงเวลา 1 วินาที
void setup() {
pinMode(13, OUTPUT); // sets the digital pin 13 as output
}
void loop() {
digitalWrite(13, HIGH); // sets the digital pin 13 on
delay(1000); // waits for a second
digitalWrite(13, LOW); // sets the digital pin 13 off
delay(1000); // waits for a second
}
pinMode()
Description
เป็น Function ที่ใช้ในการ Set mode ของ Pin ว่าจะเป็น mode ไหน เช่น INPUT, OUTPUT, or INPUT_PULLUP
Syntax
pinMode(pin, mode);
Parameters
pin: Pin number mode: INPUT, OUTPUT, or INPUT_PULLUP
Returns
Example Code
ตัวอย่างนี้เป็นโปรแกรมไฟกระพริบโดยจะหน่วงเวลา 1 วินาที
void setup() {
pinMode(13, OUTPUT); // sets the digital pin 13 as output
}
void loop() {
digitalWrite(13, HIGH); // sets the digital pin 13 on
delay(1000); // waits for a second
digitalWrite(13, LOW); // sets the digital pin 13 off
delay(1000); // waits for a second
}
analogRead()
Description
เป็น Function สําหรับอ่านค่า Analog จาก Pin ที่ต้องการ ซึ่ง Input จะอ่านค่าแรงดันไฟฟ้าจาก Pin ที่กําหนด แล้วแปลงเป็นข้อมูล Digital 10-bit จะได้ความละเอียดอยู่ที่ 1024 ตัวอย่างถ้าเราอ่านข้อมูลจาก Arduino board ชนิดที่ใช้แรงดันไฟฟ้า 5V เราก็จะอ่านได้ที่ความระเอียด 5/1024 = 0.0049 volts (4.9 mV) ต่อหน่วย
ตารางด้านล่างนี้เป็นตารางข้อมูลของ Arduino board แต่ละรุ่น
BOAR | VOLTAGE | PINS | MAX RESOLUTION |
---|---|---|---|
Uno | 5 Volts | A0 to A5 | 10 bits |
Mini, Nano | 5 Volts | A0 to A7 | 10 bits |
Mega, Mega2560, MegaADK | 5 Volts | A0 to A14 | 10 bits |
Micro | 5 Volts | A0 to A11 | 10 bits |
Leonardo | 5 Volts | A0 to A11 | 10 bits |
Zero | 3.3 Volts | A0 to A5 | 12 bits |
Due | 3.3 Volts | A0 to A11 | 12 bits |
MKR Family boards | 3.3 Volts | A0 to A6 | 12 bits |
Syntax
analogRead(pin);
Parameters
pin: Pin number
Returns
ค่าที่อ่านได้จาก Pin ที่กําหนด มี type เป็น Int
Example Code
อ่านค่าจาก Pin A3 แล้วแสดง
int analogPin = A3; // potentiometer wiper (middle terminal) connected to analog pin 3
// outside leads to ground and +5V
int val = 0; // variable to store the value read
void setup() {
Serial.begin(9600); // setup serial
}
void loop() {
val = analogRead(analogPin); // read the input pin
Serial.println(val); // debug value
}
analogReference()
Description
Function สําหรับกําหนดแรงดันไฟฟ้าสูงสุดที่ต้องการจะอ่านจากจาก Analog Pin
Arduino AVR Boards (Uno, Mega, Leonardo, etc.)
- DEFAULT: the default analog reference of 5 volts (on 5V Arduino boards) or 3.3 volts (on 3.3V Arduino boards)
- INTERNAL: an built-in reference, equal to 1.1 volts on the ATmega168 or ATmega328P and 2.56 volts on the ATmega32U4 and ATmega8 (not available on the Arduino Mega)
- INTERNAL1V1: a built-in 1.1V reference (Arduino Mega only)
- INTERNAL2V56: a built-in 2.56V reference (Arduino Mega only)
- EXTERNAL: the voltage applied to the AREF pin (0 to 5V only) is used as the reference.
Arduino SAMD Boards (Zero, etc.)
- AR_DEFAULT: the default analog reference of 3.3V
- AR_INTERNAL: a built-in 2.23V reference
- AR_INTERNAL1V0: a built-in 1.0V reference
- AR_INTERNAL1V65: a built-in 1.65V reference
- AR_INTERNAL2V23: a built-in 2.23V reference
- AR_EXTERNAL: the voltage applied to the AREF pin is used as the reference
Arduino megaAVR Boards (Uno WiFi Rev2)
- DEFAULT: a built-in 0.55V reference
- INTERNAL: a built-in 0.55V reference
- VDD: Vdd of the ATmega4809. 5V on the Uno WiFi Rev2
- INTERNAL0V55: a built-in 0.55V reference
- INTERNAL1V1: a built-in 1.1V reference
- INTERNAL1V5: a built-in 1.5V reference
- INTERNAL2V5: a built-in 2.5V reference
- INTERNAL4V3: a built-in 4.3V reference
- EXTERNAL: the voltage applied to the AREF pin (0 to 5V only) is used as the reference
Arduino SAM Boards (Due)
- AR_DEFAULT: the default analog reference of 3.3V. This is the only supported option for the Due.
Syntax
analogReference(type)
Parameters
type: รายละเอียดอยู่ใน Description ด้านบน
Returns
analogWrite()
Description
เป็น Function สําหรับกําหนดค่า Output Analog โดยจะใช้หลักการ PWM สัญญานที่ออกจาก Pin จะเป็นระดับแรงดันไฟฟ้าตามที่เรากําหนด
ตารางด้านล่างเป็นรายละเอียดของ Arduino board แต่ละรุ่น
BOARD | PWM PINS | PWM FREQUENCY |
---|---|---|
Uno, Nano, Mini | 3, 5, 6, 9, 10, 11 | 490 Hz (pins 5 and 6: 980 Hz) |
Mega | 2 - 13, 44 - 46 | 490 Hz (pins 4 and 13: 980 Hz) |
Leonardo, Micro, Yún | 3, 5, 6, 9, 10, 11, 13 | 490 Hz (pins 3 and 11: 980 Hz) |
Uno WiFi Rev.2 | 3, 5, 6, 9, 10 | 976 Hz |
MKR boards * | 0 - 8, 10, A3 (18), A4 (19) | 732 Hz |
MKR1000 WiFi * | 0 - 8, 10, 11, A3 (18), A4 (19) | 732 Hz |
Zero * | 3 - 13, A0 (14), A1 (15) | 732 Hz |
Due ** | 2-13 | 1000 Hz |
101 | 3, 5, 6, 9 | pins 3 and 9: 490 Hz, pins 5 and 6: 980 Hz |
Syntax
analogWrite(pin, value);
Parameters
pin: Pin ที่ต้องการ value: the duty cycle: รับข้อมูลเป็น Int ค่าตั้งแต่ 0-255 โดยที่ 0 คือ Off และ 255 คือ On
Returns
Example Code
int ledPin = 9; // LED connected to digital pin 9
int analogPin = 3; // potentiometer connected to analog pin 3
int val = 0; // variable to store the read value
void setup() {
pinMode(ledPin, OUTPUT); // sets the pin as output
}
void loop() {
val = analogRead(analogPin); // read the input pin
analogWrite(ledPin, val / 4); // analogRead values go from 0 to 1023, analogWrite values from 0 to 255
}
delay()
Description
เป็น Function หน่วงเวลาโดนเราสามารถกําหนดระยะเวลาการหน่วงเป็น milliseconds
Syntax
delay(ms);
Parameters
ms: milliseconds (เป็นข้อมูลชนิด long)
Returns
Example Code
int ledPin = 13; // LED connected to digital pin 13
void setup() {
pinMode(ledPin, OUTPUT); // sets the digital pin as output
}
void loop() {
digitalWrite(ledPin, HIGH); // sets the LED on
delay(1000); // waits for a second
digitalWrite(ledPin, LOW); // sets the LED off
delay(1000); // waits for a second
}
delayMicroseconds()
Description
เป็น Function หน่วงเวลาโดนเราสามารถกําหนดระยะเวลาการหน่วงเป็น Microseconds
Syntax
delayMicroseconds(us);
Parameters
us: เวลาที่ต้องการหน่วงเวลา Microseconds (ข้อมูลชนิด unsigned int)
Returns
Example Code
int outPin = 8; // digital pin 8
void setup() {
pinMode(outPin, OUTPUT); // sets the digital pin as output
}
void loop() {
digitalWrite(outPin, HIGH); // sets the pin on
delayMicroseconds(50); // pauses for 50 microseconds
digitalWrite(outPin, LOW); // sets the pin off
delayMicroseconds(50); // pauses for 50 microseconds
}
abs()
Description
หาค่าสัมบูรณ์ (absolute) ของตัวเลขเป็นการทําให้ค่าของตัวแปรเป็นค่าจํานวนเต็มบวก
Syntax
abs(x);
Parameters
x: number
Returns
|x|
constrain()
Description
ปัดค่าตัวเลขที่น้อยกว่าหรือมากกว่าให้อยู่ในช่วงที่กําหนด
Syntax
constrain(x, a, b);
Parameters
- x: ตัวเลขที่ต้องการปัดค่าให้อยู่ในช่วงที่กําหนดสามารถเป็นข้อมูลชนิดใดก็ได้
- a: ค่าตํ่าสุดของช่วงที่กําหนด
- b: ค่าสูงสุดของช่วงที่กําหนด
Returns
- x เมื่อ x มีค่าอยู่ระหว่าง a และ b
- a เมื่อ x มีค่าน้อยกว่า a
- b เมื่อ x มีค่ามากกว่า b
Example Code
sensVal = constrain(sensVal, 10, 150); // limits range of sensor values to between 10 and 150
map()
Description
แปลงค่าจาก range หนึง เป็นอีก range หนึ่ง เช่น เรามีค่า x ที่อยู่ในช่วง range 0-1024 แต่เราต้องการจะรู้ว่าค่า x มีค่าเท่าไรของช่วง range 0-255 เราสามารถใช้ Function คํานวณออกมาได้ครับ
Syntax
map(value, fromLow, fromHigh, toLow, toHigh);
Parameters
- value: ค่าที่อยู่ในช่วง range ตั้งต้น
- fromLow: ค่าตํ่าสุดของ range ตั้งต้น
- fromHigh: ค่าสูงสุดของ range ตั้งต้น
- toLow: ค่าตํ่าสุดของ range ใหม่
- toHigh: ค่าสูงสุดของ range ใหม่
Returns
ค่าที่ได้เมื่ออยู่ใน range ใหม่
Example Code
/* Map an analog value to 8 bits (0 to 255) */
void setup() {}
void loop() {
int val = analogRead(0);
val = map(val, 0, 1023, 0, 255);
analogWrite(9, val);
}
การคํานวนของ Function map()
long map(long x, long in_min, long in_max, long out_min, long out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
max()
Description
หาค่าสูงสุดของจํานวน 2 จํานวน
Syntax
max(x, y);
Parameters
- x: จํานวนแรก
- y: จํานวนที่สอง
Returns
ค่าสูงสุด
Example Code
sensVal = max(sensVal, 20); // assigns sensVal to the larger of sensVal or 20
// (effectively ensuring that it is at least 20)
min()
Description
หาค่าตํ่าสุดของจํานวน 2 จํานวน
Syntax
min(x, y)
Parameters
- x: จํานวนแรก
- y: จํานวนที่สอง
Returns
ค่าตํ่าสุดของสองจํานวน
Example Code
sensVal = min(sensVal, 100); // assigns sensVal to the smaller of sensVal or 100
// ensuring that it never gets above 100.
pow()
Description
คํานวณเลขยกกําลัง
Syntax
pow(base, exponent);
Parameters
- base: ฐาน
- exponent: เลขยกกําลัง
Returns
ผลการคํานวณเลขยกกําลัง
Example Code
z = pow(x, y);
sq()
Description
คํานวณหาค่า square หรือ หาค่ายกกําลัง2
Syntax
sq(x);
Parameters
x: จํานวนที่ต้องการจะหาค่ายกกําลัง2
Returns
ค่ายกกําลัง2 x
Example
int inputSquared = sq(10);
sqrt()
Description
คํานวณ สแควรูท
Syntax
sqrt(x);
Parameters
x: จํานวนที่ต้องการจะหาค่า สแควรูท
Returns
สแควรูทของ x
Example
double res = sqrt(25);
cos()
Description
คํานวณหาค่า cos จากมุม (in radians) โดยผลลัพธ์จะอยู่ระหว่าง -1 ถึง 1
Syntax
cos(rad);
Parameters
rad: radians รับประเภทของข้อมูลเป็น float.
Returns
ค่า cos โดยมี type เป็น double
sin()
Description
คํานวณหาค่า cos จากมุม (in radians) โดยผลลัพธ์จะอยู่ระหว่าง -1 ถึง 1
Syntax
sin(rad);
Parameters
rad: radians รับประเภทของข้อมูลเป็น float.
Returns
ค่า sin โดยมี type เป็น double
tan()
Description
คํานวณหาค่า tan จากมุม (in radians)
Syntax
tan(rad);
Parameters
rad: The angle in radians. Allowed data types: float.
Returns
ค่า tan โดยมี type เป็น double
random()
Description
สุมตัวเลข
Syntax
random(max);
random(min, max);
Parameters
- min: ค่าตําสุดของผลลัพธ์ที่จะ Random
- max: ค่าสูงสุดของผลลัพธ์ที่จะ Random
Returns
จํานวนที่ได้จากการสุ่มโดนจะอยู่ในช่วง min ถึง max-1 และมีประเภทของข้อมูลเป็น long
Example Code
long randNumber;
void setup() {
Serial.begin(9600);
// if analog input pin 0 is unconnected, random analog
// noise will cause the call to randomSeed() to generate
// different seed numbers each time the sketch runs.
// randomSeed() will then shuffle the random function.
randomSeed(analogRead(0));
}
void loop() {
// print a random number from 0 to 299
randNumber = random(300);
Serial.println(randNumber);
// print a random number from 10 to 19
randNumber = random(10, 20);
Serial.println(randNumber);
delay(50);
}
randomSeed()
Description
คือการกําหนดค่า seed ให้กับ random โดยค่า seed มีไว้กําหนดชุดของการ random เช่น ถ้าเรากําหนดค่า seed เป็น 1 เมื่อรันโปรแกรมหลายๆครั้ง โปรแกรมจะสุ่มค่าออกมาเป็นชุดเดียวกัน แต่ถ้าเรากําหนด seed เป็นค่าอื่นๆ ข้อมูลที่สุ่มออกมาจะไม่เหมือนกัน และถ้าค่า seed เปลี่ยนทุกครั้งที่รันโปรแกรม ข้อมูลที่สุ่มได้ จะออกมาไม่เหมือนกันเลย
Syntax
randomSeed(seed)
Parameters
seed: ค่า seed
Returns
Example Code
long randNumber;
void setup() {
Serial.begin(9600);
randomSeed(analogRead(0));
}
void loop() {
randNumber = random(300);
Serial.println(randNumber);
delay(50);
}
bit()
Description
หาค่าของ bit ที่ระบุ เช่น
- 0 bit คือ 1 (1)
- 1 bit คือ 2 (10)
- 2 bit คือ 4 (100)
- 3 bit คือ 8 (1000)
- 4 bit คือ 16 (10000)
- 5 bit คือ 32 (100000)
- 6 bit คือ 64 (1000000)
- 7 bit คือ 128 (10000000)
- 8 bit คือ 256 (100000000)
- 9 bit คือ 512 (1000000000)
- 10 bit คือ 1024 (10000000000)
Syntax
bit(n)
Parameters
n: bit
Returns
ค่าของ bit ที่ระบุ
bitClear()
Description
Clear bit ของ Number ให้เป็น 0 โดยระบุจํานวน Bit ที่ต้องการ Clear ซึ่งจะเริ่ม Clear จาก Bit ขวาสุด
Syntax
bitClear(x, n)
Parameters
- x: Number ต้องการ Clear
- n: จํานวน Bit ที่ต้องการ Clear ซึ่งจะเริ่ม Clear จาก Bit ขวาสุด
Returns
bitRead()
Description
อ่านค่า Bit ของ Number
Syntax
bitRead(x, n);
Parameters
- x: Number ที่ต้องการอ่าน
- n: Bit ที่ต้องการอ่าน เริ่มต้นจาก 0 และนับจากทางขวา
Returns
ค่าของ bit ที่อ่านได้
bitSet()
Description
Set ค่า 1 ให้กับ bit ที่ระบุ
Syntax
bitSet(x, n);
Parameters
- x: Number ที่ต้องการ
- n: ตําแหน่งของ bit ที่ก้องการ set โดยเริ่มต้นจาก 0 และนับจากทางขวา
Returns
bitWrite()
Description
Set ค่าให้กับ bit ที่ระบุ โดยเราสามารถระบุค่าที่ต้องการจะ Set ได้ว่าจะให้ Set 1 หรือ 0
Syntax
bitWrite(x, n, b)
Parameters
- x: Number ที่ต้องการ
- n: ตําแหน่งของ bit ที่ก้องการ set โดยเริ่มต้นจาก 0 และนับจากทางขวา
- b: ค่าที่ต้องการจะ Set (0 or 1).
Returns
Example Code
void setup() {
Serial.begin(9600);
while (!Serial) {} // wait for serial port to connect. Needed for native USB port only
byte x = 0b10000000; // the 0b prefix indicates a binary constant
Serial.println(x, BIN); // 10000000
bitWrite(x, 0, 1); // write 1 to the least significant bit of x
Serial.println(x, BIN); // 10000001
}
void loop() {}
highByte()
Description
ตัด Byte สูง หรือ byte ที่อยู่ด้านซ้ายออกมา เช่น
- 11000000 00011000 จะได้ 11000000
- 11000111 00011000 จะได้ 11000111
- 11001000 00011000 จะได้ 11001000
Syntax
highByte(x)
Parameters
x: ข้อมูลที่ต้องการตัด
Returns
ข้อมูลที่ตัดได้
lowByte()
Description
ตัด Byte ตํ่า หรือ byte ที่อยู่ด้านขวาออกมา เช่น
- 11000000 00011011 จะได้ 00011011
- 11000111 00011000 จะได้ 00011000
- 11001000 11111000 จะได้ 11111000
Syntax
lowByte(x);
Parameters
x: ข้อมูลที่ต้องการตัด
Returns
ข้อมูลที่ตัดได้
นอกจากนี้ยังมี Function อื่นๆอีก สามารถเข้าไปศึกษาเพิ่มเติมได้ที่ arduino.cc/reference/en/