Download as pdf or txt
Download as pdf or txt
You are on page 1of 37

Lập trình điện tử cùng Arduino Kit

2
Arduino một nền tảng mã nguồn mở gồm phần cứng và phần mềm được ra mắt năm
2005 Là
tại một
Ý. nền tảng mã nguồn mở gồm phần cứng và phần mềm.

Phần cứng Arduino là các bo mạch vi xử lý được thiết kế dựa trên nền tảng vi điều
khiển AVR Atmel 8bit hoặc ARM Atmel 32-bit, được dùng để xây dựng các ứng dụng
tương tác với môi trường hoặc tương tác với nhau một cách dễ dàng. Một bo mạch
Arduino thường bao gồm cổng giao tiếp USB, các chân I/O truyền nhận tín hiệu tương
tự, tín hiệu số tương thích với nhiều bo mở rộng khác nhau.

GIỚI Chân cắm tín hiệu số

THIỆU Chân cắm USB

VỀ
ARDUINO
Vi điều khiển

Chân cắm
tín hiệu tương tự

Đi cùng với phần cứng Arduino là phần mềm Arduino IDE (môi trường
phát triển tích hợp) tương thích với hầu hết các nền tảng từ Windows,
Linux đến MacOS. Arduino IDE cho phép người dùng viết chương trình
(lập trình) cho các bo mạch Arduino bằng ngôn ngữ C hoặc C++.
33
Node Wifi 32 là phiên bản có chức năng, hình
dạng, kích thước và cách sử dụng giống với
Arduino Uno R3 nhưng được cải tiến, vi xử lý được
thay thế bằng ESP32
ESP32.
Là các cổng có GPIO chỉ
có thể sử dụng cho chức
năng input/output digital.

Node
Wifi 32

Là các cổng có GPIO có thẻ sử


dụng cho cả chức năng input/
output digital và analog.
Các GPIO 34, 35, 36, 39 chỉ có
thể sử dụng cho chức năng input. Ngoài ra, các chân I/O của Node Wifi
32 còn được bố trí thành các chân cắm
grove dễ sử dụng, tăng tính ổn định khi
kết nối.
4
Arduino Kit là bộ kit học lập trình vi điều kiển với Node Wifi 32 là module
chính và hơn 10 module cảm biến, ngoại vi được thiết kế tương thích với
chân cắm grove của module chính.

Arduino
kit

Xoay quanh các bài tập đi từ cơ bản đến nâng cao, các module cảm biến,
ngoại vi đa dạng và có thể tương tác trực quan, được lập trình bằng ngôn
ngữ lập trình chuyên nghiệp, Arduino Kit mong muốn có thể giúp bạn đọc
tiếp cận và làm quen với ngôn ngữ lập trình C/C++ và nền tảng Arduino
theo cách dễ dàng và thú vị nhất.
Tải xuống
5

Truy cập https://www.arduino.cc/ Chọn nơi lưu file cài đặt (mặc định là C:\
Sau đó chọn mục Software -> Download Program File\Arduino) và chọn Install để bắt
đầu quá trình cài đặt.

Cài đặt Chọn phiên bản phù hợp với máy tính của bạn và
nhấn để tải về.

Arduino Cài đặt

IDE Chạy file vừa tải về, cửa sổ Setup sẽ xuất hiện,
chọn I Agree và Next để tiếp tục.
Khi có yêu cầu xác nhận cài đặt driver tại
cửa sổ Windows Security, chọn Install.

Chờ quá trình cài đặt hoàn tất, chọn Close


để kết thúc cài đặt.
6 Để cài đặt thư viện hỗ trợ cho Note Wifi 32 Sau đó vào Tools -> Board:…
đầu tiên các bạn vào File -> Preferences. -> Board Manager…

Cài đặt Trong cửa sổ Preferences, nhập URL dưới

Thư viện
đây vào ô Additional Boards Manager
URLs:
https://dl.espressifif.com/dl/package_esp32_
https://dl.espress .com/dl/package_esp32_
index.json

Trong cửa sổ Boards Manager,


Manager sau khi đợi tải
xong danh sách các board, các bạn nhập
“ESP32” vào ô tìm kiếm và chọn ESP32 by Espressif
Espressif
Systems rồi bấm Install
Install.
Chờ quá trình cài đặt hoàn tất là có thể bắt
đầu lập trình cho Node Wifi 32.
7

Giao diện Teân chöông trình


Thanh công cụ

Vùng lập trình


Biên dịch chương trình
đang soạn thảo để kiểm
tra các lỗi lập trình.

Biên dịch và upload


chương trình đang soạn.

Mở một trang soạn thảo Vùng lthông báo


mới.
Loaïi board vaø coång COM
Mở các chương tình đã luoân hieån thò taïi ñaây, chuù yù
lưu. ñeå traùnh choïn sai nheù!
Một số lưu ý cơ bản:
Lưu chương trình. - Chú thích:
Các dòng ghi chú bắt đầu bằng “//”, dùng để chú thích trong chương trình. Trình biên dịch sẽ
bỏ qua các dòng này khi biên dịch.
Mở cửa sổ Serial Monitor
để gửi và nhận dữ liệu
giữa máy tính và board. Gõ “//” trước dòng lệnh hoặc sử dụng tổ hợp phím Ctrl + / để một dòng lệnh bất kì trong
chương trình trở thành ghi chú.

- Auto Format: là chức năng giúp định dạng chương trình tự động.
Để sử dụng chức năng này, trong vùng lập trình, click chuột phải và chọn “Auto Format”.
e
8

du l
M o
á c
C
9
Đèn LED
Chuẩn bị Chương trình
1. Node Wifi 32
2. Module Switch Trong Arduino IDE, vào File -> New để tạo
(LED) 3. Module LED một chương trình mới. Nhập đoạn chương
trình dưới đây vào chương trình mới vừa
tạo.
Mục tiêu
const int ledPin = 25;
Điều khiển LED chớp tắt với chu kỳ 2
giây (sáng 1 giây, tắt 1 giây). void setup() {
pinMode(ledPin, OUTPUT);
Kết nối phần cứng }

void loop() {
Kết nối module LED với port D1 như hình digitalWrite(ledPin, HIGH);
LED (Light Emitting Diode - điốt minh họa. delay(1000);
phát quang) là các điốt có
digitalWrite(ledPin, LOW);
khả năng phát ra ánh sáng
delay(1000);
hay tia hồng ngoại, tử ngoại.
LED
LED
}

uart i2c.. I2c. Khai báo giá trị chân tín hiệu (GPIO):

d3 d2 d1 Bên cạnh mỗi cổng grove đều kí hiệu GPIO


tương ứng.
Ở bài này, port D1 có GPIO tương ứng là 25.
A3 A2 A1
10

Trong hàm setup() cần khai báo pinMode cho ledPin.


Một chương trình trong Arduino IDE có 2 chương trình con
Trong bài này, pinMode của ledPin là OUTPUT.
(hàm) không thể thiếu là setup() và loop()::
void setup() {
- Hàm setup() chứa các lệnh khởi tạo, đặt giá trị mặc pinMode(ledPin, OUTPUT);
}
định cho biến, v.v và chỉ thực hiện 1 lần khi Node WiFi
32 khởi động. Trong hàm loop()
loop(), thực hiện bật LED sáng và giữ LED sáng
trong 1 giây bằng cách tạm dừng chương trình 1 giây:
- Hàm loop() chứa các lệnh thực hiện chức năng chính void loop() {
của chương trình và được lặp đi lặp lại khi Node WiFi digitalWrite(ledPin, HIGH);
32 hoạt động. delay(1000);

Ngoài ra, trong một chương trình còn có các phần khai Ta dùng lệnh digitalWrite để điều khiển một
báo thư viện ở đầu chương trình (nếu có sử dụng thư viện), digital output, trạng thái HIGH để bật LED.
khai báo biến (thường khai báo ngay sau phần khai báo Sau đó tắt LED và cũng tạm dừng chương trình 1 giây:
thư viện), các chương trình con khác, v.v. Chúng ta sẽ lần digitalWrite(ledPin, LOW);
lượt tìm hiểu các phần này qua các bài học. delay(1000);
}
Chương trình điều khiển LED chớp tắt là chương trình cơ
Trạng thái LOW trong dòng lệnh dùng để tắt LED.
bản nhất khi bắt đầu lập trình với Arduino IDE.

Có thể xem thêm về digital output tại:


Đầu tiên cần khai báo biến ledPin lưu lại GPIO kết nối
https://ohtech.vn/all-courses/lap-trinh-esp32-voi-arduino-
với đèn LED. Số kí hiệu GPIO là một số nguyên nên ledPin
ide/lessons/digital-input-va-digital-output-voi-esp32/.
có kiểu dữ liệu là int, giá trị của ledPin không thay đổi
trong suốt chương trình nên ta dùng const để khai báo
biến này là hằng số.
const int ledPin 25;
Chọn
Giải thích
board chương
và cổng
trình
COM Biên dịch và nạp chương trình 11

Để chọn board Node Wifi 32, các bạn vào Tools -> Board -> Cần lưu lại chương trình trước khi biên dịch và upload code
Node32s vào board.
Vào File -> Save (Ctrl
Ctrl + S)
S để lưu. Mặc định Arduino IDE sẽ
lưu chương trình vào thư mục Arduino nằm trong thư mục
Documents của máy tính.

Bạn có thể đặt tên và lưu chương trình tại đây hoặc tạo
riêng một thư mục khác như hình bên dưới để dễ dàng quản
lý các file code của mình sau này.

Để chọn cổng COM tương Lưu ý: Để xác định cổng COM


ứng bằng, các bạn vào đang thực hiện kết nối với
Tools -> Port -> cổng COM. board, các bạn nhấn tổ hợp
phím Window + X và chọn Device
Manager, dxem port đang kết
Manager
nối trong mục Ports.

Như phần trước đã hướng dẫn, bạn cần chọn board, chọn
cổng COM, sau đó nhấn nút để biên dịch và nạp chương
trình. Khi nạp chương trình xong, Arduino IDE sẽ hiển thị thông
báo “Done uploading”. Hãy thử và quan sát kết quả chương
trình bạn vừa nạp nhé!
12 Chuẩn bị Chương trình

Công tắc 1. Node Wifi 32


2. Module Switch

gạt
const int switchPin = 27;
3. Module LED const int ledPin = 25;
int switchState;
Mục tiêu
(Switch) void setup() {
pinMode(switchPin, INPUT);
Điều khiển đèn LED bằng switch: gạt pinMode(ledPin, OUTPUT);
switch để bật LED, gạt ngược lại để }
tắt LED.
void loop() {
Kết nối phần cứng switchState =
digitalRead(switchPin);
Kết nối module Switch với port D2 và if (switchState == 1) {
Công tắc gạt (Switch) được sử module LED với port D1 như hình minh digitalWrite(ledPin, HIGH);
dụng để bật, tắt tín hiệu cố họa. } else {
định giúp thiết lập chức năng digitalWrite(ledPin, LOW);
hoặc điều khiển robot. LED
LED }
}
uart i2c.. I2c.
Switch

d3 d2 d1

A3 A2 A1
Giải thích chương trình
13

Đầu tiên khai báo GPIO cần sử dụng: switchPin là GPIO Ngược lại nếu công tắc không bật thì tắt LED:
kết nối với module switch, ledPin là GPIO kết nối với module
} else {
LED. 2 biến này là hằng số (const) và có kiểu dữ liệu là int. digitalWrite(ledPin, LOW);
const int switchPin = 27; }
const int ledPin = 27; }

Khai báo biến switchState để lưu lại trạng thái của switch,
khi switch bật trạng thái switchState bằng 1, khi switch tắt
Biên dịch và nạp chương trình
trạng thái switchState bằng 0.
int switchState; Chọn Board và chọn cổng COM, sau đó nhấn nút để biên
dịch và nạp chương trình.
Trong hàm setup(), khai báo pinMode cho switchPin là INPUT,
ledPin là OUTPUT. Sau khi nạp chương trình xong, gạt switch và quan sát trạng
void setup() { thái của đèn LED.
pinMode(switchPin, INPUT);
pinMode(ledPin, OUTPUT);
}
Trong hàm loop(), đọc trạng thái của switch và gán cho
biến switchState bằng dòng lệnh:
void loop() {
switchState =
digitalRead(switchPin);
Sau đó dùng câu lệnh điều kiện để điều khiển LED theo
trạng thái của swich. Nếu switch bằng 1, công tắc bật thì
điều khiển LED sáng:
if (switchState == 1) {
digitalWrite(ledPin, HIGH);
14 Chuẩn bị Chương trình

Nút nhấn 1. Node Wifi 32


2. Module Button const int buttonPin = 27;
(Button) 3. Module LED const int ledPin = 25;

int ledState;
Mục tiêu
void setup() {
Điều khiển đèn LED bằng nút nhấn: pinMode(ledPin, OUTPUT);
nhấn nút để bật đèn, nhấn thêm lần pinMode(buttonPin, INPUT);
nữa để tắt đèn. }

void loop() {
if (digitalRead(buttonPin) ==
HIGH) {
Nút nhấn (Button) được sử delayMicroseconds(20);
dụng trong các chức năng Kết nối phần cứng if (digitalRead(buttonPin) ==
điều khiển. HIGH) {
Nút nhấn là loại nhấn nhả ledState = !ledState;
(Push Button), sau khi nhấn kích LED
digitalWrite(ledPin,
tín hiệu nút nhận sẽ tự động trở ledState);
uart i2c.. I2c.
lại trạng thái ban đầu. }
BUTTON }
d3 d2 d1 }

A3 A2 A1
Giải
Giải thích
thích chương
chương trình
trình
15

Đầu tiên khai báo GPIO cần sử dụng: buttonPin là GPIO kết Sau đó kiểm tra lại trạng thái nút nhấn một lần nữa. Nếu
nối với module button, ledPin là GPIO kết nối với module LED. digitalRead (buttonPin) vẫn bằng 1, ta thực hiện đổi trạng
2 biến này là hằng số và có kiểu dữ liệu là int. thái ledState.
const int buttonPin = 27; ledState = !ledState;
const int ledPin = 25; Cuối cùng điều khiển LED theo ledState:
Khai báo biến ledState để lưu lại trạng thái cần điều khiển digitalWrite(ledPin,
LED. Nếu ledState bằng 1, cần bật LED. Nếu ledState bằng ledState);
0. cần tắt LED. }
}
int ledState;

Trong hàm setup(), khai báo pinMode cho buttonPin là INPUT,


ledPin là OUTPUT. Biên dịch và nạp chương trình
void setup() {
pinMode(ledPin, OUTPUT); Chọn Board và chọn cổng COM, sau đó nhấn nút để biên
pinMode(buttonPin, INPUT); dịch và nạp chương trình.
}
Trong hàm loop(), kiểm tra xem nút nhấn button có được Sau khi nạp chương trình xong thì nhấn nút và quan sát LED.
nhấn hay không bằng đoạn lệnh:
void loop() {
if (digitalRead(buttonPin) == HIGH) {
delayMicroseconds(20);
if (digitalRead(buttonPin) == HIGH) {
Khi digitalRead (buttonPin) bằng 1 có nghĩa là nút nhấn
được nhấn. Ta cần tạm dừng chương trình 20 micro giây để
loại bỏ phần tín hiệu điện chưa ổn định khi trạng thái nút
chấn chuyển từ mức 0 sang mức 1, phần tín hiệu này có thể
khiến vi điều khiển hiểu là nút nhấn đang được nhấn nhiều lần.
16
16

Cảm biến
Chuẩn bị Chương trình

1. Node Wifi 32

chuyển
2. Module PIR Sensor const int sensorPin = 36;
3. Module LED const int ledPin = 25;

động
int sensorState = 0;
Mục tiêu
void setup() {
Đèn LED sẽ tự động sáng khi phát hiên pinMode(ledPin, OUTPUT);
(PIR Sensor) chuyển động. pinMode(sensorPin, INPUT);
Serial.begin(115200);
}

void loop() {
sensorState =
digitalRead(sensorPin);
Kết nối phần cứng if (sensorState) {
PIR (Passive InfraRed) là bộ digitalWrite(ledPin, HIGH);
cảm biến thụ động dùng Serial.println(“Phat hien chuyen
nguồn kích thích là tia hồng LED
dong!!”);
ngoại (IR), chính là các tia } else {
uart i2c.. I2c.
nhiệt phát ra từ các vật thể. digitalWrite(ledPin, LOW);
PIR chuyển đổi tia nhiệt thành }
dạng tín hiệu điện và nhờ đó d3 d2 d1 }
mà có thể nhận ra các vật
thể nóng đang chuyển động. A3 A2 A1
Cảm biến này gọi là thụ động
vì nó không dùng nguồn nhiệt
tự phát mà phụ thuộc vào
các nguồn nhiệt của các đối
tượng khác.
Giải
Giải thích
thích chương
chương trình
trình
17

Đầu tiên khai báo GPIO cần sử dụng: sensorPin là GPIO kết Dùng câu lệnh điều kiện để điều khiển LED theo sensorState.
nối với module cảm biến chuyển động, ledPin là GPIO kết Biểu thức điều kiện (sensorState == 1) có thể được viết rút
nối với module LED. 2 biến này là hằng số và có kiểu dữ gọn thành (sensorState). Nếu sensorState bằng 1 thì điều
liệu là int. khiển LED bật và in ra thông báo “Phát hiện chuyển động”.
const int sensorPin = 36; if (sensorState) {
const int ledPin = 25; digitalWrite(ledPin, HIGH);
Khai báo biến sensorState để lưu lại trạng thái đọc được từ Serial.println(“Phat hien chuyen dong!!”);
cảm biến chuyển động, sensorState bằng 1 khi có chuyển
động, sensorState bằng 0 khi không có chuyển động. Ngược lại nếu sensorState không bằng 1 thì điều khiển tắt
int sensorState = 0; LED.
} else {
Trong hàm setup(), khai báo pinMode cho sensorPin là INPUT, digitalWrite(ledPin, LOW);
ledPin là OUTPUT. }
void setup() { }
pinMode(ledPin, OUTPUT);
pinMode(sensorPin, INPUT);
Ngoài ra, trong bài này chúng ta sẽ sử dụng chức
Biên dịch và nạp chương trình
năng in thông báo ra màn hình Serial Monitor,
đây là chức năng rất hữu ích trong Arduino IDE.
Chọn Board và chọn cổng COM, sau đó nhấn nút để biên
Để sử dụng chức năng này, cần khai báo:
dịch và nạp chương trình.
Serial.begin(115200);
} Sau khi nạp chương trình xong thì thử chuyển động gần cảm
biến và quan sát LED.
Trong hàm loop(), đọc trạng thái từ cảm biến va chạm bằng
dòng lệnh:
void loop() {
sensorState =
digitalRead(sensorPin);
18

Cảm biến
Chuẩn bị Chương trình

1. Node Wifi 32

âm thanh
2. Module Sound Sensor const int sensorPin = 36;

int sensorState = 0;

(Sound Sensor) Mục tiêu void setup() {


pinMode(sensorPin, INPUT);
Đọc trạng thái cảm biến âm thanh và Serial.begin(115200);
in kết quả ra Serial Monitor. }

void loop() {
sensorState =
digitalRead(sensorPin);
Serial.println(sensorState);
delay(100);
Kết nối phần cứng }
Cảm biến âm thanh (Sound
Sensor) được sử dụng để nhận
biết cường độ âm thanh của
môi trường,  cảm biến trả ra
giá trị điện áp Analog tuyến uart i2c.. I2c.
tính  với cường độ âm thanh,
ứng dụng trong chống trộm, d3 d2 d1
LED nhảy theo nhạc,... sound sensor
A3 A2 A1
Giải
Giải thích
thích chương
chương trình
trình Biên dịch và nạp chương trình
19

Đầu tiên khai báo GPIO cần sử dụng: sensorPin là GPIO kết Chọn Board và chọn cổng COM, sau đó nhấn nút để biên
nối với module cảm biến âm thanh. Như các bài học trước, dịch và nạp chương trình.
biến sensorPin là hằng số và có kiểu dữ liệu int.
Sau khi nạp chương trình xong, hãy thử vỗ tay để xem hoạt
const int sensorPin = 36; động của relay.

Khai báo biến sensorState lưu lại trạng thái đọc được từ
cảm biến âm thanh.
int sensorState = 0;

Trong hàm setup(), khai báo pinMode là INPUT cho sensorPin


và khởi tạo Serial với tốc độ baud 115200.
void setup() {
pinMode(sensorPin, INPUT);
Serial.begin(115200);
}
Trong hàm loop(), đọc trạng thái cảm biến và in ra Serial
Monitor.
void loop() {
sensorState = digitalRead(sensorPin);
Serial.println(sensorState);
Tạm dừng chương trình 100 mili giây để dễ dàng theo dõi
trạng thái in ra trên Serial Monitor.
delay(100);
}
20

Rơ-le
Chuẩn bị Chương trình

1. Node Wifi 32
2. Module Relay const int sensorPin = 36;
(Relay) 3. Module Sound Sensor const int relayPin = 25;

int relayState = 0;
Mục tiêu
void setup() {
Mục tiêu: Điều khiển relay bằng tiếng pinMode(sensorPin, INPUT);
vỗ tay. Vỗ tay 1 cái bật relay, vỗ tay pinMode(relayPin, OUTPUT);
thêm cái nữa tắt relay. Serial.begin(115200);
}

void loop() {
if (digitalRead(sensorPin)) {
relayState = !relayState;
Kết nối phần cứng }
Rơ-le điện (Relay) được sử if (relayState) {
dụng để đóng ngắt các thiết digitalWrite(relayPin, HIGH);
bị AC/DC sử dụng công suất LED Relay
} else {
lớn: Quạt, đèn, motor,... digitalWrite(relayPin, LOW);
Relay trên mạch là dạng uart i2c.. I2c.
}
thường mở, khi có tín hiệu kích }
sẽ đóng tương tự như công tắc d3 d2 d1
bật tắt đèn trong nhà. sound sensor
A3 A2 A1
Giải
Giải thích
thích chương
chương trình
trình
21

Khai báo GPIO cần sử dụng: Ngược lại, nếu relayState không bằng 1 thì tắt relay:
const int sensorPin = 36; } else {
const int relayPin = 25; digitalWrite(relayPin, LOW);
}
Khai báo biến relayState lưu lại trạng thái của relay: }
int relayState = 0;

Trong hàm setup() khai báo pinMode cho sensorPin và


relayPin và khởi tạo Serial.
void setup() { Biên dịch và nạp chương trình
pinMode(sensorPin, INPUT);
pinMode(relayPin, OUTPUT); Chọn Board và chọn cổng COM, sau đó nhấn nút để biên
Serial.begin(115200); dịch và nạp chương trình.
}
Trong hàm loop(), dùng câu lệnh điều kiện để thay đổi trạng Sau khi nạp chương trình xong, hãy quan sát kết quả trên
Serial Monitor.
thái relayState khi trạng thái đọc được từ cảm biến âm
thanh bằng 1:
void loop() {
if (digitalRead(sensorPin)) {
relayState = !relayState;
}
Tiếp theo dùng câu lệnh điều kiện để điều khiển relay. Nếu
relayState bằng 1 thì bật relay:
if (relayState) {
digitalWrite(relayPin, HIGH);
22

Còi báo
Chuẩn bị Chương trình

1. Node Wifi 32
2. Module Buzzer const int buzzerPin = 25;
(Buzzer) int t = 5;

void tick_tick() {
Mục tiêu int i;
for (i = 0; i < 4; i++) {
Làm đồng hồ bấm giờ: digitalWrite(buzzerPin, HIGH);
Sau một khoảng thời gian nhất định delay(60);
được cài đặt trước, buzzer sẽ phát ra digitalWrite(buzzerPin, LOW);
âm báo. delay(60);
}
}

void setup() {
Kết nối phần cứng pinMode(buzzerPin, OUTPUT);
Buzzer (Còi báo) giúp phát Serial.begin(115200);
ra âm thanh. Nguyên tắc hoạt }
động rất đơn giản là sẽ phát
ra âm thanh khi chân tín hiệu
được bật sang HIGH và sẽ tắt uart i2c.. I2c.
void loop() {
khi chân tín hiệu bật về LOW. Buzzer
delay(t * 1000);
Module buzzer có thể được sử d3 d2 d1
Serial.println(“Het gio!!!”);
dụng với chức năng PWM giúp tick_tick();
phát ra nhiều giai điệu khác A3 A2 A1 }
nhau.
Giải
Giải thích
thích chương
chương trình
trình
23

Khai báo GPIO cần sử dụng: Trong hàm loop(), tạm dừng chương trình một khoảng thời
const int buzzerPin = 25; gian t đã đặt trước.
Khai báo biến t lưu lại thời gian đặt trước của đồng hồ bấm
void loop() {
giờ (đơn vị thời gian là giây). Sau khoảng thời gian này,
delay(t * 1000);
đồng hồ sẽ phát ra âm báo.
int t = 5; Sau t giây, tức là đã hết khoảng thời gian đặt trước, in ra
Hàm tick_tick() phát ra âm báo như chuông đồng hồ báo thông báo “hết giờ” và gọi hàm tick_tick để phát ra âm báo.
thức. Trong hàm tick_tick(), dùng vòng lặp for để bật tắt
buzz er tạo thành âm thanh tick-tick-tick-tick. Serial.println(“Het gio!!!”);
tick_tick();
void tick_tick() { }
int i;
for (i = 0; i < 4; i++) {
digitalWrite(buzzerPin, HIGH);
delay(60); Biên dịch và nạp chương trình
digitalWrite(buzzerPin, LOW);
delay(60); Chọn Board và chọn cổng COM, sau đó nhấn nút để biên
} dịch và nạp chương trình.
Vòng lặp for là kiểu vòng lặp được sử dụng với số lần lặp
lại biết trước. Sau khi nạp chương trình xong, hãy quan sát kết quả.
Các chương trình con như tick_tick() được viết trước hàm
setup() và hàm loop() và sau phần khai báo biến.

Trong hàm setup(), khai báo pinMode cho buzzerPin là


OUTPUT và khởi tạo Serial:
void setup() {
pinMode(buzzerPin, OUTPUT);
Serial.begin(115200);
}
24 Chuẩn bị Chương trình

Cảm biến 1. Blocky UNO


2. Module Ultrasonic Distance Sensor

Khoảng
#define TRIG 19
#define ECHO 18

cách
Mục tiêu void setup ()
{
Cửa sổ Serial monitor sẽ hiển thị kết pinMode(TRIG, OUTPUT);
(Ultrasonic quả khoảng cách đọc được từ cảm pinMode(ECHO, INPUT);
biến đến các vật cản xung quanh. Serial.begin(115200);
Distance }
Sensor) void loop () {
unsigned int duration;
float distance;
digitalWrite(TRIG, 0);
Kết nối phần cứng delayMicroseconds(2);
digitalWrite(TRIG, 1);
delayMicroseconds(5);
digitalWrite(TRIG, 0);
duration = pulseIn(ECHO, 1);
uart i2c.. I2c. distance = duration / 2 / 29.412;
Cảm biến khoảng cách
(Ultrasonic Distance Sensor) d3 d2 d1 Serial.print(“Distance: ”);
sử dụng sóng siêu âm để đo Serial.print(distance);
khoảng cách đến vật cản A3 A2 A1 Serial.print(“ cm”);
phía trước, thích hợp để làm delay(500);
các loại robot tránh vật cản, }
chống trộm, đo khoảng cách,...
Giải
Giải thích
thích chương
chương trình
trình
25

Cảm biến khoảng cách có 2 chân tín hiệu là void loop () {


TRIG và ECHO, tương ứng lần lượt với 2 chân tín unsigned int duration;
hiệu của mỗi port (dây trắng và dây vàng). float distance;
Ở bài này, TRIG và ECHO có giá trị lần lượt là Để đọc giá trị từ cảm biến khoảng cách ta cần gửi ra một
19 và 18.
tín hiệu trigger:
Trong bài này, ta tìm hiểu một cách khai báo hằng số khác là
digitalWrite(TRIG, 0);
dùng #define. Khác với các bài trước, #define không tạo ra delayMicroseconds(2);
biến mới giúp bộ nhớ của vi điềuk hiển được tối ưu. Cách này digitalWrite(TRIG, 1);
được ưu tiên sử dụng khi khai bào GPIO. delayMicroseconds(5);
#define TRIG 27 digitalWrite(TRIG, 0);
#define ECHO 14 đọc dữ liệu từ cảm biến bằng hàm pulseIn:
Trong hàm setup(), khai báo pinMode cho TRIG là OUTPUT,
pinMode cho switchPin là ECHO và khởi tạo Serial: duration = pulseIn(ECHO, 1);
void setup () quy đổi khoảng cách về đúng đơn vị cm:
{
pinMode(TRIG, OUTPUT); distance = duration / 2 / 29.412;
pinMode(ECHO, INPUT);
Serial.begin(115200); In ra màn hình Serial Monitor khoảng cách vừa đọc được
} Serial.print(“Distance: ”);
Serial.print(distance);
Trong hàm loop(), khai báo biến duration kiểu dữ liệu unsigned
Serial.print(“ cm”);
long (số nguyên dương) và biến distance kiểu dữ liệu float
delay(500);
(số thực). }
2 biến này được khai báo trong hàm loop() vì nó chỉ sử dụng
trong hàm này.Biến được khai báo trong hàm như vậy được
gọi là biến cục bộ (local variable). Biên dịch và nạp chương trình
Biến được khai báo bên ngoài hàm trong các bài học trước
Chọn Board và chọn cổng COM, sau đó nhấn nút để biên
được gọi là toàn cục (global variable).
dịch và nạp chương trình.
26
Cảm biến
Chuẩn bị Chương trình

1. Node Wifi 32

góc xoay
2. Module Rotary #define sensorPin 36
3. Module LED #define ledPin 32
int sensorValue = 0;

(Rotary Angle Mục tiêu void setup() {


Sensor) pinMode(sensorPin, INPUT);
pinMode(ledPin, OUTPUT);
Khi bạn vặn núm xoay của cảm biến,
Serial.begin(115200);
bạn sẽ thấy đèn LED được chỉnh sáng }
tối tương ứng với mức quy định trên
cảm biến. void loop() {
sensorValue =
analogRead(sensorPin);
analogWrite(ledPin, sensorValue);
Serial.print(“sensor value: “);
Kết nối phần cứng Serial.println(sensorValue);
Cảm biến góc xoay (Rotary Serial.print(map(sensorValue, 0,
Angle Sensor) sử dụng biến 4095, 0, 100), DEC);
trở để xác định góc xoay của Serial.println(“%”);
LED

trục cảm biến từ 0~300 độ, }


uart i2c.. I2c.
cảm biến trả ra giá trị điện
áp Analog tuyến tính với góc ROTARY SENSOR

d3 d2 d1
xoay, ứng dụng trong việc lập
trình điều khiển: Dimmer, tăng
A3 A2 A1
giảm độ sáng bằng biến trở,...
Giải thích chương trình
27

Đầu tiên cần khai báo GPIO cần sử dụng: Điều khiển LED sáng với độ sáng tương ứng giá trị vừa đọc
#define sensorPin 36 được từ cảm biến và in giá trị cảm biến ra để quan sát:
#define ledPin 32
analogWrite(ledPin, sensorValue);
GPIO kết nối với cảm biến và LED là các GPIO có hỗ trợ Serial.print(“sensor value: “);
ADC để sử dụng analog input và analog output. Serial.println(sensorValue);
Có thể xem thêm về analog input và analog output tại
https://ohtech.vn/all-courses/lap-trinh-esp32-voi- Giá trị đọc được qua bộ chuyển đổi ADC là một
arduinoide/lessons/analog-input-va-analog-output-voi- số nằm trong khoẳng từ 0 - 4095, ta có thể quy
esp32/ đổi số này về một số trong khoảng 0 - 100 bằng
cách dùng hàm map để xác định độ sáng của LED.
Khai báo biến sensorValue lưu lại giá trị đọc được từ cảm biến:
Serial.print(map(sensorValue, 0, 4095, 0,
int sensorValue = 0; 100));
Serial.println(“%”);
Trong hàm setup(), khai báo pinMode của sensorPin là INPUT, }
pinMode của ledPin là OUTPUT và khởi tạo Serial:

void setup() { Biên dịch và nạp chương trình


pinMode(sensorPin, INPUT);
pinMode(ledPin, OUTPUT);
Chọn Board và chọn cổng COM, sau đó nhấn nút để
Serial.begin(115200);
biên dịch và nạp chương trình.
}

Trong hàm loop(), đọc giá trị cảm biến bằng Sau khi nạp chương trình xong, hãy quan sát kết quả.
hàm analogRead rồi gán giá trị cho sensorValue.

void loop() {
sensorValue = analogRead(sensorPin);
28

Cảm biến
Chuẩn bị NạpChương
chươngtrình
trình

1. Node Wifi 32

ánh sáng
2. Module Light Sensor #define sensorPin 36
3. Module LED #define ledPin 32

int sensorValue = 0;
Mục tiêu
void setup() {
pinMode(sensorPin, INPUT);
Đèn LED sẽ tự động sáng khi ở môi
pinMode(ledPin, OUTPUT);
trường tối và tắt đi khi ở môi trường Serial.begin(115200);
sáng. }

void loop() {
sensorValue =
analogRead(sensorPin);
analogWrite(ledPin,4095-
Kết nối phần cứng sensorValue);
Light Sensor (Cảm biến ánh Serial.print(“sensor value: “);
sáng) được sử dụng để nhận Serial.println(sensorValue);
biết cuờng độ ánh sáng của LED
Serial.print(map(sensorValue, 0,
môi trường,  cảm biến trả ra 4095, 0, 100), DEC);
giá trị điện áp Analog tuyến uart i2c.. I2c.
Serial.println(“%”);
tính  với cường độ ánh sáng, light sensor
}
ứng dụng: bật tắt đèn thông d3 d2 d1
minh, vườn thông minh,...
A3 A2 A1
Giải thích chương trình
29

Chương trình này hoạt động tương tự chương trình trong bài
cảm bieresn góc xoay, tuy nhiên giá trị của cảm biến ánh
sáng sẽ thay đổi phụ thuộc vào độ sáng của môi trường.
Khi trời càng tối, giá trị đọc được từ cảm biến càng thấp,
ta cần điều khiển LED sáng khi tới tối do đó ta cần lấy phần
bù (4095) trừ cho sensorValue để điều khiển LED:

analogWrite(ledPin,4095- sensorValue);
Để quy đổi độ sáng của đèn LED, ta dùng:
Serial.print(map(sensorValue, 0, 4095, 0,
100), DEC);

Biên dịch và nạp chương trình

Chọn Board và chọn cổng COM, sau đó nhấn nút để


biên dịch và nạp chương trình.

Sau khi nạp chương trình xong, hãy quan sát kết quả.
30

Màn hình
Chuẩn bị Chương trình

1. Node Wifi 32 Ở bài này, bạn cần cài đặt thư viện

LCD 16x2
2. Module 16x2 LCD LiquidCrystal_I2C để chạy chương trình cho
LCD, xem tiếp hướng dẫn ở phần cài đặt
thư viện.
Mục tiêu
(16 x 2 LCD) #include <LiquidCrystal_I2C.h>
Module 16x2 LCD sẽ hiện ra dòng chữ
LiquidCrystal_I2C lcd(0x27, 16,
”Hello World!”.
2);

void setup() {
lcd.init();
lcd.backlight();
}
Kết nối phần cứng
Màn hình 16x2 LCD là dạng void loop() {
màn hình LCD Text với 32 ký tự lcd.setCursor(2, 0);
(16 x 2 dòng) trên màn hình lcd.print(“Hello World!”);
giúp hiển thị các thông tin điều delay(1000);
khiển, giá trị cảm biến, thông uart i2c.. I2c. lcd.clear();
báo,... một cách trực quan. delay(1000);
d3 d2 d1 }

A3 A2 A1
Cài đặt thư viện
31
Có nhiều thư viện hỗ trợ LCD, ở bài này chúng ta sử dụng
thư viện LiquidCrystal_I2C
LiquidCrystal_I2C.
Truy cập:
https://github.com/marcoschwartz/LiquidCrystal_I2C/archive/
master.zip để tải thư viện.
Có 2 cách cài thư viện sau khi tải về:

Cách 1:
Giải nén file vừa tải về, bạn sẽ có thư mục LiquidCrystal_
I2C-master.
Di chuyển thư mục LiquidCrystal_I2C-master đến thư mục
libaries theo đường dẫn Documents\Arduino\libraries . Dẫn đến thư mục chứa file vừa tải về, chọn file rồi nhấn
Open.
Open

Sau đó khởi động lại Arduino IDE để sử dụng thư viện.
Đợi phần mềm hoàn tất cài đặt là có thể sử dụng thư viện
Cách 2: vừa cài.
Vào Sketch -> Include Library -> Add .ZIP Library.
32
Đầu tiên cần khai báo thư viện LiquidCrystal_I2C bằng câu delay(1000);
lệnh: lcd.clear();
#include <LiquidCrystal_I2C.h> delay(1000);

Tiếp theo, cấu hình LCD với các thông số địa chỉ I2C, số Hàm loop() sẽ lặp lại liên tục, tạo thành hiệu ứng hiển thị 1
cột, số hàng. Địa chỉ I2C chính là địa chỉ đã tìm được ở giây, tắt 1 giây liên tục.
phần trên:
LiquidCrystal_I2C lcd(0x27, 16, 2); Biên dịch và nạp chương trình
Trong Hàm setup(), cần khởi tạo lcd bằng lệnh khởi tạo:
Chọn Board và chọn cổng COM, sau đó nhấn nút để
void setup() { biên dịch và nạp chương trình.
lcd.init();
Sau khi nạp chương trình xong, hãy quan sát kết quả.
Bật đèn nền màn hình để dễ dàng quan sát nội dung hiển
thị trên đó:
lcd.backlight();
}
Trong hàm loop(), để hiển thị nội dung ra màn hình, đầu tiên
cần đặt vị trí con trỏ tại vị trí muốn hiển thị. Ở đây đặt vị
trí con trỏ tại cột 2, hàng 0. Bạn có thể thay đổi thành số
tương ứng với vị trí bạn muốn đặt con trỏ.
void loop() {
lcd.setCursor(2, 0);
Hiển thị nội dung Hello World! ra màn hình bằng hàm print.

Dùng hàm clear để xóa màn hình sau 1 giây, sau đó lại dừng
chương trình 1 giây.
33
Cảm biến
Chuẩn bị Chương trình

1. Node Wifi 32 Ở bài này, bạn cần cài đặt thư viện DHT để

nhiệt độ
2. Module Temperature & Humidity chạy chương trình, xem tiếp hướng dẫn ở
Sensor DHT11 phần cài đặt thư viện.

độ ẩm
#include <LiquidCrystal_I2C.h>
Mục tiêu #include “DHT.h”

cửa sổ Serial monitor sẽ hiển thị kết quả #define DHTPIN 25


đọc từ cảm biến được thay đổi tương #define DHTTYPE DHT11
ứng với mức nhiệt độ và độ ẩm mà cảm
(Temperature biến nhận được. DHT dht(DHTPIN, DHTTYPE);
& Humidity) LiquidCrystal_I2C lcd(0x27, 16,
2);

void setup() {
Kết nối phần cứng Serial.begin(9600);
lcd.init();
lcd.backlight();
dht.begin();
Cảm biến nhiệt độ & độ ẩm uart i2c.. I2c.
Temperature & Humidity
}
(Temperature & Humidity Sensor
DHT11) được sử dụng để xác void loop() {
d3 d2 d1
định nhiệt độ và độ ẩm của float h = dht.readHumidity();
không khí trong các ứng dụng: float t = dht.readTemperature();
A3 A2 A1
trồng cây, theo dõi thời tiết,... if (isnan(h) || isnan(t)) {
Serial.println(F(“Failed to
read from DHT sensor!”));
return;
}
34
lcd.setCursor(0, 0);
lcd.print(“Temperature: “); Tìm thư viện DHT
DHT, chọn version mới nhất và nhấn Install để
lcd.setCursor(13, 0); cài đặt.
lcd.print(t);
lcd.setCursor(20, 0);
lcd.print(“do C”);
lcd.setCursor(0, 1);
lcd.print(“Humidity: “);
lcd.setCursor(13, 1);
lcd.print(h);
lcd.setCursor(20, 1);
lcd.print(“%”);
delay(1000);
}

Cài đặt thư viện

Để cài đặt thư viện DHT


DHT, hãy làm theo các bước sau:
Chọn Sketch -> Include Library -> Manager Library (hoặc
nhấn tổ hợp phím Ctrl+Shift+l).
Giải thích chương trình
35
Đầu tiên cần khai báo thư viện cần sử dụng: Cuối cùng, in nhiệt độ và độ ẩm ra màn hình LCD:
#include <LiquidCrystal_I2C.h> lcd.setCursor(0, 0);
#include “DHT.h” lcd.print(“Temperature: “);
Tiếp theo, khai báo GPIO và loại cảm biến cần sử dụng: lcd.setCursor(13, 0);
#define DHTPIN 25 lcd.print(t);
#define DHTTYPE DHT11 lcd.setCursor(20, 0);
Cấu hình LCD và cảm biến DHT11: lcd.print(“do C”);
DHT dht(DHTPIN, DHTTYPE); lcd.setCursor(0, 1);
LiquidCrystal_I2C lcd(0x27, 16, 2); lcd.print(“Humidity: “);
Trong Hàm setup(), cần khởi tạo Serial, LCD và DHT11: lcd.setCursor(13, 1);
lcd.print(h);
void setup() {
lcd.setCursor(20, 1);
Serial.begin(9600);
lcd.print(“%”);
lcd.init();
delay(1000);
lcd.backlight();
}
dht.begin();
}
Trong hàm loop(), đọc nhiệt độ và đọ ẩm từ cảm biến DHT11 Biên dịch và nạp chương trình
và in ra thông báo nếu gặp lỗi:
Chọn Board và chọn cổng COM, sau đó nhấn nút để
void loop() {
biên dịch và nạp chương trình.
float h = dht.readHumidity();
float t = dht.readTemperature();
Sau khi nạp chương trình xong, hãy quan sát kết quả.
if (isnan(h) || isnan(t)) {
Serial.println(F(“Failed to read from DHT
sensor!”));
return;
}
Cuối cùng, in nhiệt độ và độ ẩm ra màn hình LCD:
Mục lục
Giới thiệu về Arduino 02
Node Wifi 32 03
Arduino Kit 04
Cài đặt Arduino IDE 05
Cài đặt thư viện 06
Giao diện 07
Các module 08
Đèn LED 09
Công tắc gạt 12
Nút nhấn 14
Cảm biến chuyển động 16
Cảm biến âm thanh 18
Còi báo 20
Rơ-le 22
Cảm biến khoảng cách 24
Cảm biến góc xoay 26
Cảm biến ánh sáng 28
Màn hình LCD 16x2 30
Cảm biến nhiệt độ & độ ẩm 33

You might also like