Chương 1: TỔNG QUAN • Chương 2: CƠ SỞ LÝ THUYẾT • Chương 3: TÍNH TOÁN VÀ THIẾT KẾ • Chương 4: KẾT QUẢ VÀ ĐÁNH GIÁ • Chương 5: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 3 CHƯƠNG 2: CƠ SỞ LÝ THUYẾT 2.1 CHUẨN GIAO TIẾP UART [1] 2.1 Giới thiệu UART là một kiểu giao thức truyền dữ liệu được sử dụng tương đối rộng rãi và đơn giản, bao gồm hai đường truyền độc lập dữ liệu là TX (truyền) và RX (nhận). UART là giao thức truyền dữ liệu không đồng bộ, nó là phương thức giao tiếp giữa hai phần cứng sử dụng mối giao tiếp nối tiếp không đồng bộ. Tốc độ truyền của UART phải là ở một con số chuẩn và tốc độ giống nhau giữa hai thiết bị truyền và nhận, chẳng hạn như 9600, 38400, 115200 baud và một vài tốc độ khác. UART có định nghĩa tốc độ truyền là số lượng bit dữ liệu mỗi giây được truyền tải.
Tốc độ có thể thay đổi linh hoạt dựa theo yêu cầu người dùng cũng như yêu cầu của các ứng dụng. Dữ liệu được truyền qua đường truyền TX RX có dạng khung dữ liệu, sử dụng một bit bắt đầu, bit dừng, bit chẵn lẻ và bit dữ liệu. Giữa hai thiết bị truyền UART thì được kết nối bởi ba đường TX, RX và GND. Chân RX của thiết bị nhận sẽ được nối tiếp với chân TX thiết bị gửi và ngược lại, đặc biệt lưu ý là GND phải được chập vào nhau để so sánh mức điện áp.1 Chuẩn giao tiếp UART [1] Số dây lượng sử dụng Hai dây Tốc độ Từ 9600 đến 115200 tốc độ baud Phương thức truyền của giao thức Không đồng bộ Kiểu truyền Truyền theo kiểu nối tiếp Số Master Một Số Slave Một 4 2.2 Cách truyền dữ liệu của chuẩn giao tiếp UART Hình 2.1 UART [2] UART sẽ truyền data qua một bus data, để chuyển gửi dữ liệu từ các thiết bị khác như Arduino đến UART.
Dữ liệu từ bus data được chuyển sang UART 1 dưới kiểu truyền song song. Sau đó UART1 nhận tín hiệu sẽ bắt đầu tạo gói dữ liệu từ một bit Start, một bit Parity và một bit Stop. Sau đó, gói dữ liệu được đưa ra qua các bit liên tiếp tại chân truyền TX. UART 2 nhận gói dữ liệu theo từng bit tại chân RX của nó.
Tiếp theo, UART 2 thực hiện việc loại bỏ Start bit, Parity bit, và Stop bit. Khi kết thúc, UART2 sẽ chuyển gói dữ liệu đó song song với bus dữ liệu ở ban đầu nhận.2 Khung dữ liệu UART [3] Trong giao thức UART, dữ liệu là các gói, hay còn gọi là "Packets". Mỗi Packet bao gồm 1bit bắt đầu, khoảng từ 5 đến 9 bit dữ liệu, 1bit chẵn lẻ và 1 hoặc 2bit dừng. Start bit: UART sẽ giữ cho đường truyền ở mức cao khi chưa thực hiện việc truyền dữ liệu.
Khi bắt đầu quá trình gửi, đường truyền sẽ được UART bên gửi cho xuống mức thấp trong khoảng một chu kỳ thời gian. Khi phát hiện sự chuyển đổi điện áp xuống thấp, UART 2 bắt đầu đọc các bit trong Packets ở tần số của tốc độ truyền. 5 Data Frame: Các bit nào đang truyền sẽ hiện ở đây, nếu dùng bit kiểm tra chẵn lẻ thì có độ dài khung là khoảng 5 đến 8 bit, nếu không thì data frame có thể dài đến 9 bit. Bit LSB được gửi đầu tiên trong khung truyền.
Parity bit: Mô tả tính lẻ hoặc chẵn của một số, đây là phương thức để UART kiểm tra xem khi truyền có bị lỗi, có sự thay đổi hoặc mất mát dữ liệu hay không. Khi truyền dữ liệu sẽ bị các lỗi về tốc độ truyền hoặc do khoảng cách truyền quá xa, …Khi khung truyền sang thiết bị nhận, nó sẽ bắt đầu đếm tổng số bit là 1, và kiểm tra xem đó là một con số chẵn hay lẻ. Từ đó kiểm tra tính chính xác của việc truyền dữ liệu bằng cách nếu parity bit là số 0 thì phải là chẵn ngược lại thì nếu parity bit là số 1 thì phải là con số lẻ, nếu không trùng khớp thì dữ liệu đã bị lỗi.2 CHUẨN GIAO TIẾP I2C [4] 2.1 Giới thiệu Giao thức I2C là một chuẩn giao tiếp đồng bộ nối tiếp, được phát triển bởi Philips Semiconductors. Các bit dữ liệu được truyền lần lượt một theo chu kỳ đều đặn được xác định bởi một tín hiệu thời gian và chỉ sử dụng hai dây truyền tín hiệu duy nhất.
Sử dụng I2C để kết nối với nhiều loại IC, hoặc là vi điều khiển, EEPROM, mạch hiển thị, và các thiết bị IoT khác. I2C có cấu tạo đơn giản, bao gồm hai dây là: SCL: Xung nhịp đồng hồ sẽ được tạo bởi Master. SDA: Đường dùng để nhận dữ liệu. 3 Cấu tạo I2C [5] 6 Giao thức I2C là việc giao tiếp, trao đổi dữ liệu giữa các thiết bị Slave và Master.
Trong kiểu giao tiếp này, đường truyền SCL và đường lệnh SDA sẽ được điều khiển bởi Master, thường là một vi điều khiển. Các thiết bị IC, vi điều khiển Slave sẽ nhận dữ liệu và lệnh từ Master. Master và Slave kết nối với nhau ở chế độ Open Drain thông qua hai dây SDL và SDA. Để tránh tình trạng ngắn mạch, không có thiết bị nào trên I2C có thể kéo SCL và SDA lên mức cao (HIGH) và ngược lại, bất kỳ thiết bị nào cũng kéo xuống được mức thấp (LOW), sẽ không có tính trạng một bên cố gắng kéo lên mức cao trong khi một bên đang cố gắng kéo xuống mức thấp.
Vì vậy, để ngăn chặn hiện tượng trên, một điện trở (thường là khoảng 1 - 4,7 kΩ) được sử dụng để duy trì mức cao mặc định trên đường bus. Giao tiếp I2C hiện hỗ trợ hai chế độ tốc độ khác nhau: Chế độ hoạt động chuẩn hoạt động với tốc độ 100 kBit/s. Chế độ hoạt động tốc độ thấp với tốc độ 10 kBit/s.2 Khung truyền I2C Hình 2.4 Khung truyền I2C [6] Khối bắt đầu: Cho biết việc truyền dữ liệu sẽ bắt đầu. Bit địa chỉ: Được sử dụng để phân biệt giữa nhiều IC hoặc thiết bị trong quá trình truyền nhận.
Thường là 7 bit, nhưng có thể là 8, 9, hoặc 10 bit tùy thuộc vào yêu cầu cụ thể. Bit read/ write: Có tác dụng kiểm tra xem Master đang gửi hay nhận dữ liệu. Nếu bit này bằng ‘0’ thì tương ứng với Master gửi dữ liệu và ngược lại, nếu nó bằng ‘1’ là nhận dữ liệu. 7 Bit ACK/NACK: Sử dụng để xác nhận sự trùng khớp giữa các địa chỉ.
Nếu giống nhau, Slave trả về giá trị '0', ngược lại là '1'. Khối bit dữ liệu: Chứa dữ liệu muốn gửi, độ dài của nó là 8 bit. Kết thúc: Dấu hiệu thông báo kết thúc quá trình gửi.3 Quá trình truyền nhận dữ liệu của I2C Bắt đầu quá trình truyền dữ liệu, Master kéo lần lượt SCL và SDA xuống mức thấp. Sau đó, gửi đi một địa chỉ dài 7 bit cùng bit Read/Write tới Slave nhận dữ liệu.5 Sau khi Master gửi xung Start [7] Thiết bị Slave so sánh địa chỉ nhận được với địa chỉ của nó.
Nếu giống nhau, đường dây SDA sẽ được kéo xuống mức thấp cũng như cho bit ACK/NACK xuống 0. Nếu khác nhau thì cả đường đó đều được giữ giá trị mặc định là '1'. Trong quá trình truyền, bit Read/Write ở mức cao hoặc thấp sẽ xác định Master gửi hoặc nhận dữ liệu, mức thấp là gửi, mức cao là nhận. Khi dữ liệu gửi thành công, ACK/NACK sẽ xuống mức thấp để thông báo cho Master gửi tiếp dữ liệu.
Khi Slave thành công nhận dữ liệu, Master sẽ gửi tín hiệu bằng cách nâng SDA và SCL từ mức thấp lên mức cao, tín hiệu dừng sẽ cho các Slave biết rằng quá trình gửi dữ liệu đã xong.3 CƠ SỞ DỮ LIỆU THỜI GIAN THỰC TRÊN FIREBASE [8] Firebase lần đầu tiên được ra mắt là vào năm 2012 bởi hai nhà phát triển James Tamplin và Andrew Lee từ công ty Envole, Firebase là công cụ lưu trữ cơ sở dữ liệu dựa trên lưu trữ đám mây nhằm hỗ trợ người dùng dễ dàng thiết kế phần mềm di động, thiết kế web và các ứng dụng có dùng cơ sở dữ liệu.6 Logo Firebase[8] Firebase Realtime Database là một chức năng lưu trữ dữ liệu trực tuyến thời gian thực được chính Firebase phát triển. Dịch vụ này cung cấp người dùng một cơ sở dữ liệu đám mây NoSQL, trong đó dữ liệu này có dạng cây JSON và cập nhật liên tục gần như tức thì giữa các phần cứng và nguồn dữ liệu. Đồng thời nó còn cho phép lưu trữ và đồng bộ hóa dữ liệu trong thời gian thực giữa các ứng dụng di động, máy chủ và các hệ thống web.7 Cơ sở dữ liệu thời gian thực của firebase 9 2.4 ANDROID STUDIO Android Studio là một công cụ phát triển phần mềm di động Android chính thức và mạnh mẽ, nó có sự tin cậy cao và được sử dụng phổ biến trong các mô hình phát triển ứng dụng. Đây hoàn toàn một môi trường lập trình hoàn hảo cho việc tạo ra ứng dụng Android và là một nền tảng linh hoạt dễ quản lý cũng như triển khai dự án.
Hiện nay, Android Studio mang đến hai ngôn ngữ lập trình chính là Java và Kotlin. Tuy vậy, trong cộng đồng phát triển ứng dụng Android (và đặc biệt là trong dự án này), Java được sử dụng làm ngôn ngữ chính. Để bắt đầu thiết kế và phát triển một ứng dụng Android bằng Android Studio, người phát triển thực hiện hai công việc chính: Thiết Kế Giao Diện: Hình 2.8 Một giao diện Android Studio đang được thiết kế o Người phát triển chịu trách nhiệm tạo ra giao diện bên ngoài màn hình như biểu tượng, nút nhấn, hình ảnh, và các yếu tố khác. o Các thành phần này có thể mang theo chức năng cụ thể hoặc không có chức năng nào, thường được đặc trưng và lưu trữ trong các tệp tin có định dạng.
10 Lập Trình Chức Năng Hình 2.9 Một số chức năng được lập trình ở phần java class o Giao diện sẽ được thiết kế dựa trên yêu cầu chức năng đặt ra, người phát triển sẽ lập trình để triển khai các chức năng cho mỗi trang hoặc thành phần của ứng dụng. o Các tệp tin chứa mã nguồn của các chức năng thường được lưu trữ dưới định dạng. Android Studio không chỉ cung cấp một môi trường làm việc hiệu quả cho việc tạo ra giao diện và thiết kế các chức năng mà còn cung cấp tính năng kiểm tra, gỡ lỗi, và triển khai ứng dụng một cách thuận tiện, giúp tối ưu hoá việc triển khai ý tưởng và đảm bảo chất lượng ứng dụng Android đầu ra. 11 CHƯƠNG 3: THIẾT KẾ HỆ THỐNG 3.