Ưu điểm và nhược điểm của I2C
Có rất nhiều điều ở I2C có thể khiến nó nghe có vẻ phức tạp so với các giao thức khác, nhưng có một số lý do chính đáng khiến bạn có thể muốn hoặc không muốn sử dụng I2C để kết nối với một thiết bị cụ thể:
Ưu điểm
Chỉ sử dụng hai dây
Hỗ trợ nhiều master và nhiều slave
Bit ACK / NACK xác nhận mỗi khung được chuyển thành cơng Phần cứng ít phức tạp hơn so với UART
Trang 81 Giao thức nổi tiếng và được sử dụng rộng rãi
Nhược điểm
Tốc độ truyền dữ liệu chậm hơn SPI
Kích thước của khung dữ liệu bị giới hạn ở 8 bit Cần phần cứng phức tạp hơn để triển khai so với SPI
3.2.7 CRC Crc là gì Crc là gì
CRC (cyclic redundancy check) là một loại hàm băm, được dùng để sinh ra giá trị kiểm thử, của một chuỗi bit có chiều dài ngắn và cố định, của các gói tin vận chuyển qua mạng hay một khối nhỏ của tệp dữ liệu. Giá trị kiểm thử được dùng để dò lỗi khi dữ liệu được truyền hay lưu vào thiết bị lưu trữ. Giá trị của CRC sẽ được tính tốn và đính kèm vào dữ liệu trước khi dữ liệu được truyền đi hay lưu trữ. Khi dữ liệu được sử dụng, nó sẽ được kiểm thử bằng cách sinh ra mã CRC và so khớp với mã CRC trong dữ liệu.
CRC rất phổ biến, vì nó rất đơn giản để lắp đặt trong các máy tính sử dụng hệ cơ số nhị phân, dễ dàng phân tích tính đúng, và rất phù hợp để dò các lỗi gây ra bởi nhiễu trong khi truyền dữ liệu.
Giới thiệu
CRC là một loại mã phát hiện lỗi. Cách tính tốn của nó giống như phép tốn chia số dài trong đó thương số được loại bỏ và số dư là kết quả, điểm khác biệt ở đây là sử dụng cách tính khơng nhớ (carry-less arithmetic) của một trường hữu hạn. Độ dài của số dư luôn nhỏ hơn hoặc bằng độ dài của số chia, do đó số chia sẽ quyết định độ dài có thể của kết quả trả về. Định nghĩa đối với từng loại CRC đặc thù quyết định số chia nào được sử dụng, cũng như nhiều ràng buộc khác.
Mặc dù các mã CRC có thể xây dựng được bằng cách sử dụng bất kỳ trường hữu hạn nào, nhưng tất cả các mã CRC thường dùng đều sử dụng trường hữu hạn GF(2). Đây là trường hai phần tử, thường được ký hiệu là 0 và 1, phù hợp với kiến trúc máy tính. Phần cịn lại của bài viết sẽ chỉ đề cập đến những mã CRC thuộc dạng này, nhưng nguyên tắc thì khái quát hơn.
Một lý do quan trong lý giải sự phổ biến của mã CRC trong phát hiện sự thay đổi ngẫu nhiên của dữ liệu là hiệu suất đảm bảo. Điển hình, một mã CRC n bit, được áp dụng cho một đoạn dữ liệu có độ dài tùy ý, sẽ phát hiện được bất kỳ lỗi tín hiệu đơn nào có độ dài khơng q n bit (nói cách khác, bất kỳ sự biến đổi đơn lẻ nào có chiều dài khơng q n bit của dữ liệu), và sẽ phát hiện một phần 1-2-n của tất cả các lỗi tín
Trang 82 hiệu có độ dài dài hơn thế. Các lỗi trong cả các kênh truyền dữ liệu và phương tiện bộ nhớ từ dẫn đến phân bố không ngẫu nhiên (v.d, "bursty"), làm cho các đặc tính của CRC trở nên hữu dụng hơn những mã khác như Multiple Parity checks.
Hệ thống tìm lỗi đơn giản nhất, bit parity (xet chẵn lẽ), thực ra là một mã CRC ở dạng tầm thường: sử dụng số chia độ dài 2 bit là 11.
3.3 Làm việc với Firebase
Để bắt đầu sử dụng Firebase ta truy cập đến trang chủ https://firebase.google.com/ do Firebase là dịch vụ của Google nên ta đăng nhập bằng tài khoản Gmail của mình:
Sau đó ta Go to console với giao diện như dưới đây và chọn Create a project để bắt đầu dự án của chúng ta
Trang 83 Ta Add project
Đặt tên cho Project
Trang 84 Tiếp theo ta chọn Default Account for Firebase và Create project
Trang 85 Sau đó ta đợi Firebase khởi tạo project của chúng ta
Cuối cùng Firebase sẽ dẫn ta đến giao diện như sau:
3.3.1 Khởi tạo và cài đặt Firebase Realtime Database
Ở đây ta sẽ sử dụng Services Realtime Database của Firebase với mục đích làm cơ sở dữ liệu để các client có thể tương tác qua lại.
Trang 86 Ở đây ta chọn mặc định và next
Bước tiếp theo :
• Nếu ta đang phát triển dự án với mục đích để test các chức năng thì ta chọn test mode, nhưng database của chúng ta sẽ ở trạng thái open trong 30 ngày đầu tiên
• Ngược lại khi ta cần một database để phục vụ cho mobile app hoặc các ứng dụng web chính thức thì ta chọn locked mode và database của chúng ta sẽ ở chế độ private và dưới các rules mà chúng ta thiết lập (ở đây ta chọn locked mode và Enable)
Trang 87
3.3.2 Khởi tạo cấu trúc dữ liệu cho Realtime Database Firebase
Giao diện của Database của chúng ta hiện tại chưa có một trường dữ liệu và dữ liệu nào.
Tiếp theo ta sẽ tạo ra trường dữ liệu và gán dữ liệu theo cách thủ công bằng cách nhấn vào dấu cộng (add child)
Trang 88 Ta tạo ra trường esp32 và esp32 – string sau đó gán dữ liệu theo kiểu ta muốn
Dữ liệu có thể là kiểu int, string, float… tùy theo dữ liệu ban đầu bạn nhập vào.
Trong bài này, ta sẽ tạo Database như sau
Realtime Database Firebase có cấu trúc kiểu cha – con. Tương tự như cấu trúc của
chuỗi JSON. Vậy nên chúng ta có thể thay đổi 1 dữ liệu hoặc tất cả dữ liệu bằng cách gửi chuỗi JSON lên Database.
Trang 89 Tùy vào mục đích ta có thể thiết kế Database phức tạp hơn bằng cách ấn vào dấu cộng như trên và ta được kết quả như ảnh minh họa dưới đây:
Hình: Cấu trúc dữ liệu của Realtime Database Firebase
3.4 Kết nối ESP32 với Firebase truyền nhận dữ liệu
3.4.1 Thêm thư viện và kết nối với Realtime Database Firebase
Ta mở phần mềm Arduino IDE để bắt đầu code cho modulee esp32 của chúng ta, sau đó ấn tổ hợp phím Ctrl + N để tạo ra trang mới như sau:
Trang 90 Tiếp theo ta thêm các thư viện cần thiết (ở đây ta đang code cho modulee esp32-cam) và thư viện FirebaseESP32.h
Tiếp theo để sử dụng Firebase với esp32 thì ta phải lấy host và đường dẫn đến Database của chúng ta để cập nhật vào code
Trang 91 Vào thẻ Service accounts để lấy secrets code:
Trong mục Realtime Database ta lấy đường dẫn truy xuất đến Database.
Trong code ta thực hiện khai báo Host và Authentication cho modulee và khai báo biến trung gian để truy xuất đến Firebase
Trang 92
3.4.2 Lập trình ESP32 truyền dữ liệu lên Firebase
Đầu tiên, cập nhật WiFi cho esp32, là wifi mà nơi bạn sử dụng
Trong Setup() {…} ta thực hiện kết nối WiFi
Để kết nối đến Firebase thì ta dùng lệnh sau:
Get dữ liệu từ Firebase về ESP32
Tạo biến data5base để lưu giá trị get được từ Firebase về.
Ta thực hiện chức năng get bằng lệnh Firebase.getInt(địa chỉ firebase, vị trí) Sau đó lấy giá trị trả về lưu vào data5base
Trang 93
Push dữ liệu từ ESP32 lên Firebase
Tạo 1 String tên truongthaydoi chính là đường dẫn tới vị trí esp32-string. Chúng ta sẽ push dữ liệu từ Esp32 lên đó.
Sử dụng hàm Firebase.setString(địa chỉ firebase, vị trí, dữ liệu) Lúc này ESP32 sẽ đẩy dữ liệu lên firebase.
Kết quả
Ta đã push được data kiểu string “huy” lên trường esp32-string và get được giá trị 10 từ DB về.
Trang 94 Ta cũng có thể gửi data lên trường esp32 và đọc về ngược lại bằng hàm setInt.
5.Tạo 1 web trên FireBase API
Trước khi thêm Firebase vào ứng dụng JavaScript, bạn cần tạo một dự án Firebase để kết nối với ứng dụng của mình.
1. Trong bảng điều khiển Firebase , nhấp vào Thêm dự án , sau đó chọn hoặc nhập tên Dự án .
2. Nếu bạn đang tạo một dự án mới, bạn có thể chỉnh sửa ID dự án . Firebase tự động chỉ định một ID duy nhất cho dự án Firebase của bạn. Một fter căn cứ
hỏa lực quy định nguồn lực cho dự án căn cứ hỏa lực của bạn, bạn không thể thay đổi ID dự án của bạn.
3. Nhấp vào Tiếp tục .
4. (Tùy chọn) Bạn có thể thiết lập Google Analytics cho dự án của mình bằng cách
sử dụng bất kỳ sản phẩm Firebase nào sau đây: 5. Firebase Crashlytics
6. Dự đoán của Firebase
7. Nhắn tin qua đám mây Firebase 8. Nhắn tin trong ứng dụng Firebase 9. Cấu hình từ xa Firebase
10. Thử nghiệm Firebase A / B
Bạn ln có thể thiết lập Google Analytics sau này trong tab Tích hợp của cài đặt Cài đặt dự án.
5. Nhấp vào Tạo dự án và Firebase sẽ tự động cung cấp tài nguyên cho dự án Firebase của bạn. Khi q trình hồn tất, bạn sẽ được đưa đến trang tổng quan cho dự án Firebase của mình trong bảng điều khiển Firebase.
Sau khi có dự án Firebase, bạn có thể thêm ứng dụng web của mình vào dự án đó.
1. Ở giữa trang tổng quan về dự án của bảng điều khiển Firebase , nhấp vào biểu tượng Web ( </> ) để khởi chạy thiết lập.
2. Nhập tên ứng dụng của bạn. Tên này là số nhận dạng nội bộ và chỉ hiển thị với bạn trong bảng điều khiển Firebase.
Trang 95 3. (Tùy chọn) Thiết lập Lưu trữ Firebase cho ứng dụng web của bạn. Bạn
có thể thiết lập điều này sau nếu bạn muốn làm điều đó. Bạn cũng có thể liên kết Ứng dụng web Firebase của mình với trang Lưu trữ bất kỳ lúc nào trong cài đặt Dự án của bạn . Lưu trữ Firebase không bắt buộc để bạn sử dụng các sản phẩm Firebase với ứng dụng web của mình. 4. Nhấp vào Đăng ký ứng dụng .
Firebase cung cấp thư viện JavaScript cho hầu hết các sản phẩm Firebase, bao gồm Cấu hình từ xa, FCM, v.v. Bạn có thể thêm bất kỳ thư viện có sẵn nào vào ứng dụng của mình.
Cách bạn thêm SDK Firebase vào ứng dụng Web của mình tùy thuộc vào việc bạn có đang sử dụng Lưu trữ Firebase cho ứng dụng của mình hay khơng, bạn đang sử dụng cơng cụ nào với ứng dụng của mình (như gói mơ-đun) hoặc nếu bạn đang định cấu hình Node.js ứng dụng. Để được trợ giúp thêm về việc lựa chọn giữa các lựa chọn thay thế này, hãy xem Các cách thêm SDK Web vào ứng dụng của bạn .
Với mục đích của blog này, tơi sẽ đi sâu vào cách thêm Firebase với npm: 5. Cài đặt SDK JavaScript của Firebase:
6. Nếu bạn chưa có package.json tệp, hãy tạo một tệp bằng cách chạy lệnh sau từ thư mục gốc của dự án JavaScript của bạn:
npm init
npm install --save firebase
// Firebase App (the core Firebase SDK) is always required and must be listed first
import firebase from "firebase/app";
// If you are using v7 or any earlier version of the JS SDK, you should import firebase using namespace import
// import * as firebase from "firebase/app"
// If you enabled Analytics in your project, add the Firebase SDK for Analytics
import "firebase/analytics";
// Add the Firebase products that you want to use import "firebase/auth";
Trang 96 // TODO: Replace the following with your app's Firebase project
configuration
// For Firebase JavaScript SDK v7.20.0 and later, `measurementId` is an optional field const firebaseConfig = { // ... }; // Initialize Firebase firebase.initializeApp(firebaseConfig);
Đây là định dạng của một đối tượng cấu hình với tất cả các dịch vụ cần thiết được bật:
// For Firebase JavaScript SDK v7.20.0 and later, `measurementId` is an optional field var firebaseConfig = { apiKey: "API_KEY", authDomain: "PROJECT_ID.firebaseapp.com", databaseURL: "https://PROJECT_ID.firebaseio.com", projectId: "PROJECT_ID", storageBucket: "PROJECT_ID.appspot.com", messagingSenderId: "SENDER_ID", appId: "APP_ID", measurementId: "G-MEASUREMENT_ID", };
// For Firebase JavaScript SDK v7.20.0 and later, `measurementId` is an optional field
var firebaseConfig = {
Trang 97 authDomain: "myapp-project-123.firebaseapp.com", databaseURL: "https://myapp-project-123.firebaseio.com", projectId: "myapp-project-123", storageBucket: "myapp-project-123.appspot.com", messagingSenderId: "65211879809", appId: "1:65211879909:web:3ae38ef1cdcb2e01fe5f0c", measurementId: "G-8GSGZQ44ST" }; 3.5 Quy trình thực hiện
Bước 1: Lên ý tưởng
Bước 2: Lên tính tốn linh kiện Bước 3: Dự tốn kinh phí Bước 4: Mua linh kiện
Bước 5: Tiến hình thực nghiệm giao tiếp giữa aduino và cảm biến Bước 6. Thực nghiệm giao tiếp giữa Lora node và Lora Gateway Bước 7: Tối ưu hóa thuật tốn giao tiếp (truyền nhận dữ liệu) Bước 8: Kết nối mơ hình hịa chỉnh
Bước 9: Đóng hộp, gia cố hồn thiện sản phẩm Bước 10: Chạy thực nghiệm
Trang 98
3.6 Master
Sơ đồ khối master: