ấ 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) (multi­line 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  ể ữ ệ ằ for (  = ;  ằ ạ  <=  += ) { b ệ     <đo n câu l nh>; }

(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  ằ ể ữ ệ for (  = ;  ằ  <=  ­= ; } Và khi đã hi u đ hàm For: ế for ( = ;<đi u ki 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 (pre­compile) .

ằ ị ủ ằ

ế ế ế 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 pre­compile 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 pre­comile, 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 pre­compile 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   //đ \ArduinoIDE\libraries\EEPROM\function\code.h

ằ 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 on­board  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 on­board 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 ớ ế

15­1) (16 bit)

ị ừ ế  ­32,768 đ n 32,767 (­

ị ừ ạ

31­1) (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

15­1) (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.  ị ằ ế ế

ữ ố ạ 6­7 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

ả ầ ử  0­5), 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

1.

2.

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

1.

2.

3.

4.

5.

6.

ượ ậ ế ớ ỉ ầ ạ 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

7. Leonardo)

8.

9.

10.

11.

} }   void loop() {

12.

ỗ ầ ủ

13.

14.

15.

16.

ự ừ ký t ế ế  10 đ n h t

17.

18.

19.

20.

21.

ừ ị ủ ụ ứ ự ế v  trí th  7 đ n khi xóa đ  22 ký t

22.

23.

24.

25.

26.

27.

28.

// 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/huong­dan­ham/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/bang­ma­ascii ) ổ ố       // 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 = "";   Serial.println(stringOne);   stringOne.toUpperCase();   Serial.println(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 "read­only". 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

ạ Memory­mapped peripheral registers (thanh ghi ngo i vi có ánh

1. ớ ạ ế x  đ n ô 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 ế ư ệ ạ ệ  0­1,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 0­5V

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 ả ấ  0­5V, 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

1.

ủ ờ ớ ạ 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

ứ ấ ờ

2. th i gian xung có m c áp th p.

ệ ớ

ạ ẽ ể ề ề ơ

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),

2.

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ọ ờ ỉ ừ ế

3.

ấ  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.

ờ ớ ở ứ ứ

ượ ủ ừ  0­180 đ ị 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 1­2ms. ề ể ư 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 A­B 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à Not­A­Number.

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 HC­SRxx 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.

o

o

o

o

o

o

o

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ử }