Professional Documents
Culture Documents
3
Néi dung m«n häc
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)
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:
11
Thiết kế hệ thống nhúng
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
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ướ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
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ở.
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
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
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/
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/
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.
44
Thiết kế hệ thống nhúng
Nhập xuất Analog (Analog I/O)
analogWrite()
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
55
56