ấ C u trúc Giá trị
(cid:0) ố H ng sằ
(cid:0) (cid:0) setup() loop()
(cid:0) ề ể ấ C u trúc đi u khi n | LOW | INPUT_PULLUP
(cid:0) (cid:0)
(cid:0) (cid:0)
(cid:0) (cid:0)
(cid:0) (cid:0) ố ố ự
(cid:0)
(cid:0) (cid:0)
(cid:0) (cid:0)
(cid:0) (cid:0)
(cid:0) (cid:0) if if...else switch / case for while break continue return goto
(cid:0) ở ộ
(cid:0) (cid:0) Cú pháp m r ng ấ ẩ
(cid:0) (cid:0) ặ ấ
(cid:0) (cid:0)
(cid:0) (cid:0) (multiline comment)
(cid:0) (cid:0)
(cid:0) (cid:0) ấ ; (d u ch m ph y) ọ {} (d u ngo c nh n) // (single line comment) /* */ #define #include
(cid:0) Toán t
(cid:0) (cid:0)
(cid:0) (cid:0)
(cid:0) (cid:0) ự ể ằ ễ bi u di n b ng
(cid:0) (cid:0)
(cid:0) HIGH INPUT LED_BUILTIN true | false ằ H ng s nguyên (integer constants) ằ H ng s th c (floating point constants) ể ữ ệ Ki u d li u void boolean char unsigned char byte int unsigned int word long unsigned long short float double array ỗ (chu i kí t string String (object) ể ổ ể ữ ệ Chuy n đ i ki u d li u
(cid:0) (cid:0) ử ố ọ s h c = (phép gán) + (phép c ng)ộ (phép tr )ừ * (phép nhân) / (phép chia) ấ ư % (phép chia l y d ) char()
(cid:0) Toán t
(cid:0) (cid:0) ử so sánh (so sánh b ng)ằ
(cid:0) (cid:0)
(cid:0) (cid:0)
(cid:0) (cid:0)
(cid:0) byte() int() word() long() float() ủ ạ
(cid:0) (cid:0) ế Ph m vi c a bi n ạ ặ ằ ặ ằ
(cid:0) == != (khác b ng)ằ ơ ớ > (l n h n) < (bé h n)ơ ơ ớ >= (l n h n ho c b ng) ơ (bé h n ho c b ng) <= ử Toán t
(cid:0) (cid:0)
(cid:0) (cid:0)
(cid:0)
(cid:0) (cid:0) ế và phân lo iạ ệ ự ủ Ph m vi hi u l c c a bi n ế static bi n tĩnh ằ ế const bi n h ng volatile Hàm h trỗ ợ sizeof()
logic (và) && || (ho c)ặ ủ ị ! (ph đ nh) ạ ừ ^ (lo i tr ) ợ
(cid:0) ơ
(cid:0) ấ Phép toán h p nh t ộ ừ ị (c ng thêm 1 đ n v ) ơ
(cid:0)
(cid:0)
(cid:0)
(cid:0) ++ ị (tr đi 1 đ n v ) ộ ọ ủ (phép rút g n c a phép c ng) += ừ ọ ủ = (phép rút g n c a phép tr ) ọ ủ (phép rút g n c a phép nhân) *= ọ ủ /= (phép rút g n c a phép chia)
ẽ ượ
ươ ủ ạ
ế ế ậ ệ ữ Setup và loop: Nh ng l nh trong setup() s đ ể ử ụ ở ộ ng trình c a b n kh i đ ng. B n có th s d ng nó đ khai báo ị ủ ố
ạ c ch y khi ể t l p các thông s ,… ạ ệ c ch y. Chúng
ượ ồ ủ ạ ắ ư ệ ữ ớ ụ i liên t c cho t i khi nào b n ng t ngu n c a board
ặ ạ ớ
ấ ng trình c a b n s tr v l ủ ạ ẽ ở ề ạ i
ươ ớ ượ ấ ấ ứ ạ ư
ể ượ
1. ạ ch giá tr c a bi n, khai báo th vi n, thi ạ Sau khi setup() ch y xong, nh ng l nh trong loop() đ ẽ ặ s l p đi l p l Arduino m i thôi. ạ B t c khi nào b n nh t nút Reset, ch tr ng thái nh khi Arduino m i đ c miêu t Quá trình này có th đ
ồ . c c p ngu n ả ư ơ ồ ướ nh s đ d i đây
Ví dụ int led = 13; void setup() { pinMode(led, OUTPUT); } void loop() { digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); }
ả Gi i thích
ệ pinMode(led, OUTPUT);” s ẽ
ầ ạ ấ ạ ồ c ch y 1 l n đ khai báo.
ở ẽ ượ ạ c ch y và đ ượ c setup(), l nh
loop() s đ ỗ ệ ộ i liên t c, t o thành m t chu i:
ụ Khi b n c p ngu n cho Arduino, l nh “ ể ượ đ ở ệ ạ Sau khi ch y xong l nh ụ ạ ặ ạ ặ l p đi l p l digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); …… ướ Tr ạ ầ c khi đ c v l nh if, các b n c n xem qua các m c sau:
ọ ề ệ ử Các toán t logic (Boolean operators)
Ví dụ Toán tử Ý nghĩa
ả ề ề ế
ị Và and (&&) ả ề (a && b) tr v TRUE n u a và b đ u mang ặ ộ ế giá tr TRUE. N u m t trong a ho c b là FALSE thì (a && b) tr v FALSE
ả ề ấ
ả ề ế ị or ( || ) Ho cặ
ề ế (a || b) tr v TRUE n u có ít nh t 1 trong 2 giá tr a và b là TRUE, tr v FALSE n u a và b đ u FALSE
ị
not ( ! ) Ph ủ đ nhị ế n u a mang giá tr TRUE thì (!a) là FALSE và ượ ạ c l ng i
ả ề
ườ ợ xor (^) Lo i ạ trừ ạ ả ề ế (a ^ b) tr v TRUE n u a và b mang hai giá ị tr TRUE/FALSE khác nhau, các tr ng h p còn l i tr v FALSE
ử
ườ ể ộ so sánh (Comparison operators) so sánh th ể ữ ố ng dùng đ so sánh 2 s có cùng m t ki u d
Các toán t ử Các toán t li u.ệ
Ví dụ
ả ề ế ằ ượ ạ (a == b) tr v TRUE n u a b ng b và ng c l i
ả ề ế ượ ạ So sánh không b ngằ (a != b) tr v TRUE n u a khác b và ng c l i
ế ớ ơ
ả ề ơ ặ ằ (a > b) tr v TRUE n u a l n h n b và FALSE ế n u a bé h n ho c b ng b
ế ơ
(a < b) tr v TRUE n u a bé h n b và FALSE ế n u ng ả ề ượ ạ c l i
ặ ằ ơ ươ ươ ớ Bé h n ho c b ng (a <= b) t ng đ ng v i ((a < b) or (a = b))
ặ ằ ớ ơ ươ ươ ớ L n h n ho c b ng (a >= b) t ng đ ng v i ((a > b) or (a = b))
ử ứ ứ ề ể ể so sánh] [bi u th c 2]) { //bi u th c đi u
ệ ệ Câu l nh if Cú pháp: ứ ể if ([bi u th c 1] [toán t ki nệ [câu l nh 1]
ệ
ẽ ượ c s đ
ả ề ệ i, ề c l ị ẽ ượ s đ
ừ ệ ắ ằ ộ khóa else
ệ ể ạ
ứ ề ả ượ ề ứ ằ ệ if. ặ
ằ ộ ể ặ ả ử ụ ộ c bao b ng m t ngo c tròn và ứ } else { [câu l nh 2] } ể ế ệ ệ ứ [câu l nh 1] N u bi u th c đi u ki n tr v giá tr TRUE, ệ . ự ượ ạ [câu l nh 2] ệ ự c th c hi n th c hi n, ng Ví d :ụ int a = 0; if (a == 0) { a = 10; } else { a = 1; } // a = 10 ả ệ L nh if không b t bu c ph i có nhóm l nh n m sau t int a = 0; if (a == 0) { a = 10; }// a = 10 ể ế ợ B n có th k t h p nhi u bi u th c đi u ki n khi s d ng l nh ể ỗ Chú ý r ng m i bi u th c con ph i đ ộ ặ ph i luôn có m t c p ngo c tròn bao toàn b bi u th c con.
ế ế Cách vi t đúng Cách vi t sai
int a = 0; if ((a == 0) && (a < 1)) { a = 10; } int a = 0; if (a == 0) && (a < 1) { a = 10; }
int a = 0;
if (a == 0 && a < 1) { a = 10; }
Chú ý:
(cid:0) ủ ộ ị a = 10; là m t câu l nh gán, giá tr logic c a nó luôn là TRUE (vì
c)
(cid:0) ệ ệ ượ ệ l nh gán này luôn th c hi n đ ứ ự ộ ị (a == 10) là m t bi u th c logic có giá tr TRUE hay FALSE tùy
ể ế ộ ị ủ
ạ ế ế
ệ
ợ ườ ư ộ ẽ ằ ượ ể ộ ả ề ứ c xem nh m t bi u th c logic và luôn tr v
ị ủ ng h p này nó đ ị
ệ
ệ ể ạ ử ế ộ ị ư if, switch / case cũng là m t d ng l nh n u thì, nh ng nó ư ộ ạ ế chuyên ế ế t k chuyên bi t đ b n x ý giá tr trên m t bi n
ị ừ ữ ụ ạ ậ ộ nh ng module khác
ộ ị
ẹ ủ ọ thu c vào giá tr c a bi n x. t … N u b n vi int a = 0; if (a = 1) { a = 10; } … thì giá tr c a a s b ng 10, vì (a = 1) là m t câu l nh gán, trong tr giá tr TRUE. ố Gi ng nh ượ c thi đ tệ . bi ẽ ế Ví d , b n có m t bi n là action s nh n tr t ẽ ằ ư qua serial. Nh ng action s n m trong m t các giá tr nào đó thì lúc này ử ụ ạ b n hãy s d ng switch / case. Ví dụ switch (action) { case "callMyMom": ệ //g i đi n cho m c a tôi
ọ ệ ủ
ả
ặ ị ạ
break; case "callMyDad": //g i đi n cho ba c a tôi break; default: // m c đ nh là không làm gì c ặ ể // b n có th có default: ho c không }
ạ ệ
ố ị ủ ế ẽ ế ớ
Ằ ậ ứ ặ
ơ ộ ộ
ả ẳ ể ấ ạ ạ ộ ộ Cú pháp switch (var) { case label: ạ ệ //đo n l nh break; case label: // Đo n l nh break; /* case ... more and more */ default: // statements } Tham số ạ var: bi n mà b n mu n so sánh label: s đem giá tr c a bi n SO SÁNH B NG v i nhãn này ặ ộ Hàm for có ch c năng làm m t vòng l p. V y vòng l p là gì? Hãy ạ hi u m t cách đ n gi n, nó làm đi làm l ậ ắ ch t chung nào đó. Ch ng h n, b n b t t ệ i m t công vi c có m t tính t m t con LED thì dùng
ư ồ ạ LOW r i l i delay. Nh ng n u
ố ề
ẳ ẹ ử ơ ỉ ế ủ ạ ẽ i t ng dòng? ồ ạ ạ ọ ồ ử ạ ừ ẻ ng i s a l
ớ ạ ậ ư ế
ạ ạ ẽ ế
ề ộ ạ
ế ậ ữ ậ ắ ồ digitalWrite xu tấ HIGH delay r i l i ạ b n mu n làm nhi u h n 1 con LED thì m i đo n code c a b n s dài ra (không đ p và khi ch nh s a thì ch ng l V i 1 con led, b n l p trình nh th này digitalWrite(led1,HIGH); delay(1000); digitalWrite(led1,LOW); delay(1000); ư ế ớ V i 10 con led, n u b n không dùng for, đo n code nó s dài nh th này digitalWrite(led1,HIGH); delay(1000); digitalWrite(led1,LOW); delay(1000); digitalWrite(led2,HIGH); delay(1000); digitalWrite(led2,LOW); delay(1000); ... digitalWrite(led10,HIGH); delay(1000); digitalWrite(led10,LOW); delay(1000); ố ậ ư ậ N u nh v y thì b n có còn mu n l p trình và suy nghĩ v m t led ma ờ ắ tr n có còn n a không ? Ch c ch n là không r i, vì v y hàm for ra đ i
ạ ộ ố ộ ơ i đ p h n !
ươ ẹ ư ấ ả ờ ể đ giúp b n nhìn cu c s ng m t cách t ộ Bây gi ụ ơ hãy l y m t ví d đ n gi n nh sau:
ậ ố
ữ ố ừ ượ 1 10) ra Serial. Hãy giúp tôi l p trình ệ ấ c vi c y!
ế ứ ề ế ạ ư ạ ẽ t ki n th c v for, b n s
ặ ệ Serial.println
ế ề ự ạ ộ i câu l nh ỉ ầ t v hàm for b n ch c n m t đo n code c c kì
ạ ư ắ
ấ Tôi mu n xu t 10 ch s (t ể trên Arduino đ làm đ ư ọ ế N u b n ch a đ c bài này và cũng ch a bi ư ậ l p trình nh sau: void setup() { Serial.begin(9600); Serial.println(1); Serial.println(2); Serial.println(3); Serial.println(4); Serial.println(5); Serial.println(6); Serial.println(7); Serial.println(8); Serial.println(9); Serial.println(10); } void loop() { // không làm gì c ;ả } ặ ạ Đo n code khá dài và l p đi l p l ạ Nh ng sau khi bi ư ng n nh sau: void setup(){ Serial.begin(9600); int i; for (i = 1;i<=10;i=i+1) { Serial.println(i);
} } void loop(){ }
ấ
ặ ặ ạ ủ t v vòng l p ho c hàm for,
ầ ắ ế ề c 4 ph n:
ắ ắ C u trúc Theo quan đi m c a tôi, n u b n ch a bi ượ ể ể ượ đ hi u đ ớ ạ ộ ẽ i h n nghĩa là ch c ch n nó s Hàm for là m t vòng l p có gi
ớ
1. ế k t thúc (không s m thi mu n).
2.
ộ ị ế ị m t v trí xác đ nh và đi đ n m t v trí k t thúc.
3.
ự ệ
ế ạ ệ ướ ề ặ ế ể ư ạ ầ c hàm for, b n c n n m đ ặ ộ ẽ ắ ầ ừ ộ ị ạ ế c ho c nhi u c 1 b Nó s b t đ u t ứ ỗ ướ C m i b Sau đó, nó l
ộ i th c hi n m t đo n l nh ể ướ ờ ổ
c xong, nó l ạ ướ i b c đi ti p, nó có th b ượ c thay đ i theo th i gian. c, nh ng không đ ử ụ ạ ư ụ , ta có đo n code s d ng hàm ư for nh sau:
ụ
1.
ạ
4. ướ b Theo ví d trên for (i = 1;i<=10;i = i + 1) { Serial.println(i); } Hàm for trong ví d này s : ắ ắ ạ ừ ị
ế Serial.println(i); 10 l nầ ị ẽ ẽ ử Ch c ch n nó s x lý đo n code ấ Ch y t ế v trí xu t phát là 1, đ n v trí k t thúc là 10 // i = 1 ; i <=
2. 10
ứ ỗ ầ ướ ả ị ấ ạ c xong (tính luôn c v trí xu t phát t
ể ờ i th i ế C m i l n b 3. ạ đi m i = 1) thì nó l i ch y l nh ạ ệ Serial.println(i);. Trong đó bi n i, dân
ị ế
ạ ằ ủ ằ ướ ữ ừ ọ ạ ướ i b
ọ ọ ỗ ầ ằ ấ c thêm 1 b ề ướ còn <= 10 thì nó còn quay v b c 3 ẽ ạ ộ
ạ ể ủ ạ ọ
ụ ứ ủ khoa h c g i là bi n con ch y, còn tôi g i là v trí c a th ng i ạ 4. M i l n ch y xong, th ng i l c n a. Ch ng nào mà th ng i ờ ễ ể B n có th y nó d hi u không? Bây gi tôi s nói nó theo m t cách ẽ khoa h c qua cú pháp c a hàm for (tôi s chia làm 2 lo i đ các b n ễ d dàng ng d ng vào code c a mình).
(cid:0) ị ớ ỏ ạ ơ For ti nế (xu t phát t
ị ế ị
ế
ừ ộ ị
m t v trí nh ch y đ n v trí l n h n) ạ ấ ị ỗ ầ ế ằ ạ ị ạ ấ
ơ
trí k t thúc> bé h n (cid:0) ị ớ ạ ỏ ơ ề ị
m t v trí l n ch y v v trí nh h n) ấ ừ ộ ị
ế For lùi (xu t phát t
ị ị ấ ạ ị ạ ằ ế ỗ ầ ạ
c>) {
ệ ấ ướ
ạ ể ượ ủ ắ ộ c m t cách sâu s c thì đây là cú pháp chính c a ướ ề ệ ạ c>) { ộ ạ ề ệ ặ ế ướ ố ầ ặ ư ả ể
ừ
, nh ng mình qu n lý lúc nào thì nó ng ng c s l n l p cua nó t tr ấ
ơ
ớ
xu t phát> l n h n ể ố ạ ầ ệ ắ Cách hi u dành cho Newbie
Gi ng nh ư for, cũng có vài khái ni m mà b n c n n m, tôi đã "vui" ả ặ ọ
hóa cho nó nên hãy tho i mái khi đ c
ộ
While là m t vòng l p không bi ế ướ ố ầ ặ
ề ự
ố ề ệ ệ !
t tr
ạ ẻ ạ c s l n l p, nó d a vào
1.
ư
ề
đi u ki n, đi u ki n còn đúng thì còn ch y. Đi u này cũng gi ng nh ,
ế
n u chúng ta còn đang "xanh" trong LOL thì không ng i gì mà đi l . ế ấ T t nhiên, n u không "xanh" thì không đi l ẻ ữ
n a ưở Ch y m t đo n l nh (trong đó có nh ng hàm nh h ế
ng đ n ạ ệ
ộ
ế ứ ạ ề ữ
ư void loop() thì bi ả
ặ
ế
t khi nào vòng l p ớ ừ ạ
2.
ệ
đi u ki n). N u c ch y mãi nh
While m i d ng! ệ ạ ừ ế ỗ ộ ờ ờ có 60 phút, m i ỗ
, m i gi ừ ờ ớ ộ ớ
ặ ạ ộ ể ạ ủ ộ ỉ ậ ứ ộ ệ ừ ứ ừ ị ả ở ứ
break và Cú pháp
ề
while (<đi u ki n>) {
ạ ệ
//các đo n l nh;
}
Ví dụ
int day = 1;
int nam = 2014; // Năm 2014
while (day < 365) { //Ch ng nào day < 365 thì còn ch y (<=364). Khi
day == 365 thì h t 1 năm...
day += 1; //
delay(60*60*24);// M t ngày có 24 gi
phút có 60 giây
}
nam += 1; //... bây gi
đã là m t năm m i ! Chúc m ng năm m i :)
ể
ụ
Đó ch là m t ví d vui đ b n hi u cách ho t đ ng c a vòng l p
while. Chúc vui v !ẻ
ặ
ộ
break là m t l nh có ch c năng d ng ngay l p t c m t vòng l p
ấ ả ữ
ặ
t c nh ng
(do, for, while) ch a nó trong đó. Khi d ng vòng l p, t
ẽ ị
ủ
ưở
ặ
ệ
l nh phía sau
ng c a nó s b
trong vòng l p ch u nh h
ỏ
.
b qua
Ví dụ
int a = 0; while (true) {
if (a == 5) break;
a = a + 1; }
//a = 5
while (true) {
while (true) {
a++;
if (a > 5) break;
}
a++;
if (a > 100) break;
}
//a = 101 ộ ỏ ứ
ứ ở ặ ộ
ọ ệ continue,
ẽ ị ỏ ữ ệ
ệ ể
ớ
trong cùng vòng l p v i nó s b b qua đ
ặ ẫ ằ ụ ả ề ộ ể ữ ệ ớ ị ượ ọ ặ
ộ ệ
continue là m t l nh có ch c năng b qua m t chu kì l p trong m t
ặ
do, while) ch a nó trong đó. Khi g i l nh
vòng l p (for,
ữ
nh ng l nh sau nó và
ế ế .
ự
th c hi n nh ng chu kì l p k ti p
Ví dụ
int a = 0;
int i = 0;
while (i < 10) {
i = i + 1;
continue;
a = 1;
}
//a v n b ng 0
return có nhi m v tr v m t giá tr (cùng ki u d li u v i hàm) mà
nó đ ệ
c g i! Cú pháp ả ề ị ặ ấ ỳ ộ ố ượ .
ng ưỡ ơ ộ ế ể ng nào đó hay ệ ể ế ộ ng trình r i chuy n đ n m t nhãn đã ồ
ươ ươ
ạ ế ạ return;
return value; // c 2 đ u đúng
Thông số
value: b t k giá tr ho c m t đ i t
Ví dụ
ị ủ ả
//Hàm ki m tra giá tr c a c m bi n có h n m t ng
không
int checkSensor(){
if (analogRead(0) > 400) {
return 1;
else{
return 0;
}
Goto
ụ ạ
Nó có nhi m v t m d ng ch
ượ ị
c
đ ừ
ướ , sau đó l i ch y ti p ch c đ nh tr ng trình! ồ ạ ệ ế ự ữ Cú pháp
ộ
label: //Khai báo m t nhãn có tên là label
ế
goto label; //Ch y đ n nhãn label r i sau đó th c hi n ti p nh ng
ạ
đo n ch
ng trình sau nhãn đó
ủ ươ ư ng trình nào s d ng ngôn ng C. Nh ng n u s d ng m t cách ấ ứ
ng trình Program hay b t c
ộ
ế ử ụ
ươ
ộ ử ụ
ạ ẽ ố ư ượ ề ề i u hóa đ ng ữ ề ặ ộ ỏ ố ươ
ậ
Th thu t
ươ
Không nên dùng l nhệ goto trong ch
ữ
ch
khôn ngoan b n s t
c nhi u đi u trong m t ch
trình!
ạ
ậ
V y nó h u ích khi nào, đó là lúc b n đang dùng nhi u vòng l p quá
và mu n thoát kh i nó m t cách nhanh chóng!
Ví dụ ệ ủ ặ ng c a ngôn ng C/C++ cho phép b n đ t tên ộ ố ượ
ố ướ ằ ị ạ
c khi biên d ch, trình
ử ụ ữ
ố ự
ạ ượ ọ ề ằ
c g i là quá trình ti n biên for(byte r = 0; r < 255; r++){
for(byte g = 255; g > 1; g){
for(byte b = 0; b < 255; b++){
if (analogRead(0) > 250){ goto bailout;}
ữ
ề
//thêm nhi u câu l nh n a
}
}
}
bailout:
#define là m t đ i t
ộ ằ
cho m t h ng s nguyên hay h ng s th c. Tr
ằ
ế ữ
ẽ
ị
biên d ch s thay th nh ng tên h ng b n đang s d ng b ng chính
ế
ị ủ
giá tr c a chúng. Quá trình thay th này đ
ị
d ch (precompile) . ằ ị ủ ằ ế ế ế
t code th này ... ướ ị ươ c khi biên d ch, ch ủ ạ ẽ
ng trình c a b n s Cú pháp
#define [tên h ng] [giá tr c a h ng]
Ví dụ
#define pi 3.14
ạ
N u b n vi
#define pi 3.14
float a = pi * 2.0; // pi = 6.28
thì sau khi precompile tr
ư ế
nh th này:
#define pi 3.14
float a = 3.14 * 2.0; // a = 6.28 ố ượ ế ằ ớ ộ c khai báo ế ấ ẽ ị ế ằ Chú ý
ế
N u m t bi n có tên trùng v i tên h ng s đ
ị
b ngằ #define thì khi precomile, cái bi n y s b thay th b ng giá tr ươ ủ ị ệ ng trình c a
t y u là khi biên d ch, ch
ề
i cú pháp (b n s không d dàng nh n ra đi u này). Đôi
ẫ ế ỗ ậ
ử ả ấ ế
ạ ẽ
i logic m t l ễ
ộ ỗ ấ
i r t khó s a ! ạ ế ế ế t th này... ạ ẽ ượ ướ ị
c khi biên d ch, b n s đ ế
c th này: ỗ ể ạ ạ ậ ể ử ụ ạ ầ i cú pháp
ệ ử ụ #define đ khai báo
i đa vi c s d ng
t. B n có th s d ng cách khai báo sau đ ể ươ ượ ư ệ
i m t th vi n đã đ c ộ
ữ ủ ạ ả
ng trình c a b n t
ấ ượ
t s n. T c là b n có th truy xu t đ
ế ộ ề ạ ể
ủ
ươ
ươ ấ ủ ả ư
ạ
c nh ng tài nguyên trong th
ạ
ầ
ạ
ng trình c a mình. N u b n có m t đo n code và c n
#include đ ể
ể
ng trình, b n có th dùng
ng trình c a mình, thay vì ph i chép đi ố
ủ ằ
c a h ng s kia. H qu t
ạ ẽ ị ỗ
b n s b l
khi nó cũng d n đ n l
N u b n vi
#define pi 3.14
float pi = 3.141592654;
thì sau khi precompile tr
#define pi 3.14
float 3.14 = 3.141592654; // l
ế ố
Vì v y, b n nên h n ch t
ế
ố
ằ
h ng s khi không c n thi
thay th :ế
const float pi = 3.14;
#include cho phép ch
ứ
ế ẵ
vi
ừ ươ
ệ
vi n này t
ch
ử ụ
s d ng nó trong nhi u ch
ạ
n p đo n code y vào ch
ạ
chép l ạ
ấ .
ạ
i đo n code y ẫ ế ứ ườ ư ệ ng d n đ n file ch a th vi n]> s b n có th m c cài đ t Arduino IDE tên là ArduinoIDE, th ư ả ử ạ
ệ ủ ạ ượ ư c l u ạ ộ ủ file ư
ư ụ
code.h n m trong th m c function c a th ượ ư c khai báo nh sau:
ườ ẫ ng d n đ y đ : Cú pháp
#include <[đ
Ví dụ
ư ụ
ặ
Gi
EEPROM (đ
vi n c a b n có tên là
ở \ArduinoIDE\libraries\EEPROM\)
ằ
ư ở
M t đo n code l u
vi nệ EEPROM thì đ
ầ ủ
#include ằ HIGH là m tộ h ng s ộ ơ ớ iá tr ị ệ ị
ố có giá tr nguyên
ứ
ệ ử HIGH là m t m c đi n áp l n h n 0V. G
ệ
,
ượ ị
c đ nh nghĩa khác nhau trong các m ch đi n khác
ườ ượ ư ứ ạ
các m c nh 1.8V, 2.7V, 3.3V ướ ở
c c quy ng đ ị
ố có giá tr nguyên là 1 ụ ạ ậ
Trong l p trình trên Arduino,
là 1. Trong đi n t
c aủ HIGH đ
ư
nhau, nh ng th
5V, 12V, ...
HIGH là m tộ h ng sằ
Xét đo n code ví d sau:
int led = 13;
void setup() {
pinMode(led, OUTPUT);
digitalWrite(led, HIGH);
} ố ứ ố ớ ạ
ạ ạ ươ ể ả ạ
i đo n ch ứ ươ ủ
ng trình này lên m ch Arduino c a
ử ả ạ
i đo n ch ng trình này lên: ằ ị
ố có giá tr nguyên là ệ ằ , ặ ầ
ệ ư ạ ộ void loop() {
}
ậ
Đo n code này có ch c năng b t sáng đèn led n i v i chân s 13 trên
m ch Arduino (Arduino Nano, Arduino Uno R3, Arduino Mega
ạ
2560, ...). B n có th t
ể ể
mình đ ki m ch ng. Sau đó, hãy th t
int led = 13;
void setup() {
pinMode(led, OUTPUT);
digitalWrite(led, 1);
}
LOW là m tộ h ng s
ậ
Trong l p trình trên Arduino,
ệ ử LOW là m c đi n áp 0V ho c g n b ng 0V, giá tr
ị
ứ
0. Trong đi n t
ượ ị
này đ
c đ nh nghĩa khác nhau trong các m ch đi n khác nhau, nh ng
ặ ơ
ườ
ng là 0V ho c h n m t chút xíu.
th
LOW là m tộ h ng sằ ị
ố có giá tr nguyên là 0 ạ ụ ố ớ ứ ố ạ
ạ ể ả ươ ạ ạ
i đo n ch ủ
ng trình này lên m ch Arduino c a
ử ả ươ ứ ng trình này lên: ạ
i đo n ch Xét đo n code ví d sau:
int led = 13;
void setup() {
pinMode(led, OUTPUT);
}
void loop() {
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(1000);
}
ậ
Đo n code này có ch c năng b t sáng đèn led n i v i chân s 13 trên
m ch Arduino (Arduino Nano, Arduino Uno R3, Arduino Mega
ạ
2560, ...). B n có th t
ể ể
mình đ ki m ch ng. Sau đó, hãy th t
int led = 13;
void setup() {
pinMode(led, OUTPUT);
} ẽ ấ ấ void loop() {
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, 0);
delay(1000);
}
ề
ệ
S xu t hi n 2 v n đ : (cid:0) ứ ạ ượ ử Trong đo n code th 2, " c s a thành " LOW" đã đ 0". (cid:0) ạ ẫ ườ ươ Đèn led trên m ch Arduino v n sáng bình th ớ
ng v i 2 ch ng trình khác nhau. ẳ ị ị
ố có giá tr nguyên là 0" đã LOW là m tộ h ng sằ ở ề
Đi u này kh ng đ nh "
nêu trên. ộ ớ ơ ệ ế ữ ể ể ệ
ộ ự ủ ụ ở ự ị ố ệ
i m t đi m là tr s hi u đi n th gi a đi m đó
s ta có m t viên pin vuông 9V
c c âm là ả ử
ng c a c c pin là 9V, ự ủ ụ ế ữ ặ ệ
LOW là m t đi n áp l n h n 0V
ộ
ệ
ế ạ
Đi n áp (đi n th ) t
ệ
ồ
ủ
và c c âm c a ngu n đi n (0V). Gi
ở ự ươ
ệ
ể
thì ta có th nói đi n áp
c c d
ệ
ệ
0V, ho c hi u đi n th gi a 2 c c c a c c pin là 9V. ị ụ ể ư ạ
ằ
ặ ẫ c là m c
ạ c xem là ừ ằ ở ệ
ượ
các chân I m c ẽ ấ ấ ở ứ LOW không có giá tr c th nh 3.3V, 5V, 9V, ... mà
ệ
m c
Đi n áp
ư th
ườ
ộ ị ố
ỗ
ệ
ạ
trong m i lo i m ch đi n, nó có m t tr s khác nhau nh ng
ng
ượ
ạ
ặ ầ
c quy
LOW đ
. Trong các m ch Arduino,
là 0V ho c g n b ng 0V
ứ 0V m c dù 0.5V v n có th đ
ướ
LOW. Ví d nhụ ư
ể ượ
c xem là
ả
ấ
trong m ch Arduino Uno R3, theo nhà s n xu t, đi n áp đ
ế
ả
ở ứ LOW n m trong kho ng t
0V đ n 1.5V
void loop() {
}
ề
ệ
S xu t hi n 2 v n đ : (cid:0) ạ ượ ử ứ HIGH" đã đ 1". (cid:0) ạ ẫ ươ Trong đo n code th 2, "
Đèn led trên m ch Arduino v n sáng bình th c s a thành "
ớ
ườ
ng v i 2 ch ng trình khác nhau. ẳ ị ị
ố có giá tr nguyên là 1" đã HIGH là m tộ h ng sằ ở ề
Đi u này kh ng đ nh "
nêu trên. ộ ớ ơ ệ ể ế ữ ể ự ệ
ộ ị ố ệ
i m t đi m là tr s hi u đi n th gi a đi m đó
s ta có m t viên pin vuông 9V ủ ụ ệ ặ ả ử
ng c a c c pin là 9V, ho c hi u ệ ệ
HIGH là m t đi n áp l n h n 0V
ế ạ
ệ
ộ
Đi n áp (đi n th ) t
ệ
ồ
ủ
và c c âm c a ngu n đi n (0V). Gi
ệ
ể
ở ự ươ
thì ta có th nói đi n áp
c c d
ự ủ ụ
ế ữ
đi n th gi a 2 c c c a c c pin là 9V. ị ụ ể ư m c
ạ ị ố ượ ướ ệ ạ ở ứ HIGH không có giá tr c th nh 3.3V, 5V, 9V, ... mà
ệ
Đi n áp
ỗ
c
trong m i lo i m ch đi n, nó có tr s khác nhau và đã đ c quy ướ ượ c là m c HIGH đ ấ ượ ằ c quy
ụ ư
c xem là ứ 5V m c ặ
ướ
ạ
c xem là
HIGH. Ví d nh trong m ch Arduino
ở ứ
ệ
m c HIGH n m ả ừ ế
3V đ n 5V.
ộ ị ố ế ằ ư ấ ị ủ ớ ơ ứ ư ạ
c. Trong các m ch Arduino,
tr
ể ượ
ẫ
dù 4V v n có th đ
ả
Uno R3, theo nhà s n xu t, đi n áp đ
trong kho ng t
Dù HIGH không có m t tr s nào rõ ràng nh ng nh t quy t r ng giá
tr c a nó luôn l n h n 0V.
ư
ế ặ
t đ t Digital Pins nh là INPUT, INPUT_PULLUP, và OUTPUT
Thi
ử
ksp g i vào , 21 Tháng 5, 2014 20:27 (cid:0) Th t
ƯỢ 9400 L T XEM ỹ ậ ố ư
c s d ng nh là INPUT, ể ượ ử ụ
ặ ử ụ ể ổ ộ ử ụ Chân k thu t s có th đ
INPUT_PULLUP , ho c OUTPUT . Đ thay đ i cách s d ng m t
pin, chúng ta s d ng hàm pinMode(). ấ ộ ớ ủ ở ộ
ượ ấ
c c u hình là m t INPUT v i
ấ ệ ụ ạ ươ ệ
ộ ng đ ự ươ
ề ượ ấ
c c u hình là INPUT làm vi c tiêu th năng
ệ
ớ
ỏ
ấ
ng v i m t lo t các đi n
ướ ủ
c c a pin . Đi u này làm cho chúng c c kì ấ ư ộ ả ộ . ạ
ng đi n c a m ch r t nh , nó t
ở
phía tr
ệ ọ
ng m t đèn LED ộ ượ ấ ộ
ệ ệ c c u hình là INPUT
ọ ượ ừ ấ ứ
b t c
c t c các tín hi u đi n và đ c đ ự ng đ ộ
ệ
c th c hi n v i m t
ư ố
ượ
ặ ấ ạ ẽ
ườ
ố ự
ệ ả ở C u hình m t pin là INPUT
Các pin c a Arduino ( Atmega ) đ
pinMode ( ) có nghĩa là làm cho pin y có tr kháng cao (không cho
dòng đi n đi ra) . Pin đ
ệ ủ
ượ
l
ở
tr 100 Megaôm
ế
ữ
h u ích cho vi c đ c m t c m bi n, nh ng không cung c p năng
ượ
l
Nói m t cách nôm na, dân dã, thì khi m t pin đ
ọ ượ
ạ ẽ ễ
thì b n s d dàng đ c đ
ứ
ệ
th gì (Có đi n <= 5V)!
ế
ấ
ạ
N u b n đã c u hình pin là INPUT, b n s mu n pin có m t tham
ế
ộ
ớ
ặ ấ
ế
chi u đ n m t đ t (GND, c c âm), th
ở
ộ
ố
ệ
đi n tr kéo xu ng ( m t đi n tr đi xu ng m t đ t ) nh mô t
trong
ậ ố ọ ố ế
ỹ
k thu t s đ c n i ti p.
ộ
ấ ộ ở ệ
ạ ạ
ở ở ạ ộ ộ
ệ ế
ể ạ C u hình m t pin là INPUT_PULLUP
ở ế ố ớ
Chip Atmega trên Arduino có n i kéo lên đi n tr (đi n tr k t n i v i
ệ
ệ ố
ể
h th ng đi n n i b ) mà b n có th truy c p. N u b n không thích
ộ
ắ
m c thêm m t đi n tr ệ
ậ
ố
m ch ngoài, b n có th dùng tham s ượ ế ố ộ ặ ị
c k t n i v i c c d
ượ ớ ự ấ ặ ượ ế ố ớ ự ươ
c thông t c k t n i
ẽ
ng thì pin s
ố
i c c âm xu ng đ t thì INPUT_PULLUP trong pinMode(). M c đ nh khi không đ
ạ
v i m t m ch ngoài ho c đ
ị
nh n giá tr là HIGH, khi pin đ
ị
nh n giá tr là LOW. ớ
ậ
ậ
ấ ầ ộ ế ặ ấ ể ộ ượ ộ ủ ệ
ể ng đi n đáng k cho các
ấ ặ ế ệ ụ ạ
ể ạ ề
ụ ữ
ế ả ọ ng đèn LED nh ng vô d ng đ i v i các c m bi n đ c! ạ ư
ạ
ế ự ắ ặ ồ ươ ệ ặ ế ự ươ
ớ ự
ạ
ộ ố ườ
ượ ạ ộ ể ơ ng
c. Đ ạ ộ ặ
ẩ ị ụ ế ế ạ ọ ạ
ư ứ ư C u hình m t pin là đ u ra (OUTPUT)
ề
ộ
ể
, đi u này
t đ t pin là m t OUTPUT, chúng ta dùng pinMode ( )
Đ thi
ấ
ộ ở
ệ
có nghĩa là làm cho pin y có m t tr kháng th p (cho dòng đi n đi ra).
ẽ
ề
ấ
Đi u này có nghĩa, pin s cung c p m t l
ồ
ề
ạ
ể
m ch khác . Pin c a vi đi u khi n Atmega có th cung c p m t ngu n
ả
ệ
đi n liên t c 5V ho c th chìm ( cho đi n th bên ngoài ch y vào ) lên
ế
đ n 40 mA ( milliamps )
. Đi u này làm cho chúng h u ích đ t o năng
ố ớ
ượ
l
ắ
ờ ế
ấ
Lúc b y gi
, n u b n làm làm ng n m ch (digitalWrite 1 pin là HIGH
ồ ố ự ế
r i n i tr c ti p đ n c c âm ho c digitalWrite 1 pin là LOW r i m c
ẽ
ữ
ự ế
tr c ti p đ n c c d
ng t ) thì m ch s
ng, ho c nh ng vi c làm t
ỉ
ệ
ị ỏ
b h ng! Ngoài ra, v i dòng đi n ch 40mA thì trong m t s tr
ể
ợ
h p chúng ta không th làm cho mô t
ho c relay ho t đ ng đ
ộ ố ạ
ầ
làm chúng ho t đ ng thì chúng ta c n chu n b cho mình m t s m ch
ử ụ
s d ng các IC khu ch đ i chuyên d ng (g i là m ch giao ti p)
ế ặ
Thi
t đ t Digital Pins nh là INPUT, INPUT_PULLUP, và OUTPUT
ử
ksp g i vào , 21 Tháng 5, 2014 20:27 (cid:0) Th t
ƯỢ 9401 L T XEM ỹ ậ ố ư
c s d ng nh là INPUT, ể ượ ử ụ
ặ ử ụ ể ổ ộ ử ụ Chân k thu t s có th đ
INPUT_PULLUP , ho c OUTPUT . Đ thay đ i cách s d ng m t
pin, chúng ta s d ng hàm pinMode(). ấ ộ ủ ớ ộ
ượ ấ
c c u hình là m t INPUT v i
ấ ở ụ ệ ệ
ộ ươ ạ ng đ ươ
ề ự C u hình m t pin là INPUT
Các pin c a Arduino ( Atmega ) đ
pinMode ( ) có nghĩa là làm cho pin y có tr kháng cao (không cho
dòng đi n đi ra) . Pin đ
ệ ủ
ượ
l
ở
tr 100 Megaôm ượ ấ
c c u hình là INPUT làm vi c tiêu th năng
ệ
ớ
ỏ
ấ
ng v i m t lo t các đi n
ướ ủ
c c a pin . Đi u này làm cho chúng c c kì ạ
ng đi n c a m ch r t nh , nó t
ở
phía tr ấ ư ộ ả ộ . ệ ọ
ng m t đèn LED ộ ượ ấ ệ ộ
ệ c các tín hi u đi n và đ c đ c c u hình là INPUT
ọ ượ ừ ấ ứ
b t c
c t ự ng đ ự
ệ ạ ẽ
ườ
ố ộ
ệ
c th c hi n v i m t
ư ố
ượ
ặ ấ ả ở ế
ữ
h u ích cho vi c đ c m t c m bi n, nh ng không cung c p năng
ượ
l
Nói m t cách nôm na, dân dã, thì khi m t pin đ
ọ ượ
ạ ẽ ễ
thì b n s d dàng đ c đ
ứ
ệ
th gì (Có đi n <= 5V)!
ế
ấ
ạ
N u b n đã c u hình pin là INPUT, b n s mu n pin có m t tham
ặ ấ
ế
ộ
ớ
ế
chi u đ n m t đ t (GND, c c âm), th
ộ
ố
ệ
ở
trong
đi n tr kéo xu ng ( m t đi n tr đi xu ng m t đ t ) nh mô t
ỹ
ậ ố ọ ố ế
k thu t s đ c n i ti p.
ộ
ấ ộ ở ệ
ạ ạ
ở ở ạ ộ ộ
ệ ế
ể ệ
ậ
ố
m ch ngoài, b n có th dùng tham s
ượ ế ố ộ ạ
ặ ị
c k t n i v i c c d
ượ ớ ự ấ c k t n i
ẽ
ng thì pin s
ố
i c c âm xu ng đ t thì ặ ượ ế ố ớ ự ươ
c thông t C u hình m t pin là INPUT_PULLUP
ở ế ố ớ
Chip Atmega trên Arduino có n i kéo lên đi n tr (đi n tr k t n i v i
ệ
ệ ố
ể
h th ng đi n n i b ) mà b n có th truy c p. N u b n không thích
ộ
ắ
m c thêm m t đi n tr
INPUT_PULLUP trong pinMode(). M c đ nh khi không đ
ạ
v i m t m ch ngoài ho c đ
ị
nh n giá tr là HIGH, khi pin đ
ị
nh n giá tr là LOW. ầ ộ ớ
ậ
ậ
ấ ế ặ ấ ể ộ ượ ủ ệ
ể ng đi n đáng k cho các
ấ ộ ặ ụ ệ ế ạ
ể ạ ữ
ế ề
ụ ả ọ ng đèn LED nh ng vô d ng đ i v i các c m bi n đ c! ạ ư
ạ
ế ự ắ ặ ồ ươ ệ ặ ế ự ươ
ớ ạ
ự
ộ ố ườ
ượ ạ ộ ể ơ ng
c. Đ ạ ộ ặ
ẩ ị ụ ế ế ạ ạ ọ C u hình m t pin là đ u ra (OUTPUT)
ề
ộ
ể
, đi u này
t đ t pin là m t OUTPUT, chúng ta dùng pinMode ( )
Đ thi
ệ
ộ ở
ấ
có nghĩa là làm cho pin y có m t tr kháng th p (cho dòng đi n đi ra).
ấ
ề
ẽ
Đi u này có nghĩa, pin s cung c p m t l
ồ
ể
ạ
ề
m ch khác . Pin c a vi đi u khi n Atmega có th cung c p m t ngu n
ả
ệ
đi n liên t c 5V ho c th chìm ( cho đi n th bên ngoài ch y vào ) lên
ế
đ n 40 mA ( milliamps )
. Đi u này làm cho chúng h u ích đ t o năng
ố ớ
ượ
l
ắ
ờ ế
ấ
Lúc b y gi
, n u b n làm làm ng n m ch (digitalWrite 1 pin là HIGH
ồ ố ự ế
r i n i tr c ti p đ n c c âm ho c digitalWrite 1 pin là LOW r i m c
ẽ
ữ
ự ế
ng t ) thì m ch s
ng, ho c nh ng vi c làm t
tr c ti p đ n c c d
ị ỏ
ỉ
ệ
b h ng! Ngoài ra, v i dòng đi n ch 40mA thì trong m t s tr
ể
ợ
ho c relay ho t đ ng đ
h p chúng ta không th làm cho mô t
ộ ố ạ
ầ
làm chúng ho t đ ng thì chúng ta c n chu n b cho mình m t s m ch
ử ụ
s d ng các IC khu ch đ i chuyên d ng (g i là m ch giao ti p) ư ứ ư ế ặ
Thi
t đ t Digital Pins nh là INPUT, INPUT_PULLUP, và OUTPUT
ử
ksp g i vào , 21 Tháng 5, 2014 20:27 (cid:0) Th t
ƯỢ 9402 L T XEM ỹ ậ ố ư
c s d ng nh là INPUT, ể ượ ử ụ
ặ ử ụ ể ổ ộ ử ụ Chân k thu t s có th đ
INPUT_PULLUP , ho c OUTPUT . Đ thay đ i cách s d ng m t
pin, chúng ta s d ng hàm pinMode(). ấ ộ ớ ủ ở ộ
ượ ấ
c c u hình là m t INPUT v i
ấ ệ ụ ạ ươ ệ
ộ ng đ ự ươ
ề ượ ấ
c c u hình là INPUT làm vi c tiêu th năng
ỏ
ệ
ớ
ấ
ng v i m t lo t các đi n
ướ ủ
c c a pin . Đi u này làm cho chúng c c kì ấ ư ộ ả ộ . ạ
ng đi n c a m ch r t nh , nó t
ở
phía tr
ệ ọ
ng m t đèn LED ộ ượ ấ ộ
ệ ệ c các tín hi u đi n và đ c đ c c u hình là INPUT
ọ ượ ừ ấ ứ
b t c
c t ự ng đ ộ
ệ
c th c hi n v i m t
ư ố
ượ
ặ ấ ạ ẽ
ườ
ố ự
ệ ả ở C u hình m t pin là INPUT
Các pin c a Arduino ( Atmega ) đ
pinMode ( ) có nghĩa là làm cho pin y có tr kháng cao (không cho
dòng đi n đi ra) . Pin đ
ượ
ệ ủ
l
ở
tr 100 Megaôm
ế
ữ
h u ích cho vi c đ c m t c m bi n, nh ng không cung c p năng
ượ
l
Nói m t cách nôm na, dân dã, thì khi m t pin đ
ọ ượ
ạ ẽ ễ
thì b n s d dàng đ c đ
ệ
ứ
th gì (Có đi n <= 5V)!
ạ
ấ
ế
N u b n đã c u hình pin là INPUT, b n s mu n pin có m t tham
ế
ặ ấ
ộ
ớ
ế
chi u đ n m t đ t (GND, c c âm), th
ộ
ố
ở
ệ
trong
đi n tr kéo xu ng ( m t đi n tr đi xu ng m t đ t ) nh mô t
ỹ
ậ ố ọ ố ế
k thu t s đ c n i ti p.
ộ
ấ ộ ở ệ
ạ ạ
ở ở ạ ộ ộ
ệ ế
ể ệ
ậ
ố
m ch ngoài, b n có th dùng tham s
ượ ế ố ộ ạ
ặ ị
c k t n i v i c c d
ượ ớ ự ấ c k t n i
ẽ
ng thì pin s
ố
i c c âm xu ng đ t thì ặ ượ ế ố ớ ự ươ
c thông t C u hình m t pin là INPUT_PULLUP
ở ế ố ớ
Chip Atmega trên Arduino có n i kéo lên đi n tr (đi n tr k t n i v i
ệ
ệ ố
ể
h th ng đi n n i b ) mà b n có th truy c p. N u b n không thích
ộ
ắ
m c thêm m t đi n tr
INPUT_PULLUP trong pinMode(). M c đ nh khi không đ
ạ
v i m t m ch ngoài ho c đ
ị
nh n giá tr là HIGH, khi pin đ
ị
nh n giá tr là LOW. ộ ầ ớ
ậ
ậ
ấ C u hình m t pin là đ u ra (OUTPUT) ộ ế ặ ấ ể ộ ượ ộ ủ ệ
ể ng đi n đáng k cho các
ấ ặ ế ệ ụ ạ
ể ạ ọ ả ề
ụ ữ
ế ng đèn LED nh ng vô d ng đ i v i các c m bi n đ c! ạ ặ ư
ạ
ế ự ắ ồ ặ ươ ệ ế ự ươ
ớ ự
ạ
ộ ố ườ
ượ ạ ộ ể ơ ng
c. Đ ạ ộ ặ
ẩ ị ế ế ạ ạ ọ ế ạ ộ ụ
ộ
ớ ạ ằ ề
ố ế
ệ ở
ế ị ề ố ế ố ớ
ệ
ộ
ố ộ
ạ ế
ầ ế , chúng có giá tr ị ạ ộ ằ ứ ằ
, m t h ng s hay ị ủ ượ ư ộ ố
ị true. ề
ể
, đi u này
Đ thi
t đ t pin là m t OUTPUT, chúng ta dùng pinMode ( )
ấ
ộ ở
ệ
có nghĩa là làm cho pin y có m t tr kháng th p (cho dòng đi n đi ra).
ẽ
ề
ấ
Đi u này có nghĩa, pin s cung c p m t l
ồ
ề
ạ
ể
m ch khác . Pin c a vi đi u khi n Atmega có th cung c p m t ngu n
ả
ệ
đi n liên t c 5V ho c th chìm ( cho đi n th bên ngoài ch y vào ) lên
ế
. Đi u này làm cho chúng h u ích đ t o năng
đ n 40 mA ( milliamps )
ố ớ
ượ
l
ắ
ờ ế
ấ
Lúc b y gi
, n u b n làm làm ng n m ch (digitalWrite 1 pin là HIGH
ồ ố ự ế
r i n i tr c ti p đ n c c âm ho c digitalWrite 1 pin là LOW r i m c
ẽ
ữ
ự ế
ng, ho c nh ng vi c làm t
tr c ti p đ n c c d
ng t ) thì m ch s
ỉ
ệ
ị ỏ
b h ng! Ngoài ra, v i dòng đi n ch 40mA thì trong m t s tr
ể
ợ
h p chúng ta không th làm cho mô t
ho c relay ho t đ ng đ
ộ ố ạ
ầ
làm chúng ho t đ ng thì chúng ta c n chu n b cho mình m t s m ch
ử ụ
s d ng các IC khu ch đ i chuyên d ng (g i là m ch giao ti p)
ầ
H u h t các m ch Arduino đ u có m t pin k t n i v i m t onboard
LED (led n m trên m ch) n i ti p v i m t đi n tr . LED_BUILTIN
ộ ằ
là m t h ng s thay th cho vi c tuyên b m t bi n có giá tr đi u
ể
khi n onboard LED. H u h t trên các m ch Arduino
là 13
ố
ể HI UỂ true là m tộ h ng s
ộ ằ
true là m t h ng logic. B n cũng có th
ể
ị
. Trong các bi u th c logic
nguyên mang giá tr là 1
ứ
ể
giá tr c a m t bi u th c khác 0 đ
c xem nh là mang giá tr
L u ýư (cid:0) ượ ộ ạ ấ Không đ c vi ế true" thành TRUE hay b t kì m t d ng nào t " khác. (cid:0) ươ ươ ị
Các giá tr sau là t ng đ ng nhau: true, HIGH, 1 ộ ằ ủ ị ị i v i ạ ớ true, false là m t h ng logic có giá tr là ph đ nh ạ c l ượ ạ , t c làứ
(!true) = false. B n cũng có
i)
ố
ộ ằ ị Trái l
c aủ true (và ng
thể HI UỂ false là m t h ng s nguyên mang giá tr là 0. Trong các ể ứ ằ ộ ằ ể ộ ố ị ủ
, m t h ng s hay giá tr c a m t bi u th c b ng 0 ứ
bi u th c logic
ư
ượ
c xem nh là b ng đ ằ false. ượ ộ ạ ấ L u ý ư Không đ c vi ế false" thành FALSEhay b t kì m t d ng nào t " khác. (cid:0) ươ ươ ị
Các giá tr sau là t ng đ ng nhau: false, LOW, 0 (cid:0) Mô tả ộ ừ ỉ ệ ộ khóa ch dùng trong vi c khai báo m t ượ ẽ ớ "void" là m t t
ữ
function. Nh ng function đ ả ề
c khai báo v i "void" s không tr v ữ ệ ượ ọ ấ
b t kì d li u nào khi đ c g i. Ví dụled = 13; void setup() { pinMode(led, OUTPUT); } void loop() { blink(); } void blink() { digitalWrite(led, LOW); delay(1000); digitalWrite(led, HIGH); delay(1000); ả }
Gi i thích (cid:0) ượ ị ớ ừ ộ
"blink" là m t function đ c đ nh nghĩa v i t ả ề ộ ụ ủ ệ ỉ ị khóa "void", do đó
ấ
nó không tr v m t giá tr nào. Nhi m v c a "blink" ch là làm nh p ở ạ ố nháy đèn LED chân s 13 trên m ch Arduino. (cid:0) ể ấ ằ ữ ệ ể ạ B n có th th y r ng nh ng function ki u này không dùng l nh ể ả ề ị ủ ệ
ế ượ ớ
ộ ẽ ỉ ậ "return" đ tr v giá tr c a function
Gi
i thi u
M t bi n đ c khai báo ki u ộ
ộ ớ ạ ẽ ấ ề ả ươ ặ ấ ị ng đ ể boolean s ch nh n m t trong hai
giá tr :ị true ho cặ false. Và b n s m t 1 byte b nh cho đi u
ề
đó.
L u ýư
ươ
ữ
Nh ng c p giá tr sau là t
ố ng nhau. V b n ch t, chúng
ớ ữ ề ằ ị đ u là nh ng h ng s nguyên v i 2 giá tr 0 và 1: (cid:0) true false (cid:0) HIGH LOW (cid:0) 1 0 Ví d :ụ int led = 13; boolean led_status; void setup() { pinMode(led, OUTPUT); ở ạ led_status = true; // led ậ
tr ng thái b t } void loop() { ậ digitalWrite(led, led_status); // b t đèn, led_status = 1 delay(1000); ắ digitalWrite(led, !led_status); // t t đèn, !led_status = 0 delay(1000); } ể ữ ệ
Ki u d li u
ể ữ ệ ể ữ ệ Ự ế ể ễ ạ Ki u d li u này là ki u d li u bi u di n cho 1 KÝ T (n u b n ể ễ ươ ỗ ạ ầ ử
ng trình Arduino b n c n s ể ữ ệ ế ộ ộ
ầ
c n bi u di n m t chu i trong ch
ớ
ể ữ ệ
ụ
d ng ki u d li u String). Ki u d li u này chi m 1 byte b nh ! ể ậ ả ị ỉ Ki u char ch nh n các giá tr trong b ng mã ASCII. ể ượ ư ướ ạ ố ố Ki u char đ c l u d i d ng 1 s nguyên byte có s âm (có các giá ị ừ ế ặ ế ể ộ ị 127 128), thay vì thi t đ t m t bi n ki u char có giá tr là 'A', ể ặ ạ ơ ụ ướ i đây . tr t
ể ể
ạ
b n có th đ t là 65. Đ hi u rõ h n b n xem ví d d
Ví dụ char myChar = 'A'; ề ệ ề ể char. Tuy nhiên ki u unsigned char ệ ớ
ộ ố . 0 255) ộ ể ừ ế
0 đ n ạ ẽ ấ ằ
ế ộ ỗ ể ế ị ươ ượ
c dùng trong ch
ớ ế 151) (16 bit) ị ừ ế
32,768 đ n 32,767 ( ị ừ ạ 311) (32 bit) (lúc này nó chi m 4 byte b nh )
ớ ế
2,147,483,648 đ n
ộ ế ợ ệ
ả
char myChar = 65; // c 2 cách khai báo đ u h p l
ể
ệ
ố
Gi ng h t bài gi
i thi u v ki u
ị ừ
ể
ạ
l
i bi u hi u m t s nguyên byte không âm (giá tr t
Ví dụ
unsigned char myChar = 240;
ả
ễ ố
ể ữ ệ
Là m t ki u d li u bi u di n s nguyên n m trong kho ng t
ể byte
ớ
255. B n s m t 1 byte b nh cho m i bi n mang ki u
Ví dụ
byte a = 123; //khai báo bi n a mang ki u byte, có giá tr là 123
Ki uể int là ki u s nguyên chính đ
ể ố
ng trình
ộ
Arduino. Ki uể int chi m 2 byte b nh !
ạ
ạ
Trên m ch Arduino Uno, nó có đo n giá tr t
215 đ n 2ế
ạ
Trên m ch Arduino Due, nó có đo n giá tr t
2,147,483,647 (231 đ n 2ế Ví dụ
int ledPin = 13; Cú pháp
int var = val;
var: tên bi nế
val: giá trị ậ ậ ộ ố ủ ị ẽ ẽ ừ ả ằ 16 1). M i bi n mang ki u d li u này ị
ể ố
ỗ ể ữ ệ ế
0 đ n
ế
chi m 2 byte ả ế
ể ữ ệ ứ ậ ằ ể ễ
ớ ạ
ị M t s th thu t l p trình
int x;
x = 32768;
ậ
x = x 1; // x s nh n giá tr là 32767
int x;
x = 32767;
ậ
x ++; // x s nh n giá tr 32768
Ki uể unsigned int là ki u s nguyên n m trong kho ng t
65535 (0 đ n 2ế
ế
ớ.
b nhộ
L u ýư
ế
ị ừ
Trên Arduino Due, unsigned int có kho ng giá tr t
0 đ n
4,294,967,295 (232 1) (lúc này nó chi m 4 byte b nh ).
ớ
ộ
B n có th d dàng nh n ra r ng ki u d li u này không ch a các giá
tr âm so v i ki u ể int. ế ị ư ặ ể ữ ệ Cú pháp
unsigned int [tên bi n] = [giá tr ];
Ví dụ
unsigned int ledPin = 13;
L u ý đ c bi ệ (nói chung cho các ki u d li u unsigned) t ế ượ ị ể unsigned int đ ơ ượ ả ặ ớ ạ ị ượ
c gán tr v
ế
ị ủ
ớ ạ ướ
i h n d ạ
t ngoài ph m vi giá tr
ẽ ự ộ
đ ng đ
c
ị ủ
i trong kho ng giá tr c a nó. ị ậ ế ừ 0 đ n 65535 ủ i c a x) ả
ớ ạ
i h n trên c a x)
ớ ạ ướ ủ
i h n d ứ ị ừ ư ể unsigned int, ki u d li u này là ki u s nguyên 16
ể ố
ể ữ ệ
ộ
ế
ế
, và nó chi m 2 byte b
0 đ n 65535) ộ ở ộ ữ ế ủ int. Nh ng bi n có ki u ị ể long có
ạ ẽ
ừ 2,147,483,648 đ nế 2,147,483,647. B n s ể
ấ ộ ộ ế
ế ạ ả ể long.
ể int), b n ph i thêm h u t ể ể ộ
ượ ể int đ chuy n chúng sang ki u
ể ữ ệ
ộ
ể ế
t thêm chi ti
đ bi ừ
c phép. Xem ữ
ậ ố
H u t ố
U và L ế .
t ừ ằ ế ỗ ể ố
32 1). M i bi n mang ki u d li u này ế
0 đ n
chi m ế ớ. ộ
Khi m t bi n ki u
ặ ớ
ơ
(bé h n 0 ho c l n h n 65525), giá tr c a bi n này s t
ẩ
i h n trên ho c gi
đ y lên gi
Ví dụ
unsigned int x = 0; // x nh n giá tr trong kho ng t
x = x 1 // x = 0 1 = 65535 (gi
x = x + 1 // x = 65535 + 1 = 0 (gi
word
ố
Gi ng nh ki u
bit không âm (ch a các giá tr t
nh !ớ
Ví dụ
word w = 10000;
ể ữ ệ
long là m t ki u d li u m r ng c a
th mang giá tr 32bit t
ớ
m t 4 byte b nh cho m t bi n ki u
ậ ố
ớ ố
"L"
Khi tính toán v i s nguyên (bi n ki u
ể long. Vi c ệ
ố
phía sau các s nguyên ki u
tính toán (c ng, tr , nhân,...) gi a 2 s thu c 2 ki u d li u khác nhau
là không đ
Ví dụ
long a = 10;
long b = a + 10L // b = 20
Ki uể unsigned long là ki u s nguyên n m trong kho ng t
ả
4,294,967,295 (0 đ n 2ế
ể ữ ệ
4 byte b nhộ
Ví dụ
unsigned long time;
void setup() ế ạ ờ ạ ệ
ẽ ấ
ươ ấ ứ ệ ể ạ ệ ố ừ
ạ ờ ệ ề ọ ể int, tuy nhiên có đi u trên m i m ch Arduino nó đ u 151) (16 bit). ố
ế ộ ớ ị ị ạ
ề
ả 32,768 đ n ế {
Serial.begin(9600);
}
void loop()
{
Serial.print("Time: ");
time = millis();
Serial.println(time);//Xu t th i gian lúc ch y h t đo n l nh trên
ng trình trong 1 giây. Lúc này s làm "tê
delay(1000);//D ng ch
ệ
li
t" h th ng, b n không th ch y b t c l nh gì trong th i gian
delay
}
Gi ng h t ki
ể
chi m 4 byte b nh và bi u th giá tr trong kho nf
32,767 (215 đ n 2ế
Ví dụ
short ledPin = 13; ế ể ố ự
ể ữ ệ ể ử ụ
ộ ể ặ ể ữ ệ float.
ị ằ
ế ế ữ ố ạ 67 ch s có nghĩa n m bên m i ằ ở
ộ ố ự ể ặ ừ
ằ ạ ỗ
. Đi u đó có nghĩa r ng b n có th đ t m t s th c dài
ự ồ
(bao g m d u ấ .) Cú pháp
short var = val;
var: tên bi nế
val: giá trị
ể ị
ạ
Đ đ nh nghĩa 1 ki u s th c, b n có th s d ng ki u d li u
ộ
M t bi n dùng ki u d li u này có th đ t m t giá tr n m trong
kho ngả 3.4028235E+38 đ n 3.4028235E+38. Nó chi m 4 byte b
ộ
nhớ.
ể ữ ệ float b n có t
ớ
V i ki u d li u
ề
ấ
bên d u "."
ế
đ n 15 ký t
L u ýư ộ ạ ả ễ ố ự ể ể
ẫ ạ ử ư
ố ẽ ị ự ủ
Đ bi u di n giá tr th c c a m t phép chia b n ph i 2 s th c chia
ả ẽ ả
ế
ụ ạ ử
5.0 / 2.0 thì k t qu s tr
cho l n nhau. Ví d : b n x lý phép tính
ả ẽ
ế
ế
v làề 2.5. Nh ng n u mà b n x lý phép tính
5 / 2 thì k t qu s
ộ ố
là 2 (vì hai s nguyên chia nhau s ra m t s nguyên).
Ví dụ
float myfloat;
float sensorCalbrate = 1.117; ẽ ả ề ế ả ứ ẽ ế ạ ậ ả Cú pháp
float var = val;
var: tên bi nế
val: giá trị
Code tham kh oả
int x;
int y;
float z;
x = 1;
y = x / 2; // y s tr v k t qu là 0
ả
z = (float)x / 2.0; //z s có k t qu là 0.5 (b n nh p 2.0, ch không
ph i là 2)
double (cid:0) ớ ệ ư
ộ ể
ậ ẩ ậ ớ ậ ị ượ ượ
c dùng trên Arduino chính là ằ
ấ
c đánh d u b ng
Array trong ngôn ữ
ữ ậ Gi
i thi u
ư ể float. Nh ng trên m ch Arduino Due thì ki u
ế
ạ
ố
Gi ng h t nh ki u
ế
ế
ạ
double l
i chi m đ n 8 byte b nh (64 bit). Vì v y hãy c n th n khi
ể ữ ệ
ử ụ
!
s d ng ki u d li u này
ả
ợ
Array là m ng (t p h p các giá tr có liên quan và đ
ỉ ố Array đ
nh ng ch s ).
ng l p trình C. ộ ả ở ạ
Các cách kh i t o m t m ng ạ ầ ử ượ (đ ề c đánh
ế i đa 6 ph n t
này đ u có ki u là int => khai báo này chi m ả
ầ ử
05), các ph n t
ớ ầ ử ầ
ầ ử ả ả
t là 2, 4, 8, 3, 6). M ng này không gi ứ
ớ ạ ố ượ
i h n s l (l n
vì có ứ ố ạ ị ầ ượ ầ ử ầ ầ ử ả
đ u tiên có giá tr l n l i
t là 2, 4, 8, , trong đó 5 ph n t ự ạ ạ ả ỗ ố (d ng chu i) có t i đa 6 ứ ố
int myInts[6]; // t o m ng myInts ch a t
ể
ấ ừ
d u t
2*6 = 12 byte b nhộ
ạ
int myPins[] = {2, 4, 8, 3, 6}; // t o m ng myPins ch a 5 ph n t
ượ
l
ng ph n t
khai báo là "[]"
int mySensVals[6] = {2, 4, 8, 3, 2}; // t o m ng mySensVals ch a t
đa 6 ph n t
3, 2
char message[6] = "hello"; // t o m ng ký t
ký t !ự ậ ả ẩ ử ầ ử ầ ượ ả ấ trong m ng
đ u tiên trong m ng luôn đ c đánh d u là s 0ố . ề ố i đa 10 ph n t ầ ử
, ầ ử ố ầ ượ ứ ấ ằ
cu i c n (th 10) đ ả
ộ
c đánh d u là Truy c p các ph n t
Chú ý: Ph n t
mySensVals[0] == 2, mySensVals[1] == 4, vâng vâng
ệ
Đi u này có nghĩa r ng, vi c khai báo m t m ng có t
s 9ố
thì ph n t ị ằ ả ế ị ả
ế ế ế cu i cùng thì hãy truy đ n đ n ô ể ế ộ ớ ằ
ậ
ậ ữ
ớ
ươ ế
ủ ạ ẽ
ng trình c a b n s ằ
ậ
ỗ ấ ắ ỗ ể ấ int myArray[10]={9,3,2,4,3,2,7,8,9,11};
ị
// myArray[9] có giá tr là 11
ẽ ả ề ộ
// myArray[10] s tr v m t giá tr "hên xui" n m trong kho ng
ị ủ
giá tr c a int
ạ
ậ
ệ
ậ
ế
Vì v y, hãy chú ý trong vi c truy c p đ n giá tr trong m ng, n u b n
ớ ạ
ầ ử ố
ậ
ố
mu n truy c p đ n ph n t
i h n
gi
ả
ủ
c a m ng 1.
ị
Hãy ghi nh r ng, trong trình biên d ch ngôn ng C, nó không ki m tra
ộ
ạ
b n có truy c p đ n m t ô có n m trong b nh hay không! Nên n u
ệ
không c n th n trong vi c truy c p m ng, ch
m c l ả
i đ y! ẩ
i logic và r t khó đ tìm l
ộ ộ ầ ử ị
Gán m t giá tr cho m t ph n t
mySensVals[0] = 10; ọ ộ ầ ử ế ộ
và gán cho m t bi n nào đó ộ
ể ữ ệ ị ủ
Đ c m t giá tr c a m t ph n t
cùng ki u d li u
x = mySensVals[0]; //10 ặ ả ẳ ặ ạ ấ ả ượ ng đ ế ư
ạ ủ ộ ế ủ ầ ủ ạ ầ ử ầ ủ ả myPins: đ u c a m ng ớ ằ ủ ủ ẽ ử ạ Ả ạ Dùng m ng trong vòng l p
ể
ườ
c dùng trong vòng l p (ch ng h n nh dùng đ
M ng r t th
ả
ư
l u các chân digital qu n lý đèn led). Trong đó, bi n ch y c a hàm for
ả
ầ
ẽ
ộ
ặ
s đi h t (ho c m t ph n) c a m ng, tùy thu c vào yêu c u c a b n
ụ ề ệ
mà thôi! Ví d v vi c in 5 ph n t
int i;
for (i = 0; i < 5; i = i + 1) {
Serial.println(myPins[i]);
}
/*
shiftOut v i 8 LED b ng 1 IC HC595
*/
//chân ST_CP c a 74HC595
int latchPin = 8;
//chân SH_CP c a 74HC595
int clockPin = 12;
ủ
//Chân DS c a 74HC595
int dataPin = 11;
ủ
//Tr ng thái c a LED, hay chính là byte mà ta s g i qua shiftOut
byte ledStatus;
void setup() {
Ộ
//B n BU C PH I pinMode các chân này là OUTPUT
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT); ọ ạ ế ệ
t trên h ộ ố ề ữ ệ ơ ố ế ữ ế ế ứ ề
ạ ầ
t ti p theo sau, b n c n có ki n th c v ề ể ụ ả ở ả ọ ạ ạ ằ ệ
ố ặ ị ế ẩ ộ ở ị bit 0 ể ắ ộ ẽ ạ }
void loop() {
/*
Trong tin h c, ngoài các phép +, , *, / hay % mà b n đã bi
ơ ố
c s 10.
Thì còn có nhi u phép tính khác n a. Và m t trong s đó là Bit Math
(toán bit) trên h c s 2.
ể ể
Đ hi u nh ng gì tôi vi
Bit Math.
ạ
ể
Đ tìm hi u v Bit Math, b n vào m c Tài li u tham kh o
b ng
ộ
ch n n m phía trên cùng trang web và ch y xu ng khi b n kéo chu t
trên trang Arduino.VN
*/
//Sáng tu n tầ ự
ledStatus = 0;//m c đ nh là không có đèn nào sáng h t (0 =
0b00000000)
for (int i = 0; i < 8; i++) {
ledStatus = (ledStatus << 1) | 1;//Đ y toàn b các bit qua trái 1 bit và
ộ
c ng bit có giá tr là 1
/**
ả
B t bu c ph i có đ shiftOut
**/
digitalWrite(latchPin, LOW); //các đèn LED s không sáng khi b n
digital LOW
//ShiftOut ra IC
shiftOut(dataPin, clockPin, MSBFIRST, ledStatus); ẽ ớ ạ ậ c c p nh p ộ ả ế ả ừ ươ ể ấ ng trình kho ng 500 mili giây đ th y các ệ ứ ắ ầ ự ẩ ấ ả t c các bit qua bên trái 1 bit ỗ ự ế ạ ớ c gi i ệ ể ớ
ư ộ ạ
ế ạ ỗ ượ ạ ạ ẽ ỗ
ộ ẽ ố ư ượ
ơ
ng String này có gì hay h n
ệ ơ
ề
ỗ ... Tuy nhiên,
ề
i b n s có nhi u c l ớ ơ
ỗ ủ ỗ ợ ấ ơ ệ ể ỗ string) và object String r t đ n
ữ ườ ấ ừ
digitalWrite(latchPin, HIGH);//các đèn LED s sáng v i tr ng thái v a
ượ ậ
đ
/**
ắ
K t thúc b t bu c ph i có
**/
delay(500); // D ng ch
ủ
hi u ng c a đèn LED
}
//T t tu n t
for (int i = 0;i<8;i++) {
ledStatus <<= 1; //Đ y t
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, ledStatus);
digitalWrite(latchPin, HIGH);
delay(500);
}
}
ạ
ố ượ
ng chu i c c m nh trên Arduino
String Object Đ i t
ố ư
ể ử ụ
ạ
ỗ
ộ
N u b n mu n l u m t chu i nào đó, b n có th s d ng
ặ ử ụ
ki uể string (m ng ký t ) ho c s d ng đ i t
ố ượ
ự
ả
ng String đ
ố ươ
ậ
thi u ngày hôm nay. V y đ i t
ki uể string kia? V i object String b n có th làm nhi u vi c h n,
ẳ
ch ng h n nh c ng chu i, tìm ki m chu i, xóa chu i,.
ề
ạ
b n cũng s t n nhi u b nh h n, nh ng ng
ệ ử
hàm h tr cho vi c x lý chu i c a mình!
ả
ữ
Đ phân bi
t gi a m ng chu i (
ữ
ỗ ớ
gi n.ả string là chu i v i ch "s" th
ỗ ượ ị
hoa! Ngoài ra, chu i đ ng còn object String là ch "S"
ụ
c đ nh nghĩa trong hai d u nháy kép (ví d ượ c xem làm ụ ắ ầ ừ ự ứ ủ ể ộ ư
nh "Arduino.VN Cong dong Arduino Viet Nam") đ
ỗ
ả
m ng chu i
hi m vệ
ả ề
Tr v ký t th n (b t đ u t 0) c a m t ki u String . ể ị ự ộ ủ ự ứ ố
th n c a m t cu i ự ủ ấ ỗ
c a chu i ứ ử ỗ ơ ể
ớ ơ
ả ớ
ể ỗ Cú pháp
string.charAt(n)
Tham số
ộ
ế
string: m t bi n ki u String.
ầ ấ
n: v trí c n l y ký t
Tr vả ề
Ký t
Ví dụ
String text = "Arduino.vn";
void setup() {
Serial.begin(9600);
for (int i = 0;i < text.length(); i++) {
Serial.println(text.charAt(i)); //Xu t các ký t
}
Serial.println();
}
void loop() {
}
ứ
ướ
c (bé h n) hay đ ng sau (l n h n)
Ki m tra th chu i này đ ng tr
ơ .
ụ ố
ạ
v i chu i khác hay là không. B n tham kh o ví d cu i bài đ rõ h n Cú pháp
string.compareTo(string2)
Tham số ỗ
ỗ string)
string) ỗ ỗ ơ ơ ớ ỗ ỗ ạ ượ ắ string: chu i này (
string2: chu i kia (
Tr vả ề
ố ươ
ế
ng: n u chu i này bé h n chu i kia
s d
ỗ ằ
0: 2 chu i b ng nhau
ố
ế
s âm: n u chu i này l n h n chu i kia
ứ
ố
N i 2 string l i thành 1 string. String th 2 đ ứ .
c g n sau string th 1 ế ể ủ Cú pháp
string.concat(string,string2)
Tham số
string, string2: bi n ki u String
Tr vả ề
ứ ộ
ể
ộ
M t ki u string ch a n i dung c a 2 string
ỗ
ụ ố
Ví d N i các chu i ụ M c tiêu ẽ ọ ỗ ế ề i đây. Bài vi
ầ ứ ượ ắ ớ ỉ ầ ạ c g n v i máy tính ụ ướ
ố
Chúng ta s h c cách n i chu i qua ví d d
t này
ấ ề ậ
ọ ơ
mang nhi u tính ch t v l p trình tin h c h n là ph n c ng. Vì
ị ộ
ỉ
ậ ạ
v y b n ch c n ch b m t m ch Arduino đ
ổ
.
qua c ng USB là ok ậ L p trình String stringOne, stringTwo; void setup() {
ở ổ ả ủ ể // M c ng Serial đ debug xem thành qu c a chúng ta Serial.begin(9600); while (!Serial) {
ổ
ợ ươ ậ ỉ ầ ế ớ c b t (ch c n thi t v i Arduino ; // đ i cho c ng serial đ
Leonardo) } stringOne = String("Cam bien"); stringTwo = String("Gia tri ");
ạ ử ộ ạ //G i m t đo n thông báo là đã ch y xong hàm setup() Serial.println("\n\nVi du ve noi chuoi:"); Serial.println(); } void loop() { ữ Serial.println(stringOne); // in ch "cam bien" ỗ ứ ỗ ứ // chèn chu i th 1 vào sau chu i th 2 stringTwo += stringOne; ữ Serial.println(stringTwo); // in ch "Gia tri cam bien" ỗ ằ ộ // thêm m t chu i h ng vào stringTwo += " cho dau Analog "; Serial.println(stringTwo); // prints "Gia tri cam bien cho dau
Analog " ộ ằ ự // Thêm m t h ng ký t vào stringTwo += 'A'; Serial.println(stringTwo); // prints "Gia tri cam bien cho dau
Analog A" ộ ố
// Thêm m t s nguyên vào stringTwo += 0; Serial.println(stringTwo); // prints "Gia tri cam bien cho dau
Analog A0" ị ủ ộ // thêm giá tr c a m t chân analog vào stringTwo += ": "; stringTwo += analogRead(A0); ị ấ ộ ặ ỳ Serial.println(stringTwo); // prints "Gia tri cam bien cho dau
Analog A0: 123" ho c là m t giá tr b t k mà analogRead(A0)
ả ề
tr v ủ Serial.println("\n\nDoi gia tri c a bien Chuoi"); stringOne = "Gia tri cua mot bien so nguyen kieu long: "; stringTwo = "millis(): "; stringOne += 123456789L; ấ
Serial.println(stringOne); //Xu t "Gia tri cua mot bien so nguyen
kieu long: 123456789" stringTwo.concat(millis()); ờ ể ệ ạ i ấ
Serial.println(stringTwo); //Xu t "millis(): "+th i đi m hi n t
theo mili giây ừ ầ // d ng h m loop while(true); ụ ố ỗ ệ ẽ ậ ớ ỗ }
Nhi m vệ
ỗ
So sánh 2 chu i có gi ng nhau hay không. Chu i trong Arduino phân
ỗ
ườ
bi
ng nhé, vì v y chu i "Arduino.vn" s khác so v i chu i
t hoa th
"arduino.vn". ế ể ườ Cú pháp
string.equals(string2)
Tham số
string, string2: bi n ki u String
Tr vả ề
ế
true: n u 2 chu i b ng nhau
false: các tr ỗ ằ
ợ
ng h p khác So sánh chu iỗ ớ ệ i thi u ỗ ậ ề ườ ng l p trình nh ỗ ự khác nhau đ u tiên ầ
ự ầ
đ u tiên
ự '9' trong mã ằ ở ị
ự '1').
ầ ẫ ằ ỗ ố ệ ơ
ấ ễ ị
ề
ố ụ
ề ả ẩ ỗ ố ậ
ấ ả ỗ ố ấ ơ
ể ố ở ệ các ki u Gi
ể
Chúng ta có nhi u cách đ so sánh chu i trong môi tr
ử ư >=,<=, <, >, = ho c ặ
ể
Arduino. Trong đó, ta có th dùng các toán t
ư equals(), equalsIgoreCase().
ư ệ
ủ
ử ụ
s d ng các hàm c a th vi n String nh
ủ
ệ
ệ
Vi c so sánh chu i là vi c so sánh mã c a ký t
ụ '1' < '2', 'a' < 'b', '999' > '1000' (vì ký t
ỗ
ủ ả
c a c 2 chu i. Ví d ,
ứ
ỗ
ủ
v trí th 0 và ký t
khác nhau c a 2 chu i đó n m
ị ớ
ASCII có giá tr l n h n ký t
L u ýư : Chúng ta r t d b nh m l n r ng vi c so sánh chu i s cũng
chính là so sánh s . Đi u này không chính xác (ví d trên), và vì v y ta
ầ
ậ
c n ph i c n th n khi so sánh các chu i s . Và đi u đ n gi n nh t đó
ể ố
là vi c ta chuy n s các chu i s y thành s
như int, float, long,... ạ ờ hãy g n Arduino vào máy tính và upload đo n code sau và ủ ắ
ệ Bây gi
rút kinh nghi m c a riêng mình! ậ ứ ượ ậ ổ ỉ ầ ế ố ớ ạ c b t (ch c n thi t đ i v i m ch L p trình
String stringOne, stringTwo;
void setup() {
ớ
ở ổ
// M c ng Serial v i m c baudrate 9600
Serial.begin(9600);
while (!Serial) {
ợ
; // đ i khi nào c ng Serial đ
Leonardo)
}
stringOne = String("this");
stringTwo = String("that");
}
void loop() { ỗ ằ ế // so sánh 2 chu i có b ng nhau hay không (cách 1)
if (stringOne == "this") {
Serial.println("StringOne == \"this\"");
}
ỗ
// n u 2 chu i khác nhau
if (stringOne != stringTwo) {
Serial.println(stringOne + " =! " + stringTwo);
} ế ư ừ ợ
ng h p 2 t t khác nhau (hoa, cùng 1 nghĩa nh ng cách vi ườ
ng) ị ỗ ạ ằ ẽ ế t khác đ nh d ng nên khi so sánh, 2 chu i này s không b ng ể ể ạ ằ ỗ ố // tr
ườ
th
stringOne = "This";
stringTwo = "this";
//Vì vi
nhau
if (stringOne != stringTwo) {
Serial.println(stringOne + " =! " + stringTwo);
}
ể
// B n có th dùng hàm equals đ ki m tra 2 chu i có gi ng (b ng)
nhau hay không
if (stringOne.equals(stringTwo)) {
Serial.println(stringOne + " equals " + stringTwo); //equals nghĩa là
b ngằ
}
else {
Serial.println(stringOne + " does not equal " + stringTwo); // does not
equal nghĩa là không b ngằ
} ỗ ợ ằ ặ ườ ng h p b n mu n ki m tra 2 chu i có b ng nhau ườ ạ
ệ ể
ng ố
t hoa th ằ ệ ườ ng) t hoa th ườ ệ ằ t hoa th ng) ỗ ố ể ằ ớ ố ộ // ho c trong tr
hay không mà không phân bi
if (stringOne.equalsIgnoreCase(stringTwo)) {
Serial.println(stringOne + " equals (ignoring case) " + stringTwo);
//b ng (không phân bi
} else {
Serial.println(stringOne + " does not equal (ignoring case) " +
stringTwo); // không b ng (không phân bi
}
// m t chu i s nguyên có th so sánh v i 1 s nguyên b ng cách...
stringOne = "1";
int numberOne = 1;
if (stringOne.toInt() == numberOne) {
Serial.println(stringOne + " = " + numberOne);
} ỗ ố ử ể ể ỗ
so sánh cũng có th dùng đ so sánh 2 chu i // so sánh 2 chu i s nguyên
stringOne = "2";
stringTwo = "1";
if (stringOne >= stringTwo) {
Serial.println(stringOne + " >= " + stringTwo);
}
// các toán t
stringOne = String("Brown");
if (stringOne < "Charles") {
Serial.println(stringOne + " < Charles"); ỗ ể ị ố ẽ ả ề ừ ầ bên trái) ữ ỗ ơ ố ố ỗ
ơ ế ớ ỗ ng n u chu i A l n h n chu i B ỗ
ỗ ằ ươ ừ ạ ế ữ
ng trình không ch y ti p n a }
if (stringOne > "Adams") {
Serial.println(stringOne + " > Adams");
}
if (stringOne <= "Browne") {
Serial.println(stringOne + " <= Browne");
}
if (stringOne >= "Brow") {
Serial.println(stringOne + " >= Brow");
}
// hàm compareTo() dùng đ so sánh 2 chu i
// nó s tr v 1 s nguyên là v trí đ u tiên (tính t
ỗ
// khác nhau gi a 2 chu i.
ế
// s nguyên nó là s âm n u chu i A bé h n chu i B
ố ươ
// là s d
ằ
// và b ng 0 khi 2 chu i b ng nhau.
stringOne = "Cucumber";
stringTwo = "Cucuracha";
if (stringOne.compareTo(stringTwo) < 0 ) {
Serial.println(stringOne + " be hon " + stringTwo);
}
else {
Serial.println(stringOne + " lon hon " + stringTwo);
}
while (true) {} //d ng ch
} ụ ỗ ố equals(), hàm
ẽ ằ ậ ỗ ớ
ng vì v y chu i "Arduino.vn" s b ng t hoa th ỗ Nhi m vệ
So sánh 2 chu i có gi ng nhau hay không. Khác v i hàm
ườ
ệ
này không phân bi
.
chu i "arduino.vn" ể ế ườ ỗ ằ
ợ
ng h p khác ụ Cú pháp
string.equalsIgnoreCase(string2)
Tham số
string, string2: bi n ki u String
Tr vả ề
ế
true: n u 2 chu i b ng nhau
false: các tr
Ví dụ
So sánh chu iỗ
length()
Nhi m vệ ự ủ ỗ ỏ ự ả ề ố
Tr v s ký t c a chu i (đã b qua ký t ầ
.
null c m cân) ể ậ ở baudrate 9600 Cú pháp
string.length()
Tham số
ế
ộ
string: m t bi n ki u String
Tr vả ề
ỗ
ộ
long: đ dài chu i
Ví dụ
String text = "Arduino.VN Cong dong Arduino Viet Nam";
void setup() {
Serial.begin(9600); // B t Serial
Serial.println(text.length());
}
void loop() {
} ế ỗ ừ ị ự
remove() là xóa các ký t
ặ ừ ị
ế
index đ n h t chu i, ho c t trong đ i t
v trí ố ượ
ng String.
ị
ế
indexđ n v v trí ư ệ
Mã th vi n:
ụ ủ
ệ
Nhi m v c a hàm
ẽ
Nó s xóa t
trí index c ngộ length. Cú pháp string.remove(index);
string.remove(index, length); ng String ắ ầ ố ượ
ị Tham số
string: đ i t
index: v trí b t đ u
ẽ ị ắ
ộ
length: đ dài s b c t
Tr vả ề
không
Ví dụ
Xóa chu iỗ ụ ự ạ trong ộ ố ượ ấ ỳ ộ
ớ ộ ế ế ố ẽ
ự ỗ
ủ
ở ướ ể ậ M c tiêu
Hàm remove() cho phép chúng ta có xóa b t k m t đo n ký t
ố
ể
ng String. Ta có th dùng hàm này v i 2 tham s khác
m t đ i t
ừ ị
ố ẽ
ỗ
v
nhau, m i cách dùng có m t ý nghĩa riêng: dùng 1 tham s s xóa t
ừ ị
ắ ầ index) cho đ n h t chu i; dùng 2 tham s s xóa t
v trí
trí b t đ u (
ạ
ế
ắ ầ index) cho đ n khi xóa đ ít nh t
. Các b n hãy
b t đ u (
ạ
xem đo n code l p trình ấ length ký t
ơ .
i đ rõ ràng h n d ậ L p trình ứ ượ ậ ế ớ ỉ ầ ạ String example = "Arduino.VN Cong dong Arduino Viet Nam";
void setup() {
ớ
ở ổ
// M c ng Serial v i m c baudrate là 9600
Serial.begin(9600);
while (!Serial) {
ợ ổ
; // đ i c ng Serial đ c b t (Ch c n thi t v i m ch }
}
void loop() { ỗ ầ ủ ự ừ ký t ế
ế
10 đ n h t ỉ ừ ị ủ ụ ứ ự ế v trí th 7 đ n khi xóa đ 22 ký t ặ // In ra chu i đ y đ
Serial.println("Chuoi day du:\n");
Serial.println(example);
// Xóa t
example.remove(10); // index = 10
Serial.println("Chuoi sau khi xoa tu ky tu 10:\n");
Serial.println(example); // Ch còn "Arduino.VN"
// Ví d khác, xóa t
example = "Arduino.VN Cong dong Arduino Viet Nam";
example.remove(7, 23);
Serial.println("Chuoi sau khi xoa:\n");
Serial.println(example); // "Arduino Viet Nam"
ừ
while(1); // d ng vòng l p
} ạ ỗ ọ ạ string) t i ừ ể
ki u ể
ướ ớ ộ ả
ị ộ ả
T o m t b n copy ki u chu i m ng char (đ c thêm t
c v i đ dài xác đ nh.
String cho tr ể ỗ ả ể ệ ớ char[]) ỗ c t o thành ( ở ứ m c baudrate 9600 Cú pháp
string.toCharArray(buf, len)
Tham số
ế
ộ
string: m t bi n ki u String
ế
ể ư
buf: bi n đ m dùng đ l u chu i ki u m ng m i (
ớ ượ ạ
ộ
len: đ dài chu i m i đ
unsigned int).
Tr vả ề
không
Ví dụ
void setup() {
ở
// m Serial
Serial.begin(9600);
while (!Serial) { ợ ở ạ ỉ ầ ế ớ t v i m ch Leonardo ỗ ả ể ẽ ạ ớ ớ ộ cướ ạ ử ỏ ; // đ i m Serial, ch c n thi
}
}
char buf[100];
void loop() {
ộ
// Hàm toCharArray s t o ra m t chu i ki u m ng m i v i đ dài
cho tr
String text = "Arduino.VN Cong dong Arduino Viet Nam";
//B n hãy th b +1
for (byte len = 1;len<=text.length()+1; len++){
Serial.print("Length: ");
Serial.print(len);
Serial.print(" ");
text.toCharArray(buf,len);
Serial.println(buf);
delay(100);
}
//Không làm gì n aữ
while(true);
} ầ ỗ ẽ ả ề ố
ộ ượ ớ ự ầ ư ệ
Mã th vi n:
String
ộ
ể
Chuy n m t chu i thành m t s . Hàm này s tr v s nguyên đ u
tiên nó tìm đ ộ ố
ầ
c v i yêu c u ký t ả
đ u tiên ph i là m t ký t ự ố.
s ể ể ế ặ ổ ố
c chuy n đ i. Ho c là s 0 n u không tìm th y s ấ ố Cú pháp
string.toInt()
Tham số
ế
ộ
string: m t bi n ki u String
Tr vả ề
ượ
ố
long: s nguyên đ
ệ
ề
ỏ
th a mãn đi u ki n trên.
Ví dụ ố ổ toInt() và các ể
ế
ụ ỗ ố
ụ
t này có m c đích gi
ạ ậ ố
ng d ng trên Arduino. B n nên tham kh o đ v n d ng th t t
ạ ử ụ
i thích cách s d ng hàm
ể ậ ụ
ả
ế ậ ụ ơ ả ộ ạ ắ ộ . Chuy n đ i chu i s thành s
ả
Bài vi
ứ
t nhé.
ỉ
Đây là m t ví d đ n gi n liên quan đ n l p trình hoàn toàn. B n ch
ầ
c n m t m ch Arduino và g n vào máy tính là xong
ậ ế ị ừ ể ư input ứ ớ ạ ỉ ầ ượ ậ c b t lên (ch c n v i m ch Arduino ộ ằ ử ạ ộ ị ừ Serial ề ạ i Ố ộ s hay ả ự ể ạ ẽ ộ ố ế ỗ L p trình
String inString = ""; // bi n inString dùng đ l u giá tr t
void setup() {
ớ
ở ổ
// M c ng Serial v i m c baudrate 9600
Serial.begin(9600);
while (!Serial) {
ợ ổ
; // đ i c ng Serial đ
Leonardo)
}
// G i m t thông báo r ng hàm setup đã ho t đ ng xong
Serial.println("\n\nChuyen doi chuoi so thanh so:");
Serial.println();
}
void loop() {
ọ
// Đ c giá tr t
while (Serial.available() > 0) {
int inChar = Serial.read(); //Xem thêm v Serial.read() t
http://arduino.vn/reference/library/serial/1/huongdanham/read
ự ố
ể
if (isDigit(inChar)) { // Hàm ki m tra S ĐÓ có là m t ký t
không (xem b ng ACSII http://arduino.vn/reference/bangmaascii )
ổ ố
// Chuy n đ i s đó thành ký t
// và thêm vào chu i. N u không thì b n s thêm m t s nguyên
vào đ y :Pấ
inString += (char)inChar; ế ộ ế xu ng dòng. Ta in k t qu ra
ấ ả
ơ ộ ự ố
ự ta dùng d u ' (nháy đ n) còn m t ỗ ấ ế }
// N u inChar là m t ký t
ộ
if (inChar == '\n' ) {//M t ký t
chu i ta dùng " (d u nháy kép)
Serial.print("Gia tri :");
Serial.println(inString.toInt());
Serial.print("Chuoi: ");
Serial.println(inString);
ị ủ
// xóa giá tr c a bi n inString
inString = "";
}
}
} ụ ể ấ ả ự ủ ỗ Nhi m vệ
Chuy n t t c ký t c a chu i thành ký t ự ườ
th ng ể Cú pháp
string.toLowerCase()
Tham số
ế
ộ
string: m t bi n ki u String
ả ề không ữ
ữ ể
ể ườ
ườ Tr v
Ví dụ
ể
Chuy n ki u ch (hoa / th
ể
Chuy n ki u ch (hoa / th ng)
ng) ớ ệ Gi i thi u ể ẫ ặ ừ ộ ế ỉ t này, t
ng t ớ ẽ ướ
ng d n b n cách chuy n ki u ch in hoa
s h
ỗ
m t chu i cho tr c. Đây là bài vi ế
ườ
ữ ậ ạ
ướ
ạ ỉ ầ ộ ữ
ể
Qua bài vi
ề
t ch nói v
ho c in th
ạ
ậ
ngôn ng l p trình Arduino, vì v y b n ch c n m t m ch Arduino
ắ
g n vào máy tính là xong . ươ ng trình ở ứ m c baudrate 9600 ở ỉ ầ ế ớ ạ t v i m ch Leonardo ẽ ể ộ ự ỗ trong chu i thành in hoa Ch
void setup() {
ở
// m Serial
Serial.begin(9600);
while (!Serial) {
ợ
; // đ i m Serial, ch c n thi
}
}
void loop() {
// toUpperCase() s chuy n toàn b các ký t
String stringOne = " ộ ẽ ể ự ỗ
trong chu i thành in ngườ // toLowerCase() s chuy n toàn b các ký t
th
String stringTwo = "";
Serial.println(stringTwo);
stringTwo.toLowerCase();
Serial.println(stringTwo);
//Không làm gì n aữ
while(true);
} ụ ể ấ ả ự ủ ỗ ự Nhi m vệ
Chuy n t t c ký t c a chu i thành ký t hoa. ể ữ ể ườ ng) ụ Cú pháp
string.toUpperCase()
Tham số
ế
ộ
string: m t bi n ki u String
Tr vả ề không
Ví dụ
ể
Chuy n ki u ch (hoa / th
String
Nhi m vệ ự ố ở ầ ạ ố ữ tr ng đ u và cu i câu. Các b n ế ể ắ ọ ẽ ắ ỏ ế
Hàm này s c t b h t nh ng ký t
ơ .
ụ ể
xem ví d đ rõ h n
Cú pháp string.trim()
Tham số string: m t bi n ki u String
ộ
Tr vả ề không
Ví dụ
ỗ
ộ
Đ dài và Chu i đã c t g n
ụ ủ ộ ỗ ể ấ
t cách làm th nào đ l y đ dài c a m t
ề ế ế
ỉ ấ ạ ộ ộ
ứ ậ
ượ ế ố ớ
c k t n i t M c đích
ạ ẽ ế
ụ
Qua ví d này b n s bi
ắ ọ
ỗ
chu i và c t g n chu i đó. Bài này ch nói v ki n th c l p trình nên
ầ
ạ
b n chi c n duy nh t m t m ch Arduino đã đ
i máy tính
là đủ.
ậ L p trình
ế ỗ ể ấ ượ ộ ỗ ượ ử ể ư ộ
c đ dài m t chu i?
ế c g i máy tính ỗ ướ ộ ủ c đó ở baudrate 9600 ế ố ớ ỉ ầ ạ
t đ i v i m ch Arduino ạ ộ ử ộ Làm th nào đ l y đ
String txtMsg = ""; // bi n dùng đ l u chu i đ
ừ
t
int lastStringLength = txtMsg.length(); // đ dài c a chu i tr
void setup() {
ở ổ
// M c ng Serial
Serial.begin(9600);
while (!Serial) {
ở ổ
ợ
; // đ i m c ng Serial. Ch c n thi
Leonardo
}
ầ
// G i m t thông báo là ph n setup đã ho t đ ng xong.
Serial.println("\n\nString length():");
Serial.println();
} ấ ả ữ ự ậ ượ ừ Serial Monitor c t nh n đ t c nh ng ký t ử ỏ ạ ộ ướ ữ ở ạ c n a setup, b n hãy nâng void loop() {
// thêm t
while (Serial.available() > 0) {
char inChar = Serial.read();
txtMsg += inChar;
delay(2); //B n hãy th b dòng này xem :).
ồ
//R i sau đó thêm m t b
baudrate lên thành 115200!
} ấ ộ ỗ ấ ế ư ạ ộ ủ ể ậ ữ ệ ế ầ ỗ i đ dài c a chu i này đ cho l n nh n d li u ti p theo // Xu t thông báo
if (txtMsg.length() != lastStringLength) {
Serial.println(txtMsg);
Serial.println(txtMsg.length());
ơ
// N u đ dài chu i bé h n 140 thì xu t thông báo này
if (txtMsg.length() < 140) {
Serial.println("Day la mot thong bao xuc tich");
}
else {
Serial.println("Thong bao nay qua dai!");
}
// l u l
lastStringLength = txtMsg.length();
}
} ế ỗ ấ ể ắ ọ ộ ỗ ồ ự ắ ữ ắ ọ
ố ả ắ ọ ẽ ắ ỏ ữ
ự
ả
tr ng bao g m: Kho ng cách
9), veritical tab (b ng ả ậ
ở ầ
đ u và cu i chu i. Các ký t
ả
32), tab (b ng ASCII
12), carriage return (b ng ả ả 10). ứ ỉ ầ ở ạ ượ ở m ch Arduino Leonardo c m . Ch c n ử Làm th nào đ c t g n chu i y?
ề
Nói v thu t ng c t g n m t tí nhé. C t g n s c t b nh ng ký t
ắ
"tr ng"
(Space bar) (b ng ASCII
ả
ASCII 11), form feed (b ng ASCII
ASCII 12), và newline (\n) (b ng ASCII
void setup() {
ớ
ở ổ
//M c ng Serial v i m c baudrate 9600
Serial.begin(9600);
while (!Serial) {
ợ ổ
; // đ i c ng Serial đ
}
ộ
// g i m t thông báo
Serial.println("\n\nString length() & trim():");
Serial.println();
} ắ ả ữ ỗ ớ ắ ọ ừ void loop() {
ộ
// đây là m t chu i v i nh ng kho ng tr ng
String stringOne = "Hello! ";
Serial.print(stringOne);
Serial.print("< ket thuc chuoi. Do dai la: ");
Serial.println(stringOne.length());
ỗ
// c t g n chu i
stringOne.trim();
Serial.print(stringOne);
Serial.print("< ket thuc chuoi. Do dai la: ");
Serial.println(stringOne.length());
// ng ng vòng loop
while(true);
} ủ ầ ọ ọ ạ ấ ộ ầ
c t o ra duy nh t m t l n khi g i hàm l n
ị
i khi g i l i hàm y. Đây là ệ ể ạ ạ
ế ụ ộ
t gi a bi n tĩnh và bi n c c b . ẽ
ữ
ạ ấ ủ ừ ế ng tính, v a có tính ch t c a 1 bi n toàn ấ ủ ừ String
ạ
ế
ạ
Ph m vi c a bi n và fan lo i
ấ
ế ẽ ượ ạ
ế
Bi n tĩnh là bi n s đ
ầ
đ u tiên và nó s không b xóa đi đ t o l
ế
ự
s khác bi
ế ưỡ
ế
Bi n tĩnh là lo i bi n l
ế ụ ộ
ụ
c c, v a mang tính ch t c a 1 bi n c c b : (cid:0) ấ ế ế ụ Tính ch t 1 bi n toàn c c: bi n không m t đi khi ch
ế ẫ ớ ủ ng trình
ượ ự
c t
ế
ư ấ
ươ
ượ ọ ạ
c g i l ươ
ng trình và đ
ố
i. Gi ng nh 1 bi n ng trình con đ (cid:0) ằ
con k t thúc, nó v n n m trong ô nh c a ch
ươ
ậ
ậ
ộ
đ ng c p nh t khi ch
ụ ậ
toàn c c v y.
ấ ế ụ ộ ể ượ ử ụ c s d ng trong ế
ỉ
c khai báo. ế ừ ướ ỉ ầ c khai báo bi n. khóa "static" tr ơ ở ạ ổ ở baudrate 9600 ấ ượ ự ổ
c s thay đ i ế ế ấ ọ ỉ
ượ ạ ị Tính ch t 1 bi n c c b : bi n ch có th đ
ượ
ươ
ng trình con mà nó đ
ch
ạ
ể
Đ khai báo b n ch c n thêm t
ụ ể
Xem ví d đ rõ h n.
Ví dụ
void setup(){
Serial.begin(9600); // Kh i t o c ng Serial
}
void loop() {
ạ
testStatus();// Ch y hàm testStatus
ể ạ
ừ
delay(500); // d ng 500 giây đ b n th y đ
}
void testStatus() {
static int a = 0;// Khi khai báo bi n "a" là bi n tĩnh
ầ
ầ
// thì duy nh t ch có 1 l n đ u tiên khi g i hàm testStatus
ế
// là bi n "a" đ c t o và lúc đó ta gán "a" có giá tr là 0 ẽ ế ạ ị ấ
ữ ệ ế ụ ộ
t gi a bi n tĩnh và bi n c c b ! ế ớ c m t khai báo bi n, b n s làm ướ
khóa "const" n m tr
ỉ
ộ ạ ẽ
ế ộ ừ
ế ộ
ể ọ ằ
ế ạ a++;
Serial.println(a);
// Bi n a s không b m t đi khi ch y xog hàm testStatus
ế
ự
// Đó là s khác bi
}
V i m t t
cho bi n này thành m t bi n ch có th đ c "readonly". N u b n có ộ ắ ằ ế ừ ươ ỡ ầ ng l m" thay đ i giá tr c a m t bi n h ng thì đ ng lo l ng, ch ỗ ẽ ạ ệ ự ủ ằ ế ằ ơ ư ế ạ ộ ể t c a có .
i đây ạ
t ể ụ ạ ằ ố ơ ỉ ọ ộ ằ ị ủ ể ạ ố ị ủ
ổ
"l
ạ
ị
i cho b n!
trình d ch s báo l
ế .
ừ
ẫ
ế
ph m vi hi u l c c a bi n
const v n tuân theo
khóa
Các bi n có t
ử ụ const đ khai báo m t bi n h ng, ta còn có th s
ể ử
ộ
ể
Ngoài cách s d ng
ỗ . Tuy nhiên
ố ặ ằ
ộ h ng s ho c h ng chu i
ể
d ngụ #define đ khai báo m t
ượ ư
ả
ậ
ộ
ử ụ
c a chu ng h n trong l p trình, vì kh năng "tuân
s d ng const đ
ế
ệ ự ủ
ạ
theo" ph m vi hi u l c c a bi n! Còn
#define ho t đ ng nh th nào
ế ủ
ạ
thì b n có th xem thêm bài vi
Ví dụ
const float pi = 3.14;
float x;
// ....
ả
x = pi * 2; // b n có th d ng h ng s pi trong tính toán vì đ n gi n
ạ
b n ch đ c nó
ỗ
pi = 7; // l ổ
i ! b n không th thay đ i giá tr c a m t h ng s ằ ế ự ể ỗ
ộ ả
ộ ằ
ữ khóa
ượ ư ừ
ể ử ụ
ề
c dùng nhi u và đ ặ ằ
ế
ẻ
c. Tuy nhiên, đ khai báo m t bi n
ỉ
const. Và
ộ
ượ
c a chu ng ả ở ể ế bài vi t Dùng const hay dùng #define ?
ố
ộ
ể
Đ khai báo m t bi n h ng s (nguyên / th c) ho c h ng chu i thì
ạ
ề ượ
b n có th dùng c 2 cách đ u đ
ố ạ
ả
array) là m t h ng s b n ch có th s d ng t
m ng (
ế const đ
ộ
đây là m t lý do n a khi n
h nơ #define!
ề ế
ạ ầ
ế
N u b n c n tìm hi u v bi n volatile, hãy tham kh o
iạ Wikipedia
t
ơ ượ
c
ế ượ khóa volatile n uế giá tr c a nó có S l
ộ
ể ị ủ ộ ở ng ớ ừ
ị ủ
c nên khai báo v i t
ự ể
ế ố ằ
n m ngoài s ki m soát c a ch
ị ủ
ơ ươ
ộ ế ổ ơ
ế ườ ị ng là: M t bi n đ
th b tác đ ng b i các y u t
ả
ạ
trình đang ch y, nói đ n gi n h n là giá tr c a bi n thay đ i m t cách
ể volatile th
không xác đ nh. Các bi n ki u ạ Memorymapped peripheral registers (thanh ghi ngo i vi có ánh ế ế ử ụ ượ Bi n toàn c c đ các ti n trình con x lý ề ụ ộ ứ nhi u tác v trong m t ng ấ ừ
c truy xu t t
2.
ng tắ (Interrupt Service Routine ISR)
ấ ừ
c truy xu t t
Concurrently Executing Thread). ế
ự
ậ ụ ể ơ ệ ế ớ ự ộ ị ế ế
ườ ự ấ ả
ầ
ườ
i ta ngăn s thay đ i b t th ừ ữ ở ạ ờ RAM đ x lí t m th i thay vì l u tr ữ ở
ị ả ưở ữ ế ộ ể s ố ụ ượ
Bi n toàn c c đ
3.
ồ
ụ
d ng th c thi đa lu ng (
Trong l p trình Arduino mà c th h n là trong vi c giao ti p v i các
ự
ướ ế
ơ
chip Atmega, n i duy nh t x y ra s tác đ ng không d báo tr
c đ n
ữ
ớ
ự
ươ
ng trình có s giao ti p v i
giá tr các bi n là nh ng ph n ch
ằ
ổ ấ
ắ
ng này b ng
Ng
các ng t (interrupts).
ế
ẽ ư
ế
volatile khi khai báo bi n cách mà s đ a bi n
cách khai báo t
khóa
ư
ể ử
ư
lên l u tr
các thanh ghi
ở interrupts. Nh ng bi n này thu c ki u
(register) b nh h
ng b i
ể
2 k trên
.
Khai báo ví dụ
volatile int state; ẫ ươ ở ệ ươ ậ ắ chân Digital 13 khi ng trình m u
ẽ ự
ng trình sau s th c hi n b t t ổ ạ Ch
Ch
t đèn LED
chân Interrupt 0 trên Arduino thay đ i tr ng thái
int pin = 13;
volatile int state = LOW;
void setup() {
pinMode(pin, OUTPUT);
attachInterrupt(0, blink, CHANGE);
}
void loop() {
digitalWrite(pin, state);
}
void blink() {
state = !state;
} Hàm h trỗ ợ ớ ệ i thi u ệ ế ặ ộ ụ ả ề ố
ớ ủ
ộ ả ề ổ ộ ố Gi
ộ
Hàm sizeof() có nhi m v tr v s byte b nh c a m t bi n, ho c
là tr v t ng s byte b nh c a m t m ng ớ ủ
ả array
. ặ ế ể ữ ệ ộ ấ ứ ể ữ ệ ộ ả ặ ỏ ộ ả ấ ể ệ ệ chu iỗ , ộ ướ ủ
ỗ ạ ử ỗ ra r t hi u qu trong vi c ki m tra đ dài
ự ầ
"c n cân" c a Arduino. Sau đây là
ể ấ
ị ủ
c. Đ th y
ụ ằ
ng trình b n hãy th thay chu i trong ví d b ng Cú pháp
sizeof(variable)
Tham số
ọ
ọ
variable: m i ki u d li u ho c m i bi n (thu c b t c ki u d li u
nào) ho c m t m ng.
Ví dụ
Hàm sizeof() t
ư
ề
ạ ầ ư
nh ng b n c n l u ý cho v ký t
ụ ề ệ ọ ừ
ộ
m t ví d v vi c đ c t ng giá tr c a m t chu i cho tr
ả ươ
ệ
ượ
c hi u qu ch
đ
ỗ
ộ
m t chu i khác xem.
char myStr[] = "this is a test";
int i;
void setup(){
Serial.begin(9600);
}
void loop() {
for (i = 0; i < sizeof(myStr) 1; i++){
Serial.print(i, DEC);
Serial.print(" = ");
Serial.write(myStr[i]);
Serial.println();
} ậ ươ ươ ấ ượ ng c ch ể ạ
ng trình đ b n th y đ ố ề ế ố ộ
ầ ử ủ ộ
ả ộ ố ộ ớ ủ ả ụ ộ ể int. ớ ậ delay(5000); // làm ch m ch
trình này mu n nói lên đi u gì
}
L u ýư
ớ ủ
ẽ ả ề ố
ộ
ả
Vì hàm sizeof s tr v s byte b nh c a m t bi n hay m t m ng
ố
ậ
ố
Ế
ạ
ế
nào đó, vì v y n u b n mu n Đ M S ph n t
c a m t m ng s
ư int, word, float,...) thì b n c n
ể ữ ệ
ạ ầ
nguyên có ki u d li u > 1 byte (nh là:
ể ữ ệ ủ
ố ộ
ả
ớ ủ
chia s b nh c a m ng cho s b nh c a ki u d li u c a m ng
ả
đó. Ví d m t m ng có ki u
for (i = 0; i < (sizeof(myInts)/sizeof(int)) 1; i++) {
ế
// hàm làm gì đó v i bi n myInts[i]
}
Hàm và th t củ ụ
ấ
Nh p xu t digita
digitalWrite() ệ ớ i thi u
ệ HIGH ho c làặ ấ
ế LOW
ạ c thi
ấ ặ ệ ị
ở pinMode(). Và b n dùng
ẽ
i chân này s là 5V (ho c
HIGH, và 0V n u ế ấ ế ặ
t đ t là OUTPUT b i
ế ạ
ệ
ệ
ấ
ế ượ
c xu t tín hi u là
.
LOW
ế ặ ở c xu t tín hi u là
c thi ệ ố ặ ắ t đ t là INPUT b i pinMode(). Lúc này
ở ệ ạ ế ố t (LOW) h th ng đi n tr pullup
INPUT_PULLUP n u mu n ệ ở Gi
Xu t tín hi u ra các chân digital, có 2 giá tr là
ượ
ộ
N u m t pin đ
ể
digitalWrite đ xu t tín hi u thì đi n th t
ạ
là 3,3 V trên m ch 3,3 V) n u đ
ệ
ượ
đ
ượ
ộ
ế
N u m t pin đ
ẽ ậ
digitalWrite s b t (HIGH) ho c t
ộ ộ
n i b . Chúng tôi khuyên b n nên dùng
ộ ộ
ậ ệ ố
b t h th ng đi n tr pullup n i b . ố ủ ạ ố ế ặ
t đ t Cú pháp
digitalWrite(pin,value)
Thông số pin: S c a chân digital mà b n mu n thi
value: HIGH ho cặ LOW ượ ế ố ớ c k t n i v i chân digital 13 ế ặ t đ t chân ledPin là OUTPUT ậ ừ ắ ừ Tr vả ề không
Ví dụ
int ledPin = 13; // đèn LED đ
void setup()
{
pinMode(ledPin, OUTPUT); // thi
}
void loop()
{
digitalWrite(ledPin, HIGH); // b t đèn led
delay(1000); // d ng trong 1 giây
digitalWrite(ledPin, LOW); // t
t đèn led
delay(1000); // d ng trong 1 giây
}
digitalRead() ệ ớ ượ ế ặ m t chân digital (đ c thi t đ t là INPUT). Tr ả ố ẽ ạ ị ư ị ạ ậ i pin 13 nh n giá tr nh giá tr t i pin ạ i thi u
Gi
ệ
ệ ừ ộ
ọ
Đ c tín hi u đi n t
ị HIGH ho cặ LOW.
ề
v 2 giá tr
Cú pháp digitalRead(pin)
ọ
Thông số pin: giá tr c a digital mu n đ c
ị ủ
Tr vả ề
HIGH ho cặ LOW
Ví dụ
ụ
Ví d này s làm cho đèn led t
2
int ledPin = 13; // chân led 13
int inPin = 2; // button t i chân 2 ể ư ệ ừ ế int val = 0; // bi n "val" dùng đ l u tín hi u t digitalRead ặ ặ ệ ừ ọ digital2
ị ủ ổ void setup()
{
pinMode(ledPin, OUTPUT); // đ t pin digital 13 là output
pinMode(inPin, INPUT); // đ t pin digital 2 là input
}
void loop()
{
val = digitalRead(inPin); // đ c tín hi u t
ị
digitalWrite(ledPin, val); // thay đ i giá tr c a đèn LED là giá tr
ủ
c a digital 2
} ượ ế ố ớ ấ ỳ ộ ứ c k t n i v i b t k m t th gì thì hàm ệ ặ ộ Chú ý
ế
N u chân input không đ
ẽ ả ề
digitalRead() s tr v tín hi u HIGH ho c LOW m t cách "hên xui" ượ ổ ể ớ
c digitalRead v i các c ng pin ư Các chân Analog cũng có th dùng đ
có tên nh là: A0, A1,...
pinMode()
ệ ớ i thi u ị ạ ộ ộ ầ ư
ậ ố ể ế ặ
ế t chi ti ứ ả ỹ
k thu t s (datasheet) đ bi ủ
ả ư ể ệ ạ ế ộ ế ộ ộ ộ ớ
ộ ệ ệ ở Gi
ấ
C u hình 1 pin quy đ nh ho t đ ng nh là m t đ u vào (INPUT) ho c
ầ
đ u ra (OUTPUT). Xem mô t
t
ề
v các ch c năng c a các chân.
ở
Nh trong phiên b n Arduino 1.0.1, nó có th kích ho t các đi n tr
pullup n i b v i ch đ INPUT_PULLUP. Ngoài ra, ch đ INPUT
vô hi u hóa m t cách rõ ràng đi n tr pullups n i b ộ ộ. ố ạ ượ ế ố ớ c k t n i v i chân digital 13 ế ặ t đ t chân ledPin là OUTPUT ậ ừ ắ Cú pháp
pinMode(pin, mode)
Thông số
ế ặ
ố ủ
t đ t
pin: S c a chân digital mà b n mu n thi
mode: INPUT, INPUT_PULLUP ho cặ OUTPUT
Tr vả ề
không
Ví dụ
int ledPin = 13; // đèn LED đ
void setup()
{
pinMode(ledPin, OUTPUT); // thi
}
void loop()
{
digitalWrite(ledPin, HIGH); // b t đèn led
delay(1000); // d ng trong 1 giây
t đèn led
digitalWrite(ledPin, LOW); // t ừ delay(1000); // d ng trong 1 giây
} ướ ạ ể ượ ử ụ i d ng Digital I/O. Ví c s d ng d ậ ệ ố ụ ặ ạ
ư Ứ ụ ệ ộ ệ ế ừ
ủ ệ ố ả
ờ ể ả ơ ị ẽ
ố
i đa m c đ nh c a h th ng (5V) thì kho ng giá tr s
ế
ộ
i quy t Ghi chú
Các chân Analog cũng có th đ
ụ
d : A0, A1, ...
ấ
Nh p xu t ânlog
ệ
ứ
i m c (đi n áp) t
Hàm analogReference() có nhi m v đ t l
i đa khi
ọ
ọ
ả ử ạ
s b n đ c m t tín
đ c tín hi u analogRead. ng d ng nh sau, gi
ế
ư
ệ
ạ
ệ
01,1V. Nh ng mà n u dùng
hi u d ng analog có hi u đi n th t
ứ
ặ ị
ệ
m c đi n áp t
ơ
ắ
ng n h n => đ chính xác kém h n => hàm này ra đ i đ gi
vi c đóệ
! ộ ặ Cú pháp
analogReference(type)
ị
ể
type: m t trong các ki u giá tr sau: DEFAULT, INTERNAL,
INTERNAL1V1, INTERNAL2V56, ho c EXTERNAL ệ ệ Ki uể ụ ả
Nhi m v đ m nhi m Ghi chú ố ặ ế ệ ứ
ạ ế DEFAULT ặ
ồ ồ i đa là 5V (n u
Đ t m c đi n áp t
ồ
trên m ch dùng ngu n 5V làm nuôi
ạ
chính) ho c là 3,3V (n u trên m ch
dùng ngu n 3,3V làm ngu n nuôi
chính) ố ệ INTERNAL là 1,1 V ặ ạ
ứ
ế ử ụ i đa
ể ề ặ ạ ứ ố Đ t l
i m c đi n áp t
(n u s d ng vi đi u khi n
ặ
ATmega328 ho c ATmega168)
ệ
Đ t l i m c đi n áp t i đa là ế ử ụ ề ể 2,56V (n u s d ng vi đi u khi n
ATmega8) ặ ạ ứ ệ ố ỉ INTERNAL1V1 Đ t l i m c đi n áp t i đa là 1,1 V Ch có trên Arduino Mega ặ ạ ứ ệ ố i m c đi n áp t i đa là 2,56 ỉ Ch có trên Arduino Mega INTERNAL2V5
6 Đ t l
V ệ ố ỉ ượ ấ i m c đi n áp t i đa ớ ứ ượ ệ c EXTERNAL ằ ả ặ ạ ứ
Đ t l
ệ
Ằ
B NG v i m c đi n áp đ
ấ
c p vào chân AREF c c p vào chân
Ch đ
ộ
AREF m t đi n áp
n m trong kho ng 05V Tr vả ề
không
ả ể Ế ạ ử ụ ằ ấ ạ ả
ệ ề ệ
ồ
ả ọ Ế
ể ử ụ ộ ử
c khi s
Ạ
Ω
ở
ố ấ ạ
ồ ệ ệ ờ ộ ộ
ạ ẽ ạ ạ ở ệ
ư ậ
ẵ
ả Ω
ế ắ ễ ệ ấ C nh báo
analogReference thì
N U b n s d ng ki u EXTERNAL cho hàm
ừ
ồ
ộ
b nạ BU CỘ ph i c p nó m t ngu n n m trong kho ng t
ả ấ
05V, và
ỏ
ộ
ế
n u b n đã c p m t ngu n đi n th a mãn đi u ki n trên vào chân
AREF thì b nạ BU CỘ ph i g i dòng
ướ
l nhệ analogReference(EXTERNAL) tr
d ngụ analogRead() [N U KHÔNG M CH B N S "die"]
Ạ
Ẽ
ặ ướ
ệ
c chân AREF
Ngoài ra, b n có th s d ng m t đi n tr 5k đ t tr
ạ
ồ ặ
r i đ t ngu n đi n ngoài (đi n áp b n mu n c p vào chân AREF). Vì
ỗ ắ
ạ
i làm nh v y? B i vì sao ch g n chân AREF có m t n i đi n
sao l
ả
ệ
ở
tr (đi n tr có s n trong m ch) kho ng 32k => s t o ra m ch
ả
ả
gi m áp phiên b n d nh t => gi m đi n th g n vào chân AREF => ạ ơ ư ế ể ạ ồ
g n ngu n h n 5V . N u b n ch a hi u ạ ỡ ắ
ư ế
không h n u b n có l
ể
rõ, b n có th xem hình sau. ọ ệ ị ệ ụ ủ analogRead() là đ c giá tr đi n áp t ạ m t chân Analog
ệ ừ ạ ữ c kí hi u t
ự ư
nh ế
ớ ề ố ố ệ ủ ứ
ả ề ế
0 đ n
ạ ằ
ặ ị ươ ứ ả
ế ể ằ ỉ ừ
analogReference().
ệ
ể ự
ể ể
ạ ườ ệ i ta nói "đ c tín hi u analog", b n có th hi u đó chính là ị ệ ừ ộ
Nhi m v c a
ượ
(ADC). Trên m ch Arduino UNO có 6 chân Analog In, đ
ươ
ng t
A0 đ n A5. Trên các m ch khác cũng có nh ng chân t
ầ
ậ
.
v y v i ti n t
"A" đ ng đ u, sau đó là s hi u c a chân
ừ
ố
analogRead() luôn tr v 1 s nguyên n m trong kho ng t
ệ
ớ
1023 t
0 đ n 5V. B n có th
ng ng v i thang đi n áp (m c đ nh) t
ệ
ề
đi u ch nh thang đi n áp này b ng hàm
ầ
Hàm analogRead() c n 100 micro giây đ th c hi n.
ọ
Khi ng
ệ ọ
vi c đ c giá tr đi n áp. ọ ệ ệ ể ọ
ọ ư ế ố ệ ạ ẽ ả ề
analogRead() s tr v
ụ
ắ ẫ ị 0 đ n 1023. Đ kh c ph c ế
ộ
ề ế
ở ả
ộ ả ể
ị ố ớ
ệ ặ ọ ố ở Cú pháp
analogRead([chân đ c đi n áp]);
Ví dụ
int voltage = analogRead(A0);
Trong đó A0 là chân dùng đ đ c đi n áp.
N u b n ch a k t n i chân đ c đi n áp, hàm
ừ
m t giá tr ng u nhiên trong kho ng t
ệ
ắ
ả
ạ
đi u này, b n ph i m c thêm m t đi n tr có tr s l n (kho ng 10k
ừ
ộ ụ ệ
chân đ c đi n áp xu ng GND.
ohm tr lên) ho c m t t đi n 104 t ướ ế ể ề xung PWM tr ọ
c khi đ c bài vi t này ! Reference Tags:
B n c n tìm hi u v
ệ ạ ầ
ớ i thi u Gi ấ ừ ộ ộ ứ
m t chân trên m ch Arduino m t m c ườ ứ ề i ta th
ủ ộ ạ
ể
ườ
ng đi u khi n m c
ằ
ơ
ng quay c a đ ng c servo b ng cách ư ế ướ
. ọ ể ặ ế ộ
pinMode() đ đ t ch đ OUTPUT cho chân ể ạ ệ
analogWrite() là l nh xu t ra t
ệ
tín hi u analog (phát xung PWM). Ng
ố ủ
i c a đèn LED hay h
sáng t
phát xung PWM nh th này
ầ
ạ
B n không c n g i hàm
ẽ
s dùng đ phát xung PWM trên m ch Arduino. ị ươ ứ ả ằ ế ừ ng ng ế
0% đ n 100% ạ ầ ộ ượ ế ố
c k t n i ứ
ạ ố Cú pháp
analogWrite([chân phát xung PWM], [giá tr xung PWM]);
ị ứ
Giá tr m c xung PWM n m trong kho ng t
0 đ n 255, t
ừ
ớ
ứ
v i m c duty cycle t
Ví dụ
int led = 11;
void setup() {
}
void loop() {
for (int i = 0; i <= 255; i++) {
analogWrite(led,i);
delay(20);
}
}
Đo n code trên có ch c năng làm sáng d n m t đèn LED đ
vào chân s 11 trên m ch Arduino.
Xung PWM ế ứ ơ ả ề ứ ệ ấ c ạ ượ ặ ạ ặ ượ
ng đ c tr ng cho 1 xung PWM (Pulse Width ạ
i. Đ i l ầ ố Ki n th c c b n
Xung là các tr ng thái cao / th p (HIGH/LOW) v m c đi n áp đ
ư
ặ
l p đi l p l
Modulation) bao g mồ t n sầ ố(frequency) và chu kì xung (duty cycle).
T n s là gì? ơ ơ ị ầ ố ố ầ ặ ạ i trong 1 đ n v th i gian. Đ n v t n s là Hz, ố ầ ặ ạ ị ờ
i dao đ ng trong 1 giây. ộ
ộ ộ ệ
ắ ộ
ấ ệ ộ ư ậ
ố ạ ớ ộ th vi c xác đ nh 1 dao đ ng. Dao
ắ ầ ầ
ị
ế ướ c xác đ nh t c khi ắ ầ ượ ặ ạ ầ ố
T n s là s l n l p l
ứ
t c là s l n l p l
ụ
ấ
L y ví d , 1Hz = 1 dao đ ng trong 1 giây. 2Hz = 2 dao đ ng trong 1
giây. 16MHz = 16 tri u dao đ ng trong 1 giây.
Nh v y theo quy t c tam su t: 16 tri u dao đ ng 1 giây > 1 dao
ộ
đ ng t n 1/16.000.000 (giây) = 0,0625 (micro giây)
ư ế
ị
Cách xác đ nh 1 dao đ ng nh th nào? Đa ph n các b n m i nghiên
ầ ở ệ
ệ ử ườ
ứ
ng m c sai l m
c u đi n t
ộ
ị
ượ
đ ng đ
ạ
tr ng thái b t đ u đ ộ
ắ
ừ ạ
tr ng thái b t đ u và k t thúc ngay tr
c l p l i. ị ộ ộ ư ậ ứ
ồ
ng, 1 dao đ ng s bao g m 2 tr ng thái đi n: m c ầ ấ ệ
ữ ạ
ờ
ph n trăm th i gian gi a 2 ệ ạ
ớ ộ ệ ứ ệ ấ ở ộ ể ệ ờ ớ ấ ộ ệ ứ ớ Cách xác đ nh 1 dao đ ng
ẽ
ườ
Nh v y thông th
ỉ ệ
ứ
cao (x giây) và m c th p (y giây). T l
tr ng thái đi n này chính là chu kì xung.
V i x/y = 0% ta có xung ch a toàn b đi n áp th p (khái ni m xung
nên hi u m r ng)
ầ
V i x/y = 50% thì 50% th i gian đ u, xung có đi n áp cao, 50% sau
ệ
xung có đi n áp th p.
V i x/y=100% ta có xung ch a toàn b đi n áp cao.
Tóm l ủ ờ ớ
ạ
i, v i 1 xung ta có:
ầ ố ể c th i gian c a 1 xung ượ
ờ ứ T n s : đ tính toán ra đ
Chu kì xung: bao nhiêu th i gian xung có m c áp cao, bao nhiêu ứ ấ ờ ệ ớ ạ ẽ ể ề ề ơ Liên h v i Arduino
ớ
ế
ứ ơ ả
V i ki n th c c b n v xung, các b n s hi u rõ h n v xung trong
ự ế ư ế
nh th nào.
th c t ử ụ ớ ữ ạ Xung khi s d ng v i hàm analogWrite trong Arduino
Gi a 2 v ch màu xanh lá cây là 1 xung. analogWrite chu kì xung t lỉ ệ analogWrite(0) 0/255 0% analogWrite(64) 64/255 25% analogWrite(127) 127/255 50% analogWrite(191) 191/255 75% analogWrite(255) 255/255 100% ơ ễ ố ệ ạ
ổ ể ạ
ượ ầ ố c chu kì xung nh b ng trên. T n s xung đ c ặ ị ề
ượ
ế ậ
t l p m c đ nh. ầ ố ể ạ ế ầ ố
ạ ư ệ ả ơ ầ ố
ỗ ợ ệ ể
ồ ố ầ Hàm analogWrite() trong Arduino giúp vi c t o 1 xung d dàng h n.
Hàm này truy n vào tham s cho phép thay đ i chu kì xung, b n có th
ư ở ả
tính toán ra đ
Arduino thi
ố ớ
Đ i v i board Arduino Uno, xung trên các chân 3,9,10,11 có t n s là
490Hz, xung trên chân 5,6 có t n s 980Hz. Làm th nào đ t o ra các
xung có t n s nhanh h n? B n có th tham kh o thêm các th vi n
ỗ ợ
riêng h tr vi c này. Trong mã ngu n Arduino g c không h tr
ph n này. ể ọ PPM (Pulse Position xung đi u khi n servo có tên g i ớ ề ệ ượ ử
c s i thi u v xung PPM (Pulse Position Modulation) đ ấ ể ề ả ề ộ
ướ
xung PWM tr c khi đ c ủ ớ ở ỗ
ch : ườ ị ả
ng có giá tr trong kho ng 50Hz (20 mili giây), L u ý:ư
ề
Modulation) khác v i xung PWM.
Xung PPM
ớ
Bài này gi
ể ề
ụ
d ng đ đi u khi n servo. V b n ch t PPM cũng là m t xung, do
ạ ầ
ậ
ọ
ả
v y b n c n tham kh o v xung trong bài
ộ
ế
ti p n i dung c a bài này.
Xung PPM khác v i PWM
ầ ố
t n s thông th
1.
không quan tr ngọ
ờ ỉ ừ ế ấ
1ms đ n 2ms, r t quan tr ng.
ệ
ổ ạ ở ứ
m c cao ch t
ự
ơ ể
ắ ượ ắ ệ ượ
t đ c xung PPM và xung ọ
th i gian xung
ấ
ề
có th có nhi u h n 1 s thay đ i tr ng thái đi n cao/th p
ể
ư ế N m b t đ
c 2 ý trên ta đã có th phân bi
ố
PWM gi ng nhau và khác nhau nh th nào. ị ủ m c cao quy đ nh góc quay c a RC servo. ờ
ớ ở ứ
ứ ượ ủ
ừ
0180 đ ị
c xác đ nh trong ả ờ ể ờ ủ ố ị Th i gian xung
ờ
V i th i gian 1ms m c cao, góc quay c a servo là 0, 1.5ms góc quay 90
và 2ms góc quay là 180. Các góc khác t
kho ng th i gian 12ms.
ề
ể
ư
L u ý: có th ghép nhi u xung trong cùng 1 th i gian là 20ms đ xác
ề
ị
đ nh v trí góc c a nhi u servo cùng 1 lúc. T i đa là 10 servo. ề ể Đi u khi n 3 servo cùng lúc ờ ạ ẽ ươ ắ ầ ủ ạ ụ ả ề ộ ố
lúc m ch Arduino b t đ u ch ố ế ụ . ờ ể ừ lúc ượ ể unsigned long là th i gian k t
ở ộ
c kh i đ ng ượ ắ ầ ể ừ ươ ờ
Hàm th i gian
ệ
millis() có nhi m v tr v m t s là th i gian (tính theo mili giây)
ố
ể ừ
k t
ng trình c a b n. Nó s tràn s
và quay s 0 (sau đó ti p t c tăng) sau 50 ngày
Tham số không
Tr vả ề m t s nguyên ki u
ộ ố
ươ
ng trình Arduino đ
th
Ví dụ
unsigned long time;
void setup(){
Serial.begin(9600);
}
void loop(){
Serial.print("Time: ");
time = millis();
ờ
// in ra th i gian k t c b t đ u ng trình đ lúc ch ợ ướ ế ụ c khi ti p t c in Serial.println(time);
// đ i 1 giây tr
delay(1000);
} ọ ư ồ ẽ ị ớ ử ụ ề ờ
ờ ễ ắ ằ ể ứ ụ ể ố
ề ị ế ở ạ ị ệ ạ i ủ ể ấ ặ ư
ạ ỗ ươ
ở ẽ ố ng trình này có nghĩa là sau m i 1000 mili giây
ổ ạ
chân s 10 s thay đ i tr ng thái L u ý quan tr ng:
Các hàm v th i gian trong Arduino g m millis() và
micros() s b tràn
ả
ố
s sau 1 th i gian s d ng. V i hàm millis() là kho ng 50 ngày. Tuy
nhiên, do là ki u s nguyên không âm (unsigned long) nên ta d dàng
ử ụ
kh c ph c đi u này b ng cách s d ng hình th c ép ki u.
unsigned long time;
byte ledPin = 10;
void setup()
{
// kh i t o giá tr bi n time là giá tr hi n t
// c a hàm millis();
time = millis();
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
}
void loop()
{
// L u ý các d u ngo c khi ép ki u
// đo n ch
// đèn Led
if ( (unsigned long) (millis() time) > 1000)
{
ổ ạ
// Thay đ i tr ng thái đèn led
if (digitalRead(ledPin) == LOW) ế ậ ạ i bi n time ố ơ ớ ế ộ ố ườ
ượ ươ ư
ố ng, n u ta có 2 s A, B và B l n h n A ( B > A) thì phép
ể unsigned long là
c AB là m t s âm. Nh ng khi ép ki u
ị ả ề ố
ng, không có s âm nên giá tr tr v là 1 s ươ ấ ủ ị ớ ể ề ạ ệ ờ
ươ ể ừ ế ụ ạ
ố ố ụ ươ ươ ị ng 4 đ n v micro giây. Ví d micros() tr v giá tr là ng đ ụ
ạ ượ ơ
ủ ạ
ng trình c a b n đã ch y đ
ụ ả ề
ị
c 40 microgiây.
ị ươ ươ
ạ , trên m ch 8Mhz (ví d LilyPad), hàm này có giá tr t ng 6 micro giây = 1 giây ng t
ng 8 micro giây. ể ừ ờ lúc ượ ươ {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
ậ
// c p nh t l
time = millis();
}
}
Thông th
ừ
tr thu đ
ể ố
ki u s nguyên d
ớ
ng l n.
nguyên d
ừ
ả ủ
ụ ế
Ví d : k t qu c a phép tr :
unsigned long ex = (unsigned long) (0 1);
ố
là 4294967295, con s này chính là giá tr l n nh t c a ki u
số unsigned long. Gi ng nh b n đ p xe 1 vòng và quay v v ch xu t
ấ
ạ
ư ạ
ố
phát v y.ậ
ụ ả ề ộ ố
micros() có nhi m v tr v m t s là th i gian (tính theo micro
ủ ạ
ẽ
ắ ầ
ng trình c a b n. Nó s
giây) k t
lúc m ch Arduino b t đ u ch
. Tuy nhiên, trên
tràn s và quay s 0 (sau đó ti p t c tăng) sau 70 phút
ị ủ
ạ
m ch Arduino 16MHz (ví d Duemilanove và Nano) thì giá tr c a hàm
này t
10 thì có nghĩa ch
ự
ươ
T
ươ
đ
ư
L u ý: 10
Tham sốkhông
Tr vả ềm t s nguyên ki u
ộ ố
ng trình Arduino đ
th ể unsigned long là th i gian k t
ở ộ
c kh i đ ng ể ừ ươ ượ ắ ầ lúc ch ng trình đ c b t đ u ướ ợ ế ụ c khi ti p t c in ụ ừ ờ ữ
ng trình trong th i gian mili giây. Và c ỗ Ví dụ
unsigned long time;
void setup(){
Serial.begin(9600);
}
void loop(){
Serial.print("Time: ");
time = micros();
ờ
// in ra th i gian k t
Serial.println(time);
// đ i 1 giây tr
delay(1000);
}
ươ
ệ
delay có nhi m v d ng ch
.
m i 1000 mili giây = 1 giây ể ữ ệ ờ ở ứ m c mili giây. ms có ki u d li u ạ ấ ế Bài 2: Cách làm đèn LED nh p nháy theo yêu t: ụ ừ ươ ờ ng trình trong th i gian ứ ỗ . ờ ể ữ ệ m c micro giây. micro có ki u d li u ố ứ ố Cú pháp
delay(ms)
Thông số ms: th i gian
là unsigned long
Tr vả ề không
Ví dụ B n xem bài vi
c uầ
ệ
elayMicroseconds có nhi m v d ng ch
micro giây. Và c m i 1000000 micro giây = 1 giây
Cú pháp delayMicroseconds(micro);
Thông số micro: th i gian
ở ứ
ả
là unsigned int. micro ph i <= 16383. Con s này là m c t ủ ệ
i đa c a h ỉ ề ươ ơ ạ ầ ể ẽ ượ
ươ c đi u ch nh tăng trong t
ng trình lâu h n thì b n c n dùng hàm ng lai. Và
delay ặ ợ ợ ể ạ ụ ạ ố ộ ộ i chân s 8. ụ ả ề ữ ệ ấ ỏ ị ố ứ ấ ể ữ ệ ề ượ ấ ọ ậ c ch p nh n. ề ượ ấ ọ ậ c ch p nh n. ấ ố ể ặ ị ượ c dùng đ l y ch n trên (không đ giá tr v t ượ
ị ứ ộ ố
th ng Arduino, và có th s đ
ố ừ
ạ
ế
n u b n mu n d ng ch
Tr vả ề không
Ví dụ
int outPin = 8; // digital pin 8
void setup()
{
pinMode(outPin, OUTPUT); // đ t là output
}
void loop()
{
digitalWrite(outPin, HIGH); // xu t 5Vấ
delayMicroseconds(50); // đ i 50 micro giây
digitalWrite(outPin, LOW); // xu t 0Vấ
delayMicroseconds(50); // đ i 50 micro giây
}
Ví d cho ta m t cách đ t o m t xung PWM t
Hàm toán h cọ
ế .
Hàm min có nhi m v tr v giá tr nh nh t gi a hai bi n
Cú pháp min(x, y);
Tham số x: s th nh t, m i ki u d li u đ u đ
ố ứ
ể ữ ệ
y: s th hai, m i ki u d li u đ u đ
Tr vả ề S nh nh t trong 2 s .
ố
ỏ
ể ấ
G i ýợ Hàm min đ
quá m t m c quy đ nh nào đó). ả ư ế ế ạ ậ ẽ ị ỗ ấ C nh báo cú pháp
min(a++, 100); // n u b n nh p nh th này thì s b l i đ y ổ ậ ư ư ế ạ c đ b t c phép tính nào bên trong hàm này, b n nhé ụ ả ề ế
ượ ể ấ ứ
ệ ị ớ ữ ấ ố ứ ấ ể ữ ệ ề ượ ấ ậ ọ c ch p nh n.
ậ
ấ ể ữ ệ c ch p nh n. ố ớ ấ ặ ướ ị ụ ể
i (không đ giá tr t t ộ ị a++;
ớ
min(a, 100); // nh ng n u nh p nh th này thì n! Và hãy ghi nh
là không đ
ế .
Hàm max có nhi m v tr v giá tr l n nh t gi a hai bi n
Cú pháp max(x, y);
Tham số x: s th nh t, m i ki u d li u đ u đ
ề ượ
ọ
ố ứ
y: s th hai, m i ki u d li u đ u đ
Tr vả ề S l n nh t trong 2 s .
ố
ể ấ
ượ
G i ýợ Hàm max đ
c dùng đ l y ch n d
ứ
xu ng quá m t m c quy đ nh nào đó). ố
ả ậ ạ ế ư ế ẽ ị ỗ ấ i đ y ư ậ ổ ớ ạ ư ế
c đ b t c phép tính nào bên trong hàm này, b n nhé ế
ượ ể ấ ứ
ệ ệ ố ủ ụ ả ề ị ộ ố. ả ề ả ề ế i là tr v x ượ ạ
c l C nh báo cú pháp
max(a, 0); // n u b n nh p nh th này thì s b l
a;
min(a, 0); // nh ng n u nh p nh th này thì n! Và hãy ghi nh là
không đ
Hàm abs có nhi m v tr v giá tr tuy t đ i c a m t s
Cú pháp abs(x);
Tham số x: m t s b t k
ộ ố ấ ỳ
Tr vả ề N u x >= 0, thì tr v x còn ng ả ế ư ế ẽ ị ỗ ấ i đ y ế ậ ổ ạ ớ
c đ b t c phép tính nào bên trong hàm này, b n nhé ể ộ ộ thang đo này sang m t giá ị ả ề ủ ị ừ
ộ ố
. Gía tr tr v c a hàm map() luôn là m t s thang đo khác C nh báo cú pháp
ậ
ạ
abs(a); // n u b n nh p nh th này thì s b l
a;
ư ế
ư
abs(a); // nh ng n u nh p nh th này thì n! Và hãy ghi nh là
ượ ể ấ ứ
không đ
ể
map() là hàm dùng đ chuy n m t giá tr t
ị ở
tr
nguyên.
Cú pháp map(val,A1,A2,B1,B2); Trong đó: (cid:0) ể (cid:0) ệ ạ i (cid:0) ướ ủ
ướ ủ ể ớ ầ ổ
ị ầ
val là giá tr c n chuy n đ i
ớ ạ
i h n trên và d
A1, A2 là gi
ớ ạ
i h n trên và d
B1,B2 là gi i c a thang đo hi n t
i c a thang đo c n chuy n t i ộ ộ ổ ể ể ể ừ ủ ả ề ế . ộ ố ấ
ả
pow() tr v k t qu tính toán này ừ ố ư ả pow() đ u đ c đ nh nghĩa là ki u ề ượ ị
ượ ị ể
ể ố
c đ nh nghĩa là ki u s ả ả ề ủ pow() đ ủ ể ể ả ộ ố ấ
. ậ
ả ề ế
ậ Ví dụ
//Chuy n đ i 37 đ C sang đ F
int C_deg = 37;
int F_deg = map(37,0,100,32,212); //F_deg = 98
ố
pow() là hàm dùng đ tính lũy th a c a m t s b t kì (có th là s
ặ ố ự
nguyên ho c s th c tùy ý).
ơ ố
Cú pháp pow([c s ], [lũy th a]);
Ví dụ
int luythua1 = pow(2,3);
float luythua2 = pow(1.2,2.3);
double luythua3 = pow(1.11111,1.11111);
//luythua1 = 8 (=23)
//luythua2 = 1.52 (=1.22.3)
//luythua3 = 1.12 (=1.111111.11111)
Chú ý C 2 tham s đ a vào hàm
ế
ố ự float. K t qu tr v c a
s th c
th cự double
ố
sqrt() là hàm dùng đ tính căn b c 2 c a m t s b t kì (có th là s
ặ ố ự
nguyên ho c s th c tùy ý) và tr v k t qu này
ố ầ
Cú pháp sqrt([s c n tính căn b c 2]);
Ví dụ
int v1 = sqrt(9);
float v2 = sqrt(6.4);
double v3 = sqrt(6.5256); ả int v4 = sqrt(9);
float v5 = sqrt(6.4);
//v1 = 3
//v2 = 2.53
//v3 = 2.55
//v4 = 0
//v5 = NaN (tham kh o hàm isnan()) ể ữ ệ ể ể ấ ố ư
ế ả ả ề ủ sqrt() đ ễ ố
sqrt() có th là b t kì ki u d li u bi u di n s
ượ ị
ể ố
c đ nh nghĩa là ki u s
ố ư ố ự ế ơ Chú ý
Tham s đ a vào hàm
nào. K t qu tr v c a
th cự double ho cặ NaN n u tham s đ a vào là s th c bé h n 0. ộ ố ấ ố ủ c dùng đ tính bình ph ng c a m t s b t kì, s này có ả ề ị ể ượ
ộ ấ ư ể ữ ệ ủ ố ể
ố ượ ớ ườ
ễ ố
. sq() tr v giá tr mà
c v i ki u d li u gi ng nh ki u d li u c a tham s ta ươ ng]); ị ầ ế ể ể ả ộ ẽ ả ề true n u giá tr c n ki m tra không ph i là m t bi u ứ ắ ọ ể
Hàm sq() đ
ể ữ ệ
th thu c b t kì ki u d li u bi n di n s nào
ể ữ ệ
nó tính đ
ư
đ a vào.
ố ầ
Cú pháp sq([s c n tính bình ph
Ví dụ
int binhphuong1 = sq(5);
int binhphuong2 = sq(5);
float binhphuong3 = sq(9.9);
float binhphuong4 = sq(9.9);
//binhphuong1 = 25
//binhphuong2 = 25
//binhphuong3 = 98.01
//binhphuong4 = 98.01
snan s tr v là
th c toán h c đúng đ n. Ch ữ nan có nghĩa là NotANumber. Cú pháp isnan(double x);
Tr vả ề true hoăc false
Ví dụ
isnan(sqrt(2)); //true
isnan(sqrt(2)); // false
ộ ộ ả ắ ớ ị ằ ướ .
c ệ B t bu c giá tr n m trong m t kho ng cho tr i thi u ỏ ả ấ ủ i (a là giá tr nh nh t c a kho ng) ả ấ ủ ị
ị ớ ị ớ ạ
i h n giá tr sensVal trong kho ng [10,150]
ượ ng giác
ệ ộ ộ ơ ị . Giá tr ị ạ ạ ở ơ ị đ n v radian (ki u ể float) ể double)
ộ
ộ ơ ị . Giá tr ị ạ ạ Gi
Cú pháp constrain(x, a, b)
Tham số
ị ầ
x: giá tr c n xét
ặ ướ
a: ch n d
ặ
b: ch n trên (b là giá tr l n nh t c a kho ng)
Tr vả ề
ế
x: n u a <= x <= b
ế
a: n u x < a
ế
b: n u x > b
Ví dụ
int sensVal = analogRead(A2);
sensVal = constrain(sensVal, 10, 150);
ả
//Gi
Hàm l
ụ
Hàm này có nhi m v tính cos m t m t góc (đ n v radian)
ch y trong đo n [1,1].
Cú pháp cos(rad)
Tham số rad: góc
Tr vả ề cos c a góc rad (ki u
ủ
ụ
ệ
Hàm này có nhi m v tính sin m t m t góc (đ n v radian)
ch y trong đo n [1,1]. ị ở ơ ể float) đ n v radian (ki u ể double) ị ơ ộ . Giá tr ị ạ ệ
ả ộ
ế ươ ng vô cùng. ụ
ừ
âm vô cùng đ n d ị ở ơ ể float) đ n v radian (ki u ể double) ố ạ ướ ẽ ả ề c. Gi ả ề ộ ố
ọ
ế ữ ượ n l n,ầ random() s tr v
c bi ế ướ
t tr . ạ ạ ng trình sau ể ậ ẳ ằ ầ ạ ẫ ị ề ượ ạ ắ
ẫ
c "ng u nhiên" cho l m.
ươ
ử ạ
ng trình này: Cú pháp sin(rad)
Tham số rad: góc
Tr vả ề sin c a góc rad (ki u
ủ
Hàm này có nhi m v tính tan m t m t góc (đ n v radian)
ch y trong kho ng t
Cú pháp tan(rad)
Tham số rad: góc
Tr vả ề tan c a góc rad (ki u
ủ
sinh s ngãu nhiên
ẫ
Hàm random() luôn tr v m t s ng u nhiên trong ph m vi cho
ị ố
ầ
ả ử
s mình g i hàm này 10 l n, nó s tr v 10 giá tr s
tr
ẽ ả ề n s . Tuy
ố
ọ
ẫ
nguyên ng u nhiên. N u g i nó
ố ị
ả ề
ị
nhiên nh ng giá tr mà nó tr v luôn đ
c (c đ nh)
ử ươ
B n hãy ch y th ch
void setup(){
Serial.begin(9600);
}
void loop(){
Serial.println(random(100));
delay(200);
}
ị
Tôi có th kh ng đ nh r ng 10 giá tr "ng u nhiên" đ u tiên b n nh n
ẻ
ượ
đ
c là: 7, 49, 73, 58, 30, 72, 44, 78, 23, 9,.... Đi u này nghe có v
không đ
B n hãy th ch y ch
void setup(){
Serial.begin(9600);
randomSeed(10); }
void loop(){
Serial.println(random(100));
delay(200);
} ị ỗ ậ ự ấ ằ ẫ ỗ ố ị
ộ ố
ị ư ổ ẫ ấ ề ệ ạ ả ề ẽ ố
ẫ ư ổ ỗ ẫ
ỗ ố ố ị ộ ả ề
random() tr v đã có s thay
Nh n th y r ng: chu i giá tr mà hàm
ố
ổ
ử
ỗ
ổ
đ i. Tuy nhiên chu i này v n là chu i c đ nh. Th thay đ i tham s
ạ ẽ ấ
ỗ ố
ủ ệ randomSeed() từ 10sang m t s khác, b n s th y chu i s
c a l nh
ẫ ố ị
ả ề
ấ
tr v cũng thay đ i theo nh ng giá tr xu t ra thì v n c đ nh, dù cho
ữ
ỗ ố ượ
ạ
c in ra nh ng l n
b n có b m nút reset trên Arduino thì chu i s đ
ượ
ầ
ố
ằ
ể
ư ầ
c in ra. Đ ý r ng tham s
sau đ u y h t nh l n đ u tiên chúng đ
ổ
ế
ẫ ố ị
ủ
c a hàm random() v n c đ nh, dĩ nhiên n u b n thay đ i tham s này
thì chu i ng u nhiên tr v s thay đ i theo, nh ng chúng cũng v n là
m t chu i s c đ nh. ớ ả ề ị
ế ị ị ậ ự
ố ậ ự ụ ộ V i cùng kho ng giá tr truy n vào hàm
hàm randomSeed() quy t đ nh tr t t
Tr t t random(),
các giá tr mà
ề
này ph thu c vào tham s mà ta truy n vào ả ề
random() tr v .
randomSeed(). ấ ạ ế ư ẽ ặ ị ạ ẵ ng trình s m c đ nh ch y s n random() mà không ch y ạ
c đó, ch
ố ẽ ả ề ị ầ ạ randomSeed(0), hàm random(100) s tr v 10 giá tr đ u ế ẽ ả ề ị ầ
ạ randomSeed(10), hàm random(100) s tr v 10 giá tr đ u ẽ ả ề ị
ạ randomSeed(46), hàm random(100) s tr v 10 giá tr Cú pháp randomSeed(number);
ộ ố
V iớ number là m t s nguyên b t kì.
ọ
L u ý: n u b n g i hàm
ươ
ướ
l nhệ randomSeed() tr
l nhệ randomSeed(0) (tham s là 0).
Ví dụ
ế
N u ch y
tiên là: 7, 49, 73, 58, 30, 72, 44, 78, 23, 9, ...
N u ch y
tiên là: 70 , 43, 1, 92, 65, 26, 40, 98, 48, 67, ...
ế
N u ch y
ầ
đ u tiên là: 15, 50, 82, 36, 36, 37, 25, 59, 93, 74, ... ẽ ả ề ị
ạ randomSeed(159), hàm random(100) s tr v 10 giá tr 13, 51, 67, 38, 22, 50, 67, 73, 81, 75, ... ẽ ả ề ị ầ
ạ randomSeed(159), hàm random(99) s tr v 10 giá tr đ u ỏ ộ ẫ ỗ ố ạ ầ ự ự ứ ộ
ượ ỗ ố ả ề c, hãy ch y ớ ộ ạ
ề ị
ố ả ươ ng trình sau ề ẫ ố đây tham s ng u nhiên truy n vào ượ ử ụ ớ ị ả ề
randomSeed() là giá tr tr v
c s d ng. v i chân A0 trên Arduino không đ ề ể ử ụ
ờ ồ ả ề ộ ẫ ả ị ị nguyên ng u nhiên trong kho ng giá tr cho tr ướ .
c ố ủ ả ế
N u ch y
ầ
đ u tiên là:
ế
N u ch y
tiên là: 67, 42, 70, 34, 53, 6, 42, 38, 29, 64, ...
M o nhẹ
ị
ế
N u b n c n m t chu i s ng u nhiên m t cách th c s , t c là giá tr
ể
ủ
c a chu i s tr v không th xác đ nh đ
l nhệ randomSeed() v i m t tham s ng u nhiên truy n vào.
ẫ
Tham kh o ch
void setup() {
Serial.begin(9600);
randomSeed(analogRead(A0));
}
void loop() {
Serial.println(random(100));
delay(300);
}
Ở
c aủ analogRead(A0)
ố
ạ
Ngoài ra, b n cũng có th s d ng tham s truy n
ồ ệ ố
vào randomSeed() là th i gian trên đ ng h h th ng.
Tr v m t giá tr
Cú pháp random(max+1);
random(min,max+1);
ị
ị ầ
Trong đó: min và max là giá tr đ u và cu i c a kho ng giá tr
ả ề
mà random() tr v .
Tr vả ề ằ ả
ượ ừ min đ nế max. N u ế
ể ầ c đ a vào thì nó đ c hi u ng m là 0. ằ
ằ ả
ả ị
ị ừ
ừ ẫ
Giá trị nguyên ng u nhiên n m trong kho ng t
giá trị min không đ
ượ ư
Ví dụ
int a = random(100); //giá tr a n m trong kho ng t
int b = random(0,11); //giá tr b n m trong kho ng t ế
0 đ n 99
ế
0 đ n 10 (Advanced I/O) ấ
ậ
Nh p xu t nâng cao
tone()
ớ ệ i thi u ộ ở ầ ố ượ ị c đ nh tr t n s đ c (ch n a ể ượ ị ặ i m t c đ nh tr
ạ
ộ buzzer ho c m t ỉ ử
ướ
ờ ạ ủ
c). Th i h n c a
ẽ
ặ
c ho c nó s phát ra âm
noTone(). Chân
ể
ộ loa đ có th
ể ộ c âm thanh.
ỉ ế ờ ộ ầ ữ ệ
ẽ ạ tone() lên pin đang đ ẽ
cượ tone() thì hàm tone() sau s thay ủ ẽ ệ ế tone() thì s can thi p đ n ạ ử ụ
.
i các chân digital 3 và digital 11
ầ ố ể ế ể t ề hãy xem trang này.
ố ề ề ộ
ạ ơ
ộ ướ
ơ
ượ ử ụ ạ ạ ố ơ Gi
ẽ ạ
Hàm này s t o ra m t sóng vuông
ấ ỳ
ẫ ượ
ộ
ỳ ạ
chu k ) t
i m t pin digital b t k (analog v n đ
ạ
ướ
quá trình t o ra sóng âm có th đ
ế
ụ
thanh liên t c cho đ n khi Arduino IDE ch y hàm
ầ ượ ế ố ớ
digital đó c n đ
c k t n i t
ượ
phát đ
ấ
ằ
ư
ể ử ụ
L u ý r ng, ch có th s d ng duy nh t m hàm
tone() trong cùng
ộ
ạ
ể
ờ
ộ
tone() đang ch y trên m t pin nào đó, bây gi
m t th i đi m. N u hàm
ạ ạ tone() thêm m t l n n a thì hàm
tone() sau s không có hi u
i
b n l
ế
ự
l c. N u b n
ổ ầ ố
đ i t n s sóng c a pin đó.
ạ
Trên m ch Arduino Mega, s d ng hàm
ầ
đ u ra PWM t
ẽ
Hàm tone() s không th phát ra âm thanh có t n s < 31 Hz. Đ bi
ậ
têm v kĩ thu t này,
ạ
ế
Chú ý: N u b n mu n ch i nhi u cao đ khác nhau trên nhi u pin.
ả noTone() trên pin
c khi ch i trên m t pin khác thì b n ph i
Thì tr
c s d ng.
đang đ
Cú pháp tone(pin, frequency)
tone(pin, frequency, duration)
Tham số pin: c ng digial / analog mà b n mu n ch i nh c (nói cách
khác là pin đ ổ
ượ ế ố ớ
c k t n i t i loa) ị ơ ạ ầ ố ủ
ờ unsigned int
ọ unsigned ộ ớ
ặ
ộ ự ệ tone() trên m t pin nào đó ế ế ạ ộ ấ ỳ
ấ ỳ ả ươ
ng ộ
tone() nào đang
ưở
ng gì đ n ch ố ạ ề ề ơ ơ
ộ ộ
ạ ế
ướ
c khi ch i trên m t pin khác thì b n ph i
ượ ử ụ .
c s d ng ạ ạ ố ơ ổ
ượ ế ố ớ
c k t n i t i loa) ể byte (g m 8 bit) ra ngoài t ng bit ượ ể ằ ộ ể ượ ắ ầ ừ
ấ ả ồ
c b t đ u t
bit n m bên ph i nh t (rightmost). Các bit này đ ừ
ấ
bit n m bên trái nh t
ượ
c cượ pulsed (có m c ứ ố ủ ộ
ế ạ
c thay đ i t
ạ ầ ầ ượ dataPin sau khi chân clockPin đ
.
ế ị
t b mà chân clock c a nó
m c đi n th LOW lên HIGH (rising edge)
ạ
ắ
c ch y clockPin c n đ ấ c xu t ra tín hi u ( ệ ử ừ ể ậ frequency: t n s c a sóng vuông (sóng âm)
duration: th i gian phát nh c, đ n v là mili giây (tùy ch n)
long
Tr vả ề không
Ví dụ
ạ ằ
Bài 12: Phát nh c b ng Arduino v i m t cái loa ho c buzzer
ụ ế
ệ
Hàm này có nhi m v k t thúc m t s ki n
ạ ệ tone()). N u không có b t k hàm
(đang ch y l nh
ẽ
ho t đ ng thì hàm này s không gây b t k nh h
trình.
Chú ý: N u b n mu n ch i nhi u cao đ khác nhau trên nhi u pin.
ả noTone() trên pin
Thì tr
đang đ
Cú pháp noTone(pin)
Tham số pin: c ng digial / analog mà b n mu n ch i nh c (nói cách
khác là pin đ
Tr vả ề không
ụ
ệ
shiftOut() có nhi m v chuy n 1
c chuy n đi có th đ
m t. Bit đ
ằ
ặ ừ
(leftmost) ho c t
ạ
ấ
xu t ra t
i chân
ị ẩ
ế
ệ
đi n th là HIGH, sau đó b đ y xu ng LOW)
ớ
L u ý:ư
ế
ế
N u b n đang giao ti p v i m t thi
ệ
ổ ừ ứ
ị ượ
có giá tr đ
ắ ằ
khi shiftOut, thì b n c n ch c ch n r ng chân
ệ
digitalWrite(clockPin,LOW);
l nh này:
Cú pháp shiftOut(dataPin, clockPin, bitOrder, value)
ệ int)
ẽ ượ
Tham số dataPin: pin s đ
clockPin: pin dùng đ xác nh n vi c g i t ng bit c a ủ dataPin (int) ấ ặ ắ ầ ừ bit bên trái nh t) ả
ữ ệ ầ ượ ạ ế c d li u ki u byte. N u b n mu n ơ ầ ặ ể
ả ể ữ ệ ớ ấ
ề ỗ ầ ố ủ ạ ể ộ ễ
ả ề
HIGH/LOW) và tr v chu kì c a xung ể ừ ứ ệ ờ ố
m c HIGH xu ng LOW
ư ả ế ế ả ứ
ộ ố ả
ượ ạ
i (LOW > HIGH). M t s c m bi n nh c m bi n
c l
ư TCS3200D hay c m bi n siêu âm dòng HCSRxx ph i
ả
ế
ả ế ợ ệ
ấ ể ệ ệ ị MSBFIRST ho cặ LSBFIRST.
ộ
bitOrder: m t trong hai giá tr
ấ
ắ ầ ừ
bit bên ph i nh t ho c B t đ u t
(B t đ u t
byte)
c shiftOut. (
value: d li u c n đ
ấ ượ ữ ệ
ố
ỉ
Chú ý shiftOut() ch xu t đ
ộ
ạ
xu t m t ki u d li u l n h n thì b n ph i shiftOut 2 l n (ho c
ơ
nhi u h n), m i l n là 8 bit.
Tr vả ề không
Ví dụ
ề
Đi u khi n 8 đèn LED sáng theo ý mu n c a b n, d hay khó ?
ủ
ệ
ọ
Đ c m t xung tín hi u digital (
ệ
tín hi u, t c là th i gian tín hi u chuy n t
ặ
ho c ng
màu s c nhắ
ữ
ế
giao ti p qua xung tín hi u nên ta ph i k t h p gi a 2
ể ọ
hàm digitalWrite() đ xu t tín hi u và
pulseIn() đ đ c tín hi u.
Cú pháp pulseIn(pin, value);
pulseIn(pin, value, timeout); ọ ượ ể ữ ệ ể ọ
c ch n đ đ c xung. pin có ki u d li u là ẽ ợ ế int.
ệ ế
ứ ả ố ộ ế
ừ ở ộ
ờ ế ả ừ ứ HIGH xu ng LOW này. ộ ế
m c N u đ t ả ừ ẽ ệ ượ ạ
c l ể ữ ệ ệ
ẽ ả ề ờ
ệ
ạ pulseIn() s tr v th i gian tín hi u
ặ value là LOW,
ờ
value có ki u d li u là i, đó là đo th i gian tín hi u nh y t
int. ở ộ ứ
ế ứ
m t m c HIGH ả
ả ề ố ị
ờ ộ ế ẽ ừ
ị
ơ ị ặ ị ượ ằ c tính b ng đ n v micro giây. Giá tr m c đ nh Trong đó:
pin là chân đ
ạ
ặ value là HIGH, hàm pulseIn() s đ i đ n khi tín hi u đ t
N u đ t
ờ
m c HIGH, kh i đ ng b đ m th i gian. Khi tín hi u nh y xu ng
LOW, b đ m th i gian d ng l
i.
ố
nh y t
hàm pulseIn() s làm ng
m c LOW lên HIGH.
ờ
ệ
/LOW c đ nh thì sau kho ng th i
N u tín hi u luôn
ị
gian timeout, hàm pulseIn() s d ng b đ m th i gian và tr v giá tr
0. timeout đ ớ i đa là ị ố
ng ng v i 1 phút. Giá tr t
ể ữ ệ unsigned long. timeout có ki u d li u là ị ượ ả ạ ờ ể unsigned long, đ n v là micro giây.
ơ
t quá v pulseIn() tr ả
timeout ườ ủ ố ệ ng tín hi u ạ ọ c aủ timeout là 60.106 t
ươ ứ
180.106 t
ớ
ươ ứ
ng ng v i 3 phút.
Tr vả ề
ộ ố
M t s nguyên ki u
ế
ề
v 0 n u th i gian nh y tr ng thái HIGH/LOW
Ví dụ
int pin = 7;
unsigned long duration;
void setup() {
Serial.begin(9600);
pinMode(pin, INPUT);
}
void loop() {
duration = pulseIn(pin, HIGH);
//Hãy n i chân 7 c a Arduino vào đ
ố
//b n mu n đ c xung
Serial.println(duration);
} ộ ố ủ ả ề ấ ấ ượ
ể ể ễ ở ệ i ể ữ ệ ố ự ạ ậ lowByte() không nh n giá tr thu c ki u d li u s th c. B n ị
ề ị ộ
ế ố
i biên d ch n u c làm đi u này. ị ầ ấ ố Bits và Bytes
ố
ỗ
lowByte() là hàm tr v byte cu i cùng (8 bit cu i cùng) c a m t chu i
ỗ
ộ ố
ộ
ư
c xem nh là m t chu i các bit,
các bit. M t s nguyên b t kì cũng đ
ướ
ị
ố
vì b t kì s nguyên nào cũng có th bi u di n
h nh phân d
ạ
.
d ng các bit "0" và "1"
L u ý:ư
ẽ ặ ỗ
s g p l
Cú pháp lowByte([giá tr c n l y ra 8 bit cu i]);
Tr vả ề byte
Ví dụ ố ề ớ ộ ỗ ỗ ả ề ộ
ư ậ ẽ ả ề ế ữ ệ ư
ầ ỗ . M t s nguyên ộ ộ
ế ữ ệ ư
ỏ ơ highByte() s tr v giá tr 0
ị
ấ ẽ ả ề
ỗ
c xem nh là m t chu i các bit, vì b t kì s nguyên ướ ạ ễ ở ệ ị
h nh phân d ộ ố
ố
i d ng các bit "0" và "1". ị ậ ạ ẽ ặ ể ữ ệ ố ự ị ề
ị ư ị ạ ượ ở ộ i m t bit nào đó đ ị
c xác đ nh b i ườ ậ ộ ố ẽ ả ề
ủ
i l p trình c a m t s nguyên . ộ ấ ứ ể ố ố ứ ự ầ ẽ ượ ừ ả ọ ph i qua trái, và s th t c tính t đ u ị ủ ặ int A = lowByte(0B11110011001100); //A = 0B11001100 = 204;
int B = lowByte(511); //B = lowByte(0B111111111) = 255;
int C = lowByte(5); //C = lowByte(0B00000101) = 0B101 = 5;
ủ
ỗ
highByte() là hàm tr v m t chu i 8 bit k v i 8 bit cu i cùng c a
m t chu i các bit. Nh v y, n u d li u đ a vào m t chu i 16bit
ộ
thì highByte() s tr v 8 bit đ u tiên, n u d li u đ a vào là m t
ặ
chu i 8bit ho c nh h n,
ư
ượ
ấ
b t kì cũng đ
ể ể
nào cũng có th bi u di n
L u ý:ư
ộ
highByte() không nh n giá tr thu c ki u d li u s th c. B n s g p
ế ố
ỗ
i biên d ch n u c làm đi u này.
l
Cú pháp highByte([giá tr đ a vào]);
Tr vả ề byte
Ví dụ
int A = highByte(0B1111111100000000); //A = 0B11111111 = 255;
int B = highByte(0B10101010); //B = 0
int C = highByte(0B110000000011111111) //C = 0B00000000 = 0
int D = highByte(1023); //D = highByte(0B111111111) = 0B11
= 3
hàm bitRead() s tr v giá tr t
ng
Cú pháp bitRead(x, n)
Tham số
ộ ố
x: m t s nguyên thu c b t c ki u s nguyên nào
ầ
n: bit c n đ c. Các bit s đ
tiên là s 0ố
Tr vả ề Giá tr c a 1 bit (1 ho c là 0) ể ế ả ề
ả ề
ả ề
ư
t nh sau ộ ị ủ ố . ị
i m t v trí xác đ nh c a s nguyên ộ ấ ứ ể ố ẽ ượ ừ ả ố ứ ự c tính t ph i qua trái, và s th t ầ
ố ể ế ộ ố ị ạ ủ ẽ ộ ị i m t bit xác đ nh c a m t s nguyên thành 1 . ộ ấ ứ ể ố ộ ố Ví dụ
bitRead(B11110010,0); // tr v 0
bitRead(B11110010,1); // tr v 1
bitRead(B11110010,2); // tr v 0
//Hàm bitRead có th vi
B11110010 >> 0 & 1 // = 0
B11110010 >> 1 & 1 // = 1
B11110010 >> 2 & 1 // = 0
ạ
ẽ
bitWrite() s ghi đè bit t
Cú pháp bitWrite(x, n, b)
Tham số
ộ ố
x: m t s nguyên thu c b t c ki u s nguyên nào
ị
n: v trí bit c n ghi. Các bit s đ
ầ
đ u tiên là s 0.
b: 1 ho c 0ặ
Tr vả ề không
Ví dụ
bitWrite(B11110010,0,1); // B11110011
bitWrite(B11110010,1,0); // B11110000
bitWrite(B11110010,2,1); // B11110110
ư
//Hàm bitWrite có th vi
t nh sau
B11110010 | (1 << 0) // = B11110011
B11110010 & ~(1 << 1) // = B11110000
B11110010 | (1 << 2) // = B11110110
bitSet() s thay giá tr t
Cú pháp bitSet(x, n)
Tham số x: m t s nguyên thu c b t c ki u s nguyên nào ố ứ ự ị ừ ả ẽ ượ ph i qua trái, và s th t c tính t ể ế ộ ố ủ ị ộ ị ạ i m t bit xác đ nh c a m t s nguyên thành ộ ấ ứ ể ố ố ứ ự ẽ ượ ừ ả ph i qua trái, và s th t c tính t ể ế n (2 mũ n). ả ề ộ ố ạ ầ
n: v trí bit c n ghi. Các bit s đ
ố
ầ
đ u tiên là s 0.
Tr vả ề không
Ví dụ
bitSet(B11110010,0); // B11110011
bitSet(B11110010,2); // B11110110
ư
t nh sau
//Hàm bitSet có th vi
B11110010 | (1 << 0) // = B11110011
B11110010 | (1 << 2) // = B11110110
ẽ
bitClear() s thay giá tr t
0.
Cú pháp bitClear(x, n)
Tham số
ộ ố
x: m t s nguyên thu c b t c ki u s nguyên nào
ị
ầ
n: v trí bit c n ghi. Các bit s đ
ố
ầ
đ u tiên là s 0.
Tr vả ề không
Ví dụ
bitClear(B11110010,1); // B11110000
ư
t nh sau
//Hàm bitClear có th vi
B11110010 & ~(1 << 1) // = B11110000
Tr v m t s nguyên d ng 2
Cú pháp bit(n)
ố
Tham số n: s nguyên
Tr vả ề m t s nguyên
ộ ố
Ví dụ
bit(0); // 2^0 = 1 ư
t nh sau bit(1); // 2^1 = 2
bit(2); // 2^2 = 4
bit(8); // 2^8 = 256
ể ế
// cũng có th vi
1 << 0 // = 1
1 << 1 // = 2
1 << 2 // = 4
1 << 8 // = 256 ắ Ng t (interrupt)
attachInterrupt() ớ ệ i thi u ờ ọ ả ề
ề ể
ằ ệ ố
ự ộ
i g i hàm t
đ ng khi h th ng sinh ra
ấ
ượ
c nhà s n xu t vi đi u khi n
ầ
ượ ấ
c c u hình trong ph n m m b ng ự ọ ố ị
ạ ộ c c u hình nên ộ ươ ộ ậ
ẽ ơ ớ ượ ấ
ụ ể
ươ ắ
ng trình chính s đ n gi n h n. M t ví d đi n hình v ng t là
đ ng ch y cùng v i ch ầ ắ
ề
ả ề
ng trình và tr v 1
. Vi cệ ượ ấ ắ ặ
ự ộ
đ ng bên c c u hình t ầ ử ơ ạ
ẳ
ng trình g n nh và x lý nhanh h n. Ch ng h n, khi
ạ ầ
ườ
ấ
ng b n c n c nh n hay không, thông th ọ
ượ
ấ digitalRead() trong đo n ạ ỉ ầ ạ ố ằ
ệ ử ụ
ắ ắ ẽ ạ ể ừ ẽ ọ ắ
ế ươ ậ ạ ắ ẽ
ng trình ng t s cho ta bi t ạ Gi
ữ
ắ
Ng t (interrupt) là nh ng l
ự ệ
ữ
ộ ự ệ
m t s ki n. Nh ng s ki n này đ
ầ ứ
ằ
ế ậ
t l p b ng ph n c ng và đ
thi
ữ
nh ng tên g i c đ nh.
Vì ng t ho t đ ng đ c l p và t
sinh ra khi đ
ả
ơ
ch
ự ộ
ạ
hàm millis(). Hàm này t
ờ
ặ
ố
con s tăng d n theo th i gian m c dù chúng ta không cài đ t nó
ế
ử ụ
cài đ t hàmặ
millis() s d ng đ n ng t và đ
ươ
ng trình Arduino.
trong mã ch
ả
ắ
ế
Vì sao c n ph i dùng đ n ng t?
ắ
ẹ
ươ
Ng t giúp ch
ể
ấ
ki m tra 1 nút nh n có đ
ể
ạ
ki m tra tr ng thái nút nh n b ng hàm
ớ
ấ
ắ
ươ
loop(). V i vi c s d ng ng t, b n ch c n n i nút nh n
ng trình
ch
ặ
ỗ ợ
ế
đ n đúng chân có h tr ng t, sau đó cài đ t ng t s sinh ra khi tr ng
thái nút chuy n t
HIGH>LOW. Thêm 1 tên hàm s g i khi ng t sinh
ế
ra. V y là xong, bi n trong đo n ch
ấ
tr ng thái nút nh n. ắ ố ượ ụ ề ể ộ ớ ạ ắ ắ ỉ ừ
ng các ng t ph thu c vào t ng dòng vi đi u khi n. V i
S l
Arduino Uno b n ch có 2 ng t, Mega 2560 có 6 ng t và Leonardo có 5
ng t.ắ Board int.1 int.2 Uno, Ethernet 3 Mega2560 3 21 Leonardo 2 0 ạ ố ứ ự ủ ắ
ố ớ ố ố ố
ả ắ ắ ố
ấ
ắ ắ ạ
ớ ự ệ ế
ắ ố ấ ở ắ c ắ ượ ự ệ ẽ ọ c sinh ra. ể ắ ồ (cid:0) ứ ụ ạ (cid:0) ụ ứ ạ (cid:0) ủ ạ ạ ể ừ ứ
m c Cú pháp attachInterrupt(interrupt, ISR, mode);
Thông số
ắ ớ ố
c a ng t. Trên Arduino Uno, b n có 2 ng t v i s
interrupt: S th t
ố
ắ ố
ứ ự
th t
là 0 và 1. Ng t s 0 n i v i chân digital s 2 và ng t s 1 n i
ặ
ớ
v i chân digital s 3. Mu n dùng ng t b n ph i g n nút nh n ho c
ế
ả
c m bi n vào đúng các chân này thì m i sinh ra s ki n ng t. N u
ạ ượ
dùng ng t s 0 mà g n nút nh n
chân digital 4 thì không ch y đ
r i.ồ
ISR: tên hàm s g i khi có s ki n ng t đ
ạ
mode: ki u kích ho t ng t, bao g m
ấ
ạ
LOW: kích ho t liên t c khi tr ng thái chân digital có m c th p
ạ
HIGH: kích ho t liên t c khi tr ng thái chân digital có m c cao.
RISING: kích ho t khi tr ng thái c a chân digital chuy n t ấ ệ ứ (cid:0) đi n áp th p sang m c đi n áp cao.
ạ ể ừ ủ FALLING: kích ho t khi tr ng thái c a chân digital chuy n t ệ
ạ
ứ ệ ệ ớ ắ ẽ ượ ọ c g i liên ữ ứ ươ ứ ng trình ng t s đ
ng ng. ứ
ấ
m c đi n áp cao sang m c đi n áp th p.
L u ý:ư
ươ
v i mode LOW và HIGH, ch
ệ
ụ
t c khi chân digital còn gi
m c đi n áp t
Tr vả ề không
Ví dụ ươ ấ ẫ ế ữ ườ ng trình d
ắ ả ấ ẫ ẽ ướ
t đi khi ng
ắ ẽ
i dùng nh n nút, n u v n gi
t. Sau khi th nút nh n, đèn led s sáng tr l ấ
i đây s làm sáng đèn led khi không nh n nút
ấ
nút nh n
ở ạ
i. ắ t đèn led ử ụ ệ ở ắ ụ ọ ấ ạ
Đo n ch
và làm đèn led t
thì đèn led v n còn t
int ledPin = 13;
void tatled()
{
digitalWrite(ledPin, LOW); // t
}
void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(2, INPUT_PULLUP); // s d ng đi n tr kéo lên cho chân
ố
s 2, ng t 0
attachInterrupt(0, tatled, LOW); // g i hàm tatled liên t c khi còn
nh n nút
} ậ void loop()
{
digitalWrite(ledPin, HIGH); // b t đèn led ộ ỏ ắ ể ạ ươ ụ
ể ử ả ấ ắ ấ ở ạ i t đèn led khi nh n nút, nh ra led nh p nháy tr l ử ụ ệ ở ắ ươ ạ ấ ng trình này nh p nháy led sau 500ms ử ụ ể ề ắ ệ ộ ượ ọ
ộ ử ườ
ng đ
ầ ẩ ấ
ạ ộ ứ ạ ắ }
ạ
ử ụ
M t ví d khác khi s d ng ng t, các b n có th thoát kh i các hàm
ng trình khác
delay đ x lý 1 đo n ch
int ledPin = 13;
void tatled()
{
// t
digitalWrite(ledPin, LOW);
}
void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(2, INPUT_PULLUP); // s d ng đi n tr kéo lên cho chân
ố
s 2, ng t 0
attachInterrupt(0, tatled, LOW);
}
void loop()
{
// đo n ch
digitalWrite(ledPin, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
delay(500);
}
Đi xa h nơ
Ng t trên AVR. (Arduino s d ng vi đi u khi n AVR)
ở ế
ắ
c g i là ng t, là m t tín hi u kh n c p g i đ n
Interrupts, th
ệ ạ
ừ
ộ ử
b x lí, yêu c u b x lí t m ng ng t c kh c các ho t đ ng hi n t
i ệ ụ ẩ ấ ả
ệ ế
ụ ụ ẽ ư ậ ấ ườ ắ ấ ệ ng trình s
ế
ử
ờ ư
ể ắ ừ ng đ
ề
ế ị ả ề
ụ
ắ
ố
các thi ằ ắ ượ ệ ưở ề ự ắ
ỉ ậ
ng t
ệ ấ ạ
ậ ồ ậ ặ ử ế ệ ề ể ể ạ ệ ậ ạ ấ ư ế ẩ ấ
ế ạ ầ ệ
ả
ế
ượ ư
i r t “kh n c p”, đ
ạ
t 1 đo n ch ươ
ạ ạ ọ ạ ị ươ
ể ấ
ệ ườ ợ ng trình đó là Input())
ề
ừ ườ
ng
ấ ả ờ ế ố ả ỉ ượ ọ ờ c g i khi ng i dùng ử ụ ưở ng s d ng ng t. ắ
ế
ấ
ế ế ạ ạ ắ ả t Ng t (interrupt) là gì, vui lòng tham kh o thêm t i ộ
ệ
ự
ể
ộ ơ
đ “nh y” đ n m t n i khác th c hi n m t nhi m v kh n c p nào
ụ ụ ắ
ọ
đó, nhi m v này g i là trình ph c v ng t – isr (interrupt service
ệ
ươ
ế
ộ ế
routine ). Sau khi k t thúc nhi m v trong isr, b đ m ch
ể ộ ử
ị ướ
ượ
ệ
ề ự
đ
c đó đ b x lí quay v th c hi n ti p các
c tr v giá tr tr
ở
ệ
ắ
ứ ộ ư
nhi m v còn dang d . Nh v y, ng t có m c đ u tiên x lí cao
ự ệ
ể ử
ượ
ấ
c dùng đ x lí các s ki n b t ng nh ng
nh t, ng t th
ẫ
ế
ờ
không t n quá nhi u th i gian. Các tín hi u d n đ n ng t có th xu t
ộ ế
t b bên trong chip (ng t báo b đ m timer/counter tràn,
phát t
ế
ắ
ở ữ ệ
ng t báo quá trình g i d li u b ng RS232 k t thúc…) hay do các tác
ữ
ấ
ắ
nhân bên ngoài (ng t báo có 1 button đ
c nh n, ng t báo có 1 gói d
ậ
ượ
c nh n…).
li u đã đ
ỏ
ự ệ ơ ả
ắ
ỹ
ộ
ắ
Ng t là m t trong 2 k thu t “b t” s ki n c b n là h i vòng
ế ế ộ
ạ ầ
ượ
ng b n c n thi
t k m t m ch đi u
(Polling) và ng t. Hãy t
ể
ụ
ệ
ề
khi n hoàn ch nh th c hi n r t nhi u nhi m v bao g m nh n thông
ừ ườ
tin t
i dùng qua các button hay keypad (ho c keyboard), nh n tín
ng
ệ ừ ả
ị
ể
ấ
hi u t
c m bi n, x lí thông tin, xu t tín hi u đi u khi n, hi n th
ượ ớ
ạ
thông tin tr ng thái lên các LCD…(b n hoàn toàn có th làm đ
c v i
ụ
ườ
AVR), rõ ràng trong các nhi m v này vi c nh n thông tin ng
i dùng
ụ
ệ
ớ
ấ
(start, stop, setup, change,…) r t hi m x y ra (so v i các nhi m v
ầ
c u tiên hàng đ u. N u dùng
khác) nh ng l
ng trình chuyên thăm dò
Polling nghĩa là b n c n vi
ủ
ạ
ươ
tr ng thái c a các button (tôi t m g i đo n ch
ả
ạ
và b n ph i chèn đo n ch
ng trình Input() này vào r t nhi u v trí
ươ
ỏ
ng trình chính đ tránh tr
trong ch
i
ng h p b sót l nh t
ậ
ề
ề
ự
i pháp cho v n đ
dùng, đi u này th t lãng phí th i gian th c thi. Gi
ắ ủ
ớ ườ
ằ
ắ
ử ụ
ng ng t c a
này là s d ng ng t, b ng cách k t n i các button v i đ
ụ ụ ắ
ử ụ
ủ
ươ
ng trình Input() làm trình ph c v ng t isr c a
chip và s d ng ch
ự
ầ
ạ
ng t đó, b n không c n ph i chèn Input() trong lúc đang th c thi và vì
ườ
ố
th không t n th i gian cho nó, Input() ch đ
ắ
nh n các button. Đó là ý t
ư
N u b n ch a bi
bài attachInterrupt(). ạ ươ ứ ớ ắ
t các ng t đã đ
ả ử ấ ầ ng ng
ầ
s sau khi nh n nút b m l n đ u tiên
t n a. Lúc này c kích ho t t
ấ
ầ
ắ ữ
t nh ng nh n l n th 2 đèn s không t
ạ ượ
ấ
ẽ
ắ ẽ ắ
Hàm detachInterrupt() s t
ể
ố
v i thông s truy n vào. Gi
ứ
ư
ẽ ắ
đèn led s t
ể ắ
ế
ầ
c n dùng đ n detachInterrupt() đ t t ng t chúng ta đã t o ra. ố ứ ự ắ ở ng t (xem thêm bài attachInterrupt() ) Cú pháp
detachInterrupt(interrupt);
Thông số
interrupt: s th t
Tr vả ề
không
Ví dụ ướ ươ ấ
t nó khi nh n ẽ ậ
ạ ỉ ắ
ấ ữ ế ụ ế ầ i. N u ti p t c nh n n a thì đèn ị ắ i đây s b t sáng đèn led và ch t
ẽ
t đi. c k t n i v i chân digital 13 ấ ư ượ ế ố ớ
ế
ị
ữ
giá tr cho bi t đã nh n nút hay ắ ấ ạ
Đo n ch
ng trình d
ả
ầ
l n đ u tiên, th ra đèn s sáng l
ẫ
v n sáng mà không b t
int ledPin = 13; // đèn LED đ
boolean daNhan = false; // l u gi
ch aư
void tatled()
{
digitalWrite(ledPin, LOW); // t t đèn led khi còn nh n nút ấ ế ặ t đ t chân ledPin là OUTPUT ở ệ ử ụ ắ ặ ắ ọ ậ ế ấ ắ ắ
t ng t đi ư ế ế ạ ắ ạ ả t Ng t (interrupt) là gì, vui lòng tham kh o thêm t i ặ ị ầ ọ ượ ạ
ẽ ậ
ắ
t các ng t
ắ
i các ng t. daNhan = true; // lúc này đã nh n nút
}
void setup()
{
pinMode(ledPin, OUTPUT); // thi
pinMode(2, INPUT_PULLUP); // s d ng đi n tr kéo lên cho chân
ố
s 2, ng t 0
attachInterrupt(0, tatled, LOW); // cài đ t ng t g i hàm tatled
}
void loop()
{
digitalWrite(ledPin, HIGH); // b t đèn led
if (daNhan == true)
{
// N u đã nh n nút thì t
detachInterrupt(0);
}
}
N u b n ch a bi
bài attachInterrupt().
ắ
ậ
M c đ nh, Arduino luôn b t các ng t nên trong ph n setup(), b n
ầ
ắ
ể ậ
không c n g i hàm này đ b t các ng t. Hàm interrupts() s b t toàn
ạ ắ
ế
ắ
ộ
ặ
b các ng t đã đ
c cài đ t. N u vì lý do nào đó b n t
ể ậ ạ
ạ ử ụ
ằ
b ng hàm
noInterrupts(), b n s d ng hàm này đ b t l
Cú pháp interrupts();
Thông số không
Tr vả ề không
Ví dụ ắ ắ ể ạ ầ ươ ề ờ ng trình yêu c u cao v th i gian ắ ạ ộ ắ
ở ạ i các ng t, các ng t ho t đ ng
ườ i ng tr l ả ạ ắ ạ ế ế ư i t Ng t (interrupt) là gì, vui lòng tham kh o thêm t ươ ề ờ ầ ng trình yêu c u chính xác v th i gian, ỉ ậ ề ẽ ử
ạ ụ ắ ỉ ạ
ắ ể
ấ
ọ
c th c thi sau khi g i hàm noInterrupts(). ắ ể ạ ắ ề ờ ươ ầ ng trình yêu c u cao v th i gian ạ ộ ắ ắ void setup() {}
void loop()
{
noInterrupts();
// t
t các ng t đ ch y
ạ
// đo n ch
interrupts();
ậ ạ
// b t l
// bình th
}
N u b n ch a bi
bài attachInterrupt().
ầ
ạ
Khi c n ch y các đo n ch
ạ ầ ắ
ụ
b n c n t
t các ng t đ Arduino ch t p trung vào x lý các tác v
ế
ầ
t và ch duy nh t các tác v này. Các ng t ch y n n s không
c n thi
ự
ượ
đ
Cú pháp noInterrupts();
Thông số không
Tr vả ề không
Ví dụ
void setup() {}
void loop()
{
noInterrupts();
// t
t các ng t đ ch y
ạ
// đo n ch
interrupts();
ậ ạ
// b t l i các ng t, các ng t ho t đ ng ườ ở ạ i ng tr l ạ ế ữ ễ ọ ư ệ ệ ữ ượ ư ệ ạ ớ ế ị ặ
ạ ấ ượ ế ặ ổ ớ ư ệ ử ụ ủ ế ạ ạ
ể ử ụ ể ệ ả ẵ ể ử ụ
ớ ể ượ ứ ế // bình th
}
ấ
Serial Th vi n giao ti p gi a các m ch Arduino d h c nh t
ế
Th vi n Serial đ
c dùng trong vi c giao ti p gi a các board m ch
ớ
ạ
ặ ớ
v i nhau (ho c board m ch v i máy tính ho c v i các thi
t b khác).
ề
ấ ả
ổ Serial (hay còn đ
c ượ
T t c các m ch Arduino đ u có ít nh t 1 c ng
ọ
ệ
ự
g i là UART ho c USART). Giao ti p Serial đ
c th c hi n qua 2
ặ
ổ
i máy tính. Vì
c ng digital 0 (RX) và 1 (TX) ho c qua c ng USB t
ậ
v y, n u b n đang s d ng các hàm c a th vi n Serial này, b n
không th s d ng các chân digital 0 và digital 1 đ làm vi c khác
c!ượ
đ
ể
ạ
B n có th s d ng b ng Serial monitor có s n trong Arduino IDE đ
ng Serial
giao ti p v i Arduino qua giao th c Serial. Kích vào bi u t ể ở ả ả ọ ặ
) ho c nh n t
ạ
ớ h p phím Ctrl+Shift+M đ m b ng Serial
ướ ể ọ
ư
i đ ch n
ủ
c dùng trong quá trình l p trình c a ấ ổ ợ
Monitor (
ộ
Monitor, sau đó b n kích chu t vào b ng ch n nh hình d
ố
ậ
ượ
baudrate gi ng v i baudrate đ
ặ ị
ạ
b n. M c đ nh là 9600 . ơ ề ổ ụ ư ị ơ ỉ này. ộ ố ạ
ể
M t s m ch khác có nhi u c ng Serial h n (Ví d nh Mega,...), đ
ạ
rõ h n, b n vào đ a ch
ư ệ
Mã th vi n:
Serial
available()
ệ ớ ữ ệ i đa mà ta có th đ c qua Serial . Các d li u ự ố
ộ ộ ớ ệ ượ ể ọ
c l u vào m t b nh đ m có dung l ng 64KB. Gi
i thi u
ả ề ố
Tr v s byte (ký t ) t
ế ượ ư
đ n đ
Cú pháp Serial.available() ỉ ạ ộ ự ư ế ệ ở ổ ứ ớ // Ch ho t đ ng trên Arduino Mega
Serial1.available()
Serial2.available()
Serial3.available()
Tham số Không
Tr vả ề m t s là s byte (ký t ) ta có th đ c
ể ọ
ố
ộ ố
Ví dụ
int incomingByte = 0; // l u tín hi u đ n
void setup() {
Serial.begin(9600); // m c ng serial v i m c baudrate là 9600
}
void loop() { ấ ệ ệ ậ ượ c tín hi u ị ọ ậ ượ c ữ ấ // xu t tín hi u khi nh n đ
if (Serial.available() > 0) {
// đ c các giá tr nh n đ
incomingByte = Serial.read();
ậ ượ
// xu t ra nh ng gì nh n đ
c
Serial.print("Toi nghe duoc: ");
Serial.println(incomingByte, DEC);
}
} ụ Ví d dành cho Arduino Mega
void setup() {
Serial.begin(9600);
Serial1.begin(9600);
} ọ ồ ử ệ ừ Serial r i g i qua Serial1 ồ ử ọ ệ ừ Serial1 r i g i qua Serial0 void loop() {
//đ c tín hi u t
if (Serial.available()) {
int inByte = Serial.read();
Serial1.print(inByte, BYTE);
}
//Đ c tín hi u t
if (Serial1.available()) {
int inByte = Serial1.read();
Serial.print(inByte, BYTE);
}
}
begin()
ệ ớ i thi u ớ ộ ổ ở ộ ể ướ
c có trên
ộ ế ạ ả ể ế ợ ạ
ườ
ị ứ
ứ ạ Gi
ộ
Kh i đ ng m t c ng Serial v i m t baudrate cho tr
ứ
ớ
Arduino. Đ giao ti p v i máy tính, b n ph i dùng m t trong các m c
baudrate sau: 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800,
ặ
38400, 57600, ho c 115200. Ngoài ra, b n có th thay th m c
ữ
baudrate khác nh ng m c trên trong tr
ẵ
m ch nào đó có s n m c baudrate xác đ nh và không thay đ i đ ế ứ
ớ
ộ
ng h p giao ti p v i m t
ổ ượ .
c ỉ Cú pháp
Serial.begin(speed)
Serial.begin(speed, config)
//Ch dành cho Arduino Mega
Serial1.begin(speed)
Serial2.begin(speed)
Serial3.begin(speed)
Serial1.begin(speed, config) ậ ẵ ẽ ữ ị ả
, và stop bits. Nh ng giá tr kh Serial2.begin(speed, config)
Serial3.begin(speed, config)
Tham số
speed: bits / giây (baud) long
ợ ữ ệ
config: t p h p d li u, bit ch n l
ụ
d ng là: (cid:0) (cid:0) (cid:0) (cid:0) ặ ị (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) SERIAL_5N1
SERIAL_6N1
SERIAL_7N1
SERIAL_8N1 (m c đ nh)
SERIAL_5N2
SERIAL_6N2
SERIAL_7N2
SERIAL_8N2
SERIAL_5E1
SERIAL_6E1
SERIAL_7E1
SERIAL_8E1
SERIAL_5E2
SERIAL_6E2
SERIAL_7E2
SERIAL_8E2
SERIAL_5O1
SERIAL_6O1
SERIAL_7O1
SERIAL_8O1
SERIAL_5O2
SERIAL_6O2 (cid:0) (cid:0) SERIAL_7O2
SERIAL_8O2 ở ở ứ m c 9600 Tr vả ề không
Ví dụ void setup() {
Serial.begin(9600); // m port
}
void loop() {} ụ ế ề ổ ạ ả ặ ứ Ví d trên Arduino Mega
ạ ử ụ
// N u b n s d ng cùng lúc nhi u c ng Serial
// (Serial, Serial1, Serial2, Serial3),
// thì b n ph i đ t các m c baudrate khác nhau cho nó
void setup(){
Serial.begin(9600);
Serial1.begin(38400);
Serial2.begin(19200);
Serial3.begin(4800); Serial.println("Hello Computer");
Serial1.println("Hello Serial 1");
Serial2.println("Hello Serial 2");
Serial3.println("Hello Serial 3");
}
void loop() {}
end()
ớ ệ i thi u
ổ ể ươ ng t ự ạ
i, b n Gi
ặ
Đóng c ng Serial, đ dùng các chân digital 0, 1 ho c các chân t
ể ậ ạ
trên (Arduino Mega) cho công tác pinMode. Đ b t l
.
dùng Serial.begin() ổ ở ứ m c 9600 Cú pháp Serial.end()
//Đóng c ng Serial trên Arduino Mega
Serial1.end()
Serial2.end()
Serial3.end()
Tham số không
Tr vả ề không
Ví dụ
void setup() {
ở
Serial.begin(9600); // m port
Serial.end();// Đóng c ngổ
Serial.println("I can't post");
}
void loop() {} ớ ệ i thi u ượ ớ ệ ẽ ọ c ký ế ẽ ả ề ệ ừ ộ
ế ế
b nh đ m đ n khi nào tìm đ
ặ ặ ế ạ . ế ể string) Gi
Serial.find() s đ c tín hi u t
ự
cho phép. Nó s tr v true n u tìm ra ho c false n u không tìm
t
ấ
th y ho c h t h n (timeout)
Cú pháp Serial.find(target)
ỗ ầ
Tham số target : chu i c n tìm ki u (ki u
Tr vả ề boolean
ệ ớ i thi u ệ ừ ộ ẽ ọ
ặ ớ ệ
ế ừ ự cho phép ho c là d ng quá trình tìm đ n khi nh n đ ượ
ế
b nh đ m đ n khi nào tìm đ
c
ự
c ký t ậ ượ
ế ế ặ ấ . ỗ ầ ế ể string) Gi
Serial.findUntil() s đ c tín hi u t
ký t
ẽ ả ề
thoát (terminator). Nó s tr v true n u tìm ra ho c false n u không
ặ ế ạ
tìm th y ho c h t h n (timeout)
Cú pháp Serial.findUntil(target,terminator)
Tham số target : chu i c n tìm ki u (ki u ỗ ừ ớ ế ụ ờ ợ
ế ụ ạ ớ ồ terminator: chu i d ng tìm (terminator)
Tr vả ề boolean
ệ
i thi u
Gi
ệ
Hàm này có nhi m v ch đ i quá trình g i thông tin qua Serial k t
ươ
thúc r i m i cho ch y ti p t c ch ử
ng trình . ỉ Cú pháp
Serial.flush()
//Ch cho Arduino Mega
Serial1.flush()
Serial2.flush()
Serial3.flush()
Tham số không
Tr vả ề không
f (Serial)
ớ ệ ổ ế ụ ế ố ẵ t các c ng k t n i Serial đã s n sàng hay ạ ạ ấ ả Gi
i thi u
ệ
Nó có nhi m v cho bi
ch aư .
Cú pháp //T t c các lo i m ch Arduino
if (Serial)
//Arduino Leonardo
if (Serial1)
//Arduino Mega
if (Serial1)
if (Serial2)
if (Serial3)
Tham số Không
Tr vả ề ượ ậ ế ể ạ c b t và b n có th giao ti p i là false ậ ượ ậ ỉ ầ ế ớ ổ c b t. Ch c n thi ạ
t v i m ch ế ổ
boolean: là true n u c ng Serial đã đ
ượ ạ
qua Serial, ng
c l
Ví dụ
void setup() {
//B t Serial
Serial.begin(9600);
while (!Serial) {
ợ ế
; //Đ i đ n khi nào c ng Serial đã đ
Leonardo
}
}
void loop() {
} ớ ệ i thi u ụ ấ ộ
ễ ấ ữ ể ể
ặ ộ ả ự ự ể bi u ừ
nó đang đ c không ph i là m t ký t ớ ệ ấ ượ ầ ộ
c trong b nh đ m
ạ ờ ằ ị ừ ế ổ ẽ ả ề ố
ẽ ừ
ờ
ị Gi
ị ố ự ầ
ệ
ớ
Hàm này có nhi m v l y ra giá tr s th c đ u tiên có trong b nh
ộ
ả
ự
ẽ ỏ
ệ
không ph i dùng đ bi u di n m t
đ m serial. Nó s b qua các ký t
ạ ừ ấ
ẽ
ấ
ố ự
s th c (ngo i tr d u tr "", d u ch m ".", ch "e" ho c "E"). Nó s
ừ
ọ
ấ
ọ
d ng đ c khi th y ký t
ễ ố ự .
di n s th c
Cú pháp Serial.parseFloat()
Tham số không
Tr vả ề float
i thi u
Gi
ớ ệ
Hàm này s tr v s nguyên đ u tiên nó l y đ
ể
ế
Serial. Nó s d ng quá trình tìm n u quá 1000 mili giây. B n có th
thay đ i th i gian ch b ng hàm
Serial.setTimeout(). N u b d ng nó
ẽ ề
.
s v giá tr là 0
Cú pháp Serial.parseInt() Tham số không
Tr vả ề int ớ ệ i thi u ể ự ử ế ẽ ử ụ
ộ ẽ ỏ ộ ệ ướ ề
ẽ ọ ộ
ộ
ớ ệ
c đ c là gì. Và khi nhìn tr m,
ấ
ớ
ự
đó kh i b nh đ m. Đi u này r t phù h p v i
ặ ỏ ẽ ượ ọ
ợ
ớ ệ
.
c gói tin là gì, sau đó chúng ta s đ c ho c b qua ỉ ớ ệ ế ặ ồ ầ
ộ ớ ệ Gi
Chúng ta s s d ng hàm này đ "nhìn tr m" xem th byte (ký t )
ti p theo trong b nh đ m mà ta s đ
ta s không xóa ký t
vi c xem tr
Cú pháp Serial.peek()
//Ch trên Arduino Mega
Serial1.peek()
Serial2.peek()
Serial3.peek()
Tham số không
ộ
Tr vả ề int: byte đ u tiên trong b nh đ m (ho c 1 n u không t n
ạ ữ ệ
t
ệ i d li u trong b nh đ m)
ớ ấ ữ ệ ườ i có i thi u
ẽ
ể ọ ượ ổ
ướ ạ
ể ượ ử ụ
c s d ng d
ự
ặ ỗ
i d ng chu i con ng
ạ
ề
i nhi u d ng khác
ể
ượ
c chuy n thành ỗ Gi
Hàm này s xu t d li u ra c ng Serial d
ướ
th đ c đ
c. Hàm này có th đ
ộ ố
ữ ố ủ
nhau. Các ch s c a m t s (nguyên ho c th c) đ
ấ
chu i và xu t ra màn hình . Ví d :ụ (cid:0) (cid:0) (cid:0) (cid:0) ẽ ữ Serial.print(78) cho ta "78"
Serial.print(1.23456) cho ta "1.23"
Serial.print('N') cho ta "N"
Serial.print("Hello world.") cho ta "Hello world."
ệ ố
ặ
ể
ố ể
ạ
i d ng mà b n mu n (th ố ứ
Tham s th 2 (có th có ho c không) s giúp h th ng Arduino in d
ệ ướ ạ
ị
ườ
li u d
ng là dùng đ debug). Các giá tr
ợ ệ
là:
h p l (cid:0) ệ ơ ố (cid:0) ữ ệ ướ ạ
ữ ệ ướ ạ ệ
ị
ệ ậ BIN: in d li u d
DEC: in d li u d i d ng h nh phân (h c s 2)
ệ ơ ố
i d ng h th p phân (h c s 10) (cid:0) ệ ơ ố (cid:0) ữ ệ ướ ạ
ữ ệ ướ ạ (cid:0) ệ
i d ng h bát phân (h c s 8)
ệ ậ ụ
i d ng h th p l c phân
ậ
ị ệ ơ ố
(h c s 16)
ộ ố ấ ỳ OCT: in d li u d
HEX: in d li u d
ố ớ ố ự
Còn đ i v i s th c, thì giá tr nh p vào là m t s nguyên b t k
ệ ố ặ ươ ố ự ể ị ng), h th ng s dùng giá tr này đ làm tròn s th c ụ ể ơ ẽ
(âm ho c d
ủ ạ
c a b n. Xem ví d đ rõ h n. Serial.print(78, BIN) cho ta "1001110"
Serial.print(78, OCT) cho ta "116"
Serial.print(78, DEC) cho ta "78"
Serial.print(78, HEX) cho ta "4E"
Serial.println(1.23456, 0) cho ta "1"
Serial.println(1.23456, 2) cho ta "1.23"
Serial.println(1.23456, 4) cho ta "1.2346" ấ ỳ ị ở ấ ỳ ể ữ ệ b t k ki u d li u nào trên ố ẽ ượ ượ ử
c g i vào
ượ
ị c ả ỗ
ể
(sau khi đã chuy n thành chu i) đ
ấ ỳ
ả ề ướ
c khi có b t k giá tr nào đ
ở ở ứ ở ộ m c baudrate 9600 ử ị Cú pháp Serial.print(val)
Serial.print(val, format)
Tham số val: b t k giá tr
ở
format: Xem
Tr vả ề
size_t: int S byte
ổ
c tr v tr
c ng Serial. Nó s đ
ử
g i đi vào Serial trong các phiên b n Arduino 1.0 tr lên.
Ví dụ
int x = 0; // Bi nế
void setup() {
Serial.begin(9600); // KH i đ ng serial
}
void loop() {
// G i các giá tr ị ộ ỉ ự ằ ượ ả
n m trong b ng ASCII đ c ướ ề ướ ạ ỗ ớ ố
i d ng chu i (Gi ng v i format : ộ ệ ạ ượ ể ố ậ ồ c chuy n h d ng th p phân r i ấ ướ ạ ộ
ố ượ ậ ụ ệ ạ ể ồ
c chuy n h d ng th p l c phân r i ấ ướ ạ ộ
ố ượ ể ệ ạ ồ c chuy n h d ng bát phân r i ấ ướ ạ Serial.print("NO FORMAT"); // in giá tr nhãn
Serial.print("\t"); // in m t phím Tab
Serial.print("DEC");
Serial.print("\t");
Serial.print("HEX");
Serial.print("\t");
Serial.print("OCT");
Serial.print("\t");
Serial.print("BIN");
Serial.print("\t");
for(x=0; x< 64; x++){ // ch các ký t
xu t raấ
ị
ạ
ấ
//Xu t ra d
i nhi u đ nh d ng
ấ ố
Serial.print(x); // xu t s x d
DEC)
Serial.print("\t"); // in m t phím tab
Serial.print(x, DEC); // s x đ
ỗ
i d ng chu i
xu t d
Serial.print("\t"); // in m t phím tab
Serial.print(x, HEX); // s x đ
ỗ
i d ng chu i
xu t d
Serial.print("\t"); // in m t phím tab
Serial.print(x, OCT); // s x đ
ỗ
xu t d
i d ng chu i
Serial.print("\t"); // prints a tab ố ượ ệ ạ ể ồ ị c chuy n h d ng nh phân r i ấ ướ ạ Serial.println(x, BIN); // s x đ
ỗ
i d ng chu i
xu t d ộ ự ố xu ng dòng. xem hàm ợ ộ ầ ữ ố ồ // sau đó thêm m t ký t
Serial.println() đ rõ!ể
delay(200); // đ i 200 mili giây
}
Serial.println(""); //Xu ng đ ng m t l n n a!
} ớ ệ ố ố ư ộ ấ ầ ạ ị ở ấ ỳ ể ữ ệ . b t k ki u d li u nào ở ố ượ ử
c g i vào
ượ
ị ẽ ượ c ỗ
ể
(sau khi đã chuy n thành chu i) đ
ấ ỳ
ả ề ướ
c khi có b t k giá tr nào đ
ở ả ế ư ị ị i thi u
Gi
ẽ ử
ệ
Gi ng h t hàm
Serial.print(), nh ng nó s g i thêm m t d u xu ng
ữ
ử
dòng sau khi g i nh ng gì b n yêu c u.
Cú pháp Serial.println(val)
Serial.println(val, format)
Tham số
ấ ỳ
val: b t k giá tr
trên
format: Xem
Tr vả ề
size_t: int S byte
ổ
c ng Serial. Nó s đ
c tr v tr
ử
g i đi vào Serial trong các phiên b n Arduino 1.0 tr lên.
Ví dụ
int analogValue = 0; // bi n l u giá tr analog
void setup() {
ớ
ở
// m serial v i baudrate 9600
Serial.begin(9600);
}
void loop() {
ị
ọ
// đ c giá tr analog trên chân A0
analogValue = analogRead(0);
ấ
//Xu t giá tr ấ ị ướ ạ ồ ổ ỗ
i d ng chu i
ệ ậ ấ ướ ạ ỗ
i d ng chu i ị ổ ệ ậ ụ ấ ướ ạ ỗ
i d ng chu i ệ ổ ồ ị ấ ướ ạ ỗ
i d ng chu i ệ ổ ồ ị ị ấ ướ ạ ỗ
i d ng chu i ồ ọ ế Serial.println(analogValue); // xu t giá tr d
ị
Serial.println(analogValue, DEC); // đ i giá tr sang h th p phân r i
xu t d
Serial.println(analogValue, HEX); // đ i giá tr sang h th p l c phân
ồ
r i xu t d
Serial.println(analogValue, OCT); // đ i giá tr sang h bát phân r i
xu t d
Serial.println(analogValue, BIN); // đ i giá tr sang h nh phân r i
xu t d
ể
ừ
// d ng 1 giây đ xem r i đ c ti p
delay(1000);
} ể ọ ừ ự ủ ộ ớ ệ Dùng đ đ c t ng ký t ớ ệ
trong b nh đ m c a Serial . i thi u Gi
Cú pháp Serial.read() ỉ ớ ệ ầ ộ ể ư ị ượ ử
c g i //Ch có trên Arduino Mega
Serial1.read()
Serial2.read()
Serial3.read()
Tham số không
Tr vả ề int : byte đ u tiên trong b nh đ m
Ví dụ int incomingByte = 0; // dùng đ l u giá tr đ ở ớ void setup() {
Serial.begin(9600); // m serial v i baudrate 9600
}
void loop() { ế ể ọ ượ c ọ ữ ệ // n u còn có th đ c đ
if (Serial.available() > 0) {
// đ c ch li u
incomingByte = Serial.read();
ậ ượ
ả ề ữ
// tr v nh ng gì nh n đ
c
Serial.print("Toi nhan duoc: ");
if (incomingByte == 1) {
Serial.println("Toi khong nhan duoc gi ca");
} else
Serial.println(char(incomingByte));
}
} ư ệ
Mã th vi n: ớ ệ ộ ủ ớ ệ
trong b nh đ m c a Serial
ầ ẽ ọ
ọ ủ ế ể ư ạ i các byte (char[] ho cặ byte[]) ầ ư int) i thi u
Gi
ủ
ự
ể ọ ừ
. Nó s đ c cho đ
ký t
Dùng đ đ c t
ẽ
ườ
ố ượ
i dùng yêu c u. Và n u không đ c đ thì nó s
ng byte mà ng
s l
ế ạ
ừ
Serial.setTimeout()).
d ng khi h t h n (xem
Cú pháp Serial.readBytes(buffer, length)
Tham số
ế
ệ
buffer: bi n đ m dùng đ l u l
ố
length : s byte c n l u (
Tr vả ề byte ị ế ệ ư ở ớ ể ọ ượ c ữ ệ ọ Ví dụ
char buffer[4]= {}; // Bi n đ m l u giá tr
void setup() {
Serial.begin(9600); // m serial v i baudrate 9600
}
void loop()
ế
// n u còn có th đ c đ
if (Serial.available() >= 3) {
// đ c ch li u
Serial.readBytes(buffer,3);
ấ ữ ệ
//Xu t d li u
Serial.print("Toi nhan duoc: ");
Serial.println(buffer);
}
} ư ệ
Mã th vi n:
Serial
ớ ệ ụ ư Serial.readBytes() ự ế ẽ ế
ư
. Nh ng nó s k t thúc quá trình
ể char) k t thúc (ki u ể char) ể ư ạ ho cặ byte[]) i các byte (char[] ế
ố ầ ư int) ệ ớ ẽ ượ ọ ặ ươ c ng Serial. Và
ự ể ọ ữ ệ .
đ đ c d li u ệ ừ ổ
c g i khi nào có tín hi u t
ng t ệ ạ Serial.read() ho c t
ả ụ ạ Esplora, i thì hàm này không kh d ng trên các m ch ỉ i thi u
Gi
ệ
Có nhi m v nh
ặ
ọ ế
đ c n u g p trúng ký t
Cú pháp Serial.readBytesUntil(character, buffer, length)
Tham số
ự ế
character: ký t
k t thúc (ki u
ệ
buffer: bi n đ m dùng đ l u l
length : s byte c n l u (
Tr vả ề byte
Gi
i thi u
Hàm serialEvent() s đ
ạ ẽ
sau đó b n s dùng hàm
Hi n t
ặ
Leonardo, ho c Micro
Cú pháp void serialEvent(){
//câu l nhệ
}
//Ch có trên Arduino Mega
void serialEvent1(){
//câu l nhệ
}
void serialEvent2(){
//câu l nhệ
}
void serialEvent3(){
//câu l nhệ } ệ ớ ố ệ ử ữ ệ ặ ị .
i đa cho vi c x lý d li u Serial. M c đ nh là 1000 ờ ờ ợ ở ơ ị đ n v mili giây ( long) i thi u
Gi
ờ
ặ
Đ t th i gian t
Cú pháp Serial.setTimeout(time)
Tham số time: th i gian ch đ i
Tr vả ề không
ệ ớ ượ ử ữ ệ ớ ộ
ộ i c ng Serial. D li u đ
ư ể byte ho c ặ
c mã hóa c g i b ng ki u
byte đ ki u ự ể char. ộ s đ ấ
c xu t ra ừ ầ ử ầ ầ ử ẽ ượ
ầ ử len 1 ượ ử ố ượ c g i đi ử ể ộ ị
ỗ ử i thi u
Gi
ữ ệ ượ ử ằ
G i d li u t
m t dãy các byte Cũng nh hàm Serial.print(). Các
thành các ký t
Cú pháp Serial.write(val)
Serial.write(str)
Serial.write(buf, len)
Tham số
ị ể byte
ộ
val: M t giá tr ki u
ị ể string.
ộ
str: M t giá tr ki u
ả
ể
buf: Ki u byte[] (m ng byte), len: đ dài các ph n t
ế
ẽ ượ
đ u tiên đ n ph n t
ph n t
c tính t
Serial, s đ
Tr vả ề byte: s l
ng byte đ
Ví dụ
void setup(){
Serial.begin(9600);
}
void loop(){
Serial.write(45); // g i m t ki u byte có giá tr 45
ả ề ố
int bytesSent = Serial.write("hello"); // g i chu i "hello" và tr v s
byte đã g iử
}1.
2.
1.
2.
3.
4.
5.
6.
7.
Leonardo)
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
1.
ớ
ạ ế
x đ n ô nh )
1.
2.
th i gian xung có m c áp th p.
2.
3.
o
o
o
o
o
o
o

