You are on page 1of 56

HANOI UNIVERSITY OF INDUSTRY

FALCUTY OF ELECTRONIC ENGINEERING

Kỹ thuật lập trình


trong điện tử
(JC5134)
LPI_HAUI Laboratory

Bộ môn Điện tử Viễn thông, Khoa Điện tử


1
Mô tả tóm tắt học phần
(Course description)

Chương 2: Thiết kế hệ thống nhúng


Mục tiêu:
- Trình bày được các lệnh cơ bản của phần mềm biên dịch
- Trình bày được các bước xây dựng bài toán
- Trình bày được tổng quan khối vào ra số
- Trình bày được tổng quan khối vào ra tương tự
- Sử dụng được phần mềm biên dịch
- Giải thích tác dụng các lệnh điều khiển khối vào ra số
trên Arduino
- Viết các chương trình theo yêu cầu.
- Phân tích các chương trình có sẵn.
- Thực hiện các ứng dụng thực tế thông qua các mô hình.
2
Néi dung m«n häc

Chương 2: Thiết kế hệ thống nhúng


1. Giới thiệu chung
2. Phần mềm biên dịch
3. Phần mềm mô phỏng
4. Các bước xây dựng bài toán
5. Khối vào ra số

3
Néi dung m«n häc

Chương 2: Thiết kế hệ thống nhúng

6. Điều khiển led đơn


7. Điều khiển led bằng nút bấm nhấn
8. Điều khiển led 7 thanh
9. Khối vào ra tương tự
10. Điều khiển led bằng quang trở
11. Điều khiển động cơ bằng biến trở
4
Thiết kế hệ thống nhúng

Các bước xây dựng bài toán

• Bước 1: Phân tích đề bài


• Bước 2: Xây dựng sơ đồ mạch
• Bước 3: Viết lưu đồ thuật toán
• Bước 4: Viết code dựa vào lưu đồ thuật toán
• Bước 5: Kiểm tra, chạy thử và sửa lỗi

5
Thiết kế hệ thống nhúng
Hàm điều khiển khối vào ra số
• digitalWrite(Chân digital,Trạng thái); // Là hàm dung để xuất tín hiệu
ra một chân digital bất kì, trạng thái có thế là mức cao (HIGH) hoặc
mức thấp (LOW).
• digitalRead(Chân digital) ; // Hàm dùng để đọc tín hiệu của một chân
digital bất kì.
• delay(khoảng thời gian) ; // đợi một khoảng, đơn vị là ms
• delayMicroseconds(khoảng thời gian); đợi một khoảng, đơn vị là
micro giây (us)

Hàm điều khiển khối vào ra tương tự


• analogRead( chân analog in) : là hàm dùng để đọc tín hiệu analog
từ bên ngoài đưa vào chân analog.
• analogWrite( chân analog out, giá trị ) : là hàm dùng để xuất tín
hiệu ra các chân analog với giá trị nhất định, giá trị này nằm trong
khoảng từ 0 đến 255.
6
Thiết kế hệ thống nhúng

2.1. Lập trình Điều khiển


Điều khiển led bằng nút bấm  Khi ấn công tắc trên chân 9 thì led trên chân 13 sáng và
khi bỏ tay khỏi nút bấm thì đèn tắt.
Điều khiển led bằng nút bấm nhấn lần thứ nhất led sáng, lần thứ hai led tắt  Viết chương
trình điều khiển led trên chân 13 bằng nút bấm trên chân số 9, ấn lần thứ nhất thì đèn sáng,
nhấn lần thứ 2 đèn tắt, quá trình được lặp lại.
Điều khiển led bằng nút bấm nhấn lần thứ nhất led sáng, lần thứ hai led tắt, có chống
nhiễu. Viết chương trình điều khiển led trên chân 13 bằng nút bấm trên chân số 9, ấn lần
thứ nhất thì đèn sáng, nhấn lần thứ 2 đèn tắt, có thêm chống nhiễu cho nút bấm.
Điều khiển led 7 thanh đơn  Hiển thi led 7 thanh đơn chạy từ 0 đến 9.
Điều khiển led 7 thanh đôi  Viết chương trình hiển thị led 7 thanh đôi, hiển thị từ 00 đến 99
Đếm sự khiện hiển thị led 7 thanh  Viết chương trình điều khiển led 7 thanh đôi đếm sự
kiến, bấm nút bấm thì giá trị led 7 thanh tăng lên 1 đơn vị.
Điều khiển led bằng biến trở  Dùng biến trở để điều khiển độ sáng của led.
Điều khiển led nháy bằng biến trở  Điều khiển led nháy bằng biến trở.
Điều khiển led bằng quang trở  Điều khiển led bằng quang trở.
Điều khiển tốc độ động cơ một chiều bằng biến trở  Điều khiển tốc độ động cơ một chiều
bằng biến trở.
Điều khiển động cơ RC servo bằng biến trở Điều khiển động cơ RC servo bằng biến trở.7
Thiết kế hệ thống nhúng

2.1. Điều khiển led


Đề bài 1_1 : Lập trình điều khiển 1 led đơn trên chân
số 13 sáng tắt với chu kỳ 1 giây.
Bước 1: Phân tích đề bài: Đề bài yêu cầu làm cho led sáng tắt với chu kì
1 giây tức là sáng 1 giây rồi lại tắt 1 giây, vì thế ta cần xuất tín hiệu digital
ra chân số 13 ở mức cao trong 1 giây sau đó xuất tín hiệu ở mức thấp
trong vòng 1 giây.
Bước 2: Xây dựng sơ đồ mạch:  Proteus
Bước 3: Lắp mạch: fritzing

8
Thiết kế hệ thống nhúng
Đề bài 1_1 : Lập trình điều khiển 1 led đơn trên chân
số 13 sáng tắt với chu kỳ 1 giây.
Bước 4: Xây dựng lưu đồ thuật Bước 5: Viết code dựa vào lưu đồ
toán: thuật toán:

#define LedPin 13
void setup() {
pinMode(13,OUTPUT);
}
void loop() {
digitalWrite(LedPin,HIGH);
delay(1000);
digitalWrite(LedPin,LOW);
delay(1000);
}
9
Thiết kế hệ thống nhúng
Đề bài 1_1 : Lập trình điều khiển 1 led đơn trên chân
số 13 sáng tắt với chu kỳ 1 giây.
Bước 5: Viết code dựa vào lưu * Giải thích chương trình: Dòng
đồ thuật toán: đầu tiên ta khai báo chân led là chân
số 13 với cú pháp #define, trong
#define LedPin 13 phần setup ta sẽ cài đặt chân led là
void setup() { chân đầu ra dữ liệu với cú pháp
pinMode(13,OUTPUT); pinMode. Trong vòng lặp vô tận,
đầu tiên ta sẽ bật led sáng với cấu
}
trúc digitalWrite(<chân Led>,
void loop() { HIGH); sau đó delay(1000) tức là
digitalWrite(LedPin,HIGH); đợi cho led sáng trong vòng 1s, tiếp
delay(1000); tục thì ta sẽ tắt led với cấu truc
digitalWrite(LedPin,LOW); digitalWrite, và cũng đợi 1s như lúc
led sáng, cứ như thế ta sẽ có được
delay(1000);
led nhấp nháy với chu kì 1s.
} 10
Thiết kế hệ thống nhúng
Đề bài 1_1 : Lập trình điều khiển 1 led đơn trên chân
số 13 sáng tắt với chu kỳ 1 giây.
Bước 6: Kiểm tra, chạy thử và sửa lỗi:

Tạo File Hex.


Để nạp code cho board trong proteus
Sau khi nạp chương trình thì ấn nút play để mô
phỏng và xem kết quả

11
Thiết kế hệ thống nhúng

Đề bài 1_2 : Điều khiển led bằng nút bấm


Đề bài: Khi ấn công tắc trên chân 9 thì led trên chân 13
sáng và khi bỏ tay khỏi nút bấm thì đèn tắt.
Bước 1: Phân tích đề bài: điều khiển led bằng nút bấm, đèn sẽ
sáng hay tắt dựa vào trạng thái của nút bấm. Vì vậy ta cần kiểm tra
trạng thái của nút bấm liên tục, dựa vào trạng thái của nút bấm để điều
khiển led.

Bước 2: Xây dựng sơ đồ mạch:

12
Thiết kế hệ thống nhúng
Đề bài 1_2 : Điều khiển led bằng nút bấm
Đề bài: Khi ấn công tắc trên chân 9 thì led trên chân 13 sáng và khi
bỏ tay khỏi nút bấm thì đèn tắt.
const int buttonPin = 9;
const int ledPin = 13;
int buttonState = 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT)
}
void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState == LOW) {
digitalWrite(ledPin, HIGH);
}
else {
digitalWrite(ledPin, LOW);
}
}
13
Thiết kế hệ thống nhúng

Đề bài 1_3 : Điều khiển led bằng nút bấm nhấn lần thứ nhất led
sáng, lần thứ hai led tắt
Đề bài: Viết chương trình điều khiển led trên chân 13 bằng nút bấm
trên chân số 9,ấn lần thứ nhất thì đèn sáng, nhấn lần thứ 2 đèn tắt,
quá trình được lặp lại.

Bước 1: Phân tích đề bài: Đề bài yêu cầu ta dùng 1 công tắc
để điều khiển led, nhưng sẽ dựa vào số lần bấm công tăc để
điều khiển led chứ không phải dựa vào trạng thái của công
tắc như đề bài 1. Để giải được bài này thì ta sẽ dùng 1 biến
đếm để đếm số lần bấm của công tắc, dựa vào biến này ta
sẽ điều khiển led. Biến đếm này sẽ được cài đặt để chỉ có hai
giá trị để ta dễ dàng trong việc điều khiển led.
14
Thiết kế hệ thống nhúng
const int buttonPin = 9;
const int ledPin = 13;
int buttonState = 0;
int biendem = 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
}
void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState == LOW) {
delay(100);
biendem ++;
if( biendem == 2)
biendem = 0;
}
if(biendem == 0) {
digitalWrite(ledPin, LOW);
}
else
if(biendem ==1) {
digitalWrite(ledPin, HIGH);
} 15
Thiết kế hệ thống nhúng

Đề bài: Hiển thi led 7 thanh đơn chạy từ 0 đến 9.


Bước 1: Phân tích đề bài: Để hiện thì được led 7 thanh thì ta cần hiểu về
cấu tạo của nó, để nó hiển thị ra các số từ 0 đến 9 thì ta phải có các mã
của từng số ( tức là tín hiệu của các chân led ), dựa vào các mã đó ta sẽ
viết được chương trình.
Ví dụ: mã led từ 0 đến 9 của led anot
chung. ( giá trị từ chân F đến chân A và
chân
DP, 1 là sáng 0 là tắt).
Số 1 : 0b11111100
Số 2 : 0b11011010
Số 3 : 0b 11110010
Số 4 : 0b 01100110
Số 5 : 0b 10110110
Số 6 : 0b 10111110
Số 7 : 0b 11100000,
Số 8 : 0b 11111110
Số 9 : 0b 11110110
16
Thiết kế hệ thống nhúng

Đề bài: Hiển thi led 7 thanh đơn chạy từ 0 đến 9.

17
Thiết kế hệ thống nhúng
Đề bài: Hiển thi led 7 thanh đơn chạy từ 0 đến 9.
const int Chan7seg[8] = void setup() void loop()
{3,4,5,6,7,8,9,10}; { {
int i=0; for (int vitri = 0; vitri < 8; vitri++) for(i = 0; i<10 ;
const byte maled[10] = { { i++ )
B11111100, pinMode(Chan7seg[vitri], {
B01100000, OUTPUT); Hienthi(i);
B11011010, } delay(100);
B11110010, } }
B01100110, void Hienthi(int SoHienthi) }
B10110110, {
B10111110, boolean SetBit;
B11100000, for(int segment=0; segment <
B11111110, 8; segment++)
B11110110, {
}; SetBit =
bitRead(maled[SoHienthi],
segment);
SetBit = !SetBit;
digitalWrite(Chan7seg[segment],
SetBit); 18
Thiết kế hệ thống nhúng
Đề bài:Dùng biến trở để điều khiển độ sang của led.
Bước 1: Phân tích đề bài: Ta sẽ sử dụng biến trở để điều khiển độ sáng
của led. Đọc giá trị analog của biến trở, sử dụng giá trị đó để xuất ra độ
sáng của led. Thực chất của việc điều khiển độ sáng của led chính là việc
điều xung PWM, các chân analog out của arduino cũng chính là các chân
xuất xung PWM.

19
Thiết kế hệ thống nhúng
Đề bài:Dùng biến trở để điều khiển độ sang của led.
Bước 5: Viết code dựa vào lưu đồ thuật toán:
const int chanAnalog = A0;
const int chanLed = 9;
int GiatriIn,GiatriOut ;
void setup()
{
pinMode(chanLed,OUTPUT);
pinMode(chanAnalog,INPUT);
GiatriIn = 0;
GiatriOut = 0;
}
void loop()
{
GiatriIn = analogRead(chanAnalog);
GiatriOut = map(GiatriIn,0,1023,0,255);
analogWrite(chanLed, GiatriOut);
delay(2);
}

20
Thiết kế hệ thống nhúng

Đề bài: Điều khiển led bằng quang trở.

Bước 1: Phân tích đề bài: Quang trở là một loại "vật liệu" điện tử rất hay
gặp và được sử dụng trong những mạch cảm biến ánh sáng. Có thể hiểu
một cách dễ dàng rằng, quang trở là một loại ĐIỆN TRỞ có điện trở thay
đổi theo cường độ ánh sáng.
Nếu đặt ở môi trường có ít ánh sáng, có bóng râm 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. Qua bài này, ta sẽ học đươc cách xây dựng
một cảm biến ánh sáng sử dụng quang trở dựa trên nguyên lý hoạt động
lý thú của nó!
Sau đây chúng ta sẽ viết chương trình đọc tín hiệu từ quang trở để điều
khiển led. Về việc đọc giá trị của quang trở sẽ không khác biệt so với việc
đọc giá trị của biến trở.

21
Thiết kế hệ thống nhúng

Đề bài: Điều khiển led bằng quang trở.

22
Thiết kế hệ thống nhúng
Đề bài: Điều khiển led bằng quang trở.
const int chanAnalog = A0;
const int chanLed = 13;
int GiatriIn,GiatriOut ;
void setup() {
pinMode(chanLed,OUTPUT);
pinMode(chanAnalog,INPUT);
GiatriIn = 0;
GiatriOut = 0;
}
void loop()
{
GiatriIn = analogRead(chanAnalog);
GiatriOut = map(GiatriIn,0,1023,0,255);
if( GiatriOut < 50 )
{
digitalWrite(chanLed,HIGH);
}
else
{
digitalWrite(chanLed,LOW);
}} 23
Thiết kế hệ thống nhúng

Đề bài: Điều khiển tốc độ động cơ một chiều bằng biến trở.

Bước 1: Phân tích đề bài:


Điều khiển động cơ là một vấn đề rất quan trọng với việc lập
trình, hầu hết trong thực tế thứ chúng ta điều khiển là động cơ
hoặc các thiết bị công suất chứ không chỉ là led, chính vì vậy
chúng ta cần biết được cách để điều khiển động cơ hoặc các
cơ cấu chấp hành khác.
Để điều khiển được động cơ một chiều với arduino thì chúng
ta điều khiển chúng giống như điều khiển độ sáng của led
bằng biến trở với việc dung hàm đọc giá trị analogRead chân
biến trở và xuất giá trị analogWrite ra chân PWM.

24
Thiết kế hệ thống nhúng

Đề bài: Điều khiển tốc độ động cơ một chiều bằng biến trở.

25
Thiết kế hệ thống nhúng
Đề bài: Điều khiển tốc độ động cơ một chiều bằng biến trở.
const int chanAnalog = A0;
const int chanDC = 13;
int GiatriIn,GiatriOut ;
void setup()
{
pinMode(chanDC,OUTPUT);
pinMode(chanAnalog,INPUT);
GiatriIn = 0;
GiatriOut = 0;
}
void loop()
{
GiatriIn = analogRead(chanAnalog);
GiatriOut = map(GiatriIn,0,1023,0,255);
analogWrite(chanDC,GiatriOut);
}
26
Thiết kế hệ thống nhúng

Giao tiếp LCD 1. VSS: tương đương với GND - cực âm


2. VDD: tương đương với VCC - cực dương
(5V)
3. Constrast Voltage (Vo): điều khiển độ sáng
màn hình
4. Register Select (RS): điều khiển địa chỉ
nào sẽ được ghi dữ liệu
5. Read/Write (RW): set đọc (read mode) hay
ghi (write mode) dữ liệu? Nó sẽ phụ thuộc
vào việc gửi giá trị gì vào.
6. Enable pin: Cho phép ghi vào LCD
7. D0 - D7: 8 chân dư liệu, mỗi chân sẽ có giá
trị HIGH hoặc LOW nếu đang ở chế độ đọc
(read mode) và nó sẽ nhận giá trị HIGH hoặc
LOW nếu đang ở chế độ ghi (write mode)
8. Backlight (Backlight Anode (+) và Backlight
Cathode (-)): Tắt bật đèn màn hình LCD.
27
Thiết kế hệ thống nhúng
Giao tiếp LCD

28
Thiết kế hệ thống nhúng
Giao tiếp LCD
//Thêm thư viện LiquitCrystal
#include <LiquidCrystal.h>
//Khởi tạo với các chân
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
//Thông báo đây là LCD 1602
lcd.begin(16, 2);
//In ra màn hình lcd dòng chữ Toi yeu Arduino
lcd.print("Toi yeu Arduino!");
}
void loop() {
// đặt con trỏ vào cột 0, dòng 1
// Lưu ý: dòng 1 là dòng thứ 2, lòng 0 là dòng thứ 1. Nôm na, nó đếm từ 0 từ
không phải từ 1
lcd.setCursor(0, 1);
// In ra dong chu
lcd.print(" Arduino.VN");
} 29
Thiết kế hệ thống nhúng
Giao tiếp LCD

 Điều khiển LCD1602 bằng Arduino UNO


http://arduino.vn/bai-viet/531-dieu-khien-lcd-bang-arduino-
uno
 Lập trình LCD 1602 với chip 74HC595
http://arduino.vn/bai-viet/536-lap-trinh-lcd-1602-voi-chip-
74hc595
 Giao tiếp I2C LCD
https://arduinokit.vn/giao-tiep-i2c-lcd-arduino
 Giao tiếp ma trận phím 4x4
http://arduino.vn/bai-viet/915-huong-dan-su-dung-module-ban-
phim-4x4-voiarduino

30
Thiết kế hệ thống nhúng
Đọc nhiệt độ lm35 và xuất ra màn hình LCD
https://dientuviet.com/do-nhiet-do-dung-lm35-va-arduino/

Như vậy ta có:


U = t*k
Trong đó:
U là điện áp đầu ra
t là nhiệt độ môi trường
k là hệ số theo nhiệt độ của LM35 (10mV/oC)
Số U = t*10mV/oC
ch Tên Chức năng
ân
Giả sử điện áp cấp cho LM35 là 5V. Bộ chuyển đổi ADC gồm
Điện áp nguồn; 5V 10 bit tức là 1024 mức
1 Vs
(+4V đến 30V) Vậy mỗi bước thay đổi của LM35 sẽ là n = 5/(210) = 5/1024
2 Vout
Điện áp ra (-1V đến Giá trị ADC đo được từ điện áp đầu vào của LM35 là
6V)
ADC_Value = U/n = (t * 10-2*1024) / 5
3 GND Chân nối đất
Vậy nhiệt độ ta đo được t = ADC_Value/2,048
Tương tự với ADC 11bit và Vcc khác ta cũng tính như trên để
được công thức lấy nhiệt độ 31
Thiết kế hệ thống nhúng
Đọc nhiệt độ lm35 và xuất ra màn hình LCD
https://dientuviet.com/do-nhiet-do-dung-lm35-va-arduino/

32
Thiết kế hệ thống nhúng
Đọc nhiệt độ lm35 và xuất ra màn hình LCD
https://dientuviet.com/do-nhiet-do-dung-lm35-va-arduino/

void setup() void loop()


/*———–Arduino LM35 Code—
{ {
———-*/
lcd.begin(16,2); /*———Đo nhiet do——-*/
/*———–Do nhiet do dung
lcd.createChar(1,degree); float
Arduino————-*/
lcd.setCursor(0,0); reading=analogRead(sensor);
#include<LiquidCrystal.h>
lcd.print(“Do nhiet do dung”); float
LiquidCrystal lcd(7,6,5,4,3,2);
lcd.setCursor(0,1); nhietdo=reading*(5.0/1024.0
#define sensor A0
lcd.print(“Cam bien LM35”); )*100;
byte degree[8] =
delay(500); delay(10);
{
lcd.clear(); /*——Hien thi ket qua——*/
0b00011,
lcd.print(“dientuadenz.com”); lcd.clear();
0b00011,
delay(500); lcd.setCursor(2,0);
0b00000,
lcd.clear(); lcd.print(“Nhiet do”);
0b00000,
} lcd.setCursor(4,1);
0b00000,
0b00000, lcd.print(nhietdo);
0b00000, lcd.write(1);
0b00000 lcd.print(“C”);
}; delay(1000);
}
33
Thiết kế hệ thống nhúng
Đọc nhiệt độ lm35 và xuất ra màn hình LCD
https://dientuviet.com/do-nhiet-do-dung-lm35-va-arduino/
Giải thích
Để viết chương trình cho nhiệt kế số, chúng ta cần phải viết code để giao tiếp cho Arduino, cảm
biến nhiệt độ LM35 và mô-đun LCD 16×2. Đầu tiên chúng ta include thư viện cho màn hình LCD
và sau đó chúng ta định nghĩa dữ liệu và chân điều khiển cho màn hình LCD và cảm biến nhiệt
độ.
#include<LiquidCrystal.h>
LiquidCrystal lcd(7,6,5,4,3,2);
#define sensor A0
Sau khi nhận được giá trị tương tự (analog) tại chân A0, Arduino sẽ đọc giá trị đó bằng cách sử
dụng hàm đọc Analog và lưu trữ giá trị đó trong một biến. Và sau đó bằng cách áp dụng công
thức đã cho để chuyển đổi nó sang nhiệt độ.
float analog_value=analogRead(analog_pin);
float nhietdo=analog_value*factor*100 // Trong đó factor=5/1024 analog_value= giá trị ngõ
ra của cảm biến nhiệt độ
float reading=analogRead(sensor);
float nhietdo=reading*(5.0/1023.0)*100;
delay(10);
Ký hiệu độ (o) ở đây được tạo bằng cách sử dụng phương pháp ký tự tùy chỉnh byte degree[8]
= {0b00011, 0b00011, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000 };

34
Thiết kế hệ thống nhúng
Đọc nhiệt độ - độ ẩm và xuất ra màn hình LCD
http://arduino.vn/bai-viet/91-doc-nhiet-do-do-am-va-xuat-ra-man-hinh-lcd
Cảm biến DHT11 // Gọi thư viện DHT11
#include "DHT.h"
const int DHTPIN = 2; //Đọc dữ liệu từ DHT11 ở chân 2
trên mạch Arduino
const int DHTTYPE = DHT11; //Khai báo loại cảm biến, có
2 loại là DHT11 và DHT22
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600)
dht.begin(); // Khởi động cảm biế
Download và cài đặt thư }
viện hỗ trợ sử dụng void loop() {
DHT11: download tại đây float h = dht.readHumidity(); //Đọc độ ẩ
float t = dht.readTemperature(); //Đọc nhiệt đ
Arduino Serial.print("Nhiet do: ")
DHT11 Serial.println(t); //Xuất nhiệt đoo
UNO R3 Serial.print("Do am: ")
GND GND Serial.println(h); //Xuất độ ẩm
Vcc 5V Serial.println(); //Xuống hàng
delay(1000); //Đợi 1 giâ
Signal D2 } 35
Thiết kế hệ thống nhúng
Đọc nhiệt độ - độ ẩm và xuất ra màn hình LCD
http://arduino.vn/bai-viet/91-doc-nhiet-do-do-am-va-xuat-ra-man-hinh-lcd
Màn hình LCD

Tham khảo
tại http://arduin
o.cc/en/Tutorial/
Liquid.... Module màn hình
Download và cài đặt thư Arduino
viện hỗ trợ sử dụng màn LCD (16x2)
hình LCD qua giao tiếp GND GND
I2C: download tại đây Vcc 5V
SDA A4
SCL A5

36
Thiết kế hệ thống nhúng
Đọc nhiệt độ - độ ẩm và xuất ra màn hình LCD
http://arduino.vn/bai-viet/91-doc-nhiet-do-do-am-va-xuat-ra-man-hinh-lcd
Màn hình LCD #include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
//0x27 là địa chỉ màn hình trong bus I2C. Phần này chúng ta
không cần phải quá bận tâm vì hầu hết màn hình (20x4,...) đều
như thế này!
//16 là số cột của màn hình (nếu dùng loại màn hình 20x4) thì
thay bằng 20
//2 là số dòng của màn hình (nếu dùng loại màn hình 20x4) thì
thay bằng 4
void setup() { lcd.init();
//Khởi động màn hình. Bắt đầu cho phép Arduino sử dụng màn
hình, cũng giống như dht.begin() trong chương trình trên
lcd.backlight(); //Bật đèn nền
lcd.print("Hello world");
//Xuất ra chữ Hello world, mặc định sau khi init thì con trỏ tại cột 0
hàng 0 (trong C, khác với quy ước của tiếng Việt, mọi chỉ số đều
bắt đầu bằng số 0, vì vậy bạn cần hiểu rằng, nếu ta kẻ một bảng
có 2 hàng và 16 cột thì ô góc trên cùng bên trái là ô (0,0) tương tự
với các ô khác, ta cứ tăng dần giá trị lên!
lcd.setCursor(0,1); //Đưa con trỏ tới hàng 1, cột 0
lcd.print("I love Arduino !");// Bạn thấy trên màn hình rồi chứ?
}
void loop() {
}
37
Thiết kế hệ thống nhúng
Đọc nhiệt độ - độ ẩm và xuất ra màn hình LCD
http://arduino.vn/bai-viet/91-doc-nhiet-do-do-am-va-xuat-ra-man-hinh-lcd
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h> void loop() {
LiquidCrystal_I2C lcd(0x27,16,2); float h = dht.readHumidity();
const int DHTPIN = 2; float t = dht.readTemperature();
const int DHTTYPE = DHT11; if (isnan(t) || isnan(h))
DHT dht(DHTPIN, DHTTYPE); {
byte degree[8] = { // Kiểm tra xem thử việc đọc giá trị có bị thất bại hay
0B01110, không. Hàm isnan bạn xem tại đây
0B01010, http://arduino.vn/reference/isnan
0B01110, }
0B00000, else {
0B00000, lcd.setCursor(10,0);
0B00000, lcd.print(round(t));
0B00000, lcd.print(" ");
0B00000 lcd.write(1);
}; lcd.print("C");
void setup() { lcd.setCursor(10,1);
lcd.init(); lcd.print(round(h));
lcd.backlight(); lcd.print(" %");
lcd.print("Nhiet do: "); }
lcd.setCursor(0,1); }
lcd.print("Do am: ");
lcd.createChar(1, degree);
dht.begin();
}
38
Thiết kế hệ thống nhúng
Nhập xuất Analog (Analog I/O)
analogReference()
Hàm analogReference() có nhiệm vụ đặt lại mức (điện áp) tối đa khi đọc tín hiệu
analogRead. Ứng dụng như sau, giả sử cần đọc một tín hiệu dạng analog có hiệu điện thế từ
0- 1,1V. Nhưng mà nếu dùng mức điện áp tối đa mặc định của hệ thống (5V) thì khoảng giá
trị sẽ ngắn hơn => độ chính xác kém hơn => hàm này dùng để giải quyết việc đó.

Cú pháp
analogReference(type)
type: một trong các kiểu giá trị sau: DEFAULT, INTERNAL, INTERNAL1V1,
INTERNAL2V56, hoặc EXTERNAL

Trả về
không

39
Thiết kế hệ thống nhúng
Nhập xuất Analog (Analog I/O)
analogRead()
Nhiệm vụ của analogRead() là đọc giá trị điện áp từ một chân Analog (ADC).
Trên mạch Arduino UNO có 6 chân Analog In, được kí hiệu từ A0 đến A5. Trên các mạch
khác cũng có những chân tương tự như vậy với tiền tố "A" đứng đầu, sau đó là số hiệu
của chân. analogRead() luôn trả về 1 số nguyên nằm trong khoảng từ 0 đến 1023 tương ứng
với thang điện áp (mặc định) từ 0 đến 5V. Có thể điều chỉnh thang điện áp này bằng
hàm analogReference().
Hàm analogRead() cần 100 micro giây để thực hiện.
Khi nói "đọc tín hiệu analog", có thể hiểu đó chính là việc đọc giá trị điện áp.
Cú pháp
analogRead([chân đọc điện áp]);

Ví dụ
int voltage = analogRead(A0);
Trong đó A0 là chân dùng để đọc điện áp. 40
Thiết kế hệ thống nhúng
Nhập xuất Analog (Analog I/O)
analogWrite()
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
hướng quay của động cơ servo bằng cách phát xung PWM như thế này.
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
analogWrite([chân phát xung PWM], [giá trị xung PWM]);

Giá trị mức xung PWM nằm trong khoảng từ 0 đến 255, tương
ứng với mức duty cycle từ 0% đến 100%

41
Thiết kế hệ thống nhúng
Nhập xuất Analog (Analog I/O)
Kiến thức cơ bản về xung PWM
Xung là các trạng thái cao / thấp (HIGH/LOW) về mức điện áp được lặp đi lặp lại. Đại lượng
đặc trưng cho 1 xung PWM (Pulse Width Modulation) bao gồm tần số (frequency) và chu kì
xung (duty cycle).

Tần số là gì? Tần số là số lần lặp lại trong 1 đơn vị thời gian.

 Cách xác định 1 dao động như thế nào?  Dao động được xác định từ trạng
thái bắt đầu và kết thúc ngay trước khi trạng thái bắt đầu được lặp lại.

42
Thiết kế hệ thống nhúng
Nhập xuất Analog (Analog I/O)
 Cách xác định 1 dao động
Như vậy thông thường, 1 dao động sẽ bao gồm 2 trạng thái điện: mức cao (x
giây) và mức thấp (y giây). Tỉ lệ phần trăm thời gian giữa 2 trạng thái điện này
chính là chu kì xung.

 Với x/y = 0% ta có xung chứa toàn bộ điện áp thấp (khái niệm xung
nên hiểu mở rộng)
 Với x/y = 50% thì 50% thời gian đầu, xung có điện áp cao, 50% sau
xung có điện áp thấp.
 Với x/y=100% ta có xung chứa toàn bộ điện áp cao.

Tóm lại, với 1 xung ta có:


 Tần số: để tính toán ra được thời gian của 1 xung
 Chu kì xung: bao nhiêu thời gian xung có mức áp cao, bao nhiêu
thời gian xung có mức áp thấp.
43
Thiết kế hệ thống nhúng
Nhập xuất Analog (Analog I/O)
analogWrite() tạo xung PWM

44
Thiết kế hệ thống nhúng
Nhập xuất Analog (Analog I/O)
analogWrite()

Xung PPM khác với PWM ở chỗ:


1. tần số thông thường có giá trị
trong khoảng 50Hz (20 mili
giây) không quan trọng
2. thời gian xung ở mức cao chỉ
từ 1ms đến 2ms rất quan trọng.
3. có thể có nhiều hơn 1 sự thay
đổi trạng thái điện cao/thấp

Với thời gian 1ms mức cao, góc quay của servo là 0, 1.5ms góc quay 90 và 2ms
góc quay là 180. Các góc khác từ 0-180 được xác định trong khoảng thời gian 1-
2ms.
Lưu ý: có thể ghép nhiều xung trong cùng 1 thời gian là 20ms để xác định vị trí góc của
nhiều servo cùng 1 lúc. Tối đa là 10 servo.
45
Thiết kế hệ thống nhúng
Nhập xuất Analog (Analog I/O)
analogWrite() tạo xung PWM
Ví dụ
int led = 11;
void setup() {
}
void loop() {
for (int i = 0; i <= 255; i++)
{
analogWrite(led,i);
delay(20);
}
}
 Điều chỉnh độ sáng của LED bằng độ rộng xung
http://arduino.vn/bai-viet/144-dieu-chinh-do-sang-cua-led-qua-giao-tiep-serial
 Tìm hiểu về xung PWM
http://arduino.vn/reference/xung-pwm 46
Thiết kế hệ thống nhúng

Ngắt (interrupt)
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.
1 attachInterrupt()
2 detachInterrupt()
3 interrupts()
4 noInterrupts()

47
Thiết kế hệ thống nhúng

attachInterrupt() Cú pháp
attachInterrupt(interrupt, ISR, mode);
Thông số
interrupt: Số thứ tự của ngắt.
 Trên Arduino Uno, 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 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.
mode: kiểu kích hoạt ngắt, bao gồm
 LOW: kích hoạt liên tục khi trạng thái chân digital có mức thấp
 HIGH: kích hoạt liên tục khi trạng thái chân digital có mức cao.
 RISING: kích hoạt khi trạng thái của chân digital chuyển từ 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.
Trả về : không

http://arduino.vn/reference/attachinterrupt 48
Thiết kế hệ thống nhúng
attachInterrupt()
Ví dụ
Đoạn chương trình dưới đây sẽ làm sáng đèn led khi không nhấn nút và làm đèn led tắt đi khi người
dùng nhấn nút, nếu vẫn giữ nút nhấn thì đèn led vẫn còn tắt. Sau khi thả nút nhấn, đèn led sẽ sáng trở lại.
int ledPin = 13;
void tatled()
{
digitalWrite(ledPin, LOW); // tắt đèn led
}
void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(2, INPUT_PULLUP); // sử dụng điện trở kéo lên cho chân số 2, ngắt 0
attachInterrupt(0, tatled, LOW); // gọi hàm tatled liên tục khi còn nhấn nút
}
void loop()
{
digitalWrite(ledPin, HIGH); // bật đèn led
}
49
Thiết kế hệ thống nhúng
attachInterrupt()
Ví dụ : Khi sử dụng ngắt, có thể thoát khỏi các hàm delay để xử lý 1 đoạn chương trình khác
int ledPin = 13;
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);
} 50
Thiết kế hệ thống nhúng
detachInterrupt()
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
attachInterrupt(interrupt, ISR, mode);

Thông số
interrupt: số thứ tự ngắt (xem thêm ở bài attachInterrupt() )
Trả về
không

http://arduino.vn/reference/detachinterrupt
51
Thiết kế hệ thống nhúng
detachInterrupt()
int ledPin = 13; 2, ngắt 0
Ví dụ : Đoạn // đèn LED được kết nối với chân attachInterrupt(0, tatled, LOW);
chương trình dưới digital 13 // cài đặt ngắt gọi hàm tatled
đây sẽ bật sáng đèn boolean daNhan = false; }
led và chỉ tắt nó // lưu giữ giá trị cho biết đã nhấn nút void loop()
hay chưa {
khi nhấn lần đầu void tatled() digitalWrite(ledPin, HIGH);
tiên, thả ra đèn sẽ { // bật đèn led
sáng lại. Nếu tiếp digitalWrite(ledPin, LOW); if (daNhan == true)
tục nhấn nữa thì // tắt đèn led khi còn nhấn nút {
đèn vẫn sáng mà daNhan = true; // Nếu đã nhấn nút thì tắt ngắt đi
không bị tắt đi. // lúc này đã nhấn nút detachInterrupt(0);
} }
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ố
52
Thiết kế hệ thống nhúng
interrupts()
Mặc định, Arduino luôn bật các ngắt nên trong phần setup(), 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 đó ta tắt các ngắt bằng hàm noInterrupts(), sử dụng hàm này để bật lại
các ngắt. Ví dụ
void setup() {}
void loop()
Cú pháp : interrupts(); {
Thông số : không noInterrupts();
Trả về: không // 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
}

http://arduino.vn/reference/interrupts 53
Thiết kế hệ thống nhúng
noInterrupts()
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, 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().
Ví dụ
void setup() {}
void loop()
Cú pháp : noInterrupts(); {
Thông số : không noInterrupts();
Trả về: không // 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
}

http://arduino.vn/reference/nointerrupts 54
Tµi liÖu Tham kh¶o

Tài liệu tham khảo

[1] Nguyễn Linh Giang, Giáo trình kỹ thuật lập trình C,


Nhà xuất bản giáo dục
[2] https://www.arduino.cc/

55
56

You might also like