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

TH: Đo lường và điều khiển bằng máy tính _C397 Đại học Cần Thơ

Bài 03: LẬP TRÌNH GIAO TIẾP NỐI TIẾP QUA CỔNG RS232
❖ Nội dung thực hành:
1. Yêu cầu 01:
Yêu cầu: Thiết kế giao diện chương trình thực hiện chức năng truyền ký tự
điều khiển và nhận chuỗi ký tự từ hệ thống nhúng thông qua cổng RS232.
➢ Mô tả cụ thể:
- Ký tự điều khiển truyền xuống board nhúng sẽ được hiển thị trên 8 LED
đơn như là một byte (quan sát giá trị nhị phân tương ứng với ký tự truyền từ
máy tính).
- Board nhúng sẽ truyền chuỗi ký tự tương ứng khi nhấn phím, giao diện trên
máy tính sẽ nhận và hiển thị chuỗi ký tự tương ứng.
• Đoạn code:
char PinOut[] = { 22, 23, 24, 25, 26, 27, 28, 29 }; // Nhận và xử lý phím ấn

#define K0 42 if (digitalRead(K0) == 0)

#define K1 47 Serial.println('0');

#define K2 46 if (digitalRead(K1) == 0)

#define K3 43 Serial.println('1');

#define COM 33 if (digitalRead(K2) == 0)

//----------------------- Serial.println('2');

void setup() { if (digitalRead(K3) == 0)

for (int i = 0; i < 8; i++) Serial.println('3');

pinMode(PinOut[i], OUTPUT); delay(5);

pinMode(COM, OUTPUT); }

digitalWrite(COM, LOW); //-----------------------------

pinMode(K0, INPUT_PULLUP); void ShiftOut(uint8_t dat) {

pinMode(K1, INPUT_PULLUP); for (int i = 0; i < 8; i++) {

pinMode(K2, INPUT_PULLUP); if (dat & 0x01)

pinMode(K3, INPUT_PULLUP); digitalWrite(PinOut[i], HIGH);

//Khởi động cổng COM else digitalWrite(PinOut[i], LOW);

Serial.begin(9600); dat = dat >> 1;

} }

void loop() { }

// Chờ nhận ký tự từ PC => led đơn

if (Serial.available()) {

char ch = Serial.read();

ShiftOut(ch);

}
1 2

SVTH: Nhóm 09 Trang 1


TH: Đo lường và điều khiển bằng máy tính _C397 Đại học Cần Thơ

❖ Giao diện Node-RED của nhóm:

// Đoạn code hàm function 16:


var str = msg.payload;
msg.payload = str+'\n';
return msg;

❖ Chạy chương trình và ghi nhận lại kết quả:


- Dữ liệu máy tính truyền về hiển thị giá trị dạng gì?
 Khi dữ liệu máy tính truyền về nó sẽ hiển thị dưới dạng đèn LED bật tắt
bao gồm cả khi truyền chuổi hoặc số
- Khi ấn phím thì giá trị nhận được trên PC thế nào?
 Khi ấn một trong các phím (K0, K1, K2, K3), giá trị tương ứng (‘0’, ‘1’,
‘2’, ‘3’) sẽ được gửi đến PC qua cổng Serial. Ví dụ, nếu ấn phím K0, thì
sẽ nhận được ký tự ‘0’ trên PC. Tương tự, nếu ấn phím K1, bạn sẽ nhận
được ký tự ‘1’, và cứ như thế.
2. Yêu cầu 02:
➢ Yêu cầu: Viết lại chương trình trên với các chức năng như sau:
- Dữ liệu nhận được sẽ hiển thị trên LED 7 đoạn (PC sẽ gởi giá trị số từ 0-
9999).
- Khi ấn phím sẽ chuyển về PC một chuỗi dữ liệu tương ứng với phím, cụ thể

➢ K0: sẽ gởi chuỗi “Chao cac ban”


➢ K1: sẽ gởi chuỗi “Do luong & dieu khien bang PC”
➢ K2: sẽ gởi chuỗi “CT397 - DLDK”
➢ K3: sẽ gởi chuỗi “TH giao tiep RS232”

SVTH: Nhóm 09 Trang 2


TH: Đo lường và điều khiển bằng máy tính _C397 Đại học Cần Thơ

• Đoạn code:
char PinOut[] = { 22, 23, 24, 25, 26, 27, 28, 29 }; void setup() {

char ctr[] = { 37, 36, 35, 34 }; for (int i = 0; i < 8; i++)

#define K0 42 pinMode(PinOut[i], OUTPUT);

#define K1 47 for (int i = 0; i < 4; i++)

#define K2 46 pinMode(ctr[i], OUTPUT);

#define K3 43 pinMode(COM, OUTPUT);

#define COM 33 digitalWrite(COM, LOW);

// Khai báo bảng mã led 7 đoạn pinMode(K0, INPUT_PULLUP);

char code7seg[] = { 0xC0, 0xF9, 0xA4, 0xB0, pinMode(K1, INPUT_PULLUP);

0x99, 0x92, 0x82, 0xF8, 0x80, 0x90 }; pinMode(K2, INPUT_PULLUP);

// Khai báo biến quét led 7 đoạn pinMode(K3, INPUT_PULLUP);

char leddat[4] = { 4, 3, 2, 1 }; Serial.begin(9600);

char indexx; }

// Khai báo biến chương trình //--------------------------

int dat = 0; void toDisp(int counter) {

char buff[5], idx = 0; leddat[3] = counter / 1000;

//-------------------- leddat[2] = (counter % 1000) / 100;

leddat[1] = ((counter % 1000) % 100) / 10;

leddat[0] = counter % 10;

1 } 2

SVTH: Nhóm 09 Trang 3


TH: Đo lường và điều khiển bằng máy tính _C397 Đại học Cần Thơ

void loop() { //--------------------------

//---- Chờ nhận dữ liệu từ PC void Scanled() {

if (Serial.available() > 0) { char ch = leddat[indexx];

String str = Serial.readStringUntil('\n'); ShiftOut(code7seg[ch]);

toDisp(str.toInt()); digitalWrite(ctr[indexx], LOW);

} ch = ctr[indexx == 0 ? 3 : (indexx - 1)];

//--- Nhận phím và truyền lệnh về PC digitalWrite(ch, HIGH);

if (digitalRead(K0) == 0) // Tang vi tri LED

Serial.println("Chao cac ban"); indexx++;

if (digitalRead(K1) == 0) if (indexx >= 4) indexx = 0;

Serial.println("HP DLDK "); }

if (digitalRead(K2) == 0) //-----------------------------

Serial.println("CT397 - DLDK"); void ShiftOut(uint8_t dat) {

if (digitalRead(K3) == 0) for (int i = 0; i < 8; i++) {

Serial.println("TH giao tiep RS232"); if (dat & 0x01)

//---- quét hiển thị led 7 đoạn digitalWrite(PinOut[i], HIGH);

Scanled(); else digitalWrite(PinOut[i], LOW);

delay(5); dat = dat >> 1;

} }

3 } 4

❖ Chạy chương trình và ghi nhận lại kết quả:


- Dữ liệu máy tính truyền về hiển thị giá trị dạng gì?
 Khi nhập vào dạng số: Dữ liệu khi máy tính truyền về thông qua cổng
Serial sẽ hiển thị dạng số thông qua led 7 đoạn. Vd nhập: 1234 thì trên
board led 7 đoạn sẽ hiện bốn số 1234 tương ứng.
 Khi nhập vào dạng chuổi: Khi gửi một chuỗi qua cổng Serial, chương
trình sẽ cố gắng chuyển đổi chuỗi đó thành một số nguyên bằng
hàm toInt(). Nếu chuỗi đó có thể được chuyển đổi thành một số nguyên thì
số nguyên đó sẽ được hiển thị trên LED 7 đoạn và nếu chuyển được sẽ hiển
thị số 0 lên led 7 đoan.
- Khi ấn phím K0, K1, K2, K3 thì như thế nào?
 Khi ấn phím K0 thì trên máy tính sẽ xuất hiện chuổi: “Chao cac ban”
 Khi ấn phím K1 thì trên máy tính sẽ xuất hiện chuổi: “HP DLDK”
 Khi ấn phím K2 thì trên máy tính sẽ xuất hiện chuổi: “CT397 - DLDK”
 Khi ấn phím K3 thì trên máy tính sẽ xuất hiện chuổi: “TH giao tiep RS232”
3. Yêu cầu 03:
Yêu cầu: Thực hiện chương trình điều khiển độ sáng của led RGB (bằng cách
sử dụng các slider), nhận và hiển thị giá trị của cảm biến nhiệt độ và cảm biến
độ sáng kết hợp hiển thị thông tin ra LCD 16x2.

SVTH: Nhóm 09 Trang 4


TH: Đo lường và điều khiển bằng máy tính _C397 Đại học Cần Thơ

➢ Mô tả cụ thể:
o Trên PC (giao diện node-red) thực hiện các chức năng sau:
▪ Thiết kế giao diện gồm có 03 slider điều khiển tương ứng 03 LED RBG
▪ Thiết kế giao diện hiển thị thông tin của cảm biến nhiệt độ và ánh sáng
dưới dạng Gause.
o Trên mạch nhúng thực hiện các yêu cầu như sau:
▪ Nhận dữ liệu điều khiển led RGB và điều khiển các đèn tương ứng.
▪ Hiển thị giá trị PWM của các LED RGB trên LCD – dòng 1
▪ Hiển thị giá trị của cảm biến trên LCD – dòng 2.
• Đoạn code:
#include <LiquidCrystal.h> // khoi dong cong RS232

// RS E D4 D5 D6 D7 Serial.begin(9600); // Baud = 9600; 8,n,1

LiquidCrystal lcd(40, 41, 37, 36, 35, 34); delay(200);

#define BACKLIGHT_PIN 10 Serial.println("Hello world !");

#define LR 13 }

#define LG 11 //----------------------------------------

#define LB 12 void loop() {

// Khai báo chân cảm biến // doc cam bien và gơi ve PC

#define LM35 A0 int tmp = analogRead(LM35);

#define PHOTO A1 int lux = analogRead(PHOTO);

//---------------------------------------- lcd.setCursor(0, 0);

void setup() { lcd.print("T: ");

// khoi dong IO lcd.setCursor(2, 0);

pinMode(BACKLIGHT_PIN,OUTPUT); lcd.print(" ");

digitalWrite(BACKLIGHT_PIN,HIGH); lcd.setCursor(10, 0);

pinMode(LR, OUTPUT); lcd.print("P: ");

pinMode(LG, OUTPUT); lcd.setCursor(12, 0);

pinMode(LB, OUTPUT); lcd.print(" ");

// khoi dong LCD lcd.setCursor(2, 0);

lcd.begin(16, 2); lcd.print(tmp);

lcd.setCursor(0, 0); lcd.setCursor(12, 0);

lcd.print("Hello world ! "); lcd.print(lux);

lcd.setCursor(0, 1); // truyen giá trị cảm biến về PC

lcd.print("DLDK – DHCT "); Serial.println("T" + String(tmp) + "P" + String(lux));

delay(500);

lcd.clear(); 1 2

SVTH: Nhóm 09 Trang 5


TH: Đo lường và điều khiển bằng máy tính _C397 Đại học Cần Thơ

// Nhan chuoi ky tu tu PC // xu ly chuoi : R120 ; G50; B234 ;

if (Serial.available() > 0) { String cmd = str.substring(0, 1);

String str = Serial.readStringUntil('\n'); String val = str.substring(1, str.length());

lcd.setCursor(0, 1); // Dieu khien do sang den RGB

lcd.print("str:"); if (cmd == "R") analogWrite(LR, val.toInt());

lcd.setCursor(0, 1); if (cmd == "G") analogWrite(LG, val.toInt());

lcd.print(" "); if (cmd == "B") analogWrite(LB, val.toInt());

lcd.setCursor(4, 1); }

lcd.print(str); delay(100);

3 } 4
❖ Giao diện Node-RED của nhóm:
// Đoạn code hàm function 17:
var str = msg.payload;
var p1 = str.indexOf("T");
var p2 = str.indexOf("P");
tmp = str.substring(p1+1,p2);
lux =
str.substring(p2+1,str.length);
msg.payload = Number(tmp);
msg1 = {payload:Number(lux)};
return [msg,msg1];

// Đoạn code của node Template:


R{{payload}} // RED
G{{payload}} // GREEN
B{{payload}} // BLUE

R{{payload}}
G{{payload}}
B{{payload}}

SVTH: Nhóm 09 Trang 6


TH: Đo lường và điều khiển bằng máy tính _C397 Đại học Cần Thơ

❖ Chạy chương trình và ghi nhận lại kết quả:


- Nhận dữ liệu điều khiển led RGB và điều khiển các đèn tương ứng?
+ Giao diện trên Node-RED với 3 thanh trượt (sliders). Mỗi thanh trượt
tương ứng với một loại màu của đèn LED RGB (R - đỏ, G - xanh lá cây, B
- xanh dương). Khi điều chỉnh mức độ trượt cho mỗi màu, giá trị PWM
tương ứng với màu đó thay đổi.
+ Truyền Dữ Liệu: Khi điều chỉnh các thanh trượt, Node-RED sẽ tạo và
truyền dữ liệu chứa các giá trị PWM tương ứng (đoạn mã điều khiển đèn
LED RGB) thông qua giao tiếp serial (UART) với mạch Arduino.
+ Arduino sẽ phân tích dữ liệu về giá trị PWM để điều khiển mức độ sáng
của các đèn LED RGB. Sau đó, nó sẽ sử dụng các giá trị này để điều khiển
đèn LED RGB bằng cách sử dụng analogWrite để thiết lập mức độ sáng
tương ứng.
 Nội dung bài: Giúp hiểu quá trình truyền dữ liệu điều khiển từ giao diện
trên PC (Node-RED) đến mạch nhúng (Arduino) để điều khiển đèn LED
RGB theo các giá trị PWM được chỉ định trên giao diện.
- Hiển thị giá trị PWM của các LED RGB trên LCD – dòng 1?
+ Khi các giá trị PWM của các LED RGB thay đổi (do người dùng điều
khiển từ giao diện trên PC sử dụng Node-RED), Arduino sẽ cập nhật và
hiển thị giá trị này lên dòng số 1 màn hình LCD. Do đó, có thể theo dõi
mức độ sáng hiện tại của các đèn LED RGB trên màn hình LCD, giúp biết
được giá trị PWM tương ứng với mỗi loại màu (đỏ, xanh lá cây, xanh
dương).
- Hiển thị giá trị của cảm biến trên LCD – dòng 2?
+ Arduino đọc giá trị từ các cảm biến nhiệt độ và ánh sáng và sau đó hiển
thị giá trị đo được này ở vị trí dòng số 2 trên màn hình LCD. Khi giá trị từ
cảm biến thay đổi (do môi trường nhiệt độ và ánh sáng thay đổi), Arduino
sẽ cập nhật và hiển thị giá trị này lên màn hình LCD ở dòng số 2.

 Tài liệu tham thảo:


[1] Tài liệu thực hành Đo lường và Điều khiển bằng máy tính buổi 03 của Thầy
Nguyễn Khắc Nguyên_CT397 – Trường Đại học Cần Thơ.
[2] Node-RED cơ bản: https://hocarm.org/node-red-co-ban/

SVTH: Nhóm 09 Trang 7

You might also like