5/15/24, 3:13 PM
OPEN LAB
192.168.1.82:3000/home/IoTNode/detailNode?idNode=4
1/11
HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
Posts and Telecommunications Institute of Technology
openlab@gmail.com
TRANG CHỦ
LỚP THIẾT BỊ
LỚP MẠNG
LỚP ỨNG DỤNG
DASHBOARD
BrokerMQTT
REPORT
BUỔI 1 : THỰC HÀNH LẬP TRÌNH CƠ BẢN VI ĐIỀU KHIỂN
Hướng dẫn tải và cài đặt phần mềm Arduino IDE
Bước 1: Truy cập vào địa chỉ: https://www.arduino.cc/en/software
Bước 2: Chọn 1 trong tất cả các phiên bản đã cho.
Danh sách video
Vào làm bài
5/15/24, 3:13 PM
OPEN LAB
192.168.1.82:3000/home/IoTNode/detailNode?idNode=4
2/11
Bước 3: Chọn “Just dowload” để tải
về.
Bước 4: Sau khi tải về, cho chạy file mới tải
Bước 5: Cho nơi cài đặt chương trình Arduino IDE xong ấn “Install”.
Bước 6: Sau khi đã cài đặt xong phần mềm sẽ yêu cầu Cài một số Driver để nạp chương trình cho vi
điều khiển, bạn chỉ cần ấn Install tất cả Driver phần mềm đề nghị.
5/15/24, 3:13 PM
OPEN LAB
192.168.1.82:3000/home/IoTNode/detailNode?idNode=4
3/11
I.2: Viết và nạp một chương trình cho Arduino Uno
Giao diện Arduino IDE khi mới
khởi động
Các chức năng nút lệnh trên Arduino:
Icon Chức năng
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 thảo
Gỡ lỗi chương trình đang soạn thảo
Board đang được chọn để nạp chương
trình vào
Hiển thị đồ thị các đầu ra giữa máy tính
và Board Arduino
Hiển thị các dữ liệu được gửi và nhận
dữ liệu giữa máy tính và board Arduino
Soạn một chương trình đơn giản: Hiển thị chữ “Hello World” ra Serial Monitor:
Chọn Cổng COM và Board đang sử dụng (Arduino UNO):
5/15/24, 3:13 PM
OPEN LAB
192.168.1.82:3000/home/IoTNode/detailNode?idNode=4
4/11
Nhấn Upload để nạp, màn hình báo Done uploading là hoàn thành:
I.3: Giới thiệu cơ bản về Arduino
Uno
Arduino Uno là một vi điều khiển dựa trên ATmega328P. Nó có 14 chân đầu vào/đầu ra kỹ thuật số (trong đó 6 chân
có thể được sử dụng làm đầu ra PWM), 6 đầu vào tương tự, tinh thể thạch anh 16 MHz, kết nối USB, giắc cắm
nguồn, header ICSP và nút reset. Mạch chứa mọi thứ cần thiết để hỗ trợ vi điều khiển, chỉ cần kết nối với máy tính
bằng cáp USB hoặc cấp nguồn bằng bộ chuyển đổi AC-to-DC hoặc qua chân nguồn để bắt đầu .
Sơ đồ chân Arduino Uno:
Chức năng các chân:
VIN: dùng để cung cấp nguồn khi không dùng USB hoặc các nguồn khác, điện áp 7-12VDC
5V: Chân này xuất ra nguồn 5V
3V3: Nguồn cung cấp 3.3V (dòng điện trên chân này tối đa là 50mA).
GND: Là chân mang điện cực âm trên board.
IOREF: chân này dùng để cung cấp tham chiếu điện áp mà bộ vi điều khiển hoạt động.
Reset: dùng để kết nối với nút reset ra bên ngoài.
5/15/24, 3:13 PM
OPEN LAB
192.168.1.82:3000/home/IoTNode/detailNode?idNode=4
5/11
Trên Board Arduino Uno có 14 chân Digital được sử dụng để làm chân đầu vào và đầu ra, chúng sử dụng các hàm
pinMode(), digitalWrite(), digitalRead(). Điện áp trên mỗi chân là 5V, dòng trên mỗi chân là 20mA và bên trong có
điện trở kéo lên là 20-50 ohm. Dòng tối đa trên mỗi chân I/O không vượt quá 40mA để tránh trường hợp gây hỏng
board mạch. Uno có 6 chân đầu vào Analog từ A0 đến A5, mỗi chân cung cấp 10 bit độ phân giải (tức là 1024 giá trị
khác nhau).
Serial: chân 0 (RX) và 1 (TX): Được sử dụng để nhận dữ liệu (RX) và truyền dữ liệu (TX) TTL.
Ngắt ngoài: chân 2 và 3
PWM (điều chế độ rộng xung): chân 3, 5, 6, 9 và 11 cung cấp đầu ra xung PWM với độ phân giải 8 bit bằng
hàm analogWrite ().
SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK). Các chân này hỗ trợ giao tiếp SPI bằng thư viện SPI.
TWI/I2C: A4 (SDA) và A5 (SCL) hỗ trợ giao tiếp I2C/TWI với các thiết bị khác.
AREF: điện áp tham chiếu cho các đầu vào tương tự
Nội dung 1. Lập trình cho vi điều khiển hiển thị dòng chữ lên màn hình LCD
Màn hình LCD 16x2:
- LCD 16×2 có 16 chân trong đó 8 chân dữ liệu (D0 – D7) và 3 chân điều khiển (RS, RW, EN).
- chân còn lại dùng để cấp nguồn và đèn nền cho LCD 16×2.
- Các chân điều khiển giúp ta dễ dàng cấu hình LCD ở chế độ lệnh hoặc chế độ dữ liệu.
- Chúng còn giúp ta cấu hình ở chế độ đọc hoặc ghi.
Thông số kĩ thuật:
- Điện áp hoạt động là 5 V
- Địa chỉ I2C: 0x27 (có thể thay đổi theo đơn hàng của nsx ví dụ như: 0x3F )
- Hỗ trợ màn hình: LCD1602,1604,2004 (driver HD44780).
- Có đèn led nền, có thể dùng biến trở hoặc PWM điều chình độ sáng để sử dụng ít điện năng hơn.
- Có thể được điều khiển với 6 dây tín hiệu
Module I2C Arduino:
- LCD có quá nhiều nhiều chân gây khó khăn trong quá trình đấu nối và chiếm dụng nhiều chân trên vi điều
khiển. Do đó Module I2C LCD ra đời để giải quyết vấn đề này. Thay vì phải mất 6 chân vi điều khiển để kết nối với
LCD 16×2 (RS, EN, D7, D6, D5 và D4) thì module IC2 bạn chỉ cần tốn 2 chân (SCL, SDA) để kết nối.
Sơ đồ đấu nối:
5/15/24, 3:13 PM
OPEN LAB
192.168.1.82:3000/home/IoTNode/detailNode?idNode=4
6/11
Arduino LCD
GND GND
VCC VCC
SDA/A4 SDA
SCL/A5 SCL
Code tham khảo:
- Thư viện cho LCD: “LiquidCrystal I2C ” của Frank de Brabander
Link tham khảo có code mẫu:
https://github.com/johnrickman/LiquidCrystal_I2C
- Có thể mô phỏng qua đường link đây: https://wokwi.com
- Code :
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd ( 0x 27 , 16 , 2 ) ; // Khai báo địa chỉ của LCD gồm 16 cột, 2 dòng
void setup ()
{
lcd . init () ; // Khởi động màn hình lCD
lcd . backlight () ; // Bật đèn nền LCD
lcd . setCursor ( 0 , 0 ) ; //Đưa con trỏ vị trí tới hàng 1 cột 1, nếu là (1,0) thì là hàng 1 cột thứ
2
lcd . print ( "Hello, world!" ) ; // In ra màn hình LCD
lcd . setCursor ( 0 , 1 ) ; // Đưa con trỏ tới vị trí hàng 1 cột 2
lcd . print ( "IoT LAB" ) ; // In ra màn hình LCD
}
void loop ()
{
}
Kết quả:
Nội dung 2. Lập trình cho vi điều n háy Led RGB
Led RGB
- Đèn led hay còn gọi là điốt phát quang, là một biến thể của diode cơ bản, nó xác định độ chênh lệch điện áp
nhỏ nhất giữa Anode (+ ) và Cathode (-), led khác diode ở chỗ là tạo ra ánh sáng khi dòng điện đi qua. Đèn led cần
được kết nối đúng âm dương của nguồn điện để hoạt động. L ed RGB có 3 màu : đỏ, xanh lá, xanh dươ ng .
5/15/24, 3:13 PM
OPEN LAB
192.168.1.82:3000/home/IoTNode/detailNode?idNode=4
7/11
- Điện áp: Mỗi đèn led đều có một mức điện áp đầu vào nhất định (led 5mm dao động 1.9 – 3.2 Vol), nếu cung cấp
không đủ đèn sẽ không phát sáng hoặc cung cấp nguồn lớn hơn thì cần phải sử dụng trở để giảm điện thế vào led.
Nếu bạn mắc nhiều đèn led nối tiếp, song song thì cần phải tính toán mức điện áp, dòng điện cung cấp cho tất cả các
led.
- Dòng điện: Nếu bạn cung cấp dòng điện vượt qua ngưỡng cho phép, tương đương với việc làm gia tăng nhiệt độ và
làm giảm tuổi thọ của led. Dòng điện phù hợp với led 5mm thường ở mức 20mA, tối đa có thể là 30mA, chúng ta
kiểm soát dòng điện bằng cách mắc một điện trở nối tiếp với đèn led,nó giúp dòng điện của led luôn ở mức cho phép.
Sơ đồ đấu nối:
Arduino LED
D7 R
D8 G
D9 B
GND GND
Code tham khảo:
#define red 7
#define green 8
#define blue 9
void setup () {
pinMode ( red, OUTPUT ) ; // Cấu hình chân D7 làm OUTPUT cho led red
pinMode ( green, OUTPUT ) ; // Cấu hình chân D8 làm OUTPUT cho led green
pinMode ( blue, OUTPUT ) ; // Cấu hình chân D9 làm OUTPUT cho led blue
}
void loop () {
digitalWrite ( red,HIGH ) ; // Chân red lên mức Cao hay Bật Đèn Led
delay ( 1000 ) ; // Đèn sáng tầm 1 giây
5/15/24, 3:13 PM
OPEN LAB
192.168.1.82:3000/home/IoTNode/detailNode?idNode=4
8/11
digitalWrite ( red,LOW ) ; // Chân red xuống mức Thấp hay Tắt Đèn Led
digitalWrite ( green,HIGH ) ; // Chân green lên mức Cao hay Bật Đèn Led
delay ( 1000 ) ; // Đèn sáng tầm 1 giây
digitalWrite ( green,LOW ) ; // Chân green xuống mức Thấp hay Tắt Đèn Led
digitalWrite ( blue,HIGH ) ; // Chân blue lên mức Cao hay Bật Đèn Led
delay ( 1000 ) ; // Đèn sáng tầm 1 giây
digitalWrite ( blue,LOW ) ; // Chân blue xuống mức Thấp hay Tắt Đèn Led
}
Kết quả:
Nội dung 3 . Lập trình cho vi điều n háy giao tiếp bàn phím
B àn phím số (Key pad )
Bàn phím ma trận 3x4 nhựa cứng gồm có 16 nút bấm được sắp xếp theo ma trận 3 hàng, 4 cột. Các nút bấm
trong cùng một hàng và một cột được nối với nhau.
Thông số kỹ thuật:
Kích thước : 7×5.2×0.9cm
Bàn Phím Ma Trận Nhựa Cứng 3x4 Keypad loại phím nhựa cứng.
Độ dài cáp: 88mm.
Nhiệt độ hoạt động 0 ~ 70oC.
Đầu nối ra 7 chân.
Kích thước bàn phím 65 x 64mm
Sơ đồ chân:
Sơ đồ đấu nối:
Arduino Key Pad
5/15/24, 3:13 PM
OPEN LAB
192.168.1.82:3000/home/IoTNode/detailNode?idNode=4
9/11
D3 (3,2)
D4 (2,3)
D5 (2,2)
D6 (2,1)
D7 (1,3)
D8 (1,2)
D9 (1,1)
*Note: (3,2) trong bảng chân của Key Pad ở đây tương đương với hàng thứ 3 và cột thứ 2 trong bộ Kit
Lập trình:
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <stdio.h>
const byte ROWS = 4 ; // 4 hàng
const byte COLS = 3 ; // 3 cột
String arr [ 8 ] = {} ;
String password [ 8 ] = { "1" , "2" , "3" , "4" , "5" , "6" , "7" , "8" } ;
int place = 0 ;
int input = 6 ;
bool value = true ;
char keys [ROWS][COLS] = {
{ '1','2','3' } ,
{ '4','5','6' } ,
{ '7','8','9' } ,
{ '*','0','#' }
} ;
LiquidCrystal_I2C lcd ( 0x 27 , 16 , 2 ) ; // Khai báo địa chỉ của LCD gồm 16 cột, 2 dòng
byte rowPins [ROWS] = { 8 , 3 , 4 , 6 } ; // nối hàng của keypad
byte colPins [COLS] = { 7 , 9 , 5 } ; // nối cột keypad
Keypad keypad = Keypad ( makeKeymap ( keys ) , rowPins, colPins, ROWS, COLS ) ;
void setup (){
lcd . init () ; // Khởi động màn hình lCD
lcd . backlight () ; // Bật đèn nền LCD
lcd . setCursor ( 0 , 0 ) ; //Đưa con trỏ vị trí tới hàng 1 cột 1, nếu là (1,0) thì
lcd . print ( "pass: " ) ;
lcd . setCursor ( 0 , 1 ) ;
lcd . print ( "status: " ) ;
Serial . begin ( 9600 ) ; // khởi tạo serial
}
5/15/24, 3:13 PM
OPEN LAB
192.168.1.82:3000/home/IoTNode/detailNode?idNode=4
10/11
void loop (){
// Kiểm tra nút được nhấn
char key = keypad . getKey () ;
// in nút ra màn hình
if ( key != NO_KEY ){
lcd . setCursor ( input, 0 ) ;
lcd . print ( key ) ;
arr [place] = key;
place++;
input++;
}
if ( place == 8 )
{
for ( int i = 0 ;i< 8 ;i++ )
{
if ( arr [i] != password [i] )
{
value = false ;
break ;
}
}
if ( value == true )
{
lcd . setCursor ( 0 , 1 ) ;
lcd . print ( " Welcome! " ) ;
}
else
{
place = 0 ;
value = true ;
lcd . setCursor ( 8 , 1 ) ;
lcd . print ( "Wrong!" ) ;
input = 6 ;
lcd . setCursor ( input, 0 ) ;
lcd . print ( " " ) ;
delay ( 1000 ) ;
lcd . setCursor ( 8 , 1 ) ;
lcd . print ( " " ) ;
}
}
}
Kết quả:
5/15/24, 3:13 PM
OPEN LAB
192.168.1.82:3000/home/IoTNode/detailNode?idNode=4
Add your comments here
Submit comment
5/15/24, 3:14 PM
OPEN LAB
192.168.1.82:3000/home/IoTNode/detailNode?idNode=5
1/6
HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
Posts and Telecommunications Institute of Technology
openlab@gmail.com
TRANG CHỦ
LỚP THIẾT BỊ
LỚP MẠNG
LỚP ỨNG DỤNG
DASHBOARD
BrokerMQTT
REPORT
BUỔI 2: THỰC HÀNH GIAO TIẾP CẢM BIẾN-VI ĐIỀU KHIỂN-
THIẾT BỊ CHẤP HÀNH
Nội dung 1. Thực hành cho vi điều khiển thu thập dữ liệu từ cảm biến nhiệt độ , độ ẩm và
hiển thị kết quả ra màn hình
Cảm biến nhiệt độ, độ ẩm (DHT)
- Cảm biến độ ẩm và nhiệt độ DHT11 là cảm biến rất thông dụng và chi phí rẻ và rất dễ lấy dữ liệu thông qua giao
tiếp 1 wire (dùng 1 chân digital để truyền dữ liệu. Bộ tiền xử lý tín hiệu tích hợp trong cảm biến có được dữ liệu
chính xác mà không phải qua bất kỳ tính toán nào.
- Cảm biến DHT11 được tích hợp trong một mạch duy nhất. Chỉ cần nối dây nguồn (VCC), dây đất (GND) và dây tín
hiệu (Data, Signal) là xong.
Thông số kĩ thuật của DHT11:
- Điện áp hoạt động: 3-5.5V DC
- Ngưỡng độ ẩm: 20 - 90%
- Sai số độ ẩm: ± 5% RH
-
Ngưỡng nhiệt độ: 0 - 55
o
C
Danh sách video
Vào làm bài
5/15/24, 3:14 PM
OPEN LAB
192.168.1.82:3000/home/IoTNode/detailNode?idNode=5
2/6
-
Sai số nhiệt độ: ± 2
o
C
Ngoài ra còn có cảm biến nhiệt độ, âm dòng DHT21, DHT 22 giúp cho việc sai số khi đo đáng kể hơn,
phạm vi đo cũng mở rộng thêm
Chuẩn bị phần cứng:
- Cảm biến nhiệt độ, độ ẩm DHT11
- Board Arduino Uno
- Bread Board
- Màn hình LCD 16x2 giao tiếp I2C
Sơ đồ đấu nối:
Code tham khảo :
- Thư viện DHT11: “DHT sensor library” của Adafruit, link tham khảo code hoặc có thể tải qua:
https://github.com/adafruit/DHT-sensor-library
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd ( 0x 27 , 16 , 2 ) ;
#include "DHT.h" //khai báo thư viện DHT
const int DHTPIN = 7 ; //khai báo chân dữ liệu DHT
const int DHTTYPE = DHT22; //khai báo kiểu DHT, có 3 loại DHT11, DHT21, DHT22 tùy
kết quả có thể thay loại
DHT dht ( DHTPIN, DHTTYPE ) ;
void setup () {
Serial . begin ( 9600 ) ;
dht . begin () ; // Khởi động cảm biến
lcd . init () ; // Khởi tạo LCD
lcd . backlight () ; // Bật đèn LCD
}
void loop () {
float h = dht . readHumidity () ; //Đọc độ ẩm
float t = dht . readTemperature () ; //Đọc nhiệt độ
lcd . setCursor ( 0 , 0 ) ; // Đặt con trỏ hàng 1 cột 1
lcd . print ( "Do Am:" ) ; // In ra chữ Độ ẩm
lcd . print ( h ) ; // In ra giá trị Độ ẩm
lcd . setCursor ( 0 , 1 ) ; // Đặt con trỏ hàng 2 cột 1
lcd . print ( "Nhiet Do:" ) ; // In ra chữ Nhiệt độ
lcd . print ( t ) ; // In ra giá trị Nhiệ độ
delay ( 1000 ) ; //Đợi 1 giây
5/15/24, 3:14 PM
OPEN LAB
192.168.1.82:3000/home/IoTNode/detailNode?idNode=5
3/6
}
Kết quả :
Nội dung 2. Thực hành cho vi điều khiển điều khiển bóng đèn qua relay
Relay (Rơ- le)
- Relay là một thiết bị điện tử dùng để điều khiển mạch điện bằng cách sử dụng một tín hiệu điều khiển nhỏ.
Nó hoạt động dựa trên nguyên lý của cuộn dây điện dẫn điện và cơ cấu chuyển mạch.
- Relay có hai trạng thái chính: trạng thái thường đóng
(NC) và trạng thái thường mở (NO). Khi một tín hiệu điều khiển được đưa vào cuộn dây điện, relay sẽ chuyển từ
trạng thái thường mở (NO) sang trạng thái thường đóng (NC) giúp cho thiết bị được hoạt động.
Nguyên lý hoạt động
- Khi một tín hiệu điều khiển được cấp vào cuộn dây điện, dòng điện chạy qua cuộn dây sẽ tạo ra một
trường từ xung quanh cuộn dây. Trường từ này sẽ tác
động lên cơ cấu chuyển mạch trong relay, làm cho nó chuyển từ trạng thái thường mở (NO) sang trạng thái
thường đóng (NC).
- Khi rơ le ở trạng thái thường mở (NO) thì các tiếp điểm trong mạch relay không được kết nối với nhau.
Khi tín hiệu điều khiển được cấp, relay chuyển sang trạng thái thường đóng (NC)
5/15/24, 3:14 PM
OPEN LAB
192.168.1.82:3000/home/IoTNode/detailNode?idNode=5
4/6
Chuẩn bị phần cứng:
- 1 Relay
- 1 nguồn ngoài 12V
- Bóng đèn 12V
- Arduino Uno
Sơ đồ đấu nối:
Arduino Relay
5V VCC
GND GND
D8 IN
Code tham khảo :
int Relay = 8 ; void setup () {
pinMode ( Relay, OUTPUT ) ; digitalWrite ( Relay, HIGH ) ;
}
void loop () { digitalWrite ( Relay, LOW ) ; delay ( 1000 ) ;
digitalWrite ( Relay, HIGH ) ; delay ( 1000 ) ;
}
Kết quả :
Nội dung 3. Thực hành cho vi điều khiển điều khiển động cơ bước
5/15/24, 3:14 PM
OPEN LAB
192.168.1.82:3000/home/IoTNode/detailNode?idNode=5
5/6
Động cơ bước (Step Motor)
- Độ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. Độ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.
Động cơ bước 28BYJ- 48
- Động cơ bước sử dụng trong bài toán 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℃)
Chuẩn bị phần cứng:
- Arduino Uno
- Động cơ bước 28BYJ- 48
Sơ đồ đấu nối:
Arduino Động cơ
5V VCC
GND GND
D6 INT1
D 7 INT 2
D 8 INT 3
D 9 INT 4
Code tham khảo :
- Thư viện cho động cơ bước: “Stepper” của chính hãng Arduino thông tin thư viện chi tiết tại link:
https://www.arduino.cc/reference/en/libraries/stepper/
5/15/24, 3:14 PM
OPEN LAB
192.168.1.82:3000/home/IoTNode/detailNode?idNode=5
6/6
Add your comments here
Submit comment
- Độ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
#include <Stepper.h>
// Khai báo số bước và chân kết nối đến driver động cơ bước
const int stepsPerRevolution = 200 ;
Stepper stepper ( stepsPerRevolution, 6 , 7 , 8 , 9 ) ;
void setup () {
// Thiết lập tốc độ quay của động cơ (điều chỉnh theo yêu cầu)
stepper . setSpeed ( 60 ) ;
}
void loop () {
// Quay theo chiều kim đồng hồ 1 vòng
stepper . step ( stepsPerRevolution ) ;
delay ( 1000 ) ; // Dừng 1 giây
// Quay ngược chiều kim đồng hồ 1 vòng
stepper . step ( -stepsPerRevolution ) ;
delay ( 1000 ) ; // Dừng 1 giây
}
Kết quả :
5/15/24, 3:14 PM
OPEN LAB
192.168.1.82:3000/home/IoTNode/detailNode?idNode=6
1/10
HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
Posts and Telecommunications Institute of Technology
openlab@gmail.com
TRANG CHỦ
LỚP THIẾT BỊ
LỚP MẠNG
LỚP ỨNG DỤNG
DASHBOARD
BrokerMQTT
REPORT
BUỔI 3 : THỰC HÀNH CÁC GIAO THỨC TRUYỀN NHẬN DỮ
LIỆU SPI/I2C/UART
Chuẩn giao tiếp SPI:
-
SPI là viết tắt của Serial Peripheral Interface, một giao thức
truyền thông nối tiếp thường được sử dụng trong các hệ thống nhúng để trao đổi dữ liệu tốc độ cao giữa nhiều thiết bị
trên bus. Các thiết bị giao tiếp qua SPI có kiến trúc chủ-phụ với nhiều thiết bị phụ được kết nối với một thiết bị
chính. Ngoài ra, giao tiếp SPI hỗ trợ giao tiếp song công hoàn toàn, nghĩa là cả chủ và phụ đều có thể truyền và nhận
dữ liệu đồng th ời
- Không giống như các giao thức truyền thông khác như UART hay I2C, SPI không có giao thức được xác định trước
và không có thông số truyền thông cố định. Tính linh hoạt này làm cho SPI trở nên lý tưởng cho các ứng dụng truyền
dữ liệu yêu cầu truyền dữ liệu theo thời gian thực hoặc băng thông cao.
Chuẩn giao tiếp I2C :
Danh sách video
Vào làm bài
5/15/24, 3:14 PM
OPEN LAB
192.168.1.82:3000/home/IoTNode/detailNode?idNode=6
2/10
- I2C (viết tắt của Inter-Integrated Circuit), còn được gọi là I2C hoặc IIC, là một bus truyền thông nối tiếp đồng bộ,
đa chủ/đa nô lệ. Nó là bus nối tiếp hai dây hai chiều sử dụng dây đồng hồ nối tiếp (SCL) và dây dữ liệu nối tiếp
(SDA) để gửi và quản lý dữ liệu từng bit giữa nhiều thiết bị. Với I2C, nhiều nô lệ có thể được kết nối với một chủ
duy nhất (như SPI) và nhiều chủ có thể điều khiển một hoặc nhiều nô lệ.
- I2C mang lại khả năng mở rộng và tính linh hoạt cao trong việc kết nối nhiều thiết bị. Tuy nhiên, nó có một vài
nhược điểm. Nó hoạt động ở tốc độ chậm hơn so với SPI, đồng hồ và đường dữ liệu cần có điện trở kéo lên. I2C
cũng liên quan đến việc xử lý lỗi và logic phức tạp hơn cũng như các vấn đề tiềm ẩn như xung đột bus và nhiễu.
Chuẩn giao tiếp UART :
- UART hay còn gọi là bộ thu/phát không đồng bộ phổ quát là một trong những giao thức nối tiếp sớm nhất và đơn
giản nhất để trao đổi dữ liệu nối tiếp giữa hai thiết bị. Giao thức truyền thông không đồng bộ chỉ sử dụng hai dây, đó
là đường truyền (TX) và đường nhận (RX), để truyền và nhận dữ liệu.
- Các thiết bị được kết nối qua UART giao tiếp bằng cách gửi các bit ở tốc độ truyền được xác định trước, thường
bao gồm các bit bắt đầu, dừng và các bit chẵn lẻ tùy chọn. Các thiết bị UART không sử dụng tín hiệu đồng hồ dùng
chung. Thay vào đó, họ phải thống nhất về tốc độ truyền và định dạng dữ liệu.
- Nhiều nhà phát triển sử dụng UART để kết nối không dây và xử lý máy tính vì tính dễ cài đặt, giao diện thân thiện
với người dùng và giá cả phải chăng.
So sánh giữa các giao thức:
- Chuẩn giao tiếp truyền thông nối tiếp UART trên Arduino (hay còn được biết đến với tên gọi Serial) là chuẩn giao
tiếp được sử dụng rất nhiều trong các ứng dụng hệ thống nhúng.
- Serial là chuẩn giao tiếp truyền thông nối tiếp không đồng bộ, sử dụng UART (Universal Asynchronous Receiver-
Transmitter, một bộ phận phần cứng được tích hợp bên trong chip ATmega328 của board Arduino Uno) kết hợp với
mức logic TTL (mức điện áp cao tương ứng với 5V hoặc 3.3V và mức điện áp thấp tương ứng với 0V)
- UART là tên gọi để chỉ một bộ phận phần cứng dùng để chuyển đổi thông tin từ thanh ghi chứa nội dung cần trao
đổi ra bên ngoài (thông thường có 8 bits) thành 2 dây tín hiệu Serial, phục vụ cho chuẩn giao tiếp Serial chứ không
phải là tên gọi của một chuẩn giao tiếp.
5/15/24, 3:14 PM
OPEN LAB
192.168.1.82:3000/home/IoTNode/detailNode?idNode=6
3/10
Baudrate:
- V iệc truyền 1 bit data sau mỗi 1 micro giây, ta nhận thấy rằng để việc giao tiếp diễn ra thành công, giữa 2 thiết bị
cần có những thống nhất rõ ràng về khoảng thời gian truyền cho mỗi bit dữ liệu, hay nói cách khác tốc độ truyền cần
phải được thống nhất với nhau. Tốc độ này được gọi là tốc độ baud (baudrate), được định nghĩa là số bit truyền trong
mỗi giây. Ví dụ, nếu tốc độ baud được sử dụng là 9600, có nghĩa thời gian truyền cho 1 bit là 1/9600 = 104.167
micro giây.
Khung truyền (frame):
- Bên cạnh tốc độ baud, khung truyền đối với chuẩn giao tiếp Serial cũng hết sức quan trọng để đảm bảo việc truyền
nhận được diễn ra chính xác. Khung truyền quy định về số lượng bit truyền trong mỗi lần truyền, bao gồm start bit,
các bit data stop bits, ngoài ra còn có thể có parity bit (kiểm tra lỗi dữ liệu trong quá trình truyền nhận).
Hình 1: V í dụ về khung truyền, bao gồm 1 bit start, 8 bits data và cuối cùng là 1 bit
stop.
Start bit
- Đây là bit đầu tiên được truyền vào khung truyền, có chức năng thông báo cho thiết bị nhận biết đang có một chuỗi
dữ liệu sắp truyền đến. Đối với các dòng AVR nói chung và UnoX nói riêng, ở trạng thái chưa có dữ liệu (Idle)
đường truyền luôn kéo lên mức cao. Khi có dữ liệu mới, đường truyền được kéo xuống mức thấp, do đó start bit sẽ
được quy định là mức 0.
Dữ liệu (data)
- Dữ liệu cần truyền thông thường gồm 8 bits, tuy nhiên chúng ta hoàn toàn có thể tùy chỉnh số lượng bit data cho
một gói tin, có thể là 5, 6, 7, 9… Trong quá trình truyền, bit có trọng số thấp nhất (LSB) sẽ được truyền trước, và
cuối cùng sẽ là bit có trọng số cao nhất (MSB).
Stop bits
- Stop bits là một hoặc nhiều bit có chức năng thông báo cho thiết bị nhận biết rằng một gói dữ liệu đã được gởi
xong. Đây là bit quan trọng, cần phải có trong một khung truyền. Giá trị của các stop bit luôn bằng mức Idle (mức
nghỉ) và ngược với giá trị của start bit. Đối với các dòng vi điều khiển AVR các bit kết thúc này luôn là mức cao.
Sử dụng chuẩn giao tiếp Serial với boad Arduino Uno
- Giao tiếp Serial giữa 2 thiết bị với nhau thông thường sẽ có 2 dây tín hiệu, đó là TX (Transmitter) có chức năng
truyền tải dữ liệu và RX (Receiver) có chức năng thu nhận dữ liệu. 2 dây tín hiệu này được kết nối chéo nhau giữa 2
thiết bị. Cụ thể, TX của thiết bị 1 kết nối với RX của thiết bị 2 và RX của thiết bị 1 kết nối với TX của thiết bị 2.
Điều đặc biệt của Serial đó là quá trình truyền và quá trình nhận dữ liệu được diễn ra hoàn toàn độc lập với nhau.
-
B oard Arduino đều được hỗ trợ sẵn 1 hoặc nhiều cổng giao tiếp
Serial. Đối với board Arduino Uno, cổng Serial được ra chân tại vị trí chân số 1 và chân số 0 trên board), đây được
gọi là Hardware Serial, tức là giao tiếp Serial dựa trên phần cứng (có sử dụng UART). Ngoài ra, đối với các vi điều
khiển không hỗ trợ UART hoặc trong trường hợp muốn mở rộng nhiều cổng Serial để giao tiếp với nhiều thiết bị có
hỗ trợ giao ti ếp Serial, ta hoàn toàn có thể giả lập giao tiếp Serial bằng thư viện cho Arduino có tên là
SoftwareSerial,

Preview text:

5/15/24, 3:13 PM OPEN LAB
HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
Posts and Telecommunications Institute of Technology openlab@gmail.com TRANG CHỦ LỚP THIẾT BỊ LỚP MẠNG LỚP ỨNG DỤNG DASHBOARD BrokerMQTT REPORT Danh sách video Vào làm bài
BUỔI 1 : THỰC HÀNH LẬP TRÌNH CƠ BẢN VI ĐIỀU KHIỂN
Hướng dẫn tải và cài đặt phần mềm Arduino IDE
Bước 1: Truy cập vào địa chỉ: https://www.arduino.cc/en/software
Bước 2: Chọn 1 trong tất cả các phiên bản đã cho.
192.168.1.82:3000/home/IoTNode/detailNode?idNode=4 1/11 5/15/24, 3:13 PM OPEN LAB
Bước 3: Chọn “Just dowload” để tải về.
Bước 4: Sau khi tải về, cho chạy file mới tải
Bước 5: Cho nơi cài đặt chương trình Arduino IDE xong ấn “Install”.
Bước 6: Sau khi đã cài đặt xong phần mềm sẽ yêu cầu Cài một số Driver để nạp chương trình cho vi
điều khiển, bạn chỉ cần ấn Install tất cả Driver phần mềm đề nghị.
192.168.1.82:3000/home/IoTNode/detailNode?idNode=4 2/11 5/15/24, 3:13 PM OPEN LAB
I.2: Viết và nạp một chương trình cho Arduino Uno
Giao diện Arduino IDE khi mới khởi động
Các chức năng nút lệnh trên Arduino: Icon Chức năng
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 thảo
Gỡ lỗi chương trình đang soạn thảo
Board đang được chọn để nạp chương trình vào
Hiển thị đồ thị các đầu ra giữa máy tính và Board Arduino
Hiển thị các dữ liệu được gửi và nhận
dữ liệu giữa máy tính và board Arduino
Soạn một chương trình đơn giản: Hiển thị chữ “Hello World” ra Serial Monitor:
Chọn Cổng COM và Board đang sử dụng (Arduino UNO):
192.168.1.82:3000/home/IoTNode/detailNode?idNode=4 3/11 5/15/24, 3:13 PM OPEN LAB
Nhấn Upload để nạp, màn hình báo Done uploading là hoàn thành:
I.3: Giới thiệu cơ bản về Arduino Uno
Arduino Uno là một vi điều khiển dựa trên ATmega328P. Nó có 14 chân đầu vào/đầu ra kỹ thuật số (trong đó 6 chân
có thể được sử dụng làm đầu ra PWM), 6 đầu vào tương tự, tinh thể thạch anh 16 MHz, kết nối USB, giắc cắm
nguồn, header ICSP và nút reset. Mạch chứa mọi thứ cần thiết để hỗ trợ vi điều khiển, chỉ cần kết nối với máy tính
bằng cáp USB hoặc cấp nguồn bằng bộ chuyển đổi AC-to-DC hoặc qua chân nguồn để bắt đầu .
• Sơ đồ chân Arduino Uno: Chức năng các chân:
• VIN: dùng để cung cấp nguồn khi không dùng USB hoặc các nguồn khác, điện áp 7-12VDC
• 5V: Chân này xuất ra nguồn 5V
• 3V3: Nguồn cung cấp 3.3V (dòng điện trên chân này tối đa là 50mA).
• GND: Là chân mang điện cực âm trên board.
• IOREF: chân này dùng để cung cấp tham chiếu điện áp mà bộ vi điều khiển hoạt động.
• Reset: dùng để kết nối với nút reset ra bên ngoài.
192.168.1.82:3000/home/IoTNode/detailNode?idNode=4 4/11 5/15/24, 3:13 PM OPEN LAB
Trên Board Arduino Uno có 14 chân Digital được sử dụng để làm chân đầu vào và đầu ra, chúng sử dụng các hàm
pinMode(), digitalWrite(), digitalRead(). Điện áp trên mỗi chân là 5V, dòng trên mỗi chân là 20mA và bên trong có
điện trở kéo lên là 20-50 ohm. Dòng tối đa trên mỗi chân I/O không vượt quá 40mA để tránh trường hợp gây hỏng
board mạch. Uno có 6 chân đầu vào Analog từ A0 đến A5, mỗi chân cung cấp 10 bit độ phân giải (tức là 1024 giá trị khác nhau).
• Serial: chân 0 (RX) và 1 (TX): Được sử dụng để nhận dữ liệu (RX) và truyền dữ liệu (TX) TTL.
• Ngắt ngoài: chân 2 và 3
• PWM (điều chế độ rộng xung): chân 3, 5, 6, 9 và 11 cung cấp đầu ra xung PWM với độ phân giải 8 bit bằng hàm analogWrite ().
• SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK). Các chân này hỗ trợ giao tiếp SPI bằng thư viện SPI.
• TWI/I2C: A4 (SDA) và A5 (SCL) hỗ trợ giao tiếp I2C/TWI với các thiết bị khác.
• AREF: điện áp tham chiếu cho các đầu vào tương tự
Nội dung 1. Lập trình cho vi điều khiển hiển thị dòng chữ lên màn hình LCD Màn hình LCD 16x2:
- LCD 16×2 có 16 chân trong đó 8 chân dữ liệu (D0 – D7) và 3 chân điều khiển (RS, RW, EN).
- chân còn lại dùng để cấp nguồn và đèn nền cho LCD 16×2.
- Các chân điều khiển giúp ta dễ dàng cấu hình LCD ở chế độ lệnh hoặc chế độ dữ liệu.
- Chúng còn giúp ta cấu hình ở chế độ đọc hoặc ghi. Thông số kĩ thuật:
- Điện áp hoạt động là 5 V
- Địa chỉ I2C: 0x27 (có thể thay đổi theo đơn hàng của nsx ví dụ như: 0x3F )
- Hỗ trợ màn hình: LCD1602,1604,2004 (driver HD44780).
- Có đèn led nền, có thể dùng biến trở hoặc PWM điều chình độ sáng để sử dụng ít điện năng hơn.
- Có thể được điều khiển với 6 dây tín hiệu • Module I2C Arduino:
- LCD có quá nhiều nhiều chân gây khó khăn trong quá trình đấu nối và chiếm dụng nhiều chân trên vi điều
khiển. Do đó Module I2C LCD ra đời để giải quyết vấn đề này. Thay vì phải mất 6 chân vi điều khiển để kết nối với
LCD 16×2 (RS, EN, D7, D6, D5 và D4) thì module IC2 bạn chỉ cần tốn 2 chân (SCL, SDA) để kết nối.
Sơ đồ đấu nối:
192.168.1.82:3000/home/IoTNode/detailNode?idNode=4 5/11 5/15/24, 3:13 PM OPEN LAB Arduino LCD GND GND VCC VCC SDA/A4 SDA SCL/A5 SCL • • Code tham khảo:
- Thư viện cho LCD: “LiquidCrystal I2C ” của Frank de Brabander
Link tham khảo có code mẫu:
https://github.com/johnrickman/LiquidCrystal_I2C
- Có thể mô phỏng qua đường link đây: https://wokwi.com - Code : #include
LiquidCrystal_I2C lcd ( 0x 27 , 16 , 2 ) ; // Khai báo địa chỉ của LCD gồm 16 cột, 2 dòng void setup () {
lcd . init () ; // Khởi động màn hình lCD
lcd . backlight () ; // Bật đèn nền LCD
lcd . setCursor ( 0 , 0 ) ; //Đưa con trỏ vị trí tới hàng 1 cột 1, nếu là (1,0) thì là hàng 1 cột thứ 2
lcd . print ( "Hello, world!" ) ; // In ra màn hình LCD
lcd . setCursor ( 0 , 1 ) ; // Đưa con trỏ tới vị trí hàng 1 cột 2
lcd . print ( "IoT LAB" ) ; // In ra màn hình LCD } void loop () { } Kết quả:
Nội dung 2. Lập trình cho vi điều n háy Led RGB Led RGB
- Đèn led hay còn gọi là điốt phát quang, là một biến thể của diode cơ bản, nó xác định độ chênh lệch điện áp
nhỏ nhất giữa Anode (+ ) và Cathode (-), led khác diode ở chỗ là tạo ra ánh sáng khi dòng điện đi qua. Đèn led cần
được kết nối đúng âm dương của nguồn điện để hoạt động. L ed RGB có 3 màu : đỏ, xanh lá, xanh dươ ng .
192.168.1.82:3000/home/IoTNode/detailNode?idNode=4 6/11 5/15/24, 3:13 PM OPEN LAB
- Điện áp: Mỗi đèn led đều có một mức điện áp đầu vào nhất định (led 5mm dao động 1.9 – 3.2 Vol), nếu cung cấp
không đủ đèn sẽ không phát sáng hoặc cung cấp nguồn lớn hơn thì cần phải sử dụng trở để giảm điện thế vào led.
Nếu bạn mắc nhiều đèn led nối tiếp, song song thì cần phải tính toán mức điện áp, dòng điện cung cấp cho tất cả các led.
- Dòng điện: Nếu bạn cung cấp dòng điện vượt qua ngưỡng cho phép, tương đương với việc làm gia tăng nhiệt độ và
làm giảm tuổi thọ của led. Dòng điện phù hợp với led 5mm thường ở mức 20mA, tối đa có thể là 30mA, chúng ta
kiểm soát dòng điện bằng cách mắc một điện trở nối tiếp với đèn led,nó giúp dòng điện của led luôn ở mức cho phép.
Sơ đồ đấu nối: Arduino LED D7 R D8 G D9 B GND GND Code tham khảo: #define red 7 #define green 8 #define blue 9 void setup () {
pinMode ( red, OUTPUT ) ; // Cấu hình chân D7 làm OUTPUT cho led red
pinMode ( green, OUTPUT ) ; // Cấu hình chân D8 làm OUTPUT cho led green
pinMode ( blue, OUTPUT ) ; // Cấu hình chân D9 làm OUTPUT cho led blue } void loop () {
digitalWrite ( red,HIGH ) ; // Chân red lên mức Cao hay Bật Đèn Led
delay ( 1000 ) ; // Đèn sáng tầm 1 giây
192.168.1.82:3000/home/IoTNode/detailNode?idNode=4 7/11 5/15/24, 3:13 PM OPEN LAB
digitalWrite ( red,LOW ) ; // Chân red xuống mức Thấp hay Tắt Đèn Led
digitalWrite ( green,HIGH ) ; // Chân green lên mức Cao hay Bật Đèn Led
delay ( 1000 ) ; // Đèn sáng tầm 1 giây
digitalWrite ( green,LOW ) ; // Chân green xuống mức Thấp hay Tắt Đèn Led
digitalWrite ( blue,HIGH ) ; // Chân blue lên mức Cao hay Bật Đèn Led
delay ( 1000 ) ; // Đèn sáng tầm 1 giây
digitalWrite ( blue,LOW ) ; // Chân blue xuống mức Thấp hay Tắt Đèn Led } Kết quả:
Nội dung 3 . Lập trình cho vi điều n háy giao tiếp bàn phím
B àn phím số (Key pad )

Bàn phím ma trận 3x4 nhựa cứng gồm có 16 nút bấm được sắp xếp theo ma trận 3 hàng, 4 cột. Các nút bấm
trong cùng một hàng và một cột được nối với nhau. Thông số kỹ thuật:
• Kích thước : 7×5.2×0.9cm
• Bàn Phím Ma Trận Nhựa Cứng 3x4 Keypad loại phím nhựa cứng. • Độ dài cáp: 88mm.
• Nhiệt độ hoạt động 0 ~ 70oC. • Đầu nối ra 7 chân.
• Kích thước bàn phím 65 x 64mm Sơ đồ chân:
Sơ đồ đấu nối: Arduino Key Pad
192.168.1.82:3000/home/IoTNode/detailNode?idNode=4 8/11 5/15/24, 3:13 PM OPEN LAB D3 (3,2) D4 (2,3) D5 (2,2) D6 (2,1) D7 (1,3) D8 (1,2) D9 (1,1)
*Note: (3,2) trong bảng chân của Key Pad ở đây tương đương với hàng thứ 3 và cột thứ 2 trong bộ Kit Lập trình: #include #include #include
const byte ROWS = 4 ; // 4 hàng
const byte COLS = 3 ; // 3 cột String arr [ 8 ] = {} ;
String password [ 8 ] = { "1" , "2" , "3" , "4" , "5" , "6" , "7" , "8" } ; int place = 0 ; int input = 6 ; bool value = true ; char keys [ROWS][COLS] = { { '1','2','3' } , { '4','5','6' } , { '7','8','9' } , { '*','0','#' } } ;
LiquidCrystal_I2C lcd ( 0x 27 , 16 , 2 ) ; // Khai báo địa chỉ của LCD gồm 16 cột, 2 dòng
byte rowPins [ROWS] = { 8 , 3 , 4 , 6 } ; // nối hàng của keypad
byte colPins [COLS] = { 7 , 9 , 5 } ; // nối cột keypad
Keypad keypad = Keypad ( makeKeymap ( keys ) , rowPins, colPins, ROWS, COLS ) ; void setup (){
lcd . init () ; // Khởi động màn hình lCD
lcd . backlight () ; // Bật đèn nền LCD
lcd . setCursor ( 0 , 0 ) ; //Đưa con trỏ vị trí tới hàng 1 cột 1, nếu là (1,0) thì lcd . print ( "pass: " ) ; lcd . setCursor ( 0 , 1 ) ; lcd . print ( "status: " ) ;
Serial . begin ( 9600 ) ; // khởi tạo serial }
192.168.1.82:3000/home/IoTNode/detailNode?idNode=4 9/11 5/15/24, 3:13 PM OPEN LAB void loop (){
// Kiểm tra nút được nhấn
char key = keypad . getKey () ; // in nút ra màn hình if ( key != NO_KEY ){
lcd . setCursor ( input, 0 ) ; lcd . print ( key ) ; arr [place] = key; place++; input++; } if ( place == 8 ) {
for ( int i = 0 ;i< 8 ;i++ ) {
if ( arr [i] != password [i] ) { value = false ; break ; } } if ( value == true ) { lcd . setCursor ( 0 , 1 ) ;
lcd . print ( " Welcome! " ) ; } else { place = 0 ; value = true ; lcd . setCursor ( 8 , 1 ) ; lcd . print ( "Wrong!" ) ; input = 6 ;
lcd . setCursor ( input, 0 ) ; lcd . print ( " " ) ; delay ( 1000 ) ; lcd . setCursor ( 8 , 1 ) ; lcd . print ( " " ) ; } } } Kết quả:
192.168.1.82:3000/home/IoTNode/detailNode?idNode=4 10/11 5/15/24, 3:13 PM OPEN LAB Add your comments here Submit comment
192.168.1.82:3000/home/IoTNode/detailNode?idNode=4 11/11 5/15/24, 3:14 PM OPEN LAB
HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
Posts and Telecommunications Institute of Technology openlab@gmail.com TRANG CHỦ LỚP THIẾT BỊ LỚP MẠNG LỚP ỨNG DỤNG DASHBOARD BrokerMQTT REPORT Danh sách video Vào làm bài
BUỔI 2: THỰC HÀNH GIAO TIẾP CẢM BIẾN-VI ĐIỀU KHIỂN-
THIẾT BỊ CHẤP HÀNH
Nội dung 1. Thực hành cho vi điều khiển thu thập dữ liệu từ cảm biến nhiệt độ , độ ẩm và
hiển thị kết quả ra màn hình

Cảm biến nhiệt độ, độ ẩm (DHT)
- Cảm biến độ ẩm và nhiệt độ DHT11 là cảm biến rất thông dụng và chi phí rẻ và rất dễ lấy dữ liệu thông qua giao
tiếp 1 wire (dùng 1 chân digital để truyền dữ liệu. Bộ tiền xử lý tín hiệu tích hợp trong cảm biến có được dữ liệu
chính xác mà không phải qua bất kỳ tính toán nào.
- Cảm biến DHT11 được tích hợp trong một mạch duy nhất. Chỉ cần nối dây nguồn (VCC), dây đất (GND) và dây tín
hiệu (Data, Signal) là xong.
Thông số kĩ thuật của DHT11:
- Điện áp hoạt động: 3-5.5V DC
- Ngưỡng độ ẩm: 20 - 90%
- Sai số độ ẩm: ± 5% RH
- Ngưỡng nhiệt độ: 0 - 55 o C
192.168.1.82:3000/home/IoTNode/detailNode?idNode=5 1/6 5/15/24, 3:14 PM OPEN LAB
- Sai số nhiệt độ: ± 2 o C
Ngoài ra còn có cảm biến nhiệt độ, âm dòng DHT21, DHT 22 giúp cho việc sai số khi đo đáng kể hơn,
phạm vi đo cũng mở rộng thêm
Chuẩn bị phần cứng:
- Cảm biến nhiệt độ, độ ẩm DHT11 - Board Arduino Uno - Bread Board
- Màn hình LCD 16x2 giao tiếp I2C Sơ đồ đấu nối: Code tham khảo :
- Thư viện DHT11: “DHT sensor library” của Adafruit, link tham khảo code hoặc có thể tải qua:
https://github.com/adafruit/DHT-sensor-library #include
LiquidCrystal_I2C lcd ( 0x 27 , 16 , 2 ) ;
#include "DHT.h" //khai báo thư viện DHT
const int DHTPIN = 7 ; //khai báo chân dữ liệu DHT
const int DHTTYPE = DHT22; //khai báo kiểu DHT, có 3 loại DHT11, DHT21, DHT22 tùy
kết quả có thể thay loại DHT dht ( DHTPIN, DHTTYPE ) ; void setup () { Serial . begin ( 9600 ) ;
dht . begin () ; // Khởi động cảm biến
lcd . init () ; // Khởi tạo LCD
lcd . backlight () ; // Bật đèn LCD } void loop () {
float h = dht . readHumidity () ; //Đọc độ ẩm
float t = dht . readTemperature () ; //Đọc nhiệt độ
lcd . setCursor ( 0 , 0 ) ; // Đặt con trỏ hàng 1 cột 1
lcd . print ( "Do Am:" ) ; // In ra chữ Độ ẩm
lcd . print ( h ) ; // In ra giá trị Độ ẩm
lcd . setCursor ( 0 , 1 ) ; // Đặt con trỏ hàng 2 cột 1
lcd . print ( "Nhiet Do:" ) ; // In ra chữ Nhiệt độ
lcd . print ( t ) ; // In ra giá trị Nhiệ độ
delay ( 1000 ) ; //Đợi 1 giây
192.168.1.82:3000/home/IoTNode/detailNode?idNode=5 2/6 5/15/24, 3:14 PM OPEN LAB } Kết quả :
Nội dung 2. Thực hành cho vi điều khiển điều khiển bóng đèn qua relay Relay (Rơ- le)
- Relay là một thiết bị điện tử dùng để điều khiển mạch điện bằng cách sử dụng một tín hiệu điều khiển nhỏ.
Nó hoạt động dựa trên nguyên lý của cuộn dây điện dẫn điện và cơ cấu chuyển mạch. -
Relay có hai trạng thái chính: trạng thái thường đóng
(NC) và trạng thái thường mở (NO). Khi một tín hiệu điều khiển được đưa vào cuộn dây điện, relay sẽ chuyển từ
trạng thái thường mở (NO) sang trạng thái thường đóng (NC) giúp cho thiết bị được hoạt động.
Nguyên lý hoạt động
- Khi một tín hiệu điều khiển được cấp vào cuộn dây điện, dòng điện chạy qua cuộn dây sẽ tạo ra một
trường từ xung quanh cuộn dây. Trường từ này sẽ tác
động lên cơ cấu chuyển mạch trong relay, làm cho nó chuyển từ trạng thái thường mở (NO) sang trạng thái thường đóng (NC).
- Khi rơ le ở trạng thái thường mở (NO) thì các tiếp điểm trong mạch relay không được kết nối với nhau.
Khi tín hiệu điều khiển được cấp, relay chuyển sang trạng thái thường đóng (NC)
192.168.1.82:3000/home/IoTNode/detailNode?idNode=5 3/6 5/15/24, 3:14 PM OPEN LAB
Chuẩn bị phần cứng: - 1 Relay - 1 nguồn ngoài 12V - Bóng đèn 12V - Arduino Uno Sơ đồ đấu nối: Arduino Relay 5V VCC GND GND D8 IN Code tham khảo :
int Relay = 8 ; void setup () {
pinMode ( Relay, OUTPUT ) ; digitalWrite ( Relay, HIGH ) ; }
void loop () { digitalWrite ( Relay, LOW ) ; delay ( 1000 ) ;
digitalWrite ( Relay, HIGH ) ; delay ( 1000 ) ; } Kết quả :
Nội dung 3. Thực hành cho vi điều khiển điều khiển động cơ bước
192.168.1.82:3000/home/IoTNode/detailNode?idNode=5 4/6 5/15/24, 3:14 PM OPEN LAB
Động cơ bước (Step Motor)
- Độ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. Độ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. Động cơ bước 28BYJ- 48
- Động cơ bước sử dụng trong bài toán 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℃)
Chuẩn bị phần cứng: - Arduino Uno
- Động cơ bước 28BYJ- 48 Sơ đồ đấu nối: Arduino Động cơ 5V VCC GND GND D6 INT1 D 7 INT 2 D 8 INT 3 D 9 INT 4 Code tham khảo :
- Thư viện cho động cơ bước: “Stepper” của chính hãng Arduino thông tin thư viện chi tiết tại link:
https://www.arduino.cc/reference/en/libraries/stepper/
192.168.1.82:3000/home/IoTNode/detailNode?idNode=5 5/6 5/15/24, 3:14 PM OPEN LAB
- Độ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 #include
// Khai báo số bước và chân kết nối đến driver động cơ bước
const int stepsPerRevolution = 200 ;
Stepper stepper ( stepsPerRevolution, 6 , 7 , 8 , 9 ) ; void setup () {
// Thiết lập tốc độ quay của động cơ (điều chỉnh theo yêu cầu) stepper . setSpeed ( 60 ) ; } void loop () {
// Quay theo chiều kim đồng hồ 1 vòng
stepper . step ( stepsPerRevolution ) ;
delay ( 1000 ) ; // Dừng 1 giây
// Quay ngược chiều kim đồng hồ 1 vòng
stepper . step ( -stepsPerRevolution ) ;
delay ( 1000 ) ; // Dừng 1 giây } Kết quả : Add your comments here Submit comment
192.168.1.82:3000/home/IoTNode/detailNode?idNode=5 6/6 5/15/24, 3:14 PM OPEN LAB
HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
Posts and Telecommunications Institute of Technology openlab@gmail.com TRANG CHỦ LỚP THIẾT BỊ LỚP MẠNG LỚP ỨNG DỤNG DASHBOARD BrokerMQTT REPORT Danh sách video Vào làm bài
BUỔI 3 : THỰC HÀNH CÁC GIAO THỨC TRUYỀN NHẬN DỮ LIỆU SPI/I2C/UART
Chuẩn giao tiếp SPI: -
SPI là viết tắt của Serial Peripheral Interface, một giao thức
truyền thông nối tiếp thường được sử dụng trong các hệ thống nhúng để trao đổi dữ liệu tốc độ cao giữa nhiều thiết bị
trên bus. Các thiết bị giao tiếp qua SPI có kiến trúc chủ-phụ với nhiều thiết bị phụ được kết nối với một thiết bị
chính. Ngoài ra, giao tiếp SPI hỗ trợ giao tiếp song công hoàn toàn, nghĩa là cả chủ và phụ đều có thể truyền và nhận dữ liệu đồng th ời
- Không giống như các giao thức truyền thông khác như UART hay I2C, SPI không có giao thức được xác định trước
và không có thông số truyền thông cố định. Tính linh hoạt này làm cho SPI trở nên lý tưởng cho các ứng dụng truyền
dữ liệu yêu cầu truyền dữ liệu theo thời gian thực hoặc băng thông cao.
Chuẩn giao tiếp I2C :
192.168.1.82:3000/home/IoTNode/detailNode?idNode=6 1/10 5/15/24, 3:14 PM OPEN LAB
- I2C (viết tắt của Inter-Integrated Circuit), còn được gọi là I2C hoặc IIC, là một bus truyền thông nối tiếp đồng bộ,
đa chủ/đa nô lệ. Nó là bus nối tiếp hai dây hai chiều sử dụng dây đồng hồ nối tiếp (SCL) và dây dữ liệu nối tiếp
(SDA) để gửi và quản lý dữ liệu từng bit giữa nhiều thiết bị. Với I2C, nhiều nô lệ có thể được kết nối với một chủ
duy nhất (như SPI) và nhiều chủ có thể điều khiển một hoặc nhiều nô lệ.
- I2C mang lại khả năng mở rộng và tính linh hoạt cao trong việc kết nối nhiều thiết bị. Tuy nhiên, nó có một vài
nhược điểm. Nó hoạt động ở tốc độ chậm hơn so với SPI, đồng hồ và đường dữ liệu cần có điện trở kéo lên. I2C
cũng liên quan đến việc xử lý lỗi và logic phức tạp hơn cũng như các vấn đề tiềm ẩn như xung đột bus và nhiễu.
Chuẩn giao tiếp UART :
- UART hay còn gọi là bộ thu/phát không đồng bộ phổ quát là một trong những giao thức nối tiếp sớm nhất và đơn
giản nhất để trao đổi dữ liệu nối tiếp giữa hai thiết bị. Giao thức truyền thông không đồng bộ chỉ sử dụng hai dây, đó
là đường truyền (TX) và đường nhận (RX), để truyền và nhận dữ liệu.
- Các thiết bị được kết nối qua UART giao tiếp bằng cách gửi các bit ở tốc độ truyền được xác định trước, thường
bao gồm các bit bắt đầu, dừng và các bit chẵn lẻ tùy chọn. Các thiết bị UART không sử dụng tín hiệu đồng hồ dùng
chung. Thay vào đó, họ phải thống nhất về tốc độ truyền và định dạng dữ liệu.
- Nhiều nhà phát triển sử dụng UART để kết nối không dây và xử lý máy tính vì tính dễ cài đặt, giao diện thân thiện
với người dùng và giá cả phải chăng.
• So sánh giữa các giao thức:
- Chuẩn giao tiếp truyền thông nối tiếp UART trên Arduino (hay còn được biết đến với tên gọi Serial) là chuẩn giao
tiếp được sử dụng rất nhiều trong các ứng dụng hệ thống nhúng.
- Serial là chuẩn giao tiếp truyền thông nối tiếp không đồng bộ, sử dụng UART (Universal Asynchronous Receiver-
Transmitter, một bộ phận phần cứng được tích hợp bên trong chip ATmega328 của board Arduino Uno) kết hợp với
mức logic TTL (mức điện áp cao tương ứng với 5V hoặc 3.3V và mức điện áp thấp tương ứng với 0V)
- UART là tên gọi để chỉ một bộ phận phần cứng dùng để chuyển đổi thông tin từ thanh ghi chứa nội dung cần trao
đổi ra bên ngoài (thông thường có 8 bits) thành 2 dây tín hiệu Serial, phục vụ cho chuẩn giao tiếp Serial chứ không
phải là tên gọi của một chuẩn giao tiếp.
192.168.1.82:3000/home/IoTNode/detailNode?idNode=6 2/10 5/15/24, 3:14 PM OPEN LAB • Baudrate:
- V iệc truyền 1 bit data sau mỗi 1 micro giây, ta nhận thấy rằng để việc giao tiếp diễn ra thành công, giữa 2 thiết bị
cần có những thống nhất rõ ràng về khoảng thời gian truyền cho mỗi bit dữ liệu, hay nói cách khác tốc độ truyền cần
phải được thống nhất với nhau. Tốc độ này được gọi là tốc độ baud (baudrate), được định nghĩa là số bit truyền trong
mỗi giây. Ví dụ, nếu tốc độ baud được sử dụng là 9600, có nghĩa thời gian truyền cho 1 bit là 1/9600 = 104.167 micro giây. • Khung truyền (frame):
- Bên cạnh tốc độ baud, khung truyền đối với chuẩn giao tiếp Serial cũng hết sức quan trọng để đảm bảo việc truyền
nhận được diễn ra chính xác. Khung truyền quy định về số lượng bit truyền trong mỗi lần truyền, bao gồm start bit,
các bit data stop bits, ngoài ra còn có thể có parity bit (kiểm tra lỗi dữ liệu trong quá trình truyền nhận).
Hình 1: V í dụ về khung truyền, bao gồm 1 bit start, 8 bits data và cuối cùng là 1 bit stop. • Start bit
- Đây là bit đầu tiên được truyền vào khung truyền, có chức năng thông báo cho thiết bị nhận biết đang có một chuỗi
dữ liệu sắp truyền đến. Đối với các dòng AVR nói chung và UnoX nói riêng, ở trạng thái chưa có dữ liệu (Idle)
đường truyền luôn kéo lên mức cao. Khi có dữ liệu mới, đường truyền được kéo xuống mức thấp, do đó start bit sẽ
được quy định là mức 0. • Dữ liệu (data)
- Dữ liệu cần truyền thông thường gồm 8 bits, tuy nhiên chúng ta hoàn toàn có thể tùy chỉnh số lượng bit data cho
một gói tin, có thể là 5, 6, 7, 9… Trong quá trình truyền, bit có trọng số thấp nhất (LSB) sẽ được truyền trước, và
cuối cùng sẽ là bit có trọng số cao nhất (MSB). • Stop bits
- Stop bits là một hoặc nhiều bit có chức năng thông báo cho thiết bị nhận biết rằng một gói dữ liệu đã được gởi
xong. Đây là bit quan trọng, cần phải có trong một khung truyền. Giá trị của các stop bit luôn bằng mức Idle (mức
nghỉ) và ngược với giá trị của start bit. Đối với các dòng vi điều khiển AVR các bit kết thúc này luôn là mức cao.
• Sử dụng chuẩn giao tiếp Serial với boad Arduino Uno
- Giao tiếp Serial giữa 2 thiết bị với nhau thông thường sẽ có 2 dây tín hiệu, đó là TX (Transmitter) có chức năng
truyền tải dữ liệu và RX (Receiver) có chức năng thu nhận dữ liệu. 2 dây tín hiệu này được kết nối chéo nhau giữa 2
thiết bị. Cụ thể, TX của thiết bị 1 kết nối với RX của thiết bị 2 và RX của thiết bị 1 kết nối với TX của thiết bị 2.
Điều đặc biệt của Serial đó là quá trình truyền và quá trình nhận dữ liệu được diễn ra hoàn toàn độc lập với nhau. -
B oard Arduino đều được hỗ trợ sẵn 1 hoặc nhiều cổng giao tiếp
Serial. Đối với board Arduino Uno, cổng Serial được ra chân tại vị trí chân số 1 và chân số 0 trên board), đây được
gọi là Hardware Serial, tức là giao tiếp Serial dựa trên phần cứng (có sử dụng UART). Ngoài ra, đối với các vi điều
khiển không hỗ trợ UART hoặc trong trường hợp muốn mở rộng nhiều cổng Serial để giao tiếp với nhiều thiết bị có
hỗ trợ giao ti ếp Serial, ta hoàn toàn có thể giả lập giao tiếp Serial bằng thư viện cho Arduino có tên là SoftwareSerial,
192.168.1.82:3000/home/IoTNode/detailNode?idNode=6 3/10