Professional Documents
Culture Documents
Arduino Tu Hoc A Den Z Cho Nguoi Moi Bat Dau
Arduino Tu Hoc A Den Z Cho Nguoi Moi Bat Dau
EBOOKS TỰ HỌC
LẬP TRÌNH
ARDUINO DÀNH
CHO NGƯỜI MỚI
BẮT ĐẦU TỪ
A ĐẾN Z
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
2
MỤC LỤC
A. GIỚI THIỆU VỀ ARDUINO .................................................................................. 15
I. ARDUINO LÀ GÌ? ................................................................................................... 17
II. SƠ LƯỢC VỀ ARDUINO UNO R3 ........................................................................ 21
1. Một số thông số kỹ thuật như sau : ...................................................................... 22
2. Sơ đồ chân của Arduino Uno................................................................................ 23
III. SƠ LƯỢC BỘ KIT TỰ HỌC ARDUINO .............................................................. 25
1. Giới thiệu sơ lược về KIT TỰ HỌC: ................................................................... 25
2. Những lợi ích của Kit Tự Học Arduino: ............................................................. 25
3. Mục đích của bộ KIT TỰ HỌC: .......................................................................... 26
4. Một số bộ KIT TỰ HỌC ARDUINO: ................................................................ 27
IV. CÀI ĐẶT PHẦN MỀN IDE VÀ DRIVER ............................................................. 27
1. Cài đặt phần mền Arduino IDE: ......................................................................... 27
a. Cài Java Runtime Environment (JRE). ................................................................ 27
b. Cài đặt Arduino IDE: ........................................................................................... 28
2. Cài đặt Driver đối với Arduino Uno, mê ga,…: ................................................. 30
a. Cài đặt Driver: ...................................................................................................... 30
b. Nạp chương trình cho Arduino Uno (mega tương tự): ........................................ 32
3. Cài đặt Driver đối với Nano: ................................................................................ 34
a. Giới thiệu board arduino Nano. ........................................................................... 34
b. Cài đặt driver cho Arduino Nano ......................................................................... 34
c. Thông số kỹ thuật Arduino Nano: ....................................................................... 35
d. Nạp chương trình cho Arduino Nano: ................................................................. 36
B. NGÔN NGỮ LẬP TRÌNH ARDUINO ..................................................................... 40
I. HÀM CHỨC NĂNG (FUNCTION): ...................................................................... 40
1. Hàm nhập xuất Digital I/O: .................................................................................. 41
a. digitalWrite():....................................................................................................... 41
b. digitalRead(): ....................................................................................................... 42
c. pinMode(): ........................................................................................................... 43
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
3
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
4
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
5
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
6
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
7
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
8
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
9
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
10
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
11
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
12
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
13
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
14
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
15
Tuy nhiên có một thứ làm cho mọi chuyện trở nên rất dễ dàng, có tên gọi là
“Arduino”. Và trải qua các công đoạn ngắn gọn như sau:
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
16
So sánh các mô hình điều khiển được sử dụng bằng phương pháp thiết kế
“truyền thống” và từ thiết kế bằng “Arduino”.
• Hiểu biết chuyên sâu về • Chủ yếu tập trung tìm hiểu
linh kiện điện tử. kết nối hệ thống, không cần
quan tâm đến việc vẽ mạch,
• Biết vẽ mạch, rửa mạch, in
làm mạch in,…
mạch,…
Kỹ Năng
• Biết lập trình ( việc lập trình
• Biết lập trình ( việc lập
dễ dàng do thư viện có sẵn
trình khó khăn do module
của các module được chuẩn
tự thiết kế không có chuẩn
hóa).
hóa ).
• Chỉ dành cho những giới • Dành cho giới chuyên ngành,
Đối Tượng chuyên ngành điện - điện không chuyên, thậm chí là
tử. học sinh cấp 1, 2,..
• Thời gian hoàn thành rất • Thời gian hoàn thành rất
lâu 1 tuần, có thể từ 1 đến nhanh.
2 tháng.
• Thời gian chủ yếu tập trung
Thời Gian • Thời gian tập trung chủ yếu vào hệ thống nên có thể làm
vào làm mạch, ít thời gian được những hệ thống phức
để phát triển quy mô hệ tạp hơn.
thống.
• Phát triển được kỹ năng • Phát triển được tư duy lập
Phát Triển thiết kế mạch, in mạch, trình hệ thống.
hàn,…
Chính vì sự tiện lợi như vậy, Arduino đã trở thành một hiện tượng trên toàn thế
giới, nếu bạn lên mạng tìm kiếm và gõ vào Arduino, bạn sẽ thấy hàng ngàn ứng
dụng khác nhau từ khắp mọi nơi trên thế giới sử dụng Arduino. Từ đó ta có thể
thấy được tầm ảnh hưởng của Arduino đến nhường nào.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
17
I. ARDUINO LÀ GÌ?
Arduino không phải là cái gì cao siêu hết, chỉ là sử dụng chip AVR với những thứ
mà bạn sẽ cần đến như mạch giao tiếp (USB sang UART), mạch nguồn, có sẵn các
chân vào/ra để giao tiếp với cảm biến và các thiết bị ngoại vi.
Arduino rất đơn giản, dễ sử dụng, dễ code (ngôn ngữ tương tự như C/C++). Một
trong những cái hay nhất của Arduino là nó hỗ trợ rất nhiều thư viện, rất tiện lợi.
Nếu bạn muốn điều khiển động cơ, sẽ có các mạch công suất tương thích hoàn toàn
với Arduino. Nếu bạn muốn điều khiển qua mạng Internet, cũng có một mạch
Ethernet/Wifi tương thích hoàn toàn với Arduino. Và còn rất nhiều thứ khác nữa.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
18
Arduino cũng có rất nhiều kích thước khác nhau, phù hợp cho nhiều mục đích sử
dụng. Thông dụng nhất hiện nay là Arduino Uno nhỏ gọn dành cho những ai đang
bắt đầu học về arduino.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
19
Máy in 3D:
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
20
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
21
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
22
Số chân Digital I/O 14 (có 6 chân điều chế độ rộng xung PWM)
SRAM 2 KB (ATmega328)
EEPROM 1 KB (ATmega328)
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
23
• USB (1).
Arduino sử dụng cáp USB để giao tiếp với máy tính. Thông qua cáp USB chúng ta
có thể Upload chương trình cho Arduino hoạt động, ngoài ra USB còn là nguồn
cho Arduino.
• Nguồn ( 2 và 3 ).
Khi không sử dụng USB làm nguồn thì chúng ta có thể sử dụng nguồn ngoài
thông qua jack cắm 2.1mm ( cực dương ở giửa ) hoặc có thể sử dụng 2 chân Vin và
GND để cấp nguồn cho Arduino.
Bo mạch hoạt động với nguồn ngoài ở điện áp từ 5 – 20 volt. Chúng ta có thể
cấp một áp lớn hơn tuy nhiên chân 5V sẽ có mực điện áp lớn hơn 5 volt. Và nếu sử
dụng nguồn lớn hơn 12 volt thì sẽ có hiện tượng nóng và làm hỏng bo mạch.
Khuyết cáo các bạn nên dùng nguồn ổn định là 5 đến dưới 12 vol.
Chân 5V và chân 3.3V (Output voltage) : các chân này dùng để lấy nguồn ra từ
nguồn mà chúng ta đã cung cấp cho Arduino. Lưu ý : không được cấp nguồn vào
các chân này vì sẽ làm hỏng Arduino.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
24
• Chip Atmega328.
Chip Atmega328 Có 32K bộ nhớ flash trong đó 0.5k sử dụng cho bootloader.
Ngoài ra còn có 2K SRAM, 1K EEPROM.
• Input và Output ( 4 và 5 ).
Arduino Uno có các chân với chức năng input và output sử dụng các hàm
pinMode(), digitalWrite() và digitalRead() để điều khiển các chân này (Analog :
A0 đến A5) (digital : chân số 0 đến chân số 13).
Cũng trên 14 chân này chúng ta còn một số chân chức năng đó là:
Serial : chân 0 (Rx ), chân 1 ( Tx). Hai chân này dùng để truyền (Tx) và nhận (Rx)
dữ liêu nối tiếp TTL.
Chúng ta có thể sử dụng nó để giao tiếp với cổng COM của một số thiết bị hoặc
các linh kiện có chuẩn giao tiếp nối tiếp.
PWM (pulse width modulation): các chân 3, 5, 6, 9, 10, 11 trên bo mạch có
dấu “~” là các chân PWM chúng ta có thể sử dụng nó để điều khiển tốc độ động
cơ, độ sáng của
đèn…
SPI : 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK), các chân này hỗ trợ giao tiếp
theo chuẩn SPI.
I2C: Arduino hỗ trợ giao tiếp theo chuẩn I2C. Các chân A4 (SDA) và A5
(SCL) cho phép chúng tao giao tiếp giửa Arduino với các linh kiện có chuẩn giao
tiếp là I2C
• Reset (6): dùng để reset Arduino.
Nhưng đối với những ai mới bắt đầu tìm hiểu về arduino thì rất khó khăn chưa
kể đến là chưa biết gì về lập trình C, tuy thông tin tài liệu về arduino trên internet
là rất nhiều nhưng thiếu gắn kết thì bộ Ebook này là một một giải pháp tuyệt vời nó
ra đời để giúp những ai đang cảm giác thấy khó khăn trong lập trình arduino, nếu
ai đang muốn học lập trình arduino nên một lần đọc qua.
Nếu có sách không thì cũng chưa đủ chúng ta cần phải có thực hành, ứng dụng
những cái mình học từ lý thuyết thì BỘ KIT TỰ HỌC ARDUINO ra đời và kết
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
25
hợp với EBOOKS này giúp bạn thấy việc học lập trình arduino không còn khó
như ta nghĩ.
a. Tất cả các linh kiện trong bộ tự học này shop đã tạo điều kiện tốt nhất
cho người thực hành ( ví dụ như led ma trận 8x8 đã được gắn vào board
đồng,…).
b. Trên board test mẫu ở hình trên 8 led đơn đã được kết nối với 8 điện trở
1k và đã đưa ra chân sẵn, cũng nhưbiến trở 10k đã đưa ra 3 chân.
c. Có 3 nút nhấn nhỏ đã được gắn trên một module đã đi mạch sẵn và đã
cho ra chân giúp việc kết nối dễ dàng.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
26
a. Điều khiển đèn led đơn ( nhấp nháy theo yêu cầu hay chạy theo hiệu
ứng).
b. Lập trình hiển thị số trên 1 led 7 đoạn.
c. Biết lập trình module 4 led 7 đoạn hiển thị thời gian, chữ cái, số,…
d. Biết lập trình led mat trận 8x8 hiển thị chữ cái, số, hiệu ứng,…
e. Biết cách lấy tín hiệu Analog (tín hiệu tương tự) và tín hiệu Digital (tín
hiệu số) từ cảm biến nhiệt độ, cảm biến ánh sáng,…
f. Biết cách nối dây và điều khiển role ( để đóng ngắt thiết bị điện).
g. Hiển thị được thông tin trên màn hình LCD.
h. Đọc giá trị nhiệt độ hiển thị lên LCD 16X02 thông qua cảm biến nhiệt độ
LM35.
i. Điều khiển đóng ngắt thiết bị điện dựa vào cài đặt giá trị nhiệt độ.
j. Lập trình điều khiển được động cơ chạy thuận nghịch và tăng giảm tốc
độ cho động cơ.
k. Lập trình điều khiển được động cơ sevor.
l. Sử dụng remote hồng ngoại điều khiển tắt mở thiết bị điện thông qua
role.
m. Biết đọc về giá trị cảm biến độ ẩm đất để thực hiện yêu cầu gì đó mà ta
cần phải làm.
n. Và có nhiều ứng dụng khác trong quá trình thực hành cùng Kit Tự Học
Arduino.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
27
Sự khác biệt giữa các KIT TỰ HỌC ARDUINO là số lượng bài học và số lượng
Module.
Giữa BỘ KIT loại V và M khác nhau ở chổ ( Bộ V sử dụng board Arduino Uno
R3 Còn Bộ M sử dụng boardArduino Mê ga 2560).
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
28
Bản JRE phổ biến nhất là bản dành cho Windows 32bit (x86) và Windows 64bit
(x64) mình đã đánh dấu trong hình. Nhớ chọn "Accept License Agreement".
Hoặc: https://www.arduino.cc/en/Main/Software
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
29
Bước 2: Sau khi download xong, các bạn bấm chuột phải vào file vừa
download arduino-1.8.5-windows.zip và chọn “Extract here” để giải nén.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
30
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
31
Cửa sổ “Device Driver Installation Wizard” hiện ra, các bạn chọn Next để tiếp
tục.
Khi có yêu cầu xác nhận cài đặt driver, chọn “Install”
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
32
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
33
Bước 3: Vào Tools các bạn chọn đúng nhé cái này rất quan trọng.
Kết quả ta có thể thấy Led chân số 13 (tích hợp trên board, led màu cam) của
Arduino Uno sáng 1 giây và tắt 1 giây.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
34
Board Arduino Nano là một trong những phiên bản nhỏ gọn của board Arduino.
Arduino Nano có đầy đủ các chức năng và chương trình có trên Arduino Uno
do cùng sử dụng MCU ATmega328P. Nhờ việc sử dụng IC dán của ATmega328P
thay vì IC chân cắm nên Arduino Nano có thêm 2 chân Analog so với Arduino
Uno.
Arduino Nano được kết nối với máy tính qua cổng Mini - B USB và sử dụng
chip CH340 để chuyển đổi USB sang UART thay vì dùng chip ATmega16U2 để
giả lập cổng COM như trên Arduino Uno hay Arduino Mega, nhờ vậy giá thành
sản phẩm được giảm mà vẫn giữ nguyên được tính năng, giúp Arduino giao tiếp
được với máy tính, từ đó thực hiện việc lập trình.
Trước hết chúng ta phải tải driver CH340 cho arduino nano TẠI ĐÂY:
Bước 1: Giải nén thư mục vừa tải về ⇒ mở thư mục CH341SER ⇒khởi
động file SETUP.EXE
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
35
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
36
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
37
Bước 3: Vào Tools các bạn chọn đúng nhé cái này rất quan trọng.
Kết quả ta có thể thấy Led chân số 13 (tích hợp trên board, led màu đỏ) của
Arduino Nano sáng 1 giây và tắt 1 giây.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
38
mền Fritzing, hiện tại phần mềm này miễn phí và rất trực quan rất có ích cho ai
học lập trình Arduino.
Các bạn click vào links sau nhé: http://fritzing.org/download/ tải phần mềm
miễn phí với giao diện như sau:
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
39
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
40
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
41
Miêu tả:
Viết một giá trị HIGH hoặc một LOW cho một chân số của arduino.
Nếu chân đã được cấu hình như một OUTPUT với pinMode(), điện áp của
nó sẽ được thiết lập với giá trị tương ứng: 5V (hoặc 3.3V trên 3.3V)
cho HIGH, 0V cho LOW.
Nếu chân được cấu hình như là một INPUT, digitalWrite()sẽ cho phép
( HIGH) hoặc vô hiệu hóa ( LOW) pullup nội bộ trên chân đầu vào. Nên thiết
lập pinMode() để INPUT_PULLUP cho phép các điện trở kéo lên bên trong.
Cú pháp:
digitalWrite(pin, value);
Thông số:
Trả về:
Không có.
Ví dụ:
Mã làm cho pin kỹ thuật số 13 OUTPUTvà chuyển đổi nó bằng cách luân
phiên giữa HIGHvà LOWở tốc độ một giây.
void setup()
{
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
42
void loop()
{
digitalWrite(led, HIGH); // bật led
delay(1000); // dừng chương trình 1 giây
digitalWrite(led, LOW); // tắt led
delay(1000); // dừng chương trình 1 giây
}
Ghi chú:
Các chân đầu vào tương tự có thể được sử dụng như chân kỹ thuật số, được
gọi là A0, A1, v.v ...
b. digitalRead():
Miêu tả:
Đọc giá trị từ một Chân số đã được chỉ định, hoặc là HIGH hoặc LOW.
Cú pháp
digitalRead(pin)
Thông số
Trả về
Ví dụ:
void setup ()
{
pinMode (led, OUTPUT); // chân số 12 là đầu ra.
pinMode (nutnhan, INPUT); // thiết lập chân số 7 như đầu vào.
}
void loop ()
{
val = digitalRead (nutnhan); // đọc các pin đầu vào
digitalWrite (led, val); // thiết lập giá trị của LED là giá trị của nút nhấn.
}
Ghi chú:
Nếu chân không được kết nối với bất cứ thứ gì, digitalRead () có thể trở lại
HIGH hoặc LOW (và điều này có thể thay đổi ngẫu nhiên).
Các chân đầu vào tương tự có thể được sử dụng như chân kỹ thuật số, được
gọi là A0, A1, v.v ...
c. pinMode():
Miêu tả:
Cấu hình 1 pin quy định hoạt động như là một đầu vào (INPUT) hoặc đầu ra
(OUTPUT).
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
44
Cú pháp:
pinMode(pin, mode)
Thông số:
Trả về:
Không có.
Ví dụ:
void setup()
{
pinMode (12, OUTPUT); // chân số 12 là đầu ra
}
void loop ()
{
digitalWrite (12, HIGH);
delay(1000);
digitalWrite (12, LOW);
delay(1000);
}
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
45
Ghi chú:
Các chân đầu vào tương tự có thể được sử dụng như chân số, được gọi là A0,
A1, v.v ...
Giới thiệu
Nhiệm vụ của analogRead() là đọc giá trị điện áp từ một chân Analog (ADC).
Board Arduino Uno có 6 pin từ A0 đến A5 (8 pin trên Mini và Nano, 16 pin
trên Mega), bộ chuyển đổi tương tự 10-bit sang số.
Điều này có nghĩa là nó sẽ lập bản đồ điện áp đầu vào từ 0 đến 5 volts thành
các số nguyên từ 0 đến 1023. Điều này tạo ra độ phân giải giữa các lần đọc: 5
volts / 1024 đơn vị hoặc, 0,0049 volt (4,9 mV) trên một đơn vị. Dải đầu vào
và độ phân giải có thể được thay đổi bằng cách sử dụng
Khi người ta nói "đọc tín hiệu analog", bạn có thể hiểu đó chính là việc đọc giá trị
điện áp.
Cú pháp
analogRead (pin) ;
Thông số
pin: Số chân đầu vào tương tự để đọc từ (0 đến 5 trên hầu hết các bo Arduino,
0 đến 7 trên Mini và Nano, 0 đến 15 trên Mega)
Trả về
Ví dụ
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
46
void setup()
{
Serial.begin(9600); // giao tiếp serial
}
void loop()
{
val = analogRead(analogPin); // đọc giá trị analog ở chân A4
Serial.println(val); // hiển thị ra cửa sổ serial
}
Ghi chú:
Nếu pin đầu vào tương tự không kết nối với bất cứ thứ gì, giá trị trả về bởi
analogRead () sẽ dao động dựa trên một số yếu tố (ví dụ: giá trị của các đầu
vào analog khác...).
b. analogReference ()
Miêu tả:
Cấu hình điện áp tham chiếu được sử dụng cho đầu vào analog (tức là giá trị
được sử dụng làm đầu vào). Các lựa chọn là:
AR_DEFAULT: tham chiếu analog mặc định là 3.3V. Đây là tùy chọn duy
nhất được hỗ trợ cho Due.
Cú pháp
analogReference(type);
Thông số
type: một trong các kiểu giá trị sau: DEFAULT, INTERNAL, INTERNAL1V1,
INTERNAL2V56, hoặc EXTERNAL (xem danh sách các tùy chọn như trong
mô tả).
Trả về
Không có
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
48
Ghi chú
Nếu bạn sử dụng kiểu EXTERNAL cho hàm analogReference thì bạn 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 phải gọi dòng
lệnh analogReference(EXTERNAL) trước khi sử dụng analogRead().
c. analogWrite()
Miêu tả
analogWrite() là lệnh xuất ra từ một chân trên mạch Arduino một mức tín hiệu
analog (phát xung PWM). Người ta thường điều khiển mức sáng tối của đèn LED
hay điều chỉnh tốc độ động cơ.
Tần số của tín hiệu PWM trên hầu hết các chân khoảng 490 Hz. Trên
board Uno và các board tương tự, chân 5 và 6 có tần số khoảng 980 Hz.
Bạn không cần gọi hàm pinMode() để đặt chế độ OUTPUT cho chân sẽ
dùng để phát xung PWM trên mạch Arduino.
Cú pháp:
Giá trị mức xung PWM nằm trong khoảng từ 0 đến 255, tương ứng với mức duty
cycle từ 0% đến 100%
Trả về
Không có.
Ví dụ:
Đoạn code dưới có chức năng làm sáng dần một đèn LED được kết nối vào chân số
2 trên mạch Arduino.
int led = 2;
void setup() {
}
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
49
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 được kết nối vào chân số
11 trên mạch Arduino.
Hay ví dụ đặt đầu ra cho LED tỷ lệ với giá trị được đọc từ Cảm biến độ
ẩm đất:
int ledPin = 9;
int analogPin = 4; // chân A0 của cảm biến độ ẩm đất được nối với chân A4 của
arduino
int val = 0;
void setup()
{
pinMode(ledPin, OUTPUT);
}
void loop()
{
val = analogRead(analogPin);
analogWrite(ledPin, val / 4); // giá trị analogRead khoảng 0 to 1023,
analogWrite giá trị khoảng 0 to 255
}
d. analogReadResolution ():
Miêu tả
analogReadResolution () là một phần mở rộng của Analog cho Arduino Due, Zero
và MKR Family.
Board Due, Zero và MKR Family có các tính năng ADC 12-bit. Điều này sẽ trả
lại các giá trị từ analogRead() 0 đến 4095.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
50
Cú pháp
analogReadResolution(bits)
Thông số
bits: xác định độ phân giải (tính theo bit) của giá trị trả về bởi
hàm analogRead(). Bạn có thể đặt giá trị này từ 1 đến 32. Bạn có thể đặt độ
phân giải cao hơn 12 nhưng giá trị trả về analogRead()sẽ bị xấp xỉ.
Trả về
Không có
Mã ví dụ
Ví dụ cho thấy cách sử dụng ADC với nhiều độ phân giải khác nhau.
void setup() {
Serial.begin(9600);
}
void loop() {
analogReadResolution(10);
Serial.print("ADC 10-bit (default) : ");
Serial.print(analogRead(A0));
analogReadResolution(12);
Serial.print(", 12-bit : ");
Serial.print(analogRead(A0));
analogReadResolution(16);
Serial.print(", 16-bit : ");
Serial.print(analogRead(A0));
/
analogReadResolution(8);
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
51
Nếu bạn đặt giá trị analogReadResolution() cho một giá trị cao hơn khả năng
của board, Arduino sẽ chỉ báo cáo lại ở độ phân giải cao nhất của nó, đệm
thêm các bit với số không.
e. analogWriteResolution ()
Miêu tả
analogWriteResolution() là một phần mở rộng của Analog cho Arduino Due.
12 chân mà mặc định là 8-bit PWM, giống như board AVR. Có thể thay đổi độ
phân giải 12-bit.
2 chân với 12-bit DAC (Bộ chuyển đổi Số-sang-tương tự)
Bằng cách thiết lập độ phân giải ghi là 12, bạn có thể sử dụng analogWrite()với
các giá trị từ 0 đến 4095 để khai thác độ phân giải DAC đầy đủ hoặc để thiết lập
tín hiệu PWM mà không cần lăn lên.
10 chân mà mặc định là 8-bit PWM, giống như bảng AVR. Có thể thay đổi độ
phân giải 12-bit.
Các board MKR có các khả năng phần cứng sau đây:
4 chân mà mặc định là 8-bit PWM, giống như board AVR. Có thể thay đổi từ
8 (mặc định) sang độ phân giải 12-bit.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
52
Cú pháp
analogWriteResolution(bits)
Thông số
bits: xác định độ phân giải (theo bit) của các giá trị được sử dụng trong hàm
analogWrite(). Giá trị có thể dao động từ 1 đến 32. Nếu bạn chọn độ phân giải cao hơn
hoặc thấp hơn khả năng phần cứng của bảng, giá trị được sử dụng analogWrite()sẽ bị cắt
ngắn nếu nó quá cao hoặc có đệm bằng 0 nếu nó quá thấp.
Trả về
Không có
Ví dụ:
void setup(){
Serial.begin(9600);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
}
void loop(){
analogWriteResolution(8);
analogWrite(11, map(sensorVal, 0, 1023, 0 ,255));
Serial.print(" , 8-bit PWM value : ");
Serial.print(map(sensorVal, 0, 1023, 0 ,255));
// on the Due
analogWriteResolution(12);
analogWrite(12, map(sensorVal, 0, 1023, 0, 4095));
Serial.print(" , 12-bit PWM value : ");
Serial.print(map(sensorVal, 0, 1023, 0, 4095));
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
53
analogWriteResolution(4);
analogWrite(13, map(sensorVal, 0, 1023, 0, 15));
Serial.print(", 4-bit PWM value : ");
Serial.println(map(sensorVal, 0, 1023, 0, 15));
delay(5);
}
a. noTone();
Miêu tả
Ngừng tạo ra một sóng vuông kích hoạt bởi tone(). Không có hiệu lực nếu
không có tone được tạo ra.
Cú pháp
noTone(pin)
Thông số
Trả về
Không có
b. pulseIn ()
Miêu tả:
Đọc thời gian của một xung (HIGH hoặc LOW) trên pin. Ví dụ: nếu giá
trị là CAO , pulseIn()đợi cho pin đi CAO , bắt đầu tính thời gian, sau đó đợi
cho pin để LOW và dừng thời gian. Trả về thời gian của xung trong các mili
giây. Cung cấp và trả về 0 nếu không có xung bắt đầu trong một khoảng thời
gian xác định.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
54
Cú pháp
pulseIn(pin, value)
Thông số
timeout(tùy chọn): số microsecond chờ xung bắt đầu; mặc định là một giây
(unsigned long)
Trả về
Thời gian của một xung (trong micro giây) hoặc 0 nếu không có xung bắt đầu
trước khoảng thời gian chờ (unsigned long)
Ví dụ:
int pin = 9;
unsigned long duration;
void setup()
{
pinMode(pin, INPUT);
}
void loop()
{
duration = pulseIn(pin, HIGH);
}
c. shiftIn();
Cú pháp
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
55
Thông số
bitOrder: để thay đổi các bit; hoặc MSBFIRST hoặc LSBFIRST . (Bit quan
trọng nhất đầu tiên, hoặc, Bit quan trọng nhất trước tiên)
Trả về
d. shiftOut();
Miêu tả:
shiftOut() có nhiệm vụ chuyển 1 byte (gồm 8 bit) ra ngoài từng bit một. Bit được
chuyển đi có thể được bắt đầu từ bit nằm bên trái nhất (leftmost) hoặc từ bit nằm
bên phải nhất (rightmost). Các bit này được xuất ra tại chân dataPin sau khi
chân clockPin được pulsed (có mức đ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ết bị mà chân clock của nó có giá trị
được thay đổi từ mức điện thế LOW lên HIGH (rising edge) khi shiftOut, thì bạn
cần chắc chắn rằng chân clockPin cần được chạy lệnh
này: digitalWrite(clockPin,LOW);
Cú pháp
shiftOut(dataPin, clockPin, bitOrder, value)
Thông số:
clockPin: pin dùng để xác nhận việc gửi từng bit của dataPin (int)
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
56
Chú ý
shiftOut() chỉ xuất được dữ liệu kiểu byte. Nếu bạn muốn 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ụ
Đầu tiên, chúng ta cần bật IC 595 lên. Bạn hãy nối mạch như sau:
/*
shiftOut với 8 LED bằng 1 IC HC595
*/
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
57
//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);
}
void loop() {
//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 ở bit 0
/**
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);
digitalWrite(latchPin, HIGH);//các đèn LED sẽ sáng với trạng thái vừa được cập nhập
/**
Kết thúc bắt buộc phải có
**/
delay(500); // Dừng chương trình khoảng 500 mili giây để thấy các hiệu ứng của đèn
LED
}
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
58
//Tắt tuần tự
for (int i = 0;i<8;i++) {
ledStatus <<= 1; //Đẩy tất cả các bit qua bên trái 1 bit
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, ledStatus);
digitalWrite(latchPin, HIGH);
delay(500);
}
}
e. tone();
Giới thiệu
Hàm này sẽ tạo ra một sóng vuông ở tần số được định trước (chỉ nửa chu kỳ) tại
một pin digital bất kỳ (analog vẫn được). Thời hạn của quá trình tạo ra sóng âm có
thể được định trước hoặc nó sẽ phát ra âm thanh liên tục cho đến khi Arduino IDE
chạy hàm (noTone). Chân digital đó cần được kết nối tới một buzzer hoặc một
loa để có thể phát được âm thanh.
Lưu ý rằng, chỉ có thể sử dụng duy nhất mộ hàm tone() trong cùng một thời điểm.
Nếu hàm tone() đang chạy trên một pin nào đó, bây giờ bạn lại tone() thêm một lần
nữa thì hàm tone() sau sẽ không có hiệu lực. Nếu bạn tone() lên pin đang
được tone() thì hàm tone() sau sẽ thay đổi tần số sóng của pin đó.
Trên mạch Arduino Mega, sử dụng hàm tone() thì sẽ can thiệp đến đầu ra PWM tại
các chân digital 3 và digital 11.
Chú ý: Nếu bạn muốn chơi nhiều cao độ khác nhau trên nhiều pin. Thì trước khi
chơi trên một pin khác thì bạn phải noTone() trên pin đang được sử dụng.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
59
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)
duration: thời gian phát nhạc, đơn vị là mili giây (tùy chọn)
Trả về
Không có
Sự miêu tả
Tạm dừng chương trình cho khoảng thời gian (tính bằng mili giây) được chỉ
định là tham số. (Có 1000 mili giây = 1 giây.)
Cú pháp
delay(ms)
Thông số
Trả về
Không có
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
60
Ví dụ
int ledPin = 13; // LED pin 13
void setup()
{
pinMode(ledPin, OUTPUT);
}
void loop()
{
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}
b. delayMicroseconds ()
Miêu tả
Tạm dừng chương trình cho khoảng thời gian (tính bằng mili giây) được chỉ
định là tham số. Và cứ mỗi 1000000 micro giây = 1 giây
Cú pháp
delayMicroseconds(us)
Thông số
Trả về
Không có
Ví dụ
int outPin = 7; // chan so 7
void setup()
{
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
61
pinMode(outPin, OUTPUT);
}
void loop()
{
digitalWrite(outPin, HIGH);
delayMicroseconds(50);
digitalWrite(outPin, LOW);
delayMicroseconds(50);
}
Ghi chú:
Chức năng này hoạt động rất chính xác trong phạm vi 3 micro giây. Và không thể
đảm bảo rằng delayMicroseconds sẽ thực hiện chính xác cho thời gian trễ nhỏ hơn.
c. micros()
Miêu tả:
micros() có nhiệm vụ trả về một số - là thời gian (tính theo micro giây) kể từ lúc mạch
Arduino bắt đầu chương trình của bạn. Nó sẽ tràn số và quay số 0 (sau đó tiếp tục tăng)
sau 70 phút. Tuy nhiên, trên mạch Arduino 16MHz (ví dụ Duemilanove và Nano) thì giá
trị của hàm này tương đương 4 đơn vị micro giây.
Tham số
Không có
Trả về
Một số nguyên kiểu unsigned long là thời gian kể từ lúc thương trình Arduino
được khởi động
Ví dụ
unsigned long time;
void setup(){
Serial.begin(9600);
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
62
}
void loop(){
Serial.print("Time: ");
time = micros();
// in ra thời gian kể từ lúc chương trình được bắt đầu
Serial.println(time);
// đợi 1 giây trước khi tiếp tục in
delay(1000);
}
d. millis();
Giới thiệu
millis() có nhiệm vụ trả về một số - là thời gian (tính theo mili giây) kể từ lúc mạch
Arduino bắt đầu chươ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.
Thông số
Không có
Trả về
Một số nguyên kiểu unsigned long là thời gian kể từ lúc thương trình Arduino
được khởi động
Ví dụ
unsigned long time;
void setup(){
Serial.begin(9600);
}
void loop(){
Serial.print("Time: ");
time = millis();
// in ra thời gian kể từ lúc chương trình được bắt đầu
Serial.println(time);
// đợi 1 giây trước khi tiếp tục in
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
63
delay(1000);
}
Lưu ý :
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.
void loop()
{
// Lưu ý các dấu ngoặc khi ép kiểu
// đoạn chương trình này có nghĩa là sau mỗi 1000 mili giây
// đèn Led ở chân số 10 sẽ thay đổi trạng thái
if ( (unsigned long) (millis() - time) > 1000)
{
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
64
a. abs()
Mô tả
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ề
Chú ý cú pháp
abs(a--); // nếu bạn nhập như thế này thì sẽ bị lỗi đấy
a--;
abs(a); // nhưng nếu nhập như thế này thì ổn! Và hãy ghi nhớ là không được để
bất cứ phép tính nào bên trong hàm này, bạn nhé
b. constrain()
Giới thiệu
Bắt buộc giá trị nằm trong một khoảng cho trước.
Cú pháp
constrain(x, a, b)
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
65
Tham số
Trả về
a: nếu x < a
b: nếu x > b
Ví dụ
int sensVal = analogRead(A2);
sensVal = constrain(sensVal, 10, 150); //Giới hạn giá trị sensVal trong khoảng [10,150]
c. map()
Mô tả
map() là hàm dùng để chuyển một giá trị từ thang đo này sang một giá trị ở thang
đo khác. Gía trị trả về của hàm map() luôn là một số nguyên.
Cú pháp
map(val,A1,A2,B1,B2);
Trong đó:
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
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
66
d. max()
Miêu tả
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);
Thông số
Trả về
Hàm max được dùng để lấy chặn dưới (không để giá trị tụt xuống quá một mức
quy định nào đó).
e. min()
Mô tả
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ố
Trả về
Hàm min được dùng để lấy chặn trên (không để giá trị vượt quá một mức quy định nào
đó).
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
67
f. sq()
Giới thiệu
Hàm sq() được dùng để tính bình phường của một số bất kì, số này có thể thuộc bất
kì kiểu dữ liệu biển diễn số nào. sq() trả về giá trị mà nó tính được với kiểu dữ liệu
giống như kiểu dữ liệu của tham số ta đưa vào.
Cú pháp
sq([số cần tính bình phương]);
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
g. sqrt()
Giới thiệu
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
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
68
//v3 = 2.55
//v4 = 0
//v5 = NaN (tham khảo hàm isnan())
Chú ý
Tham số đưa vào hàm sqrt() có thể là bất kì kiểu dữ liệu biểu diễn số nào. Kết quả
trả về của sqrt() được định nghĩa là kiểu số thực double hoặc NaN nếu tham số đưa
vào là số thực bé hơn 0.
a. cos()
Miêu tả
Hàm này có nhiệm vụ tính cos một một góc (đơn vị radian). Giá trị chạy trong
đoạn [-1,1].
Cú pháp
cos(rad)
Thông số
Trả về
b. sin()
Giới thiệu
Hàm này có nhiệm vụ tính sin một một góc (đơn vị radian). Giá trị chạy trong
đoạn [-1,1].
Cú pháp
sin(rad)
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
69
Tham số
Trả về
c. tan()
Giới thiệu
Hàm này có nhiệm vụ tính tan một một góc (đơn vị radian). Giá trị chạy trong
khoảng từ âm vô cùng đến dương vô cùng.
Cú pháp
tan(rad)
Tham số
Trả về
a. random()
Mô tả
Trả về một giá trị nguyên ngẫu nhiên trong khoảng giá trị cho trước.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
70
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ề
Giá trị nguyên ngẫu nhiên nằm trong khoảng từ min đến max. Nếu giá
trị min không được đưa vào thì nó được hiểu ngầm là 0.
Ví dụ
int a = random(100); //giá trị a nằm trong khoảng từ 0 đến 99
int b = random(0,11); //giá trị b nằm trong khoảng từ 0 đến 10
b. randomSeed()
Mô tả
Hàm random() luôn trả về một số ngẫu nhiên trong phạm vi cho trước. Giả sử mình
gọi hàm này 10 lần, nó sẽ trả về 10 giá trị số nguyên ngẫu nhiên. Nếu gọi
nó n lần, random()sẽ trả về n số. Tuy nhiên những giá trị mà nó trả về luôn được
biết trước (cố định).
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 được "ngẫu nhiên"
cho lắm.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
71
void setup(){
Serial.begin(9600);
randomSeed(10);
}
void loop(){
Serial.println(random(100));
delay(200);
}
Nhận thấy rằng: chuỗi giá trị mà hàm random() trả về đã có sự thay đổi. Tuy nhiên
chuỗi này vẫn là chuỗi cố định. Thử thay đổi tham số của
lệnh randomSeed() từ 10 sang một số khác, bạn sẽ thấy chuỗi số trả về cũng thay
đổi theo nhưng giá trị xuất ra thì vẫn cố định, dù cho bạn có bấm nút reset trên
Arduino thì chuỗi số được in ra những lẫn sau đều y hệt như lần đầu tiên chúng
được in ra. Để ý rằng tham số 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 random(), hàm randomSeed() quyết định
trật tự các giá trị mà random() trả về. Trật tự này phụ thuộc vào tham số mà ta
truyền vào randomSeed().
Cú pháp
randomSeed(number);
Lưu ý: nếu bạn gọi hàm random() mà không chạy lệnh randomSeed() trước đó,
chương trình sẽ mặc định chạy sẵn lệnh randomSeed(0) (tham số là 0).
Ví dụ
Nếu chạy randomSeed(0), hàm random(100) sẽ trả về 10 giá trị đầu tiên là:
7, 49, 73, 58, 30, 72, 44, 78, 23, 9, ...
Nếu chạy randomSeed(10), hàm random(100) sẽ trả về 10 giá trị đầu tiên là: 70 ,
43, 1, 92, 65, 26, 40, 98, 48, 67, ...
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
72
Nếu chạy randomSeed(-46), hàm random(100) sẽ trả về 10 giá trị đầu tiên là: 15,
50, 82, 36, 36, 37, 25, 59, 93, 74, ...
Nếu chạy randomSeed(159), hàm random(100) sẽ trả về 10 giá trị đầu tiên là: 13,
51, 67, 38, 22, 50, 67, 73, 81, 75, ...
Nếu chạy randomSeed(159), hàm random(99) sẽ trả về 10 giá trị đầu tiên là: 67,
42, 70, 34, 53, 6, 42, 38, 29, 64, ...
8. Bits và Bytes:
a. Bit()
Giới thiệu
Cú pháp
bit(n)
Thông số
n: số nguyên
Trả về
số nguyên
Ví dụ
bit(0); // 2^0 = 1
bit(1); // 2^1 = 2
bit(2); // 2^2 = 4
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
73
b. bitClear()
Giới thiệu
bitClear() sẽ thay giá trị tại một bit xác định của một số nguyên thành 0.
Cú pháp
bitClear(x, n)
Tham số
n: vị trí bit cần ghi. Các bit sẽ được tính từ phải qua trái, và số thứ tự đầu tiên là số
0.
Trả về
Không có
Ví dụ
bitClear(B11110010,1); // B11110000
c. bitRead()
Giới thiệu
bitRead() sẽ trả về giá trị tại một bit nào đó được xác định bởi người lập trình của
một số nguyên.
Cú pháp
bitRead(x, n)
Tham số
n: bit cần đọc. Các bit sẽ được tính từ phải qua trái, và số thứ tự đầu tiên là số 0
Trả về
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
74
Ví dụ
bitRead(B11110010,0); // trả về 0
bitRead(B11110010,1); // trả về 1
bitRead(B11110010,2); // trả về 0
d. bitWrite()
Giới thiệu
bitWrite() sẽ ghi đè bit tại một vị trí xác định của số nguyên.
Cú pháp
bitWrite(x, n, b)
Tham số
n: vị trí bit cần ghi. Các bit sẽ được tính từ phải qua trái, và số thứ tự đầu tiên là số
0.
b: 1 hoặc 0
Trả về
Không có
Ví dụ
bitWrite(B11110010,0,1); // B11110011
bitWrite(B11110010,1,0); // B11110000
bitWrite(B11110010,2,1); // B11110110
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
75
bitSet() sẽ thay giá trị tại một bit xác định của một số nguyên thành 1.
Cú pháp
bitSet(x, n)
Tham số
n: vị trí bit cần ghi. Các bit sẽ được tính từ phải qua trái, và số thứ tự đầu tiên là số
0.
Trả về
Không có
Ví dụ
bitSet(B11110010,0); // B11110011
bitSet(B11110010,2); // B11110110
f. lowByte()
Giới thiệu
lowByte() là hàm trả về byte cuối cùng (8 bit cuối cùng) của một chuỗi các bit. Một
số nguyên bất kì cũng được xem như là một chuỗi các bit, vì bất kì số nguyên nào
cũng có thể biểu diễn ở hệ nhị phân dưới dạng các bit "0" và "1".
Lưu ý:
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
76
lowByte() không nhận giá trị thuộc kiểu dữ liệu số thực. Bạn sẽ gặp lỗi biên dịch
nếu cố làm điều này.
Cú pháp
lowByte([giá trị cần lấy ra 8 bit cuối]);
Trả về
byte
Ví dụ
int A = lowByte(0B11110011001100); //A = 0B11001100 = 204;
int B = lowByte(511); //B = lowByte(0B111111111) = 255;
int C = lowByte(5); //C = lowByte(0B00000101) = 0B101 = 5;
g. highByte()
Giới thiệu
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, highByte() sẽ trả về giá
trị 0. Một số nguyên bất kì cũng được xem như là một chuỗi các bit, vì bất kì số
nguyên nào cũng có thể biểu diễn ở hệ nhị phân dưới dạng các bit "0" và "1".
Lưu ý:
highByte() không nhận giá trị thuộc kiểu dữ liệu số thực. Bạn sẽ gặp lỗi biên dịch
nếu cố làm điều này.
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
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
77
Giới thiệu
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ắt các ngắt bằng hàm noInterrupts(), bạn sử dụng hàm
này để bật lại các ngắt.
Cú pháp
interrupts();
Thông số
Không có
Trả về
Không có
Ví dụ
void setup() {}
void loop()
{
noInterrupts();
// tắt các ngắt để chạy
// đoạn chương trình yêu cầu cao về thời gian
interrupts();
// bật lại các ngắt, các ngắt hoạt động
// bình thường trở lại
}
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
78
b. noInterrupts()
Giới thiệu
Khi cần chạy các đoạn chương trình yêu cầu chính xác về thời gian, bạn cần tắt các
ngắt để Arduino chỉ tập trung vào xử lý các tác vụ cần thiế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 thực thi sau khi gọi hàm noInterrupts().
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ương trình yêu cầu cao về thời gian
interrupts();
// bật lại các ngắt, các ngắt hoạt động
// bình thường trở lại
}
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
79
Giới thiệu
Ngắt (interrupt) là những lời gọi hàm tự động khi hệ thống sinh ra một sự kiện.
Những sự kiện này được nhà sản xuất vi điều khiển thiết lập bằng phần cứng và
được cấu hình trong phần mềm bằng những tên gọi cố định.
Vì ngắt hoạt động độc lập và tự sinh ra khi được cấu hình nên chương trình chính
sẽ đơn giản hơn. Một ví dụ điển hình về ngắt là hàm millis(). Hàm này tự động
chạy cùng với chương trình và trả về 1 con số tăng dần theo thời gian mặc dù
chúng ta không cài đặt nó. Việc cài đặt hàm millis() sử dụng đến ngắt và được cấu
hình tự động bên trong mã chương trình Arduino.
Ngắt giúp chương trình gọn nhẹ và xử lý nhanh hơn. Chẳng hạn, khi kiểm tra 1 nút
nhấn có được nhấn hay không, thông thường bạn cần kiểm tra trạng thái nút nhấn
bằng hàm digitalRead() trong đoạn chương trình loop(). Với việc sử dụng ngắt, bạn
chỉ cần nối nút nhấn đế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ương trình ngắt sẽ cho ta biết trạng thái nút nhấn.
Số lượng các ngắt phụ thuộc vào từng dòng vi điều khiển. Với Arduino Uno bạn
chỉ có 2 ngắt, Mega 2560 có 6 ngắt và Leonardo có 5 ngắt.
Cú pháp
attachInterrupt(interrupt, ISR, mode);
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
80
Thông số
interrupt: Số thứ tự của ngắt. Trên Arduino Uno, bạn có 2 ngắt với số 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 được rồi.
ISR: tên hàm sẽ gọi khi có sự kiện ngắt được sinh ra.
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ừ mức đ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ừ mức điện áp
cao sang mức điện áp thấp.
Lưu ý: với mode LOW và HIGH, chương trình ngắt sẽ được gọi liên tục khi chân
digital còn giữ mức điện áp tương ứng.
Trả về
không
Ví dụ
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
81
void tatled()
{
// tắt đèn led khi nhấn nút, nhả ra led nhấp nháy trở lại
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ương trình này nhấp nháy led sau 500ms
digitalWrite(ledPin, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
delay(500);
}
b. detachInterrupt()
Giới thiệu
Hàm detachInterrupt() sẽ tắt các ngắt đã được kích hoạt tương ứng với thông số
truyển vào. Giả sử sau khi nhấn nút bấm lần đầu tiên đèn led sẽ tắt nhưng nhấn lần
thứ 2 đèn sẽ không tắt nữa. Lúc này cần dùng đến detachInterrupt() để tắt ngắt
chúng ta đã tạo ra.
Cú pháp
detachInterrupt(interrupt);
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
82
Thông số
Trả về
không
Ví dụ
Đoạn chương trình dưới đây sẽ bật sáng đèn led và chỉ tắt nó khi nhấn lần đầu tiên, thả ra
đèn sẽ sáng lại. Nếu tiếp tục nhấn nữa thì đèn vẫn sáng mà không bị tắt đi.
int ledPin = 12; // đèn LED được kết nối với chân digital 12
boolean daNhan = false; // lưu giữ giá trị cho biết đã nhấn nút hay chưa
void tatled()
{
digitalWrite(ledPin, LOW); // tắt đèn led khi còn nhấn nút
daNhan = true; // lúc này đã nhấn nút
}
void setup()
{
pinMode(ledPin, OUTPUT); // thiết đặt chân ledPin là OUTPUT
pinMode(2, INPUT_PULLUP); // sử dụng điện trở kéo lên cho chân số 2, ngắt 0
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
83
void loop()
{
digitalWrite(ledPin, HIGH); // bật đèn led
if (daNhan == true)
{
// Nếu đã nhấn nút thì tắt ngắt đi
detachInterrupt(0);
}
}
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). Tất cả các
mạch Arduino đều có ít nhất 1 cổng Serial (hay còn được gọi là UART hoặc
USART). Giao tiếp Serial được thực hiện qua 2 cổng digital 0 (RX) và 1 (TX)
hoặc qua cổng USB tới máy tính. Vì 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!
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
84
Bạn có thể sử dụng bảng Serial monitor có sẵn trong Arduino IDE để giao
tiếp với Arduino qua giao thức Serial. Kích vào biểu tượng Serial Monitor (
) hoặc nhấn tổ hợp phím Ctrl+Shift+M để mở bảng Serial Monitor, sau
đó bạn kích chuột vào bảng chọn như hình dưới để chọn baudrate giống
với baudrate được dùng trong quá trình lập trình của bạn. Mặc định là
9600.
12. Xử lý chuỗi:
a. Hàm isAlpha()
Hàm này kiểm tra xem ký tự đã truyền có phải là chữ cái không.
Cú pháp:
bool isAlpha(int c)
Thông số
Trả về
Ví dụ
1. int t = 'b'; // kí tự
2. bool c1;
3. int c2;
4. void setup()
5. {
6. Serial.begin(9600);
7. c1 = isAlpha(t);
8. //hoặc c2=isalpha(t);
9. Serial.println(c1);
10. // Serial.println(c2);
11.}
12.void loop() { ; }
b. Hàm isAscii()
Cú pháp:
bool isAscii(int c)
Kiểu tham trị c: int
Kiểu trả về:
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
86
c. Hàm isWhitespace()
Cú pháp
bool isWhitespace(int c)
int
Ví dụ
int t = ' '; // kí tự “trắng”
bool c1;
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
87
void setup(){
Serial.begin(9600);
c1 = isWhitespace(t);
Serial.println(c1);
void loop() { ; }
d. Hàm isPrintable():
Hàm này kiểm tra xem ký tự đã truyền có thể in được không
Cú pháp
bool isPrintable(int c)
Ví dụ
int t = 'a'; // a là kí tự có thể in (xem lại bảng)
bool c1;
int c2;
void setup(){
Serial.begin(9600);
c1 = isPrintable(t);
//c2=isprint(t);
Serial.println(c1);
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
88
//Serial.println(c2);
void loop() { ; }
e. Hàm isUpperCase():
Hàm này kiểm tra xem ký tự đã truyền có phải là một chữ hoa không
Cấu trúc
bool isUpperCase(int c )
Ví dụ
int t = 'A'; // A là một kí tự viết hoa (xem lại bảng)
bool c1;
int c2;
void setup()
{
Serial.begin(9600);
c1 = isUpperCase(t);
//c2=isupper(t);
Serial.println(c1);
//Serial.println(c2);
}
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
89
void loop() { ; }
f. Hàm isHexadecimalDigit()
Hàm này kiểm tra xem ký tự đã truyền có phải là ký tự thập lục phân không
Cấu trúc
bool isHexadecimalDigit(int c)
Ví dụ
int t = 'A'; // A là một kí tự (có giá trị ) thuộc dãy thập lục phân (số Hex)(xem
lại bảng)
bool c1;
int c2;
void setup() {
Serial.begin(9600);
c1 = isHexadecimalDigit(t);
// c2=isxdigit(t);
Serial.println(c1);
// Serial.println(c2);
void loop() { ; }
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
90
g. tolower:
Hàm này chuyển đổi các chữ cái hoa thành chữ thường
Cú pháp
int tolower(int c)
Ví dụ
int t1 = 'A'; // Đổi chữ A thành a. (xem lại bảng)
int t2;
void setup() {
t2 = tolower(t1);
void loop() { ; }
h. Hàm toupper()
Hàm này chuyển đổi các chữ cái thường thành chữ hoa.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
91
Cú pháp
int toupper(int c)
Ví dụ
int t2;
void setup() {
t2 = toupper(t1);
void loop() { ; }
i. Hàm isLowerCase()
Hàm này kiểm tra xem ký tự đã truyền có phải là một chữ thường không
Cấu trúc
bool isLowerCase(int c)
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
92
Ví dụ
int t = 'a'; // a là chữ thường (không viết in hoa) (xem lại bảng)
bool c1;
int c2;
void setup()
Serial.begin(9600);
c1 = isLowerCase(t);
//c2=islower(t);
Serial.println(c1);
//Serial.println(c2);
void loop() { ; }
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
93
1. Hằng số
a. Hằng số thực:
Giới thiệu
Hằng số thực (floating point constants) cũng có cách làm việc và sử dụng tương tự.
Khi bạn viết một biểu thức tính toán, giá trị của biểu thức này sẽ được tính ra và
trình biên dịch sẽ thay thế biểu thức này bằng một hằng số thực đã tính ra được.
Điều đó gợi ý rằng trong những chương trình lớn, để giảm thời gian biên dịch, bạn
nên tính trước giá trị của những biểu thức thay vì bắt trình biên dịch tính toán.
Ví dụ
float a = .159;
float b = 0.159; // a = b
Để biểu thị những hằng số thực có giá trị cực lớn hoặc cực nhỏ, bạn phải sử dụng 2
kí hiệu khoa học là "E" và "e".
10.0 10
b. Hằng số nguyên
Giới thiệu
Hằng số nguyên là những con số được sử dụng trực tiếp trong chương trình. Theo
mặc định, những con số này có kiểu là int (trong pascal thì kiểu int giống như kiểu
integer).
Ví dụ
if (a >= 10) {
a = 0;
}
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
94
Thông thường, các hằng số nguyên được biểu thị dưới dạng thập phân, nhưng bạn
có thể biểu thị chúng trong các hệ cơ số khác như sau:
8 (bát phân) 0173 bắt đầu bằng '0' biểu thị bằng các chữ số từ 0-7
Hệ thập phân (decimal) là hệ cơ số 10, cũng là hệ cơ số được dùng phổ biến nhất.
Ví dụ:
int a = 101; // có giá trị là 101 ở hệ thập phân ((1 * 10^2) + (0 * 10^1) + 1)
Hệ nhị phân (binary) là hệ cơ số 2, chỉ được biểu thị bởi 2 chữ số "0" và "1", có
tiền tố "B" (đôi khi là "0B") đứng đầu
Ví dụ:
Các định dạng nhị phân chỉ hoạt động trên byte (8 bit) giữa 0 (B0) và 255
(B11111111). Nếu muốn sử dụng hệ nhị phân trên một số nguyên int (16 bít) thì
bạn phải thực hiện quy trình 2 bước như sau:
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
95
Hệ bát phân (octal) là hệ cơ số 8, chỉ dùng các chữ số từ 0-7 để biểu thị, có tiền tố
"0" đứng đầu
int a = 0101; // có giá trị là 65 ở hệ thập phân ((1 * 8^2) + (0 * 8^1) + 1)
Chú ý:
Rất khó để tìm lỗi một cách dễ dàng nếu bạn không cẩn thận hoặc không thành
thạo trong việc sử dụng hệ bát phân.
Lý do là giả sử bạn muốn khai báo một hằng số nguyên ở hệ thập phân ví dụ 161,
nhưng do chưa đọc bài này nên bạn "chơi trội" đặt thêm số 0 phía trước. =>
chương trình dịch hiểu sai hệ số bạn đang sử dụng => sinh ra lỗi logic khiến
chương trình chạy sai.
Hệ thập lục phân (hexadecimal) là hệ cơ số 16, chỉ dùng các chữ số từ 0-9 và
A-F (hoặc a-f) để biểu thị; A đại diện cho 10, B là 11, lên đến F là 15. Các chữ số
dùng ở hệ này có tiền tố "0x" đứng trước
Ví dụ:
int a = 0x101; // có giá trị là 257 trong hệ thập phân ((1 * 16^2) + (0 * 16^1) +
1)
Hậu tố U và L
Theo mặc định, một hằng số nguyên được coi là một số nguyên kiểu int với những
hạn chế trong giao tiếp giữa các giá trị. Để xác định một hằng số nguyên với một
kiểu dữ liệu khác, bạn phải tuân theo quy tắc sau:
Dùng 'u' hoặc 'U' để biểu thị kiểu dữ liệu unsigned (không âm). Ví dụ: 33u
Dùng 'l' hoặc 'L' để biểu thị kiểu dữ liệu long. Ví dụ: 100000L
Dùng 'ul' hoặc 'UL' để biểu thị kiểu dữ liệu unsigned long. Ví dụ: 32767ul
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
96
c. HIGH
HIGH là một hằng số có giá trị nguyên là 1
void setup() {
pinMode(led1, OUTPUT);
digitalWrite(led1, HIGH);
}
void loop() {
}
Đoạn code này có chức năng bật sáng đèn led1 nối với chân số 12 trên mạch
Arduino (Arduino Nano, Uno R3, Mega 2560, ...). Bạn có thể tải đoạn chương
trình này lên mạch Arduino của mình để kiểm chứng. Sau đó, hãy thử tải đoạn
chương trình này lên:
void setup() {
pinMode(led1, OUTPUT);
digitalWrite(led1, 1);
}
void loop() {
}
Điều này khẳng định "HIGH là một hằng số có giá trị nguyên là 1" đã nêu ở trên.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
97
Điện áp ở mức HIGH không có giá trị cụ thể như 3.3V, 5V, 9V, ... mà trong mỗi
loại mạch điện, nó có trị số khác nhau và đã được quy ước trước. Trong các mạch
Arduino, HIGH được quy ước là mức 5V mặc dù 4V vẫn có thể được xem
là HIGH. Ví dụ như trong mạch Arduino Uno R3, theo nhà sản xuất, điện áp được
xem là ở mức HIGH nằm trong khoảng từ 3V đến 5V.
d. LOW
LOW là một hằng số có giá trị nguyên là 0
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ố 12 trên mạch
Arduino (Arduino Nano, Uno R3, Mega 2560, ...). Sau đó, hãy thử tải đoạn chương
trình này lên:
void setup() {
pinMode(led, OUTPUT);
}
void loop() {
digitalWrite(led, HIGH);
delay(1000);
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
98
digitalWrite(led, 0);
delay(1000);
}
Điều này khẳng định "LOW là một hằng số có giá trị nguyên là 0" đã nêu ở trên.
Điện áp ở mức LOW không có giá trị cụ thể như 3.3V, 5V, 9V, ... mà trong mỗi
loại mạch điện, nó có một trị số khác nhau nhưng thường là 0V hoặc gần bằng
0V.
Trong các mạch Arduino, LOW được quy ước là mức 0V mặc dù 0.5V vẫn có thể
được xem là LOW.
e. INPUT:
Các Chân kỹ thuật số có thể được sử dụng được giá trị này. Để thay đổi cách sử
dụng một pin, chúng ta sử dụng hàm pinMode().
Cấu hình một pin là INPUT
Các pin của Arduino ( Atmega ) được cấu hình là một INPUT với 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 được
cấu hình là INPUT làm việc tiêu thụ năng lượng điện của mạch rất nhỏ, nó tương
đương với một loạt các điện trở 100 Mega-ôm ở phía trước của pin . Điều này làm
cho chúng cực kì hữu ích cho việc đọc một cảm biến, nhưng không cung cấp năng
lượng một đèn LED.
f. INPUT_PULLUP
Các Chân kỹ thuật số có thể được sử dụng được giá trị này. Để thay đổi cách sử
dụng một pin, chúng ta sử dụng hàm pinMode().
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
99
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ố INPUT_PULLUP trong pinMode().
Mặc định khi không được kết nối với một mạch ngoài hoặc được kết nối với cực
dương thì pin sẽ nhận giá trị là HIGH, khi pin được thông tới cực âm xuống đất thì
nhận giá trị là LOW.
g. OUTPUT
Các Chân kỹ thuật số có thể được sử dụng được giá trị này. Để thay đổi cách sử
dụng một pin, chúng ta sử dụng hàm pinMode().
Để thiết đặt pin là một OUTPUT, chúng ta dùng pinMode ( ), điều này 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ượng điện đáng kể cho các 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ượng đèn
LED nhưng vô dụng đối với các cảm biến đọc!
h. LED_BUILTIN
Hầu hết các mạch Arduino đều có một pin kết nối với một 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, chúng có giá trị là 13
i. true
Giới thiệu
true là một hằng logic. Bạn cũng có thể HIỂU true là một HẰNG SỐ NGUYÊN
mang giá trị là 1. Trong các biểu thức logic, một hằng số hay giá trị của một biểu
thức khác 0 được xem như là mang giá trị true.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
100
Lưu ý
Không được viết "true" thành TRUE hay bất kì một dạng nào khác.
Các giá trị sau là tương đương nhau: true, HIGH, 1
j. false
Giới thiệu
Trái lại với true, false là một hằng logic có giá trị là phủ định của true (và ngược
lại), tức là (!true) = false. Bạn cũng có thể HIỂU false là một hằng số nguyên
mang giá trị là 0. Trong các biểu thức logic, một hằng số hay giá trị của một biểu
thức bằng 0 được xem như là bằng false.
Lưu ý
Không được viết "false" thành FALSE hay bất kì một dạng nào khác.
Các giá trị sau là tương đương nhau: false, LOW, 0
2. Kiểu dữ liệu:
a. void
Miêu tả
"void" là một từ khóa chỉ dùng trong việc khai báo mộ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 = 10;
void setup() {
pinMode(led, OUTPUT);
}
void loop() {
blink();
}
void blink() {
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
101
digitalWrite(led, LOW);
delay(3000);
digitalWrite(led, HIGH);
delay(1000);
}
Giải thích
b. boolean
Giới thiệu
Một biến được khai báo kiểu 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 đươ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:
true - false
HIGH - LOW
1-0
Ví dụ:
int led = 10;
boolean led_status;
void setup() {
pinMode(led, OUTPUT);
led_status = true; // led ở trạng thái bật
}
void loop() {
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
102
c. int:
Giới thiệu
Kiểu int là kiểu số nguyên chính được dùng trong chươ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ừ -32,768 đến 32,767 (-215 đến 215-1)
(16 bit)
Trên mạch Arduino Due, nó có đoạn giá trị từ -2,147,483,648 đến 2,147,483,647 (-
231 đến 231-1) (32 bit) (lúc này nó chiếm 4 byte bộ nhớ)
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
103
Ví dụ
int ledPin = 10;
Cú pháp
int var = val;
d. unsigned int
Giới thiệu
Kiểu unsigned int là kiểu số nguyên nằm trong khoảng từ 0 đến 65535 (0 đến 216 -
1). Mỗi biến mang kiểu dữ liệu này chiếm 2 byte 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 = 10;
Khi một biến kiểu unsigned int được gán trị vượt ngoài phạm vi giá trị (bé hơn 0
hoặc lớn hơn 65525), giá trị của biến này sẽ tự động được đẩy lên giới hạn trên
hoặc giới hạn dưới trong khoảng giá trị của nó.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
104
e. char
Giới thiệ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 cần biểu diễn
một chuỗi trong chương trình Arduino - bạn cần sử 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á trị từ -127 -
128), thay vì thiết đặt một biến kiểu char có giá trị là 'A', bạn có thể đặt là 65. Để
hiểu rõ hơn bạn xem ví dụ dưới đây.
Ví dụ
char myChar = 'A';
char myChar = 65; // cả 2 cách khai báo đều hợp lệ
f. unsigned char
Giới thiệu
Giống hệt bài giới thiệu về kiểu char. Tuy nhiên kiểu unsigned char lại biểu hiệu
một số nguyên byte không âm (giá trị từ 0 - 255).
Ví dụ
unsigned char myChar = 240;
g. byte
Giới thiệu
Là một kiểu dữ liệu biểu diễn số nguyên nằm trong khoảng từ 0 đến 255. Bạn sẽ mất 1
byte bộ nhớ cho mỗi biến mang kiểu byte
Ví dụ
byte a = 123; //khai báo biến a mang kiểu byte, có giá trị là 123
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
105
h. word
Giới thiệu
Giống như kiểu unsigned int, kiểu dữ liệu này là kiểu số nguyên 16 bit không âm
(chứa các giá trị từ 0 đến 65535), và nó chiếm 2 byte bộ nhớ!
Ví dụ
word a = 2000;
i. long
Giới thiệu
long là một kiểu dữ liệu mở rộng của int. Những biến có kiểu long có thể mang giá
trị 32bit từ -2,147,483,648 đến -2,147,483,647. Bạn sẽ mất 4 byte bộ nhớ cho một
biến kiểu long.
Khi tính toán với số nguyên (biến kiểu int), bạn phải thêm hậu tố "L" phía sau các
số nguyên kiểu int để chuyển chúng sang kiểu long. Việc 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 được phép.
Ví dụ
long a = 10;
long b = a + 10L // b = 20.
j. unsigned long
Giới thiệu
Ví dụ
unsigned long time;
void setup()
{
Serial.begin(9600);
}
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
106
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
delay(1000);
}
k. short
Giới thiệu
Giống hệt kiể int, tuy nhiên có điều trên mọi mạch Arduino nó đều chiếm 4 byte bộ
nhớ và biểu thị giá trị trong khoảnf -32,768 đến 32,767 (-215 đến 215-1) (16 bit).
Ví dụ
short ledPin = 13;
Cú pháp
short var = val;
l. float
Giới thiệu
Để định nghĩa 1 kiểu số thực, bạn có thể sử dụng kiểu dữ liệu float. 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ớ.
Với kiểu dữ liệu float bạn có từ 6-7 chữ số có nghĩa nằm ở bên mỗi bên dấu
".". Điều đó có nghĩa rằng bạn có thể đặt một số thực dài đến 15 ký tự (bao gồm
dấu .)
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
107
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 cho lẫn nhau.
Ví dụ: bạn xử lý phép tính 5.0 / 2.0 thì kết quả sẽ trả 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;
Ví dụ
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)
m. double
Giống hết như kiểu float. Nhưng trên mạch Arduino Due thì 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!
n. array
Giới thiệu
Array là mảng (tập hợp các giá trị có liên quan và được đánh dấu bằng những chỉ
số). Array được dùng trên Arduino chính là Array trong ngôn ngữ lập trình C.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
108
int myPins[] = {2, 4, 8, 3, 6}; // tạo mảng myPins chứa 5 phần tử (lần lượt là 2, 4,
8, 3, 6). Mảng này không giới hạn số lượng phần tử vì có khai báo là "[]"
int mySensVals[6] = {2, 4, -8, 3, 2}; // tạo mảng mySensVals chứa tối đa 6 phần
tử, trong đó 5 phần tử đầu tiên có giá trị lần lượt là 2, 4, -8, 3, 2
Chú ý: Phần tử đầu tiên trong mảng luôn được đánh dấu là số 0.
Điều này có nghĩa rằng, việc khai báo một mảng có tối đa 10 phần tử, thì phần tử
cuối cần (thứ 10) được đánh dấu là số 9
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ử cuối cùng thì hãy truy đến đến ô giới hạn 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ương trình của bạn sẽ mắc lỗi logic và rất khó để tìm lỗi đấy!
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
109
Mảng rất thường được dùng trong vòng lặp (chẳng hạn như dùng để 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ử đầu
của mảng myPins:
int i;
for (i = 0; i < 5; i = i + 1) {
Serial.println(myPins[i]);
}
o. string
Giới thiệu
char Str2[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'}; //khai báo chuỗi có độ dài tối đa là 8 ký tự
và đặt nó giá trị ban đầu là arduino (7 ký tự). Buộc phải khai báo chuỗi nằm giữa
hai dấu nháy đơn nhé!
char Str3[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '\0'};//khai báo chuỗi có độ dài tối đa là 8 ký
tự và đặt nó giá trị ban đầu là arduino<ký tự null> (8 ký tự)
char Str4[ ] = "arduino";// Chương trình dịch sẽ tự động điều chỉnh kích thước cho
chuỗi Str4 này và ngoài ra bạn phải đặt một chuối trong dấu ngoặc kép
CHÚ Ý: mỗi chuỗi đều cần có 1 ký tự NULL, nếu bạn không khai báo ký tự
NULL (\0) ở cuối thì trình biên dịch sẽ tự động thêm vào. Đó là lý do vì sao Str2,
Str4 lại có độ dài là 8 nhưng chỉ chứa một chuỗi 7 ký tự. Ký tự NULL này để làm
gì? Nó dùng để trình biên dịch biết điểm dừng của một chuỗi! Nếu không nó sẽ
đọc tiếp những phần bộ nhớ khác (mà phần ấy không lưu chuỗi)
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
110
Khi cần phải thao tác với một lượng lớn chuỗi (ví dụ như trong các ứng dụng trả
lời người dùng bằng LCD) thì bạn cần sử dụng một mảng chuỗi. Mà bản chất của
chuỗi là mảng các ký tự. Vì vậy để khai báo 1 mảng chuỗi bạn cần sử dụng một
mảng 2 chiều!
Chỉ cần thêm dấu * sau chữ char và trong dấu ngoặc vuông phía sau myStrings bạn
có thể thiết đặt số lượng phần tử tối đa của mảng chuỗi!
Ví dụ
char* myStrings[]={"This is string 1", "This is string 2", "This is string 3",
"This is string 4", "This is string 5","This is string 6"};
void setup(){
Serial.begin(9600);
}
void loop(){
for (int i = 0; i < 6; i++){
Serial.println(myStrings[i]);
delay(500);
}
}
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
111
Hàm char() có nhiệm vụ chuyển kiểu dữ liệu của một giá trị về kiểu char
Cú pháp
char(x)
Tham số
Trả về
b. byte()
Giới thiệu
Hàm byte() có nhiệm vụ chuyển kiểu dữ liệu của một giá trị về kiểu byte
Cú pháp
byte(x)
Tham số
Trả về
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
112
c. int()
Giới thiệu
Hàm int() có nhiệm vụ chuyển kiểu dữ liệu của một giá trị về kiểu int
Cú pháp
int(x)
Tham số
Trả về
d. word()
Giới thiệu
Hàm word() có nhiệm vụ chuyển kiểu dữ liệu của một giá trị về kiểu word. Hoặc
ghép 2 giá trị thuộc kiểu byte thành 1 giá trị kiểu word
Cú pháp
word(x)
word(8bitDauTien,8bitSauCung)
Tham số
Trả về
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
113
e. long()
Giới thiệu
Hàm long() có nhiệm vụ chuyển kiểu dữ liệu của một giá trị về kiểu long
Cú pháp
long(x)
Tham số
Trả về
f. float()
Giới thiệu
Hàm float() có nhiệm vụ chuyển kiểu dữ liệu của một giá trị về kiểu float
Cú pháp
float(x)
Tham số
Trả về
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
114
Với một từ khóa "const" nằm trước một khai báo biến, bạn sẽ làm cho biến này
thành một biến chỉ có thể đọc "read-only".
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ố
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 được. Tuy nhiên, để khai báo một biến mảng (array) là một hằng số
bạn chỉ có thể sử dụng từ khóa const. Và đây là một lý do nữa khiến const được
dùng nhiều và được ưa chuộng hơn #define!
Biến tĩnh là biến sẽ được tạo ra duy nhất một lần khi gọi hàm lần đầu tiên và nó sẽ
không bị xóa đi để tạo lại khi gọi lại hàm ấy. Đây là sự khác biệt giữa biến tĩnh và
biến cục bộ.
Biến tĩnh là loại biến lưỡng tính, vừa có tính chất của 1 biến toàn cục, vừa mang
tính chất của 1 biến cục bộ:
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
115
Tính chất 1 biến toàn cục: biến không mất đi khi chương trình con kết thúc,
nó vẫn nằm trong ô nhớ của chương trình và được tự động cập nhật khi
chương trình con được gọi lại. Giống như 1 biến toàn cục vậy.
Tính chất 1 biến cục bộ: biến chỉ có thể được sử dụng trong chương trình
con mà nó được khai báo.
Để khai báo bạn chỉ cần thêm từ khóa "static" trước khai báo biến. Xem ví dụ để rõ
hơn.
Ví dụ
void setup(){
Serial.begin(9600); // Khởi tạo cổng Serial ở baudrate 9600
}
void loop() {
testStatus();// Chạy hàm testStatus
delay(500); // dừng 500 giây để bạn thấy được sự thay đổi
}
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
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ệt giữa biến tĩnh và biến cục bộ!
}
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
116
Những lệnh trong setup() sẽ được chạy khi chương trình của bạn khởi động. Bạn
có thể sử dụng nó để khai báo giá trị của biến, khai báo thư viện, thiết lập các
thông số,…
Sau khi setup() chạy xong, những lệnh trong loop() được chạy. Chúng sẽ lặp đi lặp
lại liên tục cho tới khi nào bạn ngắt nguồn của board Arduino mới thôi.
Ví dụ
int led = 10;
void setup() {
pinMode(led, OUTPUT);
}
void loop() {
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(1000);
}
Giải thích
Khi bạn cấp nguồn cho Arduino, lệnh “pinMode(led, OUTPUT);” sẽ được chạy 1
lần để khai báo.
Sau khi chạy xong lệnh ở setup(), lệnh ở loop() sẽ được chạy và được lặp đi lặp lại
liên tục, tạo thành một chuỗi:
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(1000);
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
117
digitalWrite(led, HIGH);
delay(1000);
……
2. Toán tử logic:
Toán tử Ý nghĩa Ví dụ
and Và (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à
ngược lạ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
3. Các toán tử so sánh.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
118
Cú pháp:
if ([biểu thức 1] [toán tử so sánh] [biểu thức 2]) { //biểu thức điều kiện
[câu lệnh 1]
} else {
[câu lệnh 2]
}
Nếu biểu thức điều kiện trả về giá trị TRUE, [câu lệnh 1] sẽ được thực hiện, ngược
lại, [câu lệnh 2] sẽ được thực hiện.
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ừ khóa else
int a = 0;
if (a == 0) {
a = 10;
// a = 10
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
119
b. switch / case
Mô tả
Giống như if, switch / case cũng là một dạng lệnh nếu thì, nhưng nó được thiết kế
chuyên biệt để bạn xử ý giá trị trên một biến chuyên biệt..
Ví dụ, bạn có một biến là action sẽ nhận trị từ những module khác 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 "0":
//bat led 1
break;
case "1":
//bat led 2
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
}
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
120
Tham số
label: sẽ đem giá trị của biến SO SÁNH BẰNG với nhãn này
c. for
Giới thiệu
Nếu bạn chưa đọc bài này và cũng chưa biết kiến thức về for, bạn sẽ 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ại câu lệnh Serial.println
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
121
Nhưng sau khi biết về hàm for bạn chỉ cần một đoạn code cực kì ngắn như sau:
void setup(){
Serial.begin(9600);
int i;
for (i = 1;i<=10;i=i+1) {
Serial.println(i);
}
}
void loop(){
}
Cấu trúc
Nếu bạn chưa biết về vòng lặp hoặc hàm for, để hiểu được hàm for, bạn cần nắm
được 4 phần:
1. Hàm for là một vòng lặp có giới hạn - nghĩa là chắc chắn nó sẽ kết thúc
(không sớm thi muộn).
2. Nó sẽ bắt đầu từ một vị trí xác định và đi đến một vị trí kết thúc.
3. Cứ mỗi bước xong, nó lại thực hiện một đoạn lệnh
4. Sau đó, nó lại bước đi tiếp, nó có thể bước 1 bước hoặc nhiều bước, nhưng
không được thay đổi theo thời gian.
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).
For tiến (xuất phát từ một vị trí nhỏ chạy đến vị trí lớn hơn) <vị trí kết thúc>
bé hơn <vị trí kết thúc>
for (<kiểu dữ liệu nguyên> <tên thằng chạy> = <vị trí xuất phát>; <tên thằng
chạy> <= <vị trí kết thúc>; <tên thằng chạy> += <mỗi lần bước mấy bước>)
{
<đoạn câu lệnh>;
}
For lùi (xuất phát từ một vị trí lớn chạy về vị trí nhỏ hơn) <vị trí xuất phát>
lớn hơn <vị trí kết thúc>
for (<kiểu dữ liệu nguyên> <tên thằng chạy> = <vị trí xuất phát>; <tên thằng
chạy> <= <vị trí kết thúc>; <tên thằng chạy> -= <mỗi lần lùi mấy bước>) {
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
122
Và khi đã hiểu được một cách sâu sắc thì đây là cú pháp chính của hàm For:
d. while
Giới thiệu
Vòng lặp while là một dạng vòng lặp theo điều kiện, mình không thể biết trước số
lần lặp cua nó, nhưng mình quản lý lúc nào thì nó ngừng lặp!
Cú pháp
while (<điều kiện>) {
//các đoạn lệnh;
}
Ví dụ
int giay = 1;
int phut = 1;
while (giay < 60) { //Chừng nào day < 60 thì còn chạy (<=60). Khi day == 60 thì
được 1 phút
giay += 1;
}
phut+= 1;
e. break
Giới thiệu
break là một lệnh có chức năng dừng ngay lập tức một vòng lặp (do, for, while)
chứa nó trong đó. Khi dừng vòng lặp, tất cả những lệnh phía sau break và ở trong
vòng lặp chịu ảnh hưởng của nó sẽ bị bỏ qua.
Ví dụ
int a = 0;
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
123
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
f. continue
Giới thiệu
continue là một lệnh có chức năng bỏ qua một chu kì lặp trong một vòng lặp
(for, do, while) chứa nó trong đó. Khi gọi lệnh continue, những lệnh sau nó và ở
trong cùng vòng lặp với nó sẽ bị bỏ qua để 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;
}
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
124
g. return
Giới thiệu
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
return;
return value; // cả 2 đều đúng
Thông số
Ví dụ
//Hàm kiểm tra giá trị của cảm biến có hơn một ngưỡng nào đó hay không
int checkSensor(){
if (analogRead(0) > 400) {
return 1;
else{
return 0;
}
h. goto
Giới thiệu
Nó có nhiệm vụ tạm dừng chương trình rồi chuyển đến một nhãn đã được định
trước, sau đó lại chạy tiếp chươ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 đó
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
125
Thủ thuật
Không nên dùng lệnh goto trong chương trình Program hay bất cứ chương trình
nào sử dụng ngôn ngữ C. Nhưng nếu sử dụng một cách khôn ngoan bạn sẽ tối ưu
hóa được nhiều điều trong một chương 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ụ
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:
5. Toán tử số học:
a. Phép gán(=)
Giới thiệu
Dùng để gán một giá trị cho một biến. Giá trị nằm trên phải, tên biến nằm bên trái
ngăn cách nhau bởi 1 dấu bằng.
Ví dụ
int sensor; // Khai báo kiểu dữ liệu cho biến sensor là int
sensor = analogRead(0); // đặt giá trị cho sensor là giá trị analog tại chân A0
b. Các phép cộng, trừ, nhân, chia trong Arduino
Giới thiệu
Những phép toán trên có nhiệm vụ thực hiện việc tính toán trong Arduino. Tùy
thuộc vào kiểu dữ liệu của các biến hoặc hằng số mà kết quả trả về của nó có kiểu
dữ liệu như thế nào.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
126
Ví dụ
y = y + 3;
x = x - 7;
i = j * 6;
r = r / 5;
Cú pháp
result = value1 + value2;
result = value1 - value2;
result = value1 * value2;
result = value1 / value2;
Tham số
Phép chia lấy dư là phép lấy về phần dư của một phép chia các số nguyên.
Cú pháp
<phần dư> = <số bị chia> / <số chia>;
Ví dụ
x = 7 % 5; // x bây giờ là 2
x = 9 % 5; // x bây giờ là 4
x = 5 % 5; // x bây giờ là 0
x = 4 % 5; // x bây giờ là 4
Tham khảo
/* cập nhập lại giá trị trong hàm loop */
int values[10];
int i = 0;
void setup() {}
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
127
void loop()
{
values[i] = analogRead(0);
i = (i + 1) % 10; // giá trị của biến i sẽ không bao giờ vượt quá 9.
}
Lưu ý
Phép chia lấy dư không khả dụng với kiểu dữ liệu float
6. Cú pháp mở rộng
a. dấu chấm phẩy ( ; )
Giới thiệu
Ví dụ
int ledPin = 13;
Thủ thuật
Giả sử bạn có quên dấu ";" này thì cũng không có vấn đề to tát lắm, chương trình
dịch của Arduino sẽ tự động dò tìm lỗi này và thông báo chính xác dòng bị lỗi!
Rất đơn giản, {} là một cặp dấu ngoặc nhọn, nên một khi bạn đã mở ngoặc thì phải
đóng ngoặc lại cho nó!
Nhiệm vụ của nó là cung cấp một cú pháp để gọi những lệnh cho những cấu trúc
đặc biệt như (if, while, for,...)
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
128
Cách sử dụng
Trong hàm và thủ tục
do
{
<câu lệnh>
} while (<điều kiện>);
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
129
Bạn rất khó ghi nhớ từng dòng code một trong một chương trình thật là dài, với
những thuật toán phức tạp, vì vậy Arduino đã làm cho bạn một cú pháp để giải
quyết vấn đề này, đó là Comments.
Comments sẽ giúp bạn ghi chú cho từng dòng code hoặc trình bày nhiệm vụ của nó
để bạn hoặc những người khác có thể hiểu được chương trình này làm được những
gì. Và comments sẽ không được Arduino biên dịch nên cho dù bạn viết nó dài đến
đâu thì cũng không ảnh hưởng đến bộ nhớ flash của vi điều khiển. Để comments
trong Arduino, bạn có 2 cách. ( // chú thích code ), ( /* chú thích code */ )
Ví dụ
void setup() {
void loop() {
delay(3000);
delay(1000);
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
130
d. #define
Giới thiệu
#define là một đối tượng của ngôn ngữ C/C++ cho phép bạn đặt tên cho một
hằng số nguyên hay hằng số thực. Trước khi biên dịch, trình 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 được gọi là quá trình tiền biên dịch (pre-compile).
Cú pháp
#define [tên hằng] [giá trị của hằng]
Ví dụ
#define pi 3.14
#define pi 3.14
float a = pi * 2.0; // pi = 6.28
thì sau khi pre-compile trước khi biên dịch, chương trình của bạn sẽ như thế
này:
#define pi 3.14
float a = 3.14 * 2.0; // a = 6.28
e. #include
Giới thiệu
#include cho phép chương trình của bạn tải một thư viện đã được viết sẵn.
Tức là bạn có thể truy xuất được những tài nguyên trong thư viện này từ
chương trình của mình. Nếu bạn có một đoạn code và cần sử dụng nó trong
nhiều chương trình, bạn có thể dùng #include để nạp đoạn code ấy vào
chương trình của mình, thay vì phải chép đi chép lại đoạn code ấy.
Cú pháp
#include <[đường dẫn đến file chứa thư viện]>
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
131
Ví dụ
Giả sử bạn có thư mục cài đặt Arduino IDE tên là ArduinoIDE, thư viện của
bạn có tên là EEPROM (được lưu ở \ArduinoIDE\libraries\EEPROM\)
Một đoạn code lưu ở file code.h nằm trong thư mục function của thư
viện EEPROM thì được khai báo như sau:
Cú pháp
x++; // tăng x lên 1 giá trị và trả về giá trị cũ của x
++x; // tăng x lên 1 giá trị và trả về giá trị mới của x
Trả về
Giá trị cũ của biến hoặc giá trị mới đã được cộng / hoặc bị trừ của biến ấy.
Ví dụ
x = 2;
y = ++x; // x bây giờ có giá trị là 3, và y cũng có giá trị là 3
y = x--; // x bây giờ đã trở lại với giá trị 2, nhưng y không đổi vẫn là 3
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
132
Cung cấp một số phép toán rút gọn để bạn gõ code trong đẹp hơn.
Cú pháp
x += y; // giống như phép toán x = x + y;
x -= y; // giống như phép toán x = x - y;
x *= y; // giống như phép toán x = x * y;
x /= y; // giống như phép toán x = x / y;
Tham số
Ví dụ
x = 2;
x += 4; // x bây giờ có giá trị là 6
x -= 3; // x bây giờ có giá trị là 3
x *= 10; // x bây giờ có giá trị là 30
x /= 2; // x bây giờ có giá trị là 15
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
133
Những lệnh trong setup() sẽ được chạy khi chương trình của bạn khởi động.
Bạn có thể sử dụng nó để khai báo giá trị của biến, khai báo thư viện, thiết
lập các thông số,…
Sau khi setup() chạy xong, những lệnh trong loop() được chạy. Chúng sẽ lặp
đi lặp lại liên tục cho tới khi nào bạn ngắt nguồn của board Arduino mới
thôi.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
134
Quá trình của một chương trình có thể được miêu tả như sơ đồ dưới đây:
int led = 13; // khai báo chân điều khiển led là chân số 13 của arduino
void setup() { //toàn bộ đoạn code nằm trong hàm này chỉ được chạy duy nhất một
lần khi chạy chương trình
pinMode(led, OUTPUT); //sẽ được chạy 1 lần để khai báo chân ra của arduino
void loop() { // lặp lại mãi mãi sau khi chạy xong setup()
delay(1000); // tắt led trong vòng 1 giây sau đó bật led và lặp lại quá trình.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
135
Nó cung cấp cho bạn một phương thức cực kỳ đơn giản để giao tiếp giữa
các module và arduino. ( ví dụ như giúp việc giao tiếp giữa Arduino với
module thời gian thực DS1307 trở nên dễ dàng hơn rất nhiều)
Thư viện trong Arduino chứa các mã nguồn có những đặc điểm chung,
được xây dựng thành một gói bao gồm file: examples, .h, .cpp,...Nhằm giúp
người sử dụng giải quyết được vấn đề nhanh chóng.
Một số thư viện có sẵn trong chương trình Arduino IDE như:
Sevor, Stepper, EEPROM, Ethernet, SPI,...
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
136
Nhằm giúp người sử dụng giải quyết được vấn đề nhanh chóng,
trong bài viết này tôi cài thư viện I2C làm ví dụ để cài vào thư viện cho
Arduino IDE.
Sau khi tải thư viện I2C về với file .zip (Tải tại đây) copy thư mục
vào đường dẫn sau: ( lưu ý Arduino IDE chỉ hiểu những file .zip hoặc
dạng folder.)
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
137
Sau khi tải về và lưu vào đường dẫn ở trên, Ta vào Sketch Include Library
Add sau đó chọn file I2C vừa tải về:
Chọn Open để bắt đầu add thư viện I2C vào Arduino IDE:
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
138
Nếu cửa sổ Arduino IDE báo dòng chữ dưới đây thì đã cài thành công.
Sau khi ài xong ta reset lại Arduino IDE và xem lại thư viện I2C đã có trong IDE
chưa. Vậy là OK
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
139
Phần cứng ( Trên kit đã tích hợp sẵn chỉ cần nối dây là được)
1 arduino uno, nano,…
1 trở 220 Ohm
1 led đơn
Lắp mạch
Ở bài này ta điều khiển led đơn sáng nhấp nháy theo yêu cầu của mình.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
140
Trước tiên, cứ mỗi khi dùng một con LED, chúng ta phải pinMode OUTPUT chân
Digital mà ta sử dụng cho con đèn LED. Trong ví dụ, chúng ta sử dụng chân LED
là chân digital 12. Nên đoạn code sau cần nằm trong void setup()
pinMode(12, OUTPUT);
Để bật một con đèn LED, bạn phải digitalWrite HIGH cho chân số 12 (chân Digtal
được kết nối với con LED). Đoạn code này nằm trong void loop()
digitalWrite(12,HIGH);
Dòng lệnh trên sẽ cấp một điện thế là 5V vào chân số Digital 12. Điện thế sẽ đi qua
điện trở 220ohm rồi đến đèn LED (sẽ làm nó sáng mà không bị cháy, ngoài ra bạn
có thể các loại điện trở khác <= 10kOhm). Để tắt một đèn LED, bạn sử dụng hàm:
digitalWrite(12,LOW);
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
141
Lúc này điện thế tại chân 12 sẽ là 0 V => đèn LED tắt. Và để thấy được trạng thái
bật và tắt của đèn LED bạn phải dừng chương trình trong một khoảng thời gian đủ
lâu để mắt cảm nhận được (nói vậy thôi, chứ bạn chỉ cần dừng chương trình trong
vài miligiây là thấy được rồi). Vì vậy, hàm delay được tạo ra để làm việc này
(Dừng hẳn chương trình bao nhiêu mili giây)!
code:
/*
Đoạn code làm nhấp nháy một đèn LED cho trước
*/
// Hàm setup chạy một lần duy nhất khi khởi động chương trình
void setup() {
pinMode(12, OUTPUT);
// Hàm loop chạy mãi mãi sau khi kết thúc hàm setup()
void loop() {
delay(5000); // dừng chương trình trong 5 giây => thây đèn sáng được 5 giây
delay(2000); // dừng chương trình trong 2 giây => thấy đèn tối được 2 giây
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
142
Phần cứng ( được tích hợp sẵn trên kit) nếu không có các bạn chuẩn bị:
Arduino Uno, nano,…
Breadboard.
Dây cắm breadboard.
1 điện trở (hoặc 220 Ohm hoặc 1kOhm).
1 đèn LED đơn.
Lắp mạch
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
143
Lưu ý những chân digital có dấu ~ phía trước và những chân analog mới hỗ
trợ analogWrite,
Chương trình:
Code lập trình sẽ được lưu trong file ( file _code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
void setup() {
// pinMode đèn led là OUTPUT
pinMode(led, OUTPUT);
}
void loop() {
//xuất giá trị độ sáng đèn LED
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
144
analogWrite(led, giatribandau);
// Đoạn code này có nghĩa nếu độ sáng == 0 hoặc bằng == 255 thì sẽ đổi chiều
của biến thay đổi độ sáng. Ví dụ, nếu đèn từ sáng yếu --> sáng mạnh thì
fadeAmount dương. Còn nếu đèn sáng mạnh --> sáng yếu thì fadeAmmount lúc
này sẽ có giá trị âm
if (giatribandau == 0 || giatribandau == 255) {
tanggiatri = - tanggiatri ;
}
//đợi 50 mili giây để thấy sự thay đổi của đèn
delay(50);
}
• Breadboard.
Lắp mạch:
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
145
int red = 8;
int yellow = 9;
void setup(){
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
146
pinMode(red,OUTPUT);
pinMode(yellow,OUTPUT);
pinMode(green,OUTPUT);
void loop(){
delay(15000);
void dengiaothong(){
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
147
Role 1 kênh ( có 1 role) và 2 kênh ( 2 rơ le) trên thuộc loại kích mức cao.
Tiếp điểm đóng ngắt gồm 3 tiếp điểm NC (thường đóng), NO(thường mở) và
COM(chân chung) được cách ly hoàn toàn với board mạch chính.
Ở trạng thái bình thường chưa kích NC sẽ nối với COM, khi có trạng thái kích
COM sẽ chuyển sang nối với NO và mất kết nối với NC.
Thông số kỹ thuật:
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
148
Lắp mạch:
int role = 11; // có thể sử dụng chân khác của arduino để điều khiển rơ le
void setup() {
void loop() {
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
149
delay(10000);
delay(4000);
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
150
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
151
-Khi cuộn hút công tắc tơ chưa được cấp điện, lò xo hồi vị đẩy lõi thép động cách
xa khỏi lõi thép tĩnh. Các cặp tiếp điểm chính ở trạng thái mở.
- Khi cấp điện vào cuộn hút của công tắc tơ, lõi thép tĩnh hút lõi thép động thắng
được lực đẩy lò xo, từ đó đóng các tiếp điểm lại, đưa điện đi từ đầu vào Công tắc
tơ tới đầu ra công tắc tơ.
- Khi ngắt điện cấp vào cuộn hút công tắc tơ, lực hút không còn nữa, lò xo lại đẩy
lõi thép động về vị trí ban đầu, các cặp tiếp điểm mở ra, ngắt điện ở đầu ra công tắc
tơ.
- Ngoài tiếp điểm chính để truyền tải điện 3 pha, công tắc tơ còn có thêm các tiếp
điểm phụ để sử dụng trong các mạch điều khiển, mạch logic trung gian.
Phần cứng chuẩn bị:
Mạch arduino uno, nano, mê ga,…
Công tắc tơ LS hàn quốc ( trong bài này sử dụng loại 18A).
Module rơ le 5Vdc ( trong bài sử dụng loại kích mức cao).
Dây cắm test và một số dây điện dân dụng hoặc công nghiệp.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
152
Lắp mạch:
int role = 3;// sử dụng chân 3 để điều khiển rơ le đóng ngắt cuộn từ của công tắc tơ
void setup() {
void loop() {
digitalWrite(role, HIGH); // bật role trong 10 giây cũng như cấp điện cho cuộn từ 10 s
delay(10000);
digitalWrite(role, LOW); // tắt role trong 10 giây cũng như ngắt điện cho cuộn từ 10 s
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
153
delay(10000);
} // trong phần sau chúng ta sử dụng nút nhấn để bật tắt role đóng ngắt cuộn từ của công tắc tơ
6. Đọc tín hiệu nút nhấn hiển thị lên serial monitor.
Giới thiệu về nút nhấn:
Tôi sẽ giới thiệu cho các bạn những loại button ( nút nhấn) phổ biến hiện nay.
Bạn có thể tìm thấy nó ở mọi thứ trong cuộc sống, chẳng hạn như cái nút trong bàn phím
máy tính của mình,…
Button có rất nhiều loại, và mỗi loại lại có ứng dụng riêng của nó. Vì vậy, chỉ cần s dụng
hợp lý và sáng tạo các loại button - nút bấm, bạn sẽ làm nên những dự án. Nút nhấn
thường có 2 loại chính: 2 chân và 4 chân ( thực chất 4 chân giống 2 chân chỉ giúp nó cố
định và chắc chắn hơn).
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
154
Đây là loại button rất phổ biến, loại button này cũng có các kính thước cạnh 6mm, 9mm
hoặc 12m. Loại 6mm hay được dùng trong các dự án nhỏ và loại còn lại dùng cho các dự
án lớn hơn.
Loại này tuy là 4 chân, nhưng thực chất cũng chỉ là 2 chân mà thôi, các bạn xem hình
dưới.
Ưu điểm của loại có 4 chân này là nó khá vững và rất khó hư!
Loại này khá là nhỏ, chỉ 2-3mm, vì vậy rât phù hợp cho những mạch yêu cầu về kích
thước, bạn có thể tìm thấy nó trên con nano, nó chính là nút reset cho chú Arduino nano.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
155
Những loại nút bấm này thường được dùng để chế tạo những đồ trong công nghiệp, hoặc
những máy móc to lớn cần bấm nhiều và cần đèn trạng thái. Loại này đôi khi có đèn, đôi
khi lại không. Với loại không có đèn thì cũng có 2 chân như các loại ở trên, còn loại có
đèn thì có đến 4 chân (2 chân của button, 1 chân dương và 1 chân âm của led).
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
156
Sơ đồ nguyên lí:
Lắp mạch( nếu các bạn đã có kit học thì đã lắp sẵn nút nhấn):
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
157
Lập trình:
Code lập trình sẽ được lưu trong file ( file _code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
158
Khi bạn chưa nhấn nút, chân D2 được nối với GND qua một điện trở 10 kΩ, do đó
lệnh digitalRead(nutnhan) sẽ trả về giá trị 0 (LOW). Khi bạn nhấn nút, chân D2
sẽ được nối trực tiếp với 5V và nối với GND thông qua 1 điện trở 10kΩ,
lệnh digitalRead(nutnhan) sẽ trả về giá trị 1 (HIGH).
Khi chưa nhấn nút, nếu bạn nối chân D2 với GND qua 1 điện trở thì người ta gọi
điện trở này là điện trở pulldown. Trái lại, nếu bạn nối D2 với chân 5V qua một
điện trở thì người ta gọi nó là điện trở pullup. Cách nối ở trên hình sử dụng cách
nối điện trở pulldown.
Sau khi upload code lên mạch Arduino, bạn bấm Ctrl + Shift + M để mở cửa
sổ Serial Monitor để xem trạng thái nút nhấn được mạch Arduino gửi về máy
tính.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
159
pinMode(button, INPUT);
Bạn hãy sửa INPUT thành INPUT_PULLUP rồi tải lại code của bạn lên mạch
Arduino. Bạn có thể tháo điện trở 10 kΩ ra và xem kết quả ... Đó là vì trong vi
điều khiển ATmega328 của Arduino UNO đã có sẵn điện trở pullup tương tự điện
trở pulldown mà bạn đang mắc, tuy nhiên nếu bạn khai báo là INPUT như mặc
định thì nó sẽ không được sử dụng, trái lại việc khai báo INPUT_PULLUP sẽ
kích hoạt điện trở này.
Lắp mạch( nếu các bạn đã có kit học thì đã lắp sẵn nút nhấn):
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
160
Lập trình:
Code lập trình sẽ được lưu trong file ( file _code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
161
Serial.begin(9600);
pinMode(nutnhan,INPUT);
}
void loop() // vong lap
{
int buttonState = digitalRead(nutnhan);
//Serial.println(buttonState);
status1 = chong_doi();
if(status1==true)
{
{
t=!t;// đảo trạng thái
}
while(status1==true){status1=chong_doi();}
}
Serial.println(t);
}
Sau khi upload code lên mạch Arduino, bạn bấm Ctrl + Shift + M để mở cửa
sổ Serial Monitor để xem trạng thái nút nhấn được mạch Arduino gửi về máy
tính.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
162
Lắp mạch( nếu các bạn đã có kit học thì đã lắp sẵn nút nhấn):
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
163
Lập trình:
Code lập trình sẽ được lưu trong file ( file _code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
164
pinMode(nutnhan,INPUT);
pinMode(led,OUTPUT);
}
void loop() // vong lap
{
int buttonState = digitalRead(nutnhan);
Serial.println(buttonState);
status1 = chong_doi();
if(status1==true)
{
{
t=!t; // đảo trạng thái
}
while(status1==true){status1=chong_doi();}
}
if(t==1)
{
digitalWrite(led,HIGH);
}
else
{
digitalWrite(led,LOW);
}
}
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
165
Lắp mạch( nếu các bạn đã có kit học thì đã lắp sẵn nút nhấn):
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
166
Lập trình:
Code lập trình sẽ được lưu trong file ( file _code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
167
}
// khởi tạo
void setup()
{
Serial.begin(9600);
pinMode(nutnhan,INPUT);
pinMode(led,OUTPUT);
}
void loop() // vong lap
{
int buttonState = digitalRead(nutnhan);
Serial.println(buttonState);
status1 = chong_doi();
if(status1==true)
{
{
t=!t; // đảo trạng thái
}
while(status1==true){status1=chong_doi();}
}
if(t==1)
{
digitalWrite(role,HIGH);
}
else
{
digitalWrite(role,LOW);
}
}
TỪ BÀI HỌC NÀY CÁC BẠN CÓ THỂ ĐIỀU KHIỂN ĐƯỢC CÔNG TẮT TƠ
THEO Ý MÌNH THÔNG QUA NÚT NHẤN.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
168
Trước khi vào lập trình, chúng ta hãy cùng đi vào tìm hiểu cấu trúc của LED 7
đoạn.
Thực ra cấu trúc của LED 7 đoạn gồm 8 LED đơn, nhìn lên hình trên chắc các bạn
cũng thấy gồm có 7 đoạn và một dấu chấm nhỏ, mỗi đoạn và dấu chấm nhỏ đó là một
LED đơn.
Việc sử dụng LED 7 đoạn chúng ta có thể sử dụng để hiển thị các số, các chữ cái
anphabet và nhiều kiểu ký tự khác nhau. Như trên hình các bạn đã thấy, một LED 7
đoạn đơn gồm 10 chân đó là các chân: a, b, c, d, e, f, g, 2 chân chung và chân dấu
chấm tròn (DP).
LED 7 đoạn gồm 2 loại đó là dương chung và âm chung. Trong bài học này chúng ta
sẽ viết chương trình và tải vào Arduino để hiển thị các số từ 0-9 ( Loại âm chung).
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
169
Để LED hiển thị chúng ta phải làm cho 8 LED đơn như ở trên hiển thị, ví dụ ở
đây 8 LED ở đây là các led mang kí tự a, b, c, d, e, f, g và một dấu chấm ở chân
cuối.
Bây giờ chúng ta thử suy nghĩ nếu chúng ta muốn hiển thị số 0 chúng ta phải làm
thế nào?
Nhìn vào hình LED hiển thị ở đầu bài chúng ta thấy:
Để hiển thị số 0 thì chúng ta phải làm cho các LED đơn a, b, c, d, e, f phải sáng
lên, dấu chấm và g phải tắt đi. Như vậy để tạo số 0 chúng ta phải thể hiện mã code
hệ nhị phân (binary) là B111111100.
Tương tự đối với số 1 thì có những cái LED nào sáng?
Các bạn có thể viết được mã làm xuất hiện số 1 được không?
Đó là: B01100000.
Tương tự đối với các số 2. 3, 4, 5, 6, 7, 9.
Để dễ hiểu hơn tôi xin đưa ra một bảng sau để các bạn dò.
Lưu ý: sáng là 1, tắt là 0.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
170
Lắp mạch( nếu các bạn đã có kit học thì đã lắp sẵn nút nhấn):
Lập trình:
Code lập trình sẽ được lưu trong file ( file _code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
171
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
172
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
173
Đây là module tốn thời gian của bạn hơi nhiều đấy, module này nhiều chân và có
khá là mới mẻ với những bạn nào mới bắt đầu học lập trình arduino. Và tất nhiên,
bạn sẽ hiểu được cách để sử dụng chúng sau này, cho những dự án khác của bạn.
Trong bài này tôi sử dụng loại Anode chung ( dương chung).
Trước tiên bạn add thư viện SevSeg vào IDE. Các bạn tải tại link sau:
http://tdhshop.com.vn/tong-hop-cac-thu-vien-cho-arduino
Chú ý trường hợp bị chồng thư viện bạn cài bản IDE 1.0.6 để tránh trường hợp
này. Chạy song song 2 phiên bản đều được.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
174
Lắp mạch( nếu các bạn đã có kit học thì đã lắp sẵn):
Tiếp đến ta nối biến trở 10k vào để tăng giảm độ sáng của led 7 đoạn.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
175
Lập trình:
Code lập trình sẽ được lưu trong file ( file _code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
int segD = 6;
int segE = 7;
int segF = 10;
int segG = 3;
int numberOfDigits = 4; // số dấu chấm
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
177
Trong bài viết này mình sử dụng LED matrix " anode ( dương chung) ", có nghĩa
là các chân điều khiển hàng của ma trận chính là cực dương của LED.
Phần cứng chuẩn bị: ( tất cả được tích hợp trên Kit Tự Học)
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
178
Lắp mạch( nếu các bạn đã có kit học thì đã lắp sẵn):
Lập trình:
Code lập trình sẽ được lưu trong file ( file _code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
179
};
};
int pixels[8][8];
int ptrChar = 0;
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0}
};
{0, 0, 0, 1, 1, 0, 0, 0},
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
180
{0, 0, 1, 0, 0, 1, 0, 0},
{0, 1, 0, 0, 0, 0, 1, 0},
{1, 1, 1, 1, 1, 1, 1, 1},
{1, 0, 0, 0, 0, 0, 0, 1},
{1, 0, 0, 0, 0, 0, 0, 1},
{1, 0, 0, 0, 0, 0, 0, 1},
{1, 0, 0, 0, 0, 0, 0, 1}
};
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 1, 0, 0, 0},
{0, 0, 1, 1, 1, 1, 0, 0},
{0, 0, 1, 1, 1, 1, 0, 0},
{0, 0, 0, 1, 1, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0}
};
……………………………………………………………………………..
digitalWrite(col[thisPin], HIGH);
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
181
setupChar();
void loop() {
refreshScreen();
if(count-- == 0){
count = 1000;
setupChar();
void setupChar(){
char c = str[ptrChar];
bool v = (*cMap)[x][y];
if(v){
pixels[x][y] = LOW;
}else{
pixels[x][y] = HIGH;
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
182
ptrChar++;
if(ptrChar>=strLen-1){
ptrChar = 0;
void refreshScreen() {
digitalWrite(row[thisRow], HIGH);
digitalWrite(col[thisCol], thisPixel);
if (thisPixel == LOW) {
digitalWrite(col[thisCol], HIGH);
digitalWrite(row[thisRow], LOW);
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
183
Trong bài này các bạn sẽ tìm cách điều khiển màn hình LCD bằng Arduino mà
không sử dụng module I2C LCD. Chỉ cần Arduino bạn có thể điều khiển được
LCD nhưng lại tốn khá nhiều chân của arduino, Ở phần tiếp theo chúng ta sẽ sử
dụng module I2C để giải quyết vấn đề đó.
Phần cứng chuẩn bị: ( tất cả được tích hợp trên Kit Tự Học)
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
184
Lắp mạch( nếu các bạn đã có kit học thì chỉ việc nối dây):
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
185
Lập trình:
Code lập trình sẽ được lưu trong file ( file _code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
#include <LiquidCrystal.h> //Khai báo thư viện cho LCD ( Thư viện đã có sẵn)
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //noi voi chan LCD LAN LUOT : Rs, E, D4, D5, D6, D7
void setup() {
//Thông báo đây là LCD 1602
lcd.print("DIEN – DIEN TU!"); //In ra màn hình lcd dòng chữ DIEN – DIEN TU
void loop() {
lcd.setCursor(0, 1); // đặt con trỏ vào cột 0, dòng 1
lcd.print(" TDHShop"); // In ra dong chu
}
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
186
Phần cứng chuẩn bị: ( tất cả được tích hợp trên Kit Tự Học)
Trước hết ta phải add thư viện I2C vào phần mền Arduino IDE. Các bạn tải thư
viện tại links sau: http://tdhshop.com.vn/tong-hop-cac-thu-vien-cho-arduino
Lắp mạch( nếu các bạn đã có kit học thì chỉ việc nối dây):
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
187
Lưu ý : Với các dòng mega các bạn nối chân SCL vào SCL và SDA vào SDA.
Lập trình:
Code lập trình sẽ được lưu trong file ( file _code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
// sau khi upload chương trình các bạn nhớ chỉnh biến trở xanh trên I2C nhé.
// trường hợp sử dụng địa chỉ 0x27 không được thay bằng 0x3F.
// Trên module I2C có biến trở chúng ta hãy điều chỉnh độ sáng của LCD.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,16,2); // lưu ý ở đây có 2 địa chỉ ( 0x27) hoặc (0x3F)
void setup()
{
lcd.init();
lcd.backlight();
lcd.print("TDHshop.com.vn");
}
void loop()
{
}
Hình ảnh thực tế:
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
188
15. Đọc giá trị cảm biến quang trở hiển thị lên serial
monitor.
Nếu đặt ở môi trường có ít ánh sáng hoặc tối thì điện trở của quang trở sẽ tăng cao
còn nếu đặt ở ngoài nắng, hoặc nơi có ánh sáng thì điện trở sẽ giảm. Quang trở
không phân biệt chân.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
189
Phần cứng chuẩn bị: (được tích hợp trên Kit Tự Học)
Lắp mạch( nếu các bạn đã có kit học thì chỉ việc nối dây):
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
190
Bây giờ chúng ta upload chương trình đọc giá trị cảm biến quang trở cho arduino và xem
giá trị của quang trở, nhớ là hãy thay đổi độ sáng của môi trường để xem sự thay đổi của
quang trở (chẳng hạn bạn lấy bàn tay che ánh sáng chiếu trực tiếp vào qua ng trở chẳng
hạn).
Lập trình:
int quangtro = A5; //Thiết đặt chân analog đọc quang trở
void setup() {
// Khởi tạo cộng Serial 9600
Serial.begin(9600);
}
void loop() {
int giatriQuangtro = analogRead(quangtro); // đọc giá trị quang trở
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
191
16. Đọc gái trị CB nhiệt độ LM35 hiển thị lên serial monitor.
Cảm biến nhiệt độ LM35 là một loại cảm biến tương tự rất hay được ứng dụng
trong các ứng dụng đo nhiệt độ thời gian thực ( nhưng vẫn còn sai số lớn) . Với
kích thước nhỏ và giá thành rẻ là một trong những ưu điểm của nó. Vì đây là cảm
biến tương tự (analog sensor) nên ta có thể dễ dàng đọc được giá trị của nó bằng
hàm analogRead().
Nhiệt độ được xác định bằng cách đo hiệu điện thế ngõ ra của LM35.
Độ chính xác thực tế: 1/4°C ở nhiệt độ phòng và 3/4°C ngoài khoảng 2°C tới 150°C công
suất tiêu thụ là 60uA.
Cảm biến LM35 hoạt động bằng cách cho ra một giá trị hiệu điện thế nhất định tại chân
Vout (chân giữa) ứng với mỗi mức nhiệt độ.
Như vậy, bằng cách đưa vào chân bên trái của cảm biến LM35 hiệu điện thế 5V, chân
phải nối đất, đo hiệu điện thế ở chân giữa bằng các pin A0 trên arduino (giống y hệt cách
đọc giá trị biến trở), bạn sẽ có được nhiệt độ (0-100ºC) bằng công thức:
Với LM35, bạn có thể tự tạo cho mình mạch cảm biến nhiệt độ sử dụng LM35 và tự động
ngắt điện khi nhiệt độ vượt ngưỡng tối đa, đóng điện khi nhiệt độ thấp hơn ngưỡng tối
thiểu thông qua module rơ le...
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
192
Lắp mạch:
Lập trình:
Code lập trình sẽ được lưu trong file ( file _code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
193
int sensorPin = A0; // chân analog kết nối tới cảm biến LM35
void setup() {
Serial.begin(9600); //Khởi động Serial ở mức baudrate 9600
// Bạn không cần phải pinMode cho các chân analog trước khi dùng nó
}
void loop() {
//đọc giá trị từ cảm biến LM35
int reading = analogRead(sensorPin);
//tính ra giá trị hiệu điện thế (đơn vị Volt) từ giá trị cảm biến
float voltage = reading * 5.0 / 1024.0;
// cứ mỗi 10mV = 1 độ C.
// Vì vậy nếu biến voltage là biến lưu hiệu điện thế (đơn vị Volt)
// thì ta chỉ việc nhân voltage cho 100 là ra được nhiệt độ!
Serial.println(temp);
delay(1000); //đợi 1 giây cho lần đọc tiếp theo
}
17. Đọc giá trị CB nhiệt độ DS18B20 hiển thị lên serial monitor.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
194
Về căn bản, cảm biến này cũng giống như LM35, các bạn có thể xem phần cảm
biến LM35 ở phần trước. DS18B20 dùng cơ chế truyền tín hiệu 1-Wire. Nôm na
với cái cơ chế này, chúng ta có thể đọc nhiều con DS18B20 cùng một lúc trên cùng
1 dây.
Sử dụng một chân data với 64bit serial code cho phép chúng ta dùng nhiều
con trên cùng 1 chân digial (cơ chế 1-Wire)
Có thể cấp nguồn từ 3 - 5.5V
Đo từ -55°C đến +125°C sai số ±0.5°C nếu đang trong khoản -10°C đến
+85°C
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
195
Lắp mạch:
Đối với loại không dây:
Lập trình:
Trước khi bắt tay vào lập trình ta cần phải tải hai thư viện sau và add vào thư viện
cho arduino IDE:
Cách add thư viện vào Ardunio IDE: Xem tại đây
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
196
Ta bắt tay vào lập trình sau khi add xong 2 thư viện trên.
Code lập trình sẽ được lưu trong file ( file _code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
#include <OneWire.h>
#include <DallasTemperature.h>
// Chân nối với Arduino
#define ONE_WIRE_BUS 2 //Thiết đặt thư viện onewire
OneWire oneWire(ONE_WIRE_BUS);
//Mình dùng thư viện DallasTemperature để đọc
DallasTemperature sensors(&oneWire);
void setup(void)
{
Serial.begin(9600);
sensors.begin();
}
void loop(void)
{
sensors.requestTemperatures();
Serial.print("Nhiet do");
Serial.println(sensors.getTempCByIndex(0)); // Vì chỉ 1cảm biến nên dùng 0
//chờ 1 s rồi đọc giá trị cảm biến
delay(1000);
}
Sau khi upload chương trình xong các bạn mở cổng Serial port xem kết quả
nhé.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
197
18. Hiển thị giá trị CB nhiệt độ LM35 lên mà hình LCD.
Lắp mạch :
Lập trình :
Code lập trình sẽ được lưu trong file ( file _code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
int sensorPin = A0; // chân analog kết nối tới cảm biến LM35
LiquidCrystal_I2C lcd(0x3F,16,2);
void setup()
{
Serial.begin(9600); //Khởi động Serial ở mức baudrate 9600
lcd.init();
lcd.backlight();
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
198
lcd.print("NHIET DO");
}
void loop()
{
//đọc giá trị từ cảm biến LM35
int reading = analogRead(sensorPin);
//tính ra giá trị hiệu điện thế (đơn vị Volt) từ giá trị cảm biến
float voltage = reading * 5.0 / 1024.0;
// cứ mỗi 10mV = 1 độ C.
// Vì vậy nếu biến voltage là biến lưu hiệu điện thế (đơn vị Volt)
float temp = voltage * 100.0;
Serial.println(temp);
lcd.setCursor(0, 1);
lcd.print("T =");
lcd.setCursor(5, 1);
lcd.print(temp);
delay(1000); //đợi 1 giây cho lần đọc tiếp theo
}
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
199
19. Đọc giá trị cảm biến mưa hiển thị lên serial monitor.
Chúng ta có thể dễ dàng nhận biết mưa bằng mắt thường hoặc cảm nhận ở da.
Với tư tưởng ấy, các hệ thống điện tử phát hiện mưa cũng chia ra làm hai loại: thứ
nhất là dùng camera để nhận biết và loại thứ hai là dùng cảm biến (tương tự da của
con người). Trong môi trường Arduino, bạn có thể dùng cả 2 cách trên để phát
hiện mưa. Tuy nhiên, để tiết kiệm chi phí và dễ dàng trong việc lập trình, cài đặt,
người ta thường chọn phương pháp thứ hai.
Vấn đề về phát hiện mưa thì cực kì đơn giản, nhưng để truyền dữ liệu cảm biến
mưa về trung tâm xử lý thì khó hơn đôi chút.
Mạch cảm biến mưa hoạt động bằng cách so sánh hiệu điện thế của mạch cảm biến
nằm ngoài trời với giá trị định trước (giá trị này thay đổi được thông qua 1 biến trở
màu xanh) từ đó phát ra tín hiệu đóng / ngắt rơ le qua chân D0(digital) hoặc
AO(analog). Vì vậy, chúng ta dùng một chân digital hoặc analog để đọc tín hiệu từ
cảm biến mưa.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
200
Khi cảm biến khô ráo (trời không mưa), chân D0 của module cảm biến sẽ được
giữ ở mức cao (5V). Khi có nước trên bề mặt cảm biến (trời mưa), đèn LED màu
đỏ sẽ sáng lên, chân D0 được kéo xuống thấp (0V).
Lắp mạch :
Lập trình :
Code lập trình sẽ được lưu trong file ( file _code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
int rainSensor = 6; // Chân tín hiệu cảm biến mưa ở chân digital 6 (arduino)
void setup() {
pinMode(rainSensor,INPUT);// Đặt chân cảm biến mưa là INPUT, vì tín hiệu sẽ
được truyền đến cho Arduino
Serial.begin(9600);// Khởi động Serial ở baudrate 9600
}
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
201
void loop() {
int value = digitalRead(rainSensor); //Đọc tín hiệu cảm biến mưa
if (value == HIGH) { // Cảm biến đang không mưa
Serial.println("Khong mua");
}
else
{
Serial.println("Dang mua");
}
delay(1000); // Đợi 1 giây cho lần kiểm tra tiếp theo.
}
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
202
20. Đọc giá trị CB siêu âm SRF 05 hiển thị lên serial
monitor.
Robot khi ở chế độ tự động, nó phải lấy thông tin của môi trường xung quanh
như: khoảng cách, nhiệt độ, ánh sáng ... Và tiến hành phân tích các dữ liệu đó, cuối
cùng ra quyết định phù hợp. Ví dụ như robot tự tìm đường đi thì nó phải tính được
xem phía trước có vật cản hay không, và tiến hành đi tới hay rẽ sang một hướng
khác. Bài viết này sẽ hướng dẫn bạn đọc hiểu và sử dụng được một trong những
cảm biến khoảng cách phổ biến - SRF05.
Việc tính toán khoảng cách cũng còn phụ thuộc rất nhiều vào môi trường truyền
dẫn, ví dụ như sóng âm truyền trong môi trường nước hay kim loại sẽ nhanh hơn
rất nhiều so với sóng âm được truyền trong môi trường không khí. Lưu ý là sóng
âm không thể truyền được trong môi trường chân không.
Cảm biến siêu âm SRF05 cũng hoạt động theo như nguyên tắc ở trên, thiết bị
gồm có 2 loa - thu và phát - cùng với 5 chân để kết nối với Arduino, tầm hoạt động
tối đa của cảm biến này nằm trong khoảng từ 1 đến 2m.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
203
Lắp mạch :
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
204
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
205
Lập trình :
Code lập trình sẽ được lưu trong file ( file _code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
Ta biết thời gian âm thanh truyền trong không khí ở 20°C là 344 m/s. Bằng quy
tắc tam suất đơn giản ta có thể dễ dàng tính được sóng âm di chuyển 1 cm trong
không khí sẽ mất 1000 / 344 * 100 ~= 29.1.
Arduino cung cấp cho ta hàm pulseIn có tác dụng trả về thời gian (tính bằng
milisec) kể từ khi hàm này được gọi cho đến khi có tín hiệu tại PIN chỉ định trước,
hay trả về 0 nếu không nhận được tín hiệu / quá thời gian timeout.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
206
21. Đọc giá trị cảm biến độ ẩm đất hiển thị lên LCD16x02.
Cảm biến phát hiện độ ẩm đất, bình thường đầu ra của cảm biến độ ẩm đất là
digital (D0) và analog (A0), tùy các bạn có thể lựa chọn chân số (digital) hay
chân tương tự (analog) để lập trình,
Độ nhạy của cảm biến độ ẩm đất có thể điều chỉnh được (Bằng cách điều
chỉnh biến trở màu xanh trên board mạch) cái này chỉ có tác dụng với chân
digital (D0).
Phần đầu dò được cắm vào đất để phát hiện độ ẩm, khi độ ầm của đất đạt
ngưỡng thiết lập, đầu ra D0 sẽ chuyển trạng thái từ mức thấp lên mức cao.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
207
Thông số kỹ thuật:
Lắp mạch :
Trong bài học này ta ứng dụng giá trị cảm biếm độ ẩm đất đọc về để điều khiển
đóng ngắt rơ le 5Vdc.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
208
Lập trình :
//Chương trình ĐỌC DỮ LIÊU TỪ CẢM BIẾN ĐO ĐỘ ẨM ĐẤT
int CBDoAm = A1; //Nối chân ra của cảm biến đo độ ẩm với chân A1
#define role 12 //Chân nối với role 12
float doamdat; //Biến độ ẩm đất
void setup()
{
Serial.begin(9600);
//Khai báo các chân
pinMode(role,OUTPUT);
}
void loop()
{
doamdat=analogRead(CBDoAm);
Serial.print("Do am la:");
Serial.print(doamdat); //In ra độ ẩm đất (serial monitor)
//Bơm nước khi đất khô( thông qua role)
if(doamdat<200)
{
digitalWrite(role,HIGH); //Bat role de tuoi cay,…
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
209
Serial.println("Tuoi cay");
}
//Ngưng bơm khi đất ướt
else
{
digitalWrite(role,LOW);
Serial.println("Cay du nuoc");
}
delay(1000);
}
22. Đọc giá trị CB dò line hiển thị lên serial monitor và LCD.
Cảm biến dò line có thể dùng để phát hiện line trắng và đen. Mạch sử dụng cảm
biến hồng ngoại với khoảng cách phát hiện từ 1~25mm. Có thể điều chỉnh độ nhạy
của cảm biến bằng cách điều chỉnh biến trở được tích hợp sẵn trên module.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
210
Thông số kỹ thuật:
• Nguồn cung cấp: 3.3V - 5V.
• Dòng điện tiêu thụ: <10mA.
• Dải nhiệt độ hoạt động: 0 độ C ~ 50 độ C
• Ngõ ra giao tiếp: 3 chân (VCC, GND, OUT)
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
211
Lắp mạch :
Lập trình :
Code lập trình sẽ được để trong một file ( file_code) riêng để tránh việc bị lỗi.
// CHƯƠNG TRÌNH THỬ ĐẶC TÍNH CỦA CẢM BIẾN DÒ LINE
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define den 8 // Sử dụng chân 8 để điều khiển đèn led
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
212
#define tinhieu 2 //Chân S của cảm biến nối với chân 2 trên mạch Arduino
int x; //Tên biến chứa giá trị của cảm biến dò đường
LiquidCrystal_I2C lcd(0x3F,16,2); // dia chi của i2c lcd
void setup()
{
Serial.begin(9600); //Đưa dữ liệu lên máy tính để quan sát
pinMode(den,OUTPUT); //Định nghĩa chân ra để điều khiển đèn led
pinMode(tinhieu,INPUT); //Định nghỉa chân 2 là chân lấy tín hiệu vào của cảm
biến
lcd.init();
lcd.backlight();
lcd.print("CB DO LINE");
}
void loop()
{
Serial.println(x);
lcd.setCursor(0, 1);
lcd.print("x =");
lcd.setCursor(5, 1);
lcd.print(x);
if(x==HIGH) //nếu x=1 (gặp màu đen) thì đèn tắt
{
digitalWrite(den,LOW);
}
if(x==LOW) //Nếu x=0 (gặp màu trắng) thì đèn sáng
{
digitalWrite(den,HIGH);
}
delay(1000); //Chờ 1 giây để hệ thống đáp ứng
}
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
213
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
214
23. Đọc giá trị điện áp khi điều chỉnh biến trở hiển thị lên
serial
Phần màu vàng là một lớp điện trở. Cây kim màu xanh được đè chặt xuống
phần điện trở này. Giả sử có dòng điện đi từ 1 đến 2 thì nó sẽ phải qua phần màu
vàng (được tô đỏ) và đó chính là điện trở hiện tại của biến trở. Bạn chỉ việc vặn
cây kim để tăng giảm độ dài của vùng màu đỏ, qua đó tăng giảm giá trị điện trở.
Khi vặn biến trở, ta sẽ làm thay đổi điện trở ở phần màu đỏ và màu vàng (do
điện tích của chúng thay đổi), qua đó làm thay đổi điện áp ở chân 2.
Phần cứng chuẩn bị: (bộ kit đã tích hợp sẵn biến trở 10K)
Lắp mạch :
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
215
Lập trình :
Code lập trình sẽ được lưu trong một file ( file_code) riêng để tránh việc bị lổi,
code bên dưới chỉ dưới dạng giải thích.
void setup() {
Serial.begin(9600); //Mở cổng Serial để giap tiếp
}
void loop() {
int value = analogRead(A0); //đọc giá trị điện áp ở chân A0
//(value luôn nằm trong khoảng 0-1023)
Serial.println(value); //xuất ra giá trị vừa đọc
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
216
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
217
24. Hiển thị thời gian thực (DS1307) lên LCD và serial monitor.
Trước tiên bạn cài 3 thư viện : Wire ( thư viện này đã có sẵn), DS1307 và I2C
cho arduino IDE. Các bạn tải thư viện tại links sau: http://tdhshop.com.vn/tong-
hop-cac-thu-vien-cho-arduino
Wire.begin(address (optional));
• Khởi tạo thư viện Wire.h và tham gia vào I2C bus.
• address: 7-bit địa chỉ của thiết bị "Slave" (optional); nếu không có địa chỉ thì
coi như "Master".
Wire.beginTransmission(address);
• Bắt đầu truyền dữ liệu đến thiết bị "Slave" với address đã có.
Wire.endTransmission();
• Kết thúc truyền dữ liệu đến thiết bị "Slave" đã được bắt đầu
bởi Wire.beginTransmission(address).
Wire.write(value);
• Ghi dữ liệu lên thiết bị "Slave", được gọi giữa beginTransmission()
và endTransmission().
Wire.read();
• Đọc dữ liệu được truyền từ thiết bị "Slave" đến Arduino, được gọi sau
requestFrom().
Wire.requestFrom(address, quantity);
• Được sử dụng bởi thiết bị "Master" để yêu cầu dữ liệu từ thiết bị "Slave".
• address: là địa chỉ của thiết bị "Slave".
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
218
Phần cứng chuẩn bị: (bộ kit đã tích hợp sẵn biến trở 10K)
Lắp mạch :
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
219
Lập trình :
Code lập trình sẽ được lưu trong một file ( file_code) riêng để tránh việc bị lổi,
code bên dưới chỉ dưới dạng giải thích.
#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,16,2); // 0x3F là địa chỉ của lcd 16x2
void setup () {
lcd.init();
lcd.backlight(); // bật đèn nền LCD
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("H:");
lcd.setCursor(0, 1);
lcd.print("D:");
Serial.begin(9600);
Wire.begin();
Wire.beginTransmission(0x68); // địa chỉ của ds1307
Wire.write(0x07);
Wire.write(0x10);
RTC.begin();
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
RTC.adjust(DateTime(__DATE__, __TIME__)); //dòng này nạp 1 lần rồi xóa rồi
nạp lại thì thời gian sẽ không bị chạy lại khi mất điện.
}
}
void loop () {
lcd.setCursor(4, 0);
lcd.print(now.hour(), DEC); // in ra giờ lên LCD
lcd.print(":");
lcd.print(now.minute(), DEC); // in ra phút lên LCD
lcd.print(":");
lcd.print(now.second(), DEC); // in ra giây lên LCD
lcd.print(" ");
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
220
Serial.print(now.day(), DEC);
Serial.print("/");
Serial.print(now.month(), DEC);
Serial.print("/");
Serial.print(now.year(), DEC);
Serial.print("");
Serial.println();
lcd.setCursor(4, 1);
lcd.print(now.day(), DEC); // in ra ngày lên LCD
lcd.print("/");
lcd.print(now.month(), DEC); // in ra tháng lên LCD
lcd.print("/");
lcd.print(now.year(), DEC); // in ra năm lên LCD
lcd.print("");
delay(1000);
}
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
221
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
222
Thông số kỹ thuật:
Điện áp cung cấp: 3.3
Độ phân giải 20 xung /vòng.
Các chân tín hiệu:
+: chân cấp nguồn dương.
GND: chân cấp nguồn âm.
CLK: phase A.
DT: phase B.
SW: button
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
223
Để điều khiển số vòng quay hay vận tốc động cơ thì chúng ta nhất thiết phải đọc
được góc quay của motor.
Encoder thường bao gồm kênh A, kênh B. Trong hình bạn thấy hãy chú ý một lỗ
nhỏ bên phía trong của đĩa quay và một cặp phát - thu dành riêng cho lỗ nhỏ này.
Cữ mỗi lần motor quay được một vòng. Bên ngoài đĩa quay được chia thành các
rãnh nhỏ và một cặp thu-phát khác dành cho các rãnh này. Đây là kênh A của
encoder. Mỗi loại encoder có độ phân giải khác nhau, có khi trên mỗi đĩa chĩ có vài
rãnh nhưng cũng có trường hợp đến hàng nghìn rãnh được chia. Để điều khiển
động cơ, bạn phải biết độ phân giải của encoder đang dùng. Độ phân giải ảnh
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
224
hưởng đến độ chính xác điều khiển và cả phương pháp điều khiển tuy nhiên trên
các encoder còn có một cặp thu phát khác được đặt trên cùng đường tròn với
kênh A nhưng lệch một chút (lệch M+0,5 rãnh), đây là kênh B của encoder. Tín
hiệu xung từ kênh B có cùng tần số với kênh A nhưng lệch pha 90o. Bằng cách
phối hợp kênh A và B người đọc sẽ biết chiều quay của động cơ.
gọi. Trong trình phục vụ ngắt này chúng ta kiểm tra mức của kênh B, tùy theo mức
của kênh B chúng ta sẽ tăng biến đếm xung lên 1 hoặc giảm đi 1. Tuy nhiên, bạn
cần phải tính toán rất cẩn thận khi sử dụng phương pháp này. Ví dụ trường hợp
encoder có độ phân giải 2000 xung/vòng, motor bạn quay với vận tốc 100 vòng/s
thì tần số xung trên kênh A của encode là 2000x100=200KHz, nghĩa là cứ mỗi 5 us
ngắt ngoài xảy ra một lần. Tần số ngắt như thế là quá cao cho AVR, điều này có
nghĩa là AVR chỉ tập trung cho mỗi việc “đếm xung”, không có đủ thời gian để
thực thi các việc khác.
Trong bài này, chúng ta chọn độ phân giải của encoder là 20 (20 xung trên mỗi
vòng quay, loại encoder đơn giản nhất).
Lắp mạch:
Lập trình :
Code lập trình sẽ được lưu trong một file ( file_code) riêng để tránh việc bị lổi,
code bên dưới chỉ dưới dạng giải thích.
Trước tiên ta phải add thêm thư viện I2C cho arduino IDE.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
226
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,20,4);
// Cách nối các chân trên Encoder quay
#define encoderPinA 2 // Tương ứng chân DT trên Encoder quay
#define encoderPinB 3 // Tương ứng chân CLK trên Encoder quay
// Chân + nối nguồn 5V và chân GND nối cực âm
volatile int encoderPos = 0; // Cho vị trí đầu bằng 0
int lastReportedPos = 1; // Vị trí cuối bằng 1
static boolean rotating=false; // Quản lý debounce (giống như là chống nhiễu)
// các biến cho trình phục vụ ngắt interrupt
boolean A_set = false;
boolean B_set = false;
//Đo tốc độ
int newposition;
int oldposition=0;
long newtime;
long oldtime=0;
int vantoc = 0;
int sovong = 0;
void setup() {
lcd.begin(20,4);
lcd.init();
lcd.backlight();
pinMode(encoderPinA, INPUT_PULLUP); // INPUT-PULLUP tương đương
Mode INPUT và tự động nhận trạng thái HIGH hoặc LOW
pinMode(encoderPinB, INPUT_PULLUP);
Serial.begin(9600); // chuyển dữ liệu lên cổng Serial Port
lcd.setCursor(0,1);
lcd.print("SO VONG = ");
}
// Vòng lặp chính, công việc được thực hiện bởi trình phục vụ ngắt
void loop() {
delay(1000);
rotating = true; // Khởi động bộ debounce (có thể hiểu như bộ chống nhiễu)
newtime=millis();
detachInterrupt(0);
detachInterrupt(1);
vantoc = (newposition-oldposition)*60/20;
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
227
Serial.print("vantoc=");
Serial.println(vantoc,DEC);
oldposition=newposition;
oldtime=newtime;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("TOC DO = ");
lcd.setCursor(11,0);
lcd.print(vantoc);
lcd.print(" RPM");
lcd.setCursor(0,1);
lcd.print("SO VONG = ");
lcd.setCursor(11,1);
lcd.print(sovong,DEC);
attachInterrupt(0, doEncoderA, CHANGE);
attachInterrupt(1, doEncoderB, CHANGE);
}
// Ngắt khi chuyển trạng thái của A
void doEncoderA(){
if ( rotating ) delay (1); // Chờ 1 chút
// Kiểm tra việc chuyển đổi trạng thái, xem có thật sự thay đổi trạng thái chưa
if( digitalRead(encoderPinA) != A_set ) {
A_set = !A_set;
// Cộng 1 nếu có tín hiệu A rồi có tín hiệu B
if ( A_set && !B_set )
encoderPos += 1;
ganxung += 1;
sovong=encoderPos/20;
if (ganxung == 42){ganxung=0;}
rotating = false; // Không cần debounce nữa cho đến khi được nhấn lần nữa
}
}
// Ngắt khi thay đổi trạng thái ở B, tương tự như ở A
void doEncoderB(){
if ( rotating ) delay (1);
if( digitalRead(encoderPinB) != B_set ) {
// Trừ 1 nếu B rồi đến A
if( B_set && !A_set )
encoderPos -= 1;
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
228
rotating = false;
}
}
Hình ảnh thực tế:
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
229
(TWI) vì chỉ sử dụng 2 kết nối để truyền tải dữ liệu, 2 kết nối của giao tiếp I2C
gồm: SDA (Serial Data Line) và SCL (Serial Clock Line).
Có hàng ngàn thiết bị sử dụng giao tiếp I2C, chẳng hạn như real-time clocks,
digital potentiometers, temperature sensors, digital compasses, memory chips, FM
radio circuits, I/O expanders, LCD controllers, amplifiers,...Board Arduino của
chúng ta có thể kiểm soát tất cả và số lượng tối đa trong một thời điểm lên đến 112
thiết bị I2C.
Trên board Arduino UNO, SDA là chân analog A4, SCL là chân analog A5.
Module DHT11:
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
230
1 LCD 16x02.
1 I2C cho LCD.
2 nút nhấn.
2 điện trở 10K.
Dây cắm test board.
Sơ đồ nối dây của nút nhấn như sau: ( ở trên là 3 nút nhấn ghép lại với nhau
thành 1 module do shop thiết kế (như hình ở dưới), các bạn cũng có thể làm được,
thực hiện giống như hình sau, với nhiều nút nhấn theo ý muốn của mình).
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
231
Lập trình :
Code lập trình sẽ được lưu trong file ( file_code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
void setup()
{
Serial.begin(9600);
pinMode(buttonDN, INPUT_PULLUP);
pinMode(buttonUP, INPUT_PULLUP);
pinMode(role, OUTPUT);//KICH ROLAY
setTempC = startTempC;
setTempC1 = startTempC;
dht11.begin();
}
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
232
void loop()
{
setTemperature();
setHeater();
displayLCD();
}
void displayLCD(){
float t1 = dht11.readTemperature();
lcd.init();
lcd.backlight();// initialize the lcd
lcd.clear();
lcd.home ();
lcd.setCursor(0,0);
lcd.print("T1: ");
lcd.setCursor(3,0);
lcd.print(round(t1));
lcd.print("");
lcd.write(1);
lcd.print("C");
…………………………………
lcd.createChar(1, degree);
}
void setTemperature()
{
if (digitalRead(buttonDN)==HIGH){
setTempC++;
if(setTempC < minTempC) setTempC = minTempC;
}
if (digitalRead(buttonUP)==HIGH){
//setTempC += incPlus;
setTempC--;
if(setTempC > maxTempC) setTempC = maxTempC;
}
}
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
233
void setHeater() // chương trình con so sánh giá trị cài đặt với giá trị thực
{
if ((setTempC) > t1){
digitalWrite(role, LOW);
lcd.setCursor(8,1);
lcd.print("TAT QUAT");
}
else if (setTempC <= (t1)){
digitalWrite(role, HIGH);
lcd.setCursor(8,1);
lcd.print("MO QUAT");
}
}
Hình ảnh thực tế:
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
234
Động cơ servo cũng được chia làm nhiều loại, phụ thuộc vào góc quay tối đa
của chúng, 2 loại phổ biến hay sử dụng là:
Như đã đề cập bên trên, động cơ servo là loại động cơ cho phép ta điều khiển
một cách cực kì chính xác. Vì vậy, khác với động cơ thông thường ta chỉ cần cấp
nguồn cho động cơ là có thể vận hành được. Động cơ servo yêu cầu ta phải cấp
nguồn (2 dây) và nhận điều khiển từ mạch chính (1 dây), mỗi dây thường được
đánh màu như sau:
Đỏ: nhận điện nguồn, tuỳ vào loại động cơ mà giá trị này có thể khác nhau
Nâu: nối với cực âm của mạch
Vàng: nhận tín hiệu từ mạch điều khiển
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
235
Lắp mạch:
Lập trình :
Code lập trình sẽ được lưu trong file ( file_code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
#include <Servo.h>
#define SERVO_PIN 9 // chan tin hieu cua servo noi voi chan so 9 arduino
Servo gServo;
void setup()
{
gServo.attach(SERVO_PIN);
}
void loop()
{
gServo.write(0); // điều chỉnh góc xoay của servo.
delay(1000);
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
236
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
237
Động cơ bước là một loại động cơ mà ở đó bạn sẽ có thể quy định chính xác số
góc quay và động cơ bước sẽ phải quay. Không giống như Servo, động cơ bước
có thể quay bao nhiêu độ tùy ý và mỗi lần quay nó sẽ quay được 1 step, 1 step ở
đây là bao nhiêu còn phụ thuộc vào động cơ bước của bạn. Ví dụ , động cơ bước
của bạn có 72 step thì nó sẽ cần quay 72 step để hoàn thành một vòng quay. Số
step này là hằng số, nhưng bạn có thể dùng công nghệ micro step để "cải thiện" số
vòng quay động cơ bước của bạn.
Động cơ bước sử dụng trong phần này là động cơ bước 4 pha (thực ra là 2 pha
được chia ra làm 2 ở mỗi pha ngay tại vị trí giữa) (gồm 5 dây), 4 trong 5 dây này
được kết nối với 2 cuộn dây trong động cơ và 1 dây là dây nguồn chung cho cả 2
cuộn dây. Mỗi bước của động cơ quét 1 góc 5.625 độ, vậy để quay 1 vòng động cơ
phải thực hiện 64 bước.
Thông số kỹ thuật:
Điện thế hoạt động 5V
Số pha 4
Tỉ lệ bánh răng *64
Một bước tương đương 5.625° (64 bước)
Tần số 100Hz
Điện trở trong 50Ω±7%(25℃)
Lắp mạch:
Lập trình :
Code lập trình sẽ được lưu trong file ( file_code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
Động cơ BYJ48 Stepper chỉ có sẵn bộ hộp số và nó cho ta đến *64 (tỉ lệ bánh răng)
=> nó có đến 64 * 64 = 4096 bước.
void setup()
{
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
239
Serial.begin(9600);
pinMode(IN1, OUTPUT); // các chân IN quy định là các chân ra
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
}
void loop()
{
for(int x=0;x<Steps;x++)
{
step1();
//delay(1);
delayMicroseconds(2500);
}
delay(1000);
void step1()
{
//stepp
switch(cstep)
{
case 0:
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
break;
case 1:
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, HIGH);
break;
case 2:
………………………………
digitalWrite(IN4, LOW);
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
240
break;
}
cstep=cstep+1;
if(cstep==8)
{cstep=0;}
}
Hình ảnh thực tế:
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
241
Hầu hết chúng ta đã sử dụng remote hồng ngoại để điều khiển TV, quạt, máy
điều hòa,....nhưng không phải ai cũng biết remote làm việc ra sao. Tín hiệu hồng
ngoại là 1 chùm sóng ánh sáng không thể nhìn thấy bằng mắt thường, do đó, bạn
không thể thấy ánh sáng khi nhìn vào cái đèn LED nhỏ ở đầu của remote. Ta dùng
remote hồng ngoại loại nào cũng được….
Trên remote có 1 hoặc nhiều LEDs hồng ngoại (IR LED) được sử dụng để truyền
tín hiệu hồng ngoại. Nhìn bên ngoài thì IR LED giống hệt LED thường, nhưng vì
nó phát ra ánh sáng hồng ngoại nên bạn không thể thấy được ánh sáng của nó bằng
mắt thường.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
242
Tín hiệu này sẽ được nhận bởi 1 bộ thu hồng ngoại đặc biệt và chuyển thành dạng
xung điện, sau đó các xung điện này được chuyển đổi thành dữ liệu được sử dụng
cho các thiết bị điện tử.
Nếu bạn tò mò muốn biết ánh sáng hồng ngoại nó như thế nào, hãy nhấn 1 nút
bất kỳ trên remote rồi nhìn vào cái đèn LED ở đầu remote thông qua 1 chiếc
camera nhé!
Trong bài viết này mình sử dụng IR receiver loại 36Khz. Vì mỗi loại IR receiver
có sơ đồ chân khác nhau nên các bạn nên tham khảo datasheet của nó nhé!!!
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
243
Lắp mạch:
Lập trình:
Code lập trình sẽ được lưu trong file ( file_code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
Trước hết các bạn phải add thư viện IR remote vào Arduino IDE. Các bạn tải TẠI
ĐÂY.
Sau khi tải thư viện về, bạn mở cửa sổ IDE, các bạn chọn Sketch--->Import
Library...---> Add Library....sau đó chọn file .zip mà bạn vừa tải về để có thể sử
dụng thư viện. Các bạn có thể tham khảo cách add thư viện TẠI ĐÂY.
Tiếp theo ta upload đoạn code (DOCFILEHEX) sau, các bạn mở cửa sổ Serial và
bấm các nút của remote, tùy loại remote sẽ có giá trị trả về khác nhau và các bạn
nên ghi lại giá trị file HEX để ta lập trình.
Đấy là các giá trị HEX của tín hiệu được gửi từ remote, thử tất cả các nút của
remote các bạn sẽ biết được IR codes của nó.
// Chương trình (CODE) đọc giá trị HEX của từng nút nhấn của Remote hồng
ngoại.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
244
Sau khi đọc được từng giá trị file HEX của các nút nhấn, các bạn nên ghi lại. Tiếp
theo ta nạp chương trình (dieukhienledbangremote) cho arduino sử dụng remote để
bật tắt LED với những giá trị hex ta đã đọc được ở trên.
switch(results.value)
{
case 0xFF30CF: stateRED = !stateRED; //ví dụ nhấn số 1(0xFF30CF: g tri hex
số 1)
digitalWrite(RED, stateRED);
break;
case 0xFF6897: stateRED = stateYELLOW = stateGREEN = false;//NHAN SO 0
digitalWrite(RED, 0);
}
}
void loop()
{
if (irrecv.decode(&results)) // nếu nhận được tín hiệu
{
translateIR();
Serial.println(results.value, HEX);
delay(200);
irrecv.resume(); // nhận giá trị tiếp theo
}
}
o IRrecv irrecv(receiverPin);: tạo đối tượng IRrecv mới có tên là irrecv sử dụng tham
số là receiverPin.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
246
Trong bài này, tôi sẽ hướng dẫn các bạn sử dụng IC L298 đã tích hợp sẵn mạch cầu H,
ứng dụng trong việc điều khiển cùng lúc 2 động cơ theo chiều quay bất kì, kết hợp với
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
247
điều xung PWM có thể điều chỉnh tốc độ xoay của động cơ. PWM để cân bằng độ chênh
lệch giữa 2 bánh xe.
Thông số kỹ thuật:
12V power, 5V power: bên trong mạch có sử dụng IC điều hướng dòng điện, hoạt
động với điện áp 5V, khi nối nguồn 12V mạch sẽ hoạt động với nguồn 12V, tuy
nhiên mạch sẽ điều hướng dòng điện.
o Điện áp 12V điều khiển động cơ để hoạt động.
o Hạ điện áp xuống thành 5V và cấp nguồn cho IC.
Như vậy khi cấp nguồn 9V: động cơ hoạt động với dòng 9V và IC của mạch sẽ
hoạt động với điện áp 5V. Việc thiết kế có nhằm điều hướng thành 2 điện áp khác
nhau giúp IC hoạt động ổn định và tách nguồn riêng biệt với động cơ.
Power GND chân này là GND của nguồn cấp cho Động cơ.
2 Jump A enable và B enable, nếu bạn dùng Board để điều khiển động cơ bước thì
giữ nguyên. Nếu điều khiển động cơ bình thường thì nối với chân PWM để điều
khiển tốc độ.
Gồm có 4 chân Input. IN1, IN2, IN3, IN4.
Output A: nối với động cơ giảm tốc V1. bạn chú ý chân +, -. Nếu bạn nối ngược
thì động cơ sẽ chạy ngược.
Lắp mạch.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
248
Lập trình:
Code lập trình sẽ được lưu trong file ( file_code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
#define ENA 8 //enable A on pin 8
#define ENB 3 //enable B on pin 3
#define IN1 7 //IN1 on pin 7
#define IN2 6 //IN2 on pin 6
#define IN3 5 //IN3 on pin 5
#define IN4 4 //IN4 on pin 4
void setup()
{
pinMode(ENA, OUTPUT);
pinMode(ENB, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
}
void loop()
{
motorA(1, 25); //cho motor A chạy 25% tốc độ CHẠY THUẬN
delay(5000); //chạy 25% trong 5 s
motorA(3, 100); //thắng động cơ A
motorB(1, 25); //cho motor B chạy 25% tốc độ.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
249
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
250
Thông số kỹ thuật:
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
251
URXD(RX) — dùng để nhận tín hiệu trong giao tiếp UART với vi điều
khiển
VCC — đầu vào 3.3V
GPIO 0 — kéo xuống thấp cho chế độ upload bootloader
RST — chân reset cứng của module, kéo xuống mass để reset
GPIO 2 — thường được dùng như một cổng TX trong giao tiếp UART để
debug lỗi
CH_PD — kích hoạt chip, sử dụng cho Flash Boot và updating lại module,
nối với mức cao
GND — nối với mass
UTXD (TX) — dùng để truyền tín hiệu trong giao tiếp UART với vi điều
khiển
Lắp mạch:
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
252
Lập trình :
Code lập trình sẽ được lưu trong file ( file_code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
Arduino Uno gửi lệnh điều khiển (tập lệnh AT) cho ESP8266 cũng bằng giao tiếp
UART. Tuy nhiên board Arduino chỉ có 1 chân RX và 1 chân TX cho phép thực
hiện giao tiếp UART. Điều đó dẫn đến 2 sự lựa chọn:
a. Sử dụng chân RX và TX có sẵn trên Arduino để nạp code sau khi nạp code
xong thì mới kết nối 2 chân đó với ESP8266. Với phương pháp này bạn phải
thêm một khoảng thời gian delay ở hàm setup() để đảm bảo là sau khi kết
nối ESP8266 với Arduino, thì ESP8266 vẫn nhận được đầy đủ các tập lệnh
AT từ Arduino. Tuy nhiên, bạn không thể debug qua cổng Serial do cổng
này đang đóng vai trò kết nối với ESP8266.
b. Sử dụng SoftwareSerial để giả lập thêm 1 cổng Serial nữa để gửi tập lệnh
AT cho ESP8266. Thư viện SoftwareSerial đã được trang bị sẵn trong
Arduino IDE nên bạn không cần phải tải thêm. Với cách này thì bạn có thể
debug thông qua Serial tuy nhiên code sẽ phức tạp hơn.
Ở ví dụ dưới đây tôi chọn phương án thứ nhất và chọn thời gian delay là 5s để kết
nối chân TX và RX của Arduino với chân RX và TX của ESP8266 ngay sau khi
nạp code thành công.
* Lưu ý : TRONG QUÁ TRÌNH NẠP CODE CÁC BẠN NÊN RÚT DÂY TX VÀ RX RA
KHỎI ARDUINO, KHI NẠP CODE XONG TA HÃY CẮM LẠI
#define LED_PIN 13
#define CMD_SEND_BEGIN "AT+CIPSEND=0"
#define CMD_SEND_END "AT+CIPCLOSE=0"
#define TDHshop_PROTOCOL_HTTP 80
#define TDHshop_PROTOCOL_HTTPS 443
#define TDHshop_PROTOCOL_FTP 21
#define TDHshop_PROTOCOL_CURRENT TDHshop_PROTOCOL_HTTP
#define TDHshop_CHAR_CR 0x0D
#define TDHshop_CHAR_LF 0x0A
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
253
……………………………………………………………………………..
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
254
Tiếp đến trên máy tính hay điện thoại ta kết nối với Wifi có
tên TDHshop.com.vn và nhập pass cho nó "123456789" . Tiếp theo mở trình duyệt
Web lên và gõ địa chỉ mặc định của ESP8266 là : 192.168.4.1 hiển thị như sau:
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
255
Giới thiệu:
Trong bài này tôi sẽ hướng dẫn bạn cách giao tiếp giữa 2 mạch Arduino bất kỳ.
Trong nhiều dự án phức tạp thì 1 Arduino thì không thể thực hiện được, Vì vậy
giao tiếp giữa 2 arduino với nhau giúp chúng ta gải quyết được vấn đề trên.
Các bạn tải thư viện TẠI ĐÂY thư viện thứ 13.
Cách add thư viện các bạn có thểm xem TẠI ĐÂY.
Lắp mạch:
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
256
Lập trình:
Code lập trình sẽ được lưu trong file ( file _code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
void setup() {
Serial.begin(9600); // Bạn khởi tạo một cổng Serial tại baudrate 9600.
}
int Step = 0;
void loop() {
if (Step == 0) {
Serial.println("LED_RED 1"); // Đèn đỏ sáng. 1 == HIGH
} else if (Step == 1) {
Serial.println("LED_RED 0"); // Đèn đỏ tắt . 0 == LOW
}
Step = (Step + 1) % 2; //Step sẽ tuần tự tuần hoàn các giá trị trong khoảng từ 0 --
>1
delay(500); // Dừng 1/2 giây giữa các lần gửi
}
Chương trình ( code) upload cho Arduino nhận lệnh:
#include <SoftwareSerial.h>
#include <SerialCommand.h> // Khai báo biến sử dụng thư viện Serial Command
SerialCommand sCmd;
int red = 8;
void setup() {
Serial.begin(9600); / /Khởi tạo Serial ở baudrate 9600 .
pinMode(red,OUTPUT);
// Một số hàm trong thư viện Serial Command
sCmd.addCommand("LED_RED", led_red); // Khi có câu lệnh tên là
LED_RED sẽ chạy hàm led_red
}
void loop() {
sCmd.readSerial();
//Bạn không cần phải thêm bất kỳ dòng code nào trong hàm loop này cả
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
257
Giới thiệu:
Trong bài này, chúng ta sẽ tìm hiểu cách sử dụng LED RGB (Red Green Blue –
Đỏ, Xanh Lá, Xanh Dương). Bạn có thể sử dụng hàm analogWrite của Arduino để
điều khiển màu sắc của LED.
LED RGB (Đỏ, Xanh lá, Xanh dương) trông giống như đèn LED thông thường,
tuy nhiên, cấu tạo bên trong của LED này thực sự gồm 3 đèn LED, một đỏ, một
xanh lá và một xanh dương. Bằng cách điều khiển độ sáng của mỗi LED riêng biệt
mà bạn có thể tạo ra màu sắc bất kì mà bạn muốn.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
258
Để thay màu sắc của LED RGB, ta chỉ việc thay đổi độ sáng của từng con diode
(led) trong con led rgb. Để thay đổi độ sáng của một con LED ta chỉ việc điều
chỉnh điện áp xuất ra con LED, mà để điều chỉnh điện áp xuất ra con LED ta sẽ
dùng xung PWM.
Lắp mạch:
Lập trình:
Code lập trình sẽ được lưu trong file ( file _code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
260
34. Hiển thị giá trị điện áp khi điều chỉnh biến trở.
Giới thiệu:
Bài ví dụ này sẽ giới thiệu cho các bạn cách đọc giá trị điện áp gây ra bởi một biến
trở. Biến trở chỉ đơn giản chỉ là một điện trở có thể thay đổi được trị số. Mạch
Arduino không đọc trực tiếp điện trở này mà đọc gián tiếp qua điện áp mà biến trở
gây ra.
Phần màu vàng là một lớp điện trở. Cây kim màu xanh được đè chặt xuống phần
điện trở này. Giả sử có dòng điện đi từ 1 đến 2 thì nó sẽ phải qua phần màu vàng
(được tô đỏ) và đó chính là điện trở hiện tại của biến trở. Bạn chỉ việc vặn cây kim
để tăng giảm độ dài của vùng màu đỏ, qua đó tăng giảm giá trị điện trở.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
261
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
262
Lập trình:
Code lập trình sẽ được lưu trong file ( file _code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
void setup() {
Serial.begin(9600); //Mở cổng Serial để giap tiếp | tham khảo //Serial
}
void loop() {
//(value luôn nằm trong khoảng 0-1023)
Serial.println(value); //xuất ra giá trị vừa đọc
int voltage;
voltage = map(value,0,1023,0,5000); //chuyển thang đo của value
//từ 0-1023 sang 0-5000 (mV)
Serial.println(voltage); //xuất ra điện áp (đơn vị là mV)
Serial.println(); //xuống hàng
delay(200); //đợi 0.2 giây
}
35. Đọc giá trị cảm biến báo cháy hiển thị serial monitor.
Giới thiệu:
Đây là loại cảm biến chuyên dùng để phát hiện lửa , thường được sử dụng trong hệ
thông báo cháy. Tầm phát hiện trong khoảng 80cm, góc quét là 60 độ. Có thể phát
hiện lửa tốt nhất là loại có bước sóng từ 760nm - 1100nm. Mạch được tích hợp IC
LM393 so sánh để tạo mức tín hiệu => ta có thể chỉnh độ nhạy bằng biến trở.
Thông số kĩ thuật:
Nguồn : 3.3V - 5V, 15mA
Điên áp ra : 3.3 - 5V, đầu ra có cả analog và Digital.
Khoảng cách : 80 cm
Góc quét : 60 độ
Kích thước : 3.2 x 1.4 cm
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
263
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
264
Lập trình:
Code lập trình sẽ được lưu trong file ( file _code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
265
36. Đọc giá trị CB màu (TCS3200) hiển thị serial monitor.
Giới thiệu:
Module cảm biến màu TCS3200 là một module cảm biến phát hiện đầy đủ màu
sắc, bao gồm cả cảm biến màu TCS3200 với khả năng nhận biết 3 màu cơ bản
RGB và 4 đèn LED trắng. Các TCS3200 có thể phát hiện và đo lường gần như tất
cả màu sắc có thể nhìn thấy. Ứng dụng bao gồm kiểm tra đọc dải, phân loại theo
màu sắc, cảm biến ánh sáng xung quanh và hiệu chuẩn, và kết hợp màu sắc, đó chỉ
là một vài ứng dụng.
TCS3200 có các bộ tách sóng quang, có 2 bộ lọc màu sắc là bộ lọc màu đỏ,
xanh, hoặc màu xanh, hoặc không có bộ lọc ( rõ
ràng). Các bộ lọc của mỗi màu được phân bố đều khắp các mảng để loại bỏ sai lệch
vị trí giữa các điểm màu. Bên trong là một bộ dao động tạo ra đầu ra sóng vuông
có tần số là tỷ lệ thuận với cường độ của màu sắc lựa chọn.
Thông số kĩ thuật:
Điện áp cung cấp: (2.7V đến 5.5V)
Chuyển đổi từ cường độ ánh sáng sang tần số với độ phân giải cao.
Có khả năng lập trình để nhận biết đầy đủ các màu sắc.
Điện năng tiêu thụ thấp.
Giao tiếp trực tiếp với vi điều khiển.
S0 ~ S1: Dùng để lựa chọn tỉ lệ tần số đầu ra
S2 ~ S3: Dùng để lựa chọn kiểu photodiode
OUT Pin: Đầu ra tần số.
OE Pin: Tần số đầu ra cho phép hoạt động (hoạt động ở mức thấp).
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
266
Tần số đầu ra của TCS3200 trong khoảng 2HZ~500KHZ. Tần số đầu ra có dạng
xung vuông với tần số khác nhau khi mà màu sắc khác nhau và cường độ sáng là
khác nhau. Chúng ta có thể lựa chọn tỉ lệ giữa cừng độ sáng và màu sắc theo bảng
sau. Trên module này cũng có chân LED EN đây là chân điều khiển đèn LED để
tắt hoặc bật.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
267
Lắp mạch:
Lập trình:
Code lập trình sẽ được lưu trong file ( file _code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8
int frequency = 0;
void setup() {
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
268
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(sensorOut, INPUT);
Serial.begin(9600);
}
void loop() {
digitalWrite(S2,LOW);
digitalWrite(S3,LOW);
frequency = pulseIn(sensorOut, LOW);
…………………………………………………
digitalWrite(S2,LOW);
digitalWrite(S3,HIGH);
frequency = pulseIn(sensorOut, LOW);
Serial.print("B= ");
Serial.print(frequency);
Serial.println(" ");
delay(100);
}
37. Đọc giá trị CB chuyển động PIR hiển thị serial monitor.
Giới thiệu:
PIR là chữ viết tắt của Passive InfraRed sensor (PIR sensor), tức là bộ cảm
biến thụ động dùng nguồn kích thích là tia hồng ngoại. Tia hồng ngoại (IR) chính
là các tia nhiệt phát ra từ các vật thể nóng. Trong các cơ thể sống, trong chúng ta
luôn có thân nhiệt (thông thường là ở 37 độ C), và từ cơ thể chúng ta sẽ luôn phát
ra các tia nhiệt, hay còn gọi là các tia hồng ngoại, người ta sẽ dùng một tế bào điện
để chuyển đổi tia nhiệt ra dạng tín hiệu điện và nhờ đó mà có thể làm ra cảm biến
phát hiện các vật thể nóng đang chuyển động.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
269
Cảm biến này gọi là thụ động vì nó không dùng nguồn nhiệt tự phát (làm nguồn
tích cực, hay chủ động) mà chỉ phụ thuộc vào các nguồn tha nhiệt, đó là thân nhiệt
của các thực thể khác, như con người, con vật…
Trên đây là đầu dò PIR, loại bên trong gắn 2 cảm biến tia nhiệt, nó có 3 chân ra,
một chân nối masse, một chân nối với nguồn volt DC, mức áp làm việc có thể từ 3
đến 15V. Góc dò lớn. Để tăng độ nhậy cho đầu dò, Bạn dùng kính Fresnel, nó
được thiết kế cho loại đầu có 2 cảm biến, góc dò lớn, có tác dụng ngăn tia tử ngoại.
Nguyên lý làm việc của loại đầu dò PIR như hình sau:
Các nguồn nhiệt (với người và con vật là nguồn thân nhiệt) đều phát ra tia hồng
ngoại, qua kính Fresnel, qua kích lọc lấy tia hồng ngoại, nó được cho tiêu tụ trên 2
cảm biến hồng ngoại gắn trong đầu dò, và tạo ra điện áp được khuếch đại với
transistor FET. Khi có một vật nóng đi ngang qua, từ 2 cảm biến này sẽ cho xuất
hiện 2 tín hiệu và tín hiệu này sẽ được khuếch đại để có biên độ đủ cao và đưa vào
mạch so áp để tác động vào một thiết bị điều khiển hay báo động.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
270
Thông số kĩ thuật:
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
271
Lắp mạch:
Lập trình:
Code lập trình sẽ được lưu trong file ( file _code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
pinMode(inputPin, INPUT);
Serial.begin(9600);
}
void loop()
{
val = digitalRead(inputPin); // đọc giá trị đầu vào.
Serial.print(frequency);
Serial.println(" ");
delay(100);
if (val == HIGH) // nếu giá trị ở mức cao.(1)
{
digitalWrite(ledPin, HIGH); // LED On
}
else
{
digitalWrite(ledPin, LOW);
}
}
38. Đọc giá trị CB khí gas (MQ2) hiển thị serial monitor.
Giới thiệu:
Cảm biến khí ga MQ2 là một trong những loại cảm biến được sử dụng để nhận
biết: LPG, i-butan, Propane, Methane , Alcohol, Hydrogen, Smoke và khí ga. Được
thiết kế với độ nhạy cao, thời gian đáp ứng nhanh. Gía trị đọc được từ cảm biến sẽ
được đọc về từ chân Analog của vi điều khiển.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
273
Thông số kĩ thuật:
Nguồn hoạt động: 5VDC
Dòng: 150mA
Tính hiệu tương tự (analog)
Hoạt động trong thời gian dài, ổn định
Phần cứng chuẩn bị:
Arduino Uno, nano,…
Breadboard.
Dây cắm test breadboard.
1 cảm biến khí gas MQ2 .
Lắp mạch:
Arduino MQ2
A0 Aout
VCC 5V
GND GND
Lập trình:
Code lập trình sẽ được lưu trong file ( file _code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
274
void setup() {
Serial.begin(9600); //Mở cổng Serial để giap tiếp | tham khảo Serial
}
void loop() {
int value = analogRead(A0); //đọc giá trị điện áp ở chân A0 - chân cảm biến
//(value luôn nằm trong khoảng 0-1023)
Serial.println(value); //xuất ra giá trị vừa đọc
//-----------------------------------------------------
delay(1000); //đợi 1 giây để bạn kịp tháy serial - (optional)
}
Để test, bạn có thể dùng hộp quẹt,... và xì hơi ga vào tấm lưới của nó.
Giới thiệu:
Kết nối Arduino với các thiết bị, module điện tử khác là 1 việc tương đối dễ
dàng, hôm nay tôi sẽ giới thiệu với các bạn cách kết nối Arduino với module
Bluetooth và điều khiển nó thông qua điện thoại Android. Các bạn có thể ứng dụng
để điều khiển các thiết bị điện trong nhà như bật tắt đèn, quạt,…
Thông số kĩ thuật:
Module này gồm 4 chân GND, VCC, TX, RX Khi kết nối bạn chỉ cần nối chân
TX với chân 0 và chân RX nối với chân 1 trên Arduino sau đó bạn có thể lập trình
gửi và nhận dữ liệu như 1 cổng Serial thông thường. Module này có 3 loại
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
275
Master, Slave và loại chạy được cả 2 chế độ Master và Slave, ở ví dụ này tôi sử
dụng loại Slave, khi kết nối với điện thoại bạn điền mật khẩu mặc định là: 1234
Arduino HC06
Tx Rx
Rx Tx
GND GND
5V VCC
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
276
int LED1 = 5;
int LED2 = 6;
int LED3 = 7;
int chucai = 'g';
void setup() {
Serial.begin(9600);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
}
void loop() {
if(Serial.available()>0){
chucai = Serial.read();
}
if(chucai =='a'){ // bật led 1
Serial.println(chucai);
digitalWrite(LED1, HIGH);
}
if(chucai=='b'){ // tắt led 1
Serial.println(chucai);
digitalWrite(LED1, LOW);
}
………………………………………
}
}
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
277
Viết app điều khiển thiết bị điện bằng Bluetooth trên điện thoại Andriod:
Trong bài viết này tôi xin giới thiệu cách viết app cho điện thoại Andriod bằng
appinventor. Giao diện rất đơn giản và dễ sử dụng.
Giao diện của Appinventor: (app cho điện thoại được lưu trong file code)
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
278
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
279
Giới thiệu:
Với việc sử dụng IC Max7219 việc điều khiển led ma trận 8x8 trở nên dễ dàng hơn
và được hổ trợ bởi những thư viện có sẵn. Ta có thể ghép nối nhiều module led 8x8
này lại với nhau.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
280
Thông số kĩ thuật:
Module có thể điều khiển 8x8 điểm led chân cathode chung.
Điện áp hoạt động: 5V
Bên trái của module là chân ngõ vào và bên phải là chân ngõ ra.
Phần cứng chuẩn bị:
Arduino Uno, nano,…
Dây cắm test breadboard.
1 module led 8x8 sử dụng IC MAX7219.
Lắp mạch:
Lập trình:
Code lập trình sẽ được lưu trong file ( file _code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
#include <SPI.h>
#include <Adafruit_GFX.h>
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
281
#include <Max72xxPanel.h>
void setup() {
void loop() {
matrix.fillScreen(LOW);
delay(wait);
}
}
Hình ảnh thực tế:
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
282
Giới thiệu:
Bài viết hướng dẫn cách sử dụng cảm biến đo tốc độ IR FC-03 kết hợp với vòng
xoay encoder 15 lỗ, để xác định tốc độ của động cơ DC. Khi có tốc độ, ta có thể
thực hiện điều chỉnh tốc độ của động cơ để cho xe chạy thẳng, thông qua mạch
L298.
CB tốc độ IR FC03:
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
283
Thông số kĩ thuật:
1 x Bộ thu phát ITR9608: Chân số 2 có chứa diode phát tia hồng ngoại, chân
số 1 chứa 1 phototransistor để thu nhận tín hiệu hồng ngoại.
1 x IC LM393.
VCC: cảm biến chịu được mức điện áp từ 3.3 - 5V. Chân này được nối với
pin nguồn 5V của Arduino.
GND: nối với pin nguồn GND của arduino.
DO: chân cho tín hiệu số đi ra của cảm biến (High / Low).
AO: chân cho tín hiệu tương tự đi ra từ cảm biến. Chân này tôi không sử
dụng.
Khi motor quay thì đĩa encoder quay, lúc này, giá trị ở chân DO của FC-03 chuyển
đổi liên tục từ LOW sang HIGH và từ HIGH sang LOW. Nguyên nhân là do khi
FC-03 được cấp điện, diode ở chân số 2 của ITR9608 phát ra tia hồng ngoại, nếu
tia hồng ngoại được truyền thông qua lỗ của đĩa encoder, phototransistor nhận
được tín hiệu và chuyển output của chân DO lên mức HIGH. Ngược lại, khi tia
hồng ngoại bị cản bởi đĩa encoder, phototransistor không nhận được tín hiệu, chân
DO được chuyển về mức LOW.
Dựa vào nguyên lý ngày, để lấy được số vòng quay của động cơ trong một khoảng
thời gian, ta chỉ cần đếm số lỗ mà FC-03 bắt được trong khoảng thời gian đó. Tức
là ta sẽ đếm số lần mà pin 2 của Arduino chuyển từ HIGH sang LOW.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
284
Lắp mạch:
Lập trình:
#define PIN_DO 2
volatile unsigned int pulses;
float rpm;
unsigned long timeOld;
#define HOLES_DISC 15 // số lổ trên đĩa encoder
void counter()
{
pulses++;
}
void setup()
{
Serial.begin(9600);
pinMode(PIN_DO, INPUT);
attachInterrupt(digitalPinToInterrupt(PIN_DO), counter, FALLING);// khởi động
interrupt
}
void loop()
{
if (millis() - timeOld >= 1000)
{
detachInterrupt(digitalPinToInterrupt(PIN_DO)); // ngưng interrupt để thực
hiện tính toán
rpm = (pulses * 60) / (HOLES_DISC);
Serial.println(rpm);
timeOld = millis();
pulses = 0;
attachInterrupt(digitalPinToInterrupt(PIN_DO), counter, FALLING); //
}
}
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
285
Giới thiệu:
Lắp mạch:
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
286
void setup() {
pinMode(redPin,OUTPUT);
pinMode(bluePin,OUTPUT);
pinMode(greenPin, OUTPUT);
Serial.begin(9600);
}
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
287
void loop() {
//while is reading the message
while(Serial.available() > 0){
flag = 0;
if(index < (max_char-1)){
r_char = Serial.read();
message[index] = r_char;
………………………………
for(i=0; i<12; i++){
message[i] = '\0';
}
index=0;
}
}
Lập trình app cho điện thoại Android:
File app được lưu trong file code kèm theo.
Lưu ý khi dùng điện thoại android kết nối với HC05 với mật khẩu 1234
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
288
Lắp mạch:
Biến trở các bạn nối như hình dưới.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
289
Nếu bạn muốn hiển thị một cái gì đó trong ma trận, bạn chỉ cần biết nếu trong một
hàng hoặc cột xác định, các đèn LED đang bật hoặc tắt.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
290
Lập trình:
Code lập trình sẽ được lưu trong file ( file _code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích. Trước hết ta phải cài thêm thư viên LedControl
và Timer có kèm theo.
…………………………………………………….
lc.clearDisplay(0);
randomSeed(analogRead(0));
#ifdef DEBUG
Serial.begin(9600);
Serial.println("Pong");
#endif
newGame();
ball_timer = timer.every(BALL_DELAY, moveBall);
}
void loop() {
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
291
timer.update();
setPad();
debug("LOOSE");
gameOver();
newGame();
}
delay(GAME_DELAY);
}
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
292
Giới thiệu:
Hình trên là sơ đồ nguyên lý của module bàn phím 4x4. Tuy có đến 16 nút nhấn,
nghĩa là nếu làm một cách thông thường (dùng chân digital) thì chúng ta phải cần
đến 16 chân Arduino để đọc. Nhưng với bàn phím này, chúng ta chỉ cần dùng 8
chân (4 chân hàng ngang (row), và 4 chân cột dọc (column)).
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
293
Lắp mạch:
#include Keypad.h
const byte rows = 4; //số hàng
const byte columns = 4; //số cột
int holdDelay = 700; //Thời gian trễ để xem là nhấn 1 nút nhằm tránh nhiễu
int n = 3; //
int state = 0; //nếu state =0 ko nhấn,state =1 nhấn thời gian nhỏ , state = 2 nhấn
giữ lâu
char key = 0;
char keys[rows][columns] =
{
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'},
};
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
294
if ((int)keypad.getState() == RELEASED) {
key += state;
state = 0;
//Xuat ket qua len may tinh
Serial.println(key);
}
delay(100);
}
Hình ảnh thực tế:
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
295
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
296
Breadboard .
Dây cắm test board.
1 điện trở 220 Ohm.
1 led siêu sáng ( từ đó ta có thể chuyển qua bật tắt relay).
Lắp mạch:
Chụp shield ethernet lên uno hoặc mega như hình:
Lập trình:
Code lập trình sẽ được lưu trong file ( file _code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích, thư viện Ethernet đã có sẵn trong ide.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
297
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // địa chỉ MAC( địa chỉ
phần cứng của shield ethernet), cứ để nguyên
IPAddress ip(192, 168, 1, 8); // địa chỉ IP của shield, có thể thay đổi tùy ý.
Serial.begin(9600);
while (!Serial) {
;
}
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
if (readString.indexOf("button2on") > 0) {
digitalWrite(3, HIGH);
}
if (readString.indexOf("button3off") > 0) {
digitalWrite(2 , LOW);
}
readString = "";
}
}
Sau khi lắp mạch như hình trên và ta nạp code bên dưới và nhập địa chỉ ip ta sẽ
thấy giao diện điều khiển hiện ra.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
298
Đây là board mạch cảm biến áp suất BMP185 đơn giản, độ chính xác cao, tiết
kiệm điện năng. BMP180 có khả năng đo lường áp suất trong khoảng 300 - 1100
hPa với sai số tuyệt đối dưới 0.02 hPa trong chế độ nâng cao độ phân giải.
Cảm biến này hoạt động trong khoảng điện áp 1.8 tới 3.6V và hỗ trợ I/O 5V (Nhà
sản xuất khuyên dùng nguồn 3.3V đã lọc sạch, ổn định). Nó được thiết kế để kết
nối trực tiếp với vi điều khiển thông qua cổng giao tiếp I2C.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
299
Lắp mạch:
Lập trình:
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
300
Trước khi upload code các bạn cần cài thêm thư viện BM180 cho arduino IDE
http://tdhshop.com.vn/tong-hop-cac-thu-vien-cho-arduino
Code lập trình sẽ được lưu trong file ( file _code) riêng để tránh việc bị lổi, code
bên dưới chỉ dưới dạng giải thích.
#include <Wire.h>
#include <Adafruit_BMP085.h>
Adafruit_BMP085 bmp;
void setup() {
Serial.begin(9600);
if (!bmp.begin()) {
Serial.println("Could not find a valid BMP085 sensor");
while (1) {}
}
}
void loop() {
Serial.print("Temperature = ");
Serial.print(bmp.readTemperature());
Serial.println(" *C");
……………………………………………………..
Serial.print("Real altitude = ");
Serial.print(bmp.readAltitude(101500));
Serial.println(" meters");
Serial.println();
delay(500);
}
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
301
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
302
47. Chạy chữ trên led ma trận 8x8 sử dụng Bluetooth HC05.
Lắp mạch:
Lưu ý trước khi nạp chương trình cho arduino ta không kết nối dây TX, RX với
chân số 8, 9 của arduino . Sau khi đã nạp xong chúng ta hãy kết nối lại.
#include <MaxMatrix.h>
#include <SoftwareSerial.h>
#include <avr/pgmspace.h>
PROGMEM const unsigned char CH[] = {
3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space
1, 8, B01011111, B00000000, B00000000, B00000000, B00000000, // !
3, 8, B00000011, B00000000, B00000011, B00000000, B00000000, // "
5, 8, B00010100, B00111110, B00010100, B00111110, B00010100, // #
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
303
…………………………………………………….
{
if (*s < 32) continue;
char c = *s - 32;
memcpy_P(buffer, CH + 7 * c, 7);
m.writeSprite(col, 0, buffer);
m.setColumn(col + buffer[0], 0);
col += buffer[0] + 1;
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
304
s++;
}
}
Lập trình app Inventor cho điện thoại android.
File app được để trong file code kèm theo.
Sau khi chúng ta đã cài đặt app cho điện thoại sử dụng hệ điều hành android và tiến
hành kết nối Bluetooth của điện thoại với HC05 ( mật khẩu mặt định 1234 ).
48. Điều khiển hiệu ứng RGB LED WS2812b.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
305
LED RGB WS2812B sử dụng chip WS2812B nên có thể lập trình để điều khiển
màu sắc độ sáng. Dễ dàng điều khiển, tương thích với Arduino. Với lớp phủ
Silicon bên ngoài có thể chống nước hoàn toàn, đảm bảo an toàn khi sử dụng trong
môi trường ẩm ướt. Sử dụng điện áp 5 – 12V.
Điều tuyệt vời về những LED này là chúng ta có thể kiểm soát ngay cả dải LED
chỉ với một chân từ bo mạch Arduino.
Lắp mạch:
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
306
#include <FastLED.h>
#define LED_PIN 7
#define NUM_LEDS 11
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
}
void loop() {
for (int i = 0; i <= 10; i++) {
leds[i] = CRGB ( 0, 0, 255);
FastLED.show();
delay(40);
}
for (int i = 10; i >= 0; i--) {
leds[i] = CRGB ( 255, 0, 0);
FastLED.show();
delay(40);
}
}
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
307
Lắp mạch:
#include <Servo.h>
const int trigPin = 10;
const int echoPin = 11;
long duration;
int distance;
Servo myServo; // Tạo đối tượng Servo để điều khiển Servo
void setup() {
pinMode(trigPin, OUTPUT); // Set chân trig là chân OUTPUT
pinMode(echoPin, INPUT); // Set chân echo INPUT
Serial.begin(9600);
myServo.attach(12); // Chân Servo là chân 12
}
void loop() {
delay(30);
Serial.print(".");
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
308
}
}
// Hàm tính khoảng cách bằng siêu âm
int calculateDistance(){
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
return distance;
}
Lập trình code cho processing:
Trước hết chúng ta cần phải cài phần mềm PROCESSING theo link sau:
https://drive.google.com/open?id=1La369RgmlIdG21q869ZbQTJJVsdD0AjB
Một phương thức điều khiển arduino bằng máy tính sử dụng ngôn ngữ Java tuy đã
xuất hiện từ lâu nhưng nó rất hữu ích cho các dự án cần về giao diện điều khiển.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
309
Trong quá trình chạy code processing cần phải kết nối arduino với máy tính.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
310
- Relay SSR (Solid State Relay) hay còn gọi là Relay Rắn là loại relay sử
dụng cấu trúc bán dẫn thay vì cấu trúc cơ học nên có độ bền và tuổi thọ cao.
- Module Relay rắn SSR sử dụng nguồn DC 5V để kích Relay hoạt động đóng
ngắt điện thế AC với công suất tối đa 250V 2A, module này chỉ dùng để
đóng ngắt nguồn AC, không sử dụng được để đóng ngắt nguồn DC, trong
Relay SSR có tích hợp sẵn opto cách ly (photo triac) nên sử dụng rất an
toàn.
- Module được thiết kế nhỏ gọn, ra chân đầy đủ, có led hiển thị trạng thái
đóng ngắt, Ứng dụng đóng ngắt nguồn AC cần tần suất đóng ngắt nhiều và
tuổi thọ cao. Khắc phục được những điểm còn hạn chế của role cơ.
Thông số kĩ thuật:
Số Relay: 1
Điện áp kích: 5VDC.
Dòng tiêu thụ: 20mA/1 Relay SSR
Điện áp đóng ngắt tối đa: 75 to 240VAC (50/60Hz).
Dòng điện đóng ngắt: 0.1 - 2A.
Có cách ly: Photo Triac
Kích thước: 25*34*25 (L * W * H)
Trọng lượng: 13 g.
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
311
Lắp mạch:
pinMode(6, OUTPUT);
}
void loop() {
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802
312
Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino
Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 01695 304 802