Tải bản đầy đủ (.docx) (27 trang)

Bài tập lớn môn thiết kế ngoại vi và kĩ thuật ghép nối (1)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (641.41 KB, 27 trang )

BỘ THÔNG TIN VÀ TRUYỀN THÔNG
HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THƠNG
--------

BÁO CÁO MƠN HỌC
MƠN HỌC: THIẾT KẾ NGOẠI VI
VÀ KỸ THUẬT GHÉP NỐI
Đề tài: Thiết kế hệ thống IoT nhỏ
dựa trên vi điều khiển ESP32
Giảng viên:

TS. Trần Thúy Hà

Nhóm bài tập:

13

Sv thực hiện:

Đỗ Thị Thành – B18DCDT232
Bùi Đức Hinh – B18DCDT081
Trần Duy Khải – B18DCDT106
Nguyễn Văn Thanh – B18DCDT231
Trịnh Đức Tiệp – B18DCDT215
Hà Nội, 2022


Thiết kế ngoại vi và kỹ thuật ghép nối

GVHD: TS. Trần Thúy Hà


MỤC LỤC

Thiết kế hệ thống IoT nhỏ

2


Thiết kế ngoại vi và kỹ thuật ghép nối

GVHD: TS. Trần Thúy Hà

DANH MỤC HÌNH ẢNH
DANH MỤC BẢNG BIỂU

Thiết kế hệ thống IoT nhỏ

3


Thiết kế ngoại vi và kỹ thuật ghép nối

GVHD: TS. Trần Thúy Hà

LỜI NÓI ĐẦU
Mỗi giai đoạn phát triển của lịch sử thế giới đều gắn liền với những cuộc cách
mạng về khoa học kỹ thuật. Và ngày nay, cuộc cách mạng Internet of Things đã tạo
nên những thay đổi đáng kể cuộc sống của chúng ta ở hiện tại và trong tương lai. Với
sự phát triển của Internet, Smartphone và đặc biệt là các thiết bị cảm biến, Internet of
Things (IoT) đang trở thành xu hướng mới của thế giới. IOT là một mạng lưới các vật
thể được gắn các cảm biến hoặc hệ thống điện tử đặc biệt cho phép chúng kết nối với

nhau để thu thập và trao đổi dữ liệu. Các vật thể trong mạng lưới này có thể được kết
nối với mạng Internet cho mục đích điều khiển và giám sát từ xa. Việc chúng ta vào
nhà, mở cửa, đèn sẽ tự động sáng ở chỗ ta đang đứng, điều hòa sẽ tự động điều chỉnh
nhiệt độ, nhạc sẽ tự động bật lên, ... Những điều chỉ có trong phim khoa học viễn
tưởng mà chúng ta thường xem, đang dần trở thành hiện thực với công nghệ IoT.
Trong cuộc sống thường nhật, chúng ta đã quá quen thuộc với việc bật tắt các thiết
bị bằng công tắc thông thường. Hiện nay, chúng ta bị chi phối bởi nhiều thứ. Việc
chúng ta ra khỏi nhà mà qn tắt đèn, điều hịa là chuyện khơng hiếm gặp. Với công
tắc thông thường, khi chúng ta rời khỏi nhà mà vẫn quên tắt các thiết bị trong nhà. Để
tắt các thiết bị thì chỉ cách quay trở lại về nhà rồi tắt chúng. Điều này đôi khi gây ra
cho chúng ta nhiều phiền toái.
Để giải quyết vấn đề trên, em đã lựa chọn đề tài: “Xây dựng hệ thống IoT nhỏ”,
ứng dụng công nghệ IoT vào đời sống. Giúp chúng ta có thể bật tắt các thiết bị trong
nhà ở mọi lúc mọi nơi. Đây là một đề tài khơng mới, nhiều anh chị khóa trước cũng đã
thực hiện. Nhưng vẫn cịn nhiều điểm cần cải thiện đó là tốc độ đáp ứng khi điều khiển
thiết bị và giao diện điều khiển thiết bị. Vì vậy đề tài của em trọng tâm sẽ thực hiện
việc cải thiện tốc độ điều khiển thiết bị lên mức tối đa có thể, xây dựng giao diện điều
khiển thiết bị có tính thẩm mỹ và thân thiện với người dùng.
Trong quá trình thực hiện đề tài, nhóm em đã cố gắng hết sức để hoàn thành một
cách tốt nhất bài báo cáo, nhưng khơng tránh khỏi những thiếu sót mong được cơ và
các bạn tiếp tục góp ý để nhóm hồn thiện đề tài.
Xin chân thành cảm ơn

Thiết kế hệ thống IoT nhỏ

4


Thiết kế ngoại vi và kỹ thuật ghép nối


GVHD: TS. Trần Thúy Hà

CHƯƠNG I. CƠ SỞ LÝ THUYẾT
I. Hệ điều hành FreeRTOS
1. Khái niệm về hệ điều hành

thời gian thực

Hệ thống thời gian thực là hệ thống mà sự hoạt động tin cậy của nó khơng
chỉ phụ thuộc vào sự chính xác của kết quả, mà cịn phụ thuộc vào thời điểm đưa
ra kết quả, hệ thống có lỗi khi u cầu về thời gian khơng được thoả mãn.

Hình 1. Hệ điều hành thời gian thực trong điều khiển

Một RTOS thường có tính mềm dẻo và có tính cấu trúc. Nó cho phép tích
hợp thêm các dịch vụ gia tăng theo vòng tròn đồng tâm. Vòng trong cùng hay
nhân cung cấp những đặc tính quan trọng nhất của hệ điều hành thời gian thực.
Các đặc điểm khác có thể được thêm vào như một vịng ngồi khi cần thiết.
Nhân nhỏ của một RTOS thích hợp cho một ứng dụng bộ xử lý nhỏ, trong khi
những vịng ngồi có thể giúp đỡ xây dựng hệ thống thời gian thực lớn. Các
RTOS thường cung cấp các mức xử lý ưu tiên. Các cơng việc ưu tiên cao hơn sẽ
được thực hiện trước.
Ngồi các chức năng của hệ điều hành như trên, hệ điều hành thời gian thực
có thể hỗ trợ thêm các chức năng sau:
- Lập lịch phân chia thời gian sử dụng tài nguyên, đặt mức ưu tiên các tác vụ.
- Truyền thông và đồng bộ giữa các tác vụ hoặc giữa tác vụ và ngắt.
- Phân phối bộ nhớ động.
- Quản lý các thiết bị vào ra.
Thiết kế hệ thống IoT nhỏ


5


Thiết kế ngoại vi và kỹ thuật ghép nối

GVHD: TS. Trần Thúy Hà

Hình 2. Sơ đị chức năng của hệ điều hành thời gian thực

Nhiều hệ điều hành không thời gian thực cũng cung cấp nhân của tương tự
nhưng điểm khác biệt lớn nhất của hệ điều hành thời gian thực và hệ điều hành
khơng thời gian thực nói chung là tính tiền định (deterministic). Thời gian tiền
định tức là các dịch vụ của hệ điều hành thực hiện chỉ được yêu cầu một khoảng
thời gian nhất định, muốn tiền định tức là phải tính tốn chính xác theo tốn học.
Các đáp ứng về thời gian là nghiêm ngặt trong hệ điều hành thời gian thực,
khơng thể có thành phần thời gian ngẫu nhiên. Với một phần thời gian ngẫu
nhiên có thể tạo ra trễ ngẫu nhiên, từ đó gây ra các đáp ứng deadline khơng thoả
mãn.
2. Khái

niệm FreeRTOS

Hình 3. Sơ đồ phát triển của FreeRTOS
FreeRTOS là lõi của hệ điều hành thời gian thực miễn phí. Hệ điều hành này được
Richard Barry công bố rộng rãi từ năm 2003, phát triển mạnh đến nay và được cộng
đồng mạng mã nguồn mở ủng hộ. FreeRTOS có tính khả chuyển, mã nguồn mở, lõi có
thể down miễn phí và nó có thể dùng cho các ứng dụng thương mại. Nó phù hợp với
những hệ nhúng thời gian thực nhỏ. Hầu hết các code được viết bằng ngơn ngữ C nên
nó có tính phù hợp cao với nhiều nền khác nhau.
Thiết kế hệ thống IoT nhỏ


6


Thiết kế ngoại vi và kỹ thuật ghép nối

GVHD: TS. Trần Thúy Hà

Ưu điểm của nó là dung lượng nhỏ và có thể chạy trên những nền mà nhiều hệ
khơng chạy được. Có thể port cho nhiều kiến trúc vi điều khiển và những công cụ phát
triển khác nhau. Mỗi port chính thức bao gồm những ứng dụng ví dụ tiền cấu hình
biểu hiện sự riêng biệt của lõi, kiến thức mới và hướng phát triển. Những hỗ trợ miễn
phí được cung cấp bởi cộng đồng mạng. Hỗ trợ thương mại với những dịch vụ phát
triển đầy đủ cũng được cung cấp.
FreeRTOS được cấp giấy phép bởi bản đã được chỉnh sửa bởi GPL (General
Public License) và có thể sử dụng trong ứng dụng thương mại với giấy phép này.
Ngoài ra liên quan đến FreeRTOS có OpenRTOS và SafeRTOS. OpenRTOS là bản
thương mại của FreeRTOS.org và khơng liên quan gì đến GPL. SafeRTOS là về cơ
bản dựa trên FreeRTOS nhưng được phân tích, chứng minh bằng tài liệu và kiểm tra
nghiêm ngặt với chuẩn IEC61508. Và chuẩn IEC61508 SIL3 đã được tạo ra và phát
triển độc lập để hoàn thiện tài liệu cho SafeRTOS.
Cụ thể các hỗ trợ khác nhau của FreeRTOS và OpenRTOS

Bảng 1. Các hỗ trợ khác nhau từ FreeRTOS và OpenRTOS
đặc điểm của RTOS
Một RTOS được ứng dụng thành công vào một nền vi điều khiển thường phải bao
gồm 3 nhóm sau:
• RTOS Kernel: nhân của hệ điều hành, trong đó thực thi các nhiệm vụ cơ bản
của RTOS. Kernel dùng chung cho tất cả các platform và được cập nhật theo
version.

• Port: thường được phát triển bởi nhà sản xuất MCU, nó khác nhau đối với từng
họ MCU.
• BSP (Board Support Package): chứa các hàm chức năng truy xuất đến các ngoại
vi, thực chất đây chính là driver cho các ngoại vi của MCU.
Một RTOS tốt chỉ khi có nhân tốt, tài liệu tốt và được phân phát cùng các công cụ
tốt để phát triển và vận hành ứng dụng. Vì vậy, các tính tốn về khoảng thời gian ngắt
và thời gian chuyển mạch ngữ cảnh là rất quan trọng, cùng với các thông số khác làm
nên một RTOS tốt .
Xây dựng các khối cơ bản của phần mềm dưới RTOS là tác vụ - task. Việc tạo ra
các tác vụ dưới RTOS là rất đơn giản. Một tác vụ đơn giản chỉ là một thủ tục con. Tại
một số điểm trong chương trình, chúng ta thực hiện một hoặc nhiều lời gọi tới một
3. Các

Thiết kế hệ thống IoT nhỏ

7


Thiết kế ngoại vi và kỹ thuật ghép nối

GVHD: TS. Trần Thúy Hà

hàm trong RTOS để bắt đầu các tác vụ. Mỗi tác vụ trong RTOS luôn luôn ở một trong
ba trạng thái chính:

Hình 4. Trạng thái các tác vụ
Running: Với ý nghĩa bộ xử lý đang thực hiện tác vụ. Với một bộ xử lý thì
chúng ta chỉ chạy một tác vụ tại một thời điểm nhất định.
• Ready: Với ý nghĩa một số tác vụ khác sẵn sàng chạy nếu bộ xử lý rỗi.
• Blocked: Với ý nghĩa tác vụ không sẵn sàng chạy kể cả khi bộ xử lý trong trạng

thái nghỉ - Idle. Tác vụ ở trong trạng thái này vì chúng đợi một sự kiện bên
ngồi tác động để kích hoạt nó trở lại trạng thái sẵn sàng.
4. Các vấn đề cơ bản trong FreeRTOS
Các vấn đề cơ bản trong FreeRTOS cũng nằm trong các vấn đề cơ bản của RTOS
nói chung:
• Đa nhiệm (Mutiltasking)
• Bộ lịch trình(Scheduling)
• Chuyển đổi ngữ cảnh (Context Switching)
• Ứng dụng thời gian thực (Real Time Application)
• Lập lịch thời gian thực (Real Time Scheduling)
4.1. Đa nhiệm
Thuật ngữ kernel được dùng để chỉ đến một thành phần cốt lõi bên trong của một
hệ điều hành. Các hệ điều hành như Linux sử dụng nhân kernel cho phép nhiều người
dùng có thể truy cập vào máy tính dường như là liên tục về mặt thời gian. Nhiều người
dùng có thể thi hành các chương trình nhìn bề ngoại có vẻ như là đồng thời với hệ điều
hành. Thực ra, mỗi một chương trình đang thi hành là một nhiệm vụ được phân chia
điều khiển bởi hệ điều hành. Nếu một hệ điều hành có khả năng thi hành nhiều tác vụ
thì được gọi là đa nhiệm (multitasking). Sử dụng hệ điều hành đa nhiệm sẽ làm đơn
giản quá trình thiết kế những bài tốn mà nó sẽ là gánh nặng nếu chuyển hết cho phần
mềm ứng dụng xử lý.
Đa nhiệm và tính năng liên lạc nội bộ giữa các tác vụ của hệ điều hành cho phép


Thiết kế hệ thống IoT nhỏ

8


Thiết kế ngoại vi và kỹ thuật ghép nối


GVHD: TS. Trần Thúy Hà

các ứng dụng phức tạp có thể phân chia ra thành các tác vụ nhỏ hơn, đơn giản hơn, dễ
quản lý hơn. Các phần chia nhỏ này sẽ giúp chúng ta dễ dàng có kết quả trong q
trình kiểm tra phần mềm, sử dụng lại mã chương trình ... Những sự tính tốn thời gian
phức tạp và các quá trình tuần tự chi tiết được tách biệt ra khỏi chương trình ứng dụng
và chuyển nhiệm vụ này cho hệ điều hành đảm trách.
Thường thì các bộ vi xử lý chỉ có thể thực hiện một tác vụ duy nhất trong một thời
điểm nhưng với sự chuyển đổi một cách rất nhanh giữa các tác vụ của một hệ điều
hành đa nhiệm làm cho chúng dường như được chạy đồng thời với nhau. Điều này
được mô tả ở sơ đồ dưới đây với 3 tác vụ và giản đồ thời gian của chúng.

Hình 5. Sơ đồ phân chia thời gian các tác vụ thực hiện

Lập lịch
Bộ lịch trình là một phần của nhân hệ điều hành chịu trách nhiệm quyết định
nhiệm vụ nào sẽ được thi hành tại một thời điểm. Nhân kernel có thể cho dừng một tác
vụ và phục hồi lại tác vụ sau đó nhiều lần trong suốt q trình sống của tác vụ đó.
Scheduling policy - cơ chế lập lịch trình là thuật tốn được sử dụng bởi bộ lịch
trình để quyết định tác vụ nào được thi hành tại thời điểm được chỉ dịnh. Cơ chế của
một hệ thống nhiều người dùng (không phải thời gian thực) gần như là cho phép mỗi
nhiệm vụ chiếm lĩnh hoàn toàn thời gian của bộ vi xử lý. Còn cơ chế của hệ thời gian
thực hay hệ nhúng sẽ được mơ tả sau đây
4.2.

Hình 6. Sơ đồ chuyển giao các tác vụ

Các task 1, 2, 3 có mức ưu tiên giảm dần cứ khi nào tác vụ ưu tiên cao yêu cầu thì
các task ưu tiên thấp phải nhường.
• Tại (1), nhiệm vụ thứ nhất được thi hành

Thiết kế hệ thống IoT nhỏ

9


Thiết kế ngoại vi và kỹ thuật ghép nối

GVHD: TS. Trần Thúy Hà

Tại (2), nhân kernel dừng tác vụ 1
• Tại (3), phục hồi lại tác vụ 2
• Tại (4), trong khi tác vụ 2 đang thi hành, nó cấm các ngoại vi của vi xử lý chỉ
cho phép chính bản thân tác vụ này truy cập vào.
• Tại (5), nhân kernel dừng tác vụ 2
• Tại (6) phục hồi lại tác vụ 3
• Tác vụ 3 cố thử truy cập vào cùng ngoại vi của vi xử lý và thấy rằng đã bị cấm,
vì vậy nó khơng thể tiếp tục và tự dừng tại vị trí (7)  Tại (8), nhân kernel phục
hồi lại task 1.
• Tại (9), thời điểm tiếp theo tác vụ 2 đang thi hành và kết thúc với ngoại vi của
vi xử lý và cho phép các tác vụ khác truy cập.
• Thời điểm tiếp là tác vụ 3 đang thi hành và thấy rằng có thể truy cập vào ngoại
vi nên tiếp tục thực thi cho khi bị dừng bởi nhân kernel
4.3. Chuyển đổi ngữ cảnh
Khi một tác vụ đang thi hành, nó sẽ sử dụng các thanh ghi và truy cập vào ROM,
RAM như các tác vụ khác. Những tài nguyên này bao gồm : thanh ghi, RAM, ROM,
stack ... gọi là ngữ cảnh thực thi nhiệm vụ của một tác vụ.
Một tác vụ là một đoạn mã liên tục, nó sẽ khơng biết và không được báo trước nếu
bị dừng hoặc được phục hồi bởi kernel. Phân tích trường hợp mà một tác vụ bị dừng
một cách tức thì khi đang thực hiện một lệnh cộng hai thanh ghi của bộ vi xử lý.
Khi tác vụ đó đã bị dừng, các tác vụ khác sẽ thi hành và có thể thay đổi các giá trị

thanh ghi của bộ vi xử lý. Dựa trên sự phục hồi một tác vụ sẽ không nhận biết được
rằng các thanh ghi của vi xử lý đã bị thay đổi - nếu sử dụng các giá trị đã bị thay đổi sẽ
dẫn đến một kết quả sai.
Để ngăn chặn kiểu lỗi này, yếu tố cần thiết là sự phục hồi một tác vụ phải có một
ngữ cảnh đồng nhất. Nhân hệ điều hành sẽ chịu trách nhiệm xác định chắc chắn trường
hợp nào cần chuyển ngữ cảnh và thực hiện nhiệm vụ đó khi tác vụ bị dừng. Khi tác vụ
được phục hồi, ngữ cảnh đã được lưu lại sẽ được trao trả cho tác vụ đó thực hiện tiếp.
4.4. Các ứng dụng thời gian thực
Hệ điều hành thời gian thực thực hiện đa nhiệm cũng với ngun lý trên nhưng các
đối tượng của nó thì rất khác so với các đối tượng của hệ không phải thời gian thực. Sự
khác biệt này được phản ánh bởi cơ chế lập lịch trình. Hệ thời gian thực/ hệ nhúng
được thiết kế sao cho các đáp ứng về mặt thời gian là thực đối với các sự kiện xảy ra
trên thế giới thật. Các sự kiện này xảy ra trên thế giới thực có thể có thời điểm kết thúc
trước ngay cả hệ nhúng/hệ thời gian thực phải đáp ứng và cơ chế lập lịch của hệ RTOS
phải xác định được thời điểm kết thúc mà nó phải gặp.
Để thực hiện những mục tiêu trên, kỹ sư lập trình phải gán quyền ưu tiên cho mỗi
một tác vụ. Sau đó cơ chế lập lịch của hệ RTOS chỉ đơn giản là xác định tác vụ có
quyền ưu tiên cao nhất được phép thi hành ở thời điểm đang xử lý. Điều này dẫn đến
cần chia sẻ thời gian xử lý một cách cơng bằng giữa các tác vụ có cùng ưu tiên và sẵn sàng
thực thi.
Tác vụ điều khiển có quyền ưu tiên cao nhất vì:
• Thời hạn cho tác vụ điều khiển có yêu cầu nghiêm ngặt hơn tác vụ xử lý bàn phím.
• Hậu quả của việc mất thời hạn kết thúc (dead line) của tác vụ điều khiển sẽ lớn
hơn tác vụ xử lý phím.
4.5. Bộ lập lịch thời gian thực


Thiết kế hệ thống IoT nhỏ

10



Thiết kế ngoại vi và kỹ thuật ghép nối

GVHD: TS. Trần Thúy Hà

Sơ đồ dưới đây trình bày các tác vụ được định nghĩa như thế nào trong phần trước
sẽ được lịch trình bởi hệ thời gian thực. Hệ RTOS trước tiên tự tạo cho nó một tác vụ
gọi là Idle Task, tác vụ này chỉ thực thi khi không có tác vụ nào có khả năng thực thi.
Tác vụ Idle của hệ RTOS luôn ở trạng thái sẵn sàng hoạt động.

Hình 7.Sơ đồ phân chia các sự kiện theo thời gian

Với giản đồ trên, ta thấy nếu tác vụ điều khiển u cầu hoạt động thì tác vụ bàn
phím buộc phải nhường do trong lập trình ta ln để tác vụ điều khiển có mức ưu tiên
cao hơn, bộ lập lịch thời gian thực cho phép các tác vụ có ưu tiên cao hơn chiếm quyền
chạy trước. Trong bộ lập lịch ln có tác vụ Idle nhằm quản lý phân phối tài ngun và
nó ln ở mức ưu tiên thấp nhất, chỉ được chạy khi khơng có tác vụ nào chạy
II. Chuẩn giao tiếp 1-WIRE (Chuẩn Bus One Wire)
1. Khái niệm chuẩn giao tiếp 1-Wire
OneWire là hệ thống bus giao tiếp được thiết kế bởi Dallas Semiconductor Corp.
Giống như tên gọi, hệ thống bus này chỉ sử dụng 1 dây để truyền nhận dữ liệu.
Chính vì chỉ sử dụng 1 dây nên giao tiếp này có tốc độ truyền thấp nhưng dữ liệu
lại truyền được khoảng cách xa hơn.
OneWire chủ yếu sử dụng để giao tiếp với các thiết bị nhỏ, thu thập và truyền nhận
dữ liệu thời tiết, nhiệt độ,… các công việc không yêu cầu tốc độ cao.
Giống như các chuẩn giao tiếp khác, 1-Wire cho phép truyền nhận dữ liệu với nhiều
Slave trên đường truyền. Tuy nhiên chỉ có thể có 1 Master ( điểm này giống với SPI).

Hình 8. Chuẩn giao tiếp 1-Wire

2. Khung truyền của giao tiếp OneWire
2.1. Cách hoạt động của one wire

Thiết kế hệ thống IoT nhỏ

11


Thiết kế ngoại vi và kỹ thuật ghép nối

GVHD: TS. Trần Thúy Hà

So với các chuẩn giao tiếp cơ bản như UART, SPI, I2C, cách thức hoạt động của
OneWire có hơi khách một chút,theo hình ảnh mơ phỏng bên dưới,đường dây luôn
được giữ ở mức cao (High). Các thao tác hoạt động cơ bản của bus sẽ được quy định
bởi thời gian kéo đường truyền xuống mức thấp (Low)
Có 4 thao tác cơ bản như sau:

Hình 9. cách hoạt động của chuẩn giao tiếp 1-wire






Gửi bit 1: Khi muốn gửi đi bit 1, thiết bị Master sẽ kéo bus xuống mức 0 trong
một khoảng thời gian A (µs) và trở về mức 1 trong khoảng B (µs).
Gửi bit 0: Thiết bị Master kéo bus xuống mức 0 trong một khoảng thời gian C
(µs) và trở về mức 1 trong khoảng D (µs).
Đọc bit: Thiết bị Master kéo bus xuống 1 khoảng A (µs). Trong khoảng thời

gian E (µs) tiếp theo, thiết bị master sẽ tiến hành lấy mẫu. Có nghĩa trong E
(µs) này, nếu bus ở mức 1, thiết bị master sẽ đọc bit 1. Ngược lại, nếu bus ở
mức 0 thì master sẽ đọc được bit 0.
Reset: Thiết bị Master kéo bus xuống 1 khoảng thời gian H (µs) và sau đó về
mức 1. Khoảng thời gian này gọi là tín hiệu reset. Trong khoảng thời gian I (µs)
tiếp theo, thiết bị master tiến hành lấy mẫu. Nếu thiết bị slave gắn với bus gửi

Thiết kế hệ thống IoT nhỏ

12


Thiết kế ngoại vi và kỹ thuật ghép nối

GVHD: TS. Trần Thúy Hà

về tín hiệu 0, (tức bus ở mức 0), master sẽ hiểu rằng slave vẫn có mặt và quá
trình trao đổi dữ liệu lại tiếp tục. Ngược lại nếu slave gửi về tin hiệu 1 ( bus ở
mức 1) thì master hiểu rằng khơng có thiết bị slave nào tồn tại và dừng quá
trình.
Với bảng giá trị thơi gian của hai chế độ tiêu chuẩn và chế độ nhanh như sau:

Bảng 2. Bảng giá trị thời gian
2.2. Một

số ứng dụng
Do chỉ sử dụng 1 dây để truyền dữ liệu, nên thường được ứng dụng vào các thiết
bị, cảm biến không yêu cầu tốc độ cao như cảm biến nhiệt độ DS18B20, cảm biến độ
ẩm
III. Chuẩn WIFI 802.11n

Tổ chức chuẩn hóa IEEE 802 đã chính thức phê chuẩn chuẩn 802.11n cho Wi-Fi.
Bản dự thảo chuẩn 801.11n tốc độ cao đã đã được thảo luậntrong thời gian gần 2 năm.
Khi trở thành một chuẩn chính thức, các thiết bị được chứng nhận đạt tiêu chuẩn
802.11n thậm chí từ các nhà cung cấp khác nhau, sẽ hoạt động với nhau. Dự kiến,
chuẩn cuối cùng sẽ được công bố vào giữa tháng 10 năm 2009.
Việc chuẩn hóa của IEEE sẽ đảm bảo tính tương thích của các thiết bị và kết nối
tốc độ cao. Về mặt lý thuyết, nó cho phép kết nối với tốc độ 300 Mbps, tức là nhanh
hơn khoảng 6 lần tốc độ đỉnh theo lý thuyết của các chuẩn trước đó như 802.11g/a (54
Mbps). Tốc độ điển hình cho chuẩn 802.11n được kỳ vọng đạt khoảng 144 Mbps.
Thiết kế hệ thống IoT nhỏ

13


Thiết kế ngoại vi và kỹ thuật ghép nối

GVHD: TS. Trần Thúy Hà

Các bộ định tuyến cung cấp hai luồng dữ liệu trong khơng gian sẽ có tốc độ lớn
nhất theo lý thuyết lên tới 300 Mbps. Còn các bộ định tuyến cung cấp 3 hoặc 4 luồng
dữ liệu trong khơng gian sẽ có tốc độ nhanh hơn và theo lý thuyết sẽ đạt 450 Mbps
hoặc 600 Mbps.
Chuẩn 802.11n xây dựng trên các chuẩn 82.11 trước đó bằng cách thêm vào anten
MIMO, các kênh 40 MHz và sự kết hợp khung trên lớp MAC.
• Anten MIMO sử dụng nhiều anten để gửi nhiều thông tin hơn so với khi sử
dụng một anten. Nó tạo ra phân tập anten và ghép kênh khơng gian cho 802.11n.
• Chức năng ghép kênh phân chia theo không gian (SDM: Spatial Division
Multiplexing) cho phép ghép nhiều luồng dữ liệu độc lập trong một kênh.
MIMO SDM có thể làm tăng đáng kể tốc độ dữ liệu khi số các luồng dữ liệu
trong không gian tăng lên. Với 4 anten cho cả hai đầu cuối, chuẩn 802.11n có

thể cho tốc độ lên tới 600 Mbps.
• Các kênh 40 MHz, gấp đôi băng thông gấp đôi kênh 20 MHz sử dụng trong các
chuẩn 802.11a/g trước đó, được kết hợp vào chuẩn 802.11n. Điều này cho phép
tăng gấp đôi tốc độ dữ liệu trong một kênh đơn 20 MHz. Thiết bị có thể làm
việc được ở cả băng 5 GHz và 2.4 GHz.

Hình 10. Phân kênh trong băng tần 2,4 GHz cho Wi-Fi

Tất nhiên khơng có nhiều khoảng trống trong băng tần 2,4 GHz cho chuẩn 802.11n
do nó cần tới 2 kênh. Hầu hết người sử dụng sẽ muốn sử dụng băng tần 5 GHz để giảm
can nhiễu từ các sản phẩm Wi-Fi theo chuẩn 802.11b/g hiện tại và các thiết bị vô tuyến
khác trong băng tần 2.4 GHz.

Thiết kế hệ thống IoT nhỏ

14


Thiết kế ngoại vi và kỹ thuật ghép nối

GVHD: TS. Trần Thúy Hà

Hình 11. Phân kênh trong băng tần 5 GHz cho Wi-Fi

Bộ đinh tuyến 100-300 Mb/s chuẩn 802.11n không thể giúp cho việc truy nhập
internet nhanh hơn nếu người sử dụng chỉ có đường kết nối 10 Mb/s. Tuy nhiên, chuẩn
802.11n được kỳ vọng sẽ giúp ích cho các việc kinh doanh và giáo dục ở những nơi
mà hàng trăm người phải dùng chung một một điểm truy cập và cho phép chia sẽ file
và xử lý dữ liệu nhanh hơn…
• Ưu điểm của 802.11n – tốc độ tối đa nhanh nhất và phạm vi tín hiệu tốt nhất;

khả năng chống nhiễu tốt hơn từ các nguồn bên ngồi.
• Nhược điểm của 802.11n – giá thành đắt hơn 802.11g; việc sử dụng nhiều tín
hiệu có thể gây nhiễu với các mạng dựa trên chuẩn 802.11b và 802.11g ở gần.
802.11n là một tiêu chuẩn công nghiệp của IEEE về truyền thông mạng không dây
Wi-Fi. Mặc dù 802.11n được thiết kế để thay thế các công nghệ Wi-Fi 802.11a,
802.11b và 802.11g cũ hơn, nhưng nó đã được thay thế bởi chuẩn 802.11ac. Mỗi tiêu
chuẩn mới thường nhanh và đáng tin cậy hơn so với tiêu chuẩn trước đó. Trên bất kỳ
thiết bị Wi-Fi nào bạn mua sẽ phản ánh tiêu chuẩn nào sẽ hỗ trợ thiết bị đó.

Thiết kế hệ thống IoT nhỏ

15


Thiết kế ngoại vi và kỹ thuật ghép nối

GVHD: TS. Trần Thúy Hà

CHƯƠNG II. NỘI DUNG ĐỀ TÀI
I. Mơ hình kiến
1. Mơ hình

trúc hệ thống

Hình 12. Mơ hình kiến trúc
2. Sơ

đồ khối

Hình 13. Sơ đồ khối hệ thống

II. Phân tích hệ thống
1. Khi nạp xong firmware

vào vi điều khiển esp32 thì:
- ESP32 chạy chế độ wifi station (chuẩn 802.11n) để kết nối với wifi có ssid và
password đc định nghĩa trong code.
- Sau khi kết nối đc wifi thì esp đc cấp phát địa chỉ ip (đọc trong cmd). địa chỉ này
đc router cấp phát bằng giao thức dhcp.
- ESP32 chạy web server. trang web này đc nhúng vào trong firmware của esp32.
truy cập vào trang web bằng gg chrome (đây là 1 client) bằng đường dẫn: địa chỉ
ip/get. vd: 192.168.1.110/get
Thiết kế hệ thống IoT nhỏ

16


Thiết kế ngoại vi và kỹ thuật ghép nối

GVHD: TS. Trần Thúy Hà

- Sau khi chạy web server, esp32 tạo task để get và post dữ liệu thu thập từ cảm
biến lên web và ngược lại get dữ liệu điều khiển từ web về điều khiển màu led rgb và
dimmer led đơn.
2.
- Cấu hình chạy wifi station trong hàm: wifi_station
- Web đc nhúng vào esp32 bằng câu lệnh trong file CmakeList.txt
- ESP32 giao tiếp với dht11 bằng giao thức onewire, dimmer led bằng pwm, điều
khiển màu led bằng rmt (điều chế sóng theo tần số sóng mang 38kHz).
- Giao thức truyền dữ liệu qua mạng local là giao thức http 1.1 (khơng bắt tay 3
bước). nhanh hơn nhưng k có bảo mật so với http 2.0


Thiết kế hệ thống IoT nhỏ

17


Thiết kế ngoại vi và kỹ thuật ghép nối

GVHD: TS. Trần Thúy Hà

CHƯƠNG III. KẾT QUẢ THU ĐƯỢC
I. Code

chính

#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "esp_system.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "lwip/err.h"
#include "lwip/sockets.h"
#include "lwip/sys.h"
#include "lwip/netdb.h"
#include "lwip/dns.h"
#include "app_http_server.h"

#include "ws2812b.h"
#include "output_iot.h"
#include "ledc_io.h"
#include "dht11.h"
/* The examples use WiFi configuration that you can set via project configuration
menu
If you'd rather not, just change the below entries to strings with
the config you want - ie #define EXAMPLE_WIFI_SSID "mywifissid"
*/
#define EXAMPLE_ESP_WIFI_SSID "EXO"
#define EXAMPLE_ESP_WIFI_PASS "24072000…"
#define EXAMPLE_ESP_MAXIMUM_RETRY 5
#define WEB_SERVER "api.thingspeak.com"
#define WEB_PORT "80"
static const char *TAG1 = "HTTP CLIENT";
Thiết kế hệ thống IoT nhỏ

18


Thiết kế ngoại vi và kỹ thuật ghép nối

GVHD: TS. Trần Thúy Hà

char REQUEST[512];
char SUBREQUEST[100];
char recv_buf[512];
/* FreeRTOS event group to signal when we are connected*/
static EventGroupHandle_t s_wifi_event_group;
/* The event group allows multiple bits for each event, but we only care about two

events:
* - we are connected to the AP with an IP
* - we failed to connect after the maximum amount of retries */
#define WIFI_CONNECTED_BIT BIT0
#define WIFI_FAIL_BIT BIT1
static const char *TAG = "wifi station";
static int s_retry_num = 0;
// xử lý các sự kiện và log các sự kiện ra màn hình
static void event_handler(void* arg, esp_event_base_t event_base,
int32_t event_id, void* event_data)
{
if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
esp_wifi_connect();
} else if (event_base == WIFI_EVENT && event_id ==
WIFI_EVENT_STA_DISCONNECTED) {
if (s_retry_num < EXAMPLE_ESP_MAXIMUM_RETRY) {
esp_wifi_connect();
s_retry_num++;
ESP_LOGI(TAG, "retry to connect to the AP");
} else {
xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);
}
ESP_LOGI(TAG,"connect to the AP fail");
} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip)); // in ra d?a ch? ip
s_retry_num = 0;
Thiết kế hệ thống IoT nhỏ

19



Thiết kế ngoại vi và kỹ thuật ghép nối

GVHD: TS. Trần Thúy Hà

xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
}
}
void switch_data_callback(int onoff)
{
output_io_set_level(2, onoff);
}
void slider_data_callback(int duty)
{
ESP_LOGI(TAG, "Duty: %d", duty);
pwm_set_duty(duty);
}
void rgb_callback(int r, int g, int b)
{
ws2812_set_all_rgb(r,g,b);
}
// http 1.1 get
static void http_get_task(void *pvParameters)
{
const struct addrinfo hints = {
.ai_family = AF_INET,
.ai_socktype = SOCK_STREAM,
};
struct addrinfo *res;

struct in_addr *addr;
int s, r;
char recv_buf[64];
while(1) {
// connect
int err = getaddrinfo(WEB_SERVER, WEB_PORT, &hints, &res);
if(err != 0 || res == NULL) {
ESP_LOGE(TAG1, "DNS lookup failed err=%d res=%p", err, res);
vTaskDelay(1000 / portTICK_PERIOD_MS);
Thiết kế hệ thống IoT nhỏ

20


Thiết kế ngoại vi và kỹ thuật ghép nối

GVHD: TS. Trần Thúy Hà

continue;
}
/* Code to print the resolved IP.
Note: inet_ntoa is non-reentrant, look at ipaddr_ntoa_r for "real" code */
addr = &((struct sockaddr_in *)res->ai_addr)->sin_addr;
ESP_LOGI(TAG1, "DNS lookup succeeded. IP=%s", inet_ntoa(*addr));
s = socket(res->ai_family, res->ai_socktype, 0);
if(s < 0) {
ESP_LOGE(TAG1, "... Failed to allocate socket.");
freeaddrinfo(res);
vTaskDelay(1000 / portTICK_PERIOD_MS);
continue;

}
ESP_LOGI(TAG1, "... allocated socket");
if(connect(s, res->ai_addr, res->ai_addrlen) != 0) {
ESP_LOGE(TAG1, "... socket connect failed errno=%d", errno);
close(s);
freeaddrinfo(res);
vTaskDelay(4000 / portTICK_PERIOD_MS);
continue;
}
ESP_LOGI(TAG1, "... connected");
freeaddrinfo(res);
// send http request
// get data of DHT11
struct dht11_reading dht11;
dht11 = DHT11_read();
float tem = dht11.temperature;
float hum = dht11.humidity;
// printf("tem: %f\thumi: %f\n", tem, hum);
// creat REQUEST string
sprintf(SUBREQUEST, "api_key=0HIGIP9U7GE6ATVP&field1=%f&field2=%f",
tem, hum);
Thiết kế hệ thống IoT nhỏ

21


Thiết kế ngoại vi và kỹ thuật ghép nối

GVHD: TS. Trần Thúy Hà


sprintf(REQUEST, "POST /update.json HTTP/1.1\nHost:
api.thingspeak.com\nConnection: close\nContent-Type: application/x-www-formurlencoded\nContent-Length:%d\n\n%s\n",strlen(SUBREQUEST),SUBREQUEST);
// sprintf(REQUEST, "GET
/>api_key=ECHMC0DU6G3VEECL&results=2\n\n");
if (write(s, REQUEST, strlen(REQUEST)) < 0) {
ESP_LOGE(TAG1, "... socket send failed");
close(s);
vTaskDelay(4000 / portTICK_PERIOD_MS);
continue;
}
ESP_LOGI(TAG1, "... socket send success");
// set timeout for receiver response
struct timeval receiving_timeout;
receiving_timeout.tv_sec = 5;
receiving_timeout.tv_usec = 0;
if (setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &receiving_timeout,
sizeof(receiving_timeout)) < 0) {
ESP_LOGE(TAG1, "... failed to set socket receiving timeout");
close(s);
vTaskDelay(4000 / portTICK_PERIOD_MS);
continue;
}
ESP_LOGI(TAG1, "... set socket receiving timeout success");
// Read response
/* Read HTTP response */
do {
bzero(recv_buf, sizeof(recv_buf));
r = read(s, recv_buf, sizeof(recv_buf)-1);
for(int i = 0; i < r; i++) {
putchar(recv_buf[i]);

}
} while(r > 0);
// delay 10s
ESP_LOGI(TAG1, "... done reading from socket. Last read return=%d errno=
Thiết kế hệ thống IoT nhỏ

22


Thiết kế ngoại vi và kỹ thuật ghép nối

GVHD: TS. Trần Thúy Hà

%d.", r, errno);
close(s);
for(int countdown = 10; countdown >= 0; countdown--) {
ESP_LOGI(TAG1, "%d... ", countdown);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
ESP_LOGI(TAG1, "Starting again!");
}
}
// cấu hình wifi station
void wifi_init_sta(void)
{
s_wifi_event_group = xEventGroupCreate();
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
esp_netif_create_default_wifi_sta();
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();

ESP_ERROR_CHECK(esp_wifi_init(&cfg));
esp_event_handler_instance_t instance_any_id;
esp_event_handler_instance_t instance_got_ip;
ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
ESP_EVENT_ANY_ID,
&event_handler,
NULL,
&instance_any_id));
ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,
IP_EVENT_STA_GOT_IP,
&event_handler,
NULL,
&instance_got_ip));
wifi_config_t wifi_config = {
.sta = {
.ssid = EXAMPLE_ESP_WIFI_SSID,
Thiết kế hệ thống IoT nhỏ

23


Thiết kế ngoại vi và kỹ thuật ghép nối

GVHD: TS. Trần Thúy Hà

.password = EXAMPLE_ESP_WIFI_PASS,
.threshold.authmode = WIFI_AUTH_WPA2_PSK,
.pmf_cfg = {
.capable = true,
.required = false

},
},
};
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) );
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config) );
ESP_ERROR_CHECK(esp_wifi_start() );
ESP_LOGI(TAG, "wifi_init_sta finished.");

EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,
WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,
pdFALSE,
pdFALSE,
portMAX_DELAY);
if (bits & WIFI_CONNECTED_BIT) {
ESP_LOGI(TAG, "connected to ap SSID:%s password:%s",
EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);
} else if (bits & WIFI_FAIL_BIT) {
ESP_LOGI(TAG, "Failed to connect to SSID:%s, password:%s",
EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);
} else {
ESP_LOGE(TAG, "UNEXPECTED EVENT");
}
/* The event will not be processed after unregister */
ESP_ERROR_CHECK(esp_event_handler_instance_unregister(IP_EVENT,
IP_EVENT_STA_GOT_IP, instance_got_ip));
ESP_ERROR_CHECK(esp_event_handler_instance_unregister(WIFI_EVENT,
ESP_EVENT_ANY_ID, instance_any_id));
vEventGroupDelete(s_wifi_event_group);
Thiết kế hệ thống IoT nhỏ


24


Thiết kế ngoại vi và kỹ thuật ghép nối

GVHD: TS. Trần Thúy Hà

switch_set_callback(switch_data_callback);
slider_set_callback(slider_data_callback);
rgb_set_callback(rgb_callback);
start_webserver();
}
void app_main(void)
{
//Initialize NVS
esp_err_t ret = nvs_flash_init(); // chứa cấu hình phần cứng wifi
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret ==
ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
ESP_ERROR_CHECK(ret);
output_io_create(2);
pwm_init(2); // khởi tạo hàm
DHT11_init(4); // khởi tạo chân dht11
ws2812_init(23,8); // khởi tạo module ws2812b chân số 23, 8 led
ws2812_set_all_rgb(255,0,0); //r = 255, g = 0, b = 0
ESP_LOGI(TAG, "ESP_WIFI_MODE_STA");
wifi_init_sta();
vTaskDelay(10000/portTICK_PERIOD_MS);

xTaskCreate(&http_get_task, "http_get_task", 4096, NULL, 5, NULL); // t?o task
}
II. Sản

phẩm thực tế

Thiết kế hệ thống IoT nhỏ

25


×