HỆ THỐNG TƯỚI TIÊU TỰ ĐỘNG + FILE CODE Các cảm biến thu dữ liệu độ ẩm, nhiệt độ, ánh sáng, độ ẩm đất từ ngoài môi trường rồi gửi cho vi điều khiển. Vi điều khiển nhận vừ gửi dữ liệu sang ESP8266 bằng UART. Esp8266 ngận dữ liệu các thông số và gửi lên Web sever. Sever lấy dữ liệu lưu vào Database đồng thười gửi lên Web để hiển thị • Cảm biến DHT11 giao tiếp với STM32 bằng giao tiếp One Wire • Cảm biến ánh sáng, độ ẩm đất sử dụng chuyển đổi ADC gửi thông số về cho STM32 • STM32 gửi dữ liệu qua ESP8266 bằng UART • STM32 điều khiển các thiết bị bằng chân IO • ESP8266 gửi dữ liệu lên Web sever bằng giao thức MQTT qua Wifi • Web sever lưu dữ liệu vào MySQL và gửi lên Web bằng API
GIỚI THIỆU LINH KIỆN
STM32F103C8T6
STM32 là một trong những dòng chip phổ biến của ST với nhiều họ thông dụng như F0,F1,F2,F3,F4… Stm32f103 thuộc họ F1 với lõi là ARM COTEX M3
STM32F103 là vi điều khiển 32 bit với tốc độ tối đa lên đến 72Mhz, có giá thành hợp lý so với các vi điều khiển tương tự Mạch nạp và công cụ lập trình của nó rất đa dạng và dễ sử dụng, phù hợp cho nhiều ứng dụng.
Các ứng dụng chính bao gồm: điều khiển driver cho ứng dụng, quản lý thiết bị cầm tay và thuốc, tương tác với máy tính và thiết bị ngoại vi chơi game, sử dụng GPS cơ bản, ứng dụng trong ngành công nghiệp, lập trình PLC, điều khiển biến tần, cũng như vận hành máy in, máy quét, hệ thống cảnh báo và thiết bị liên lạc nội bộ.
Phần mềm lập trình cho STM32 có nhiều lựa chọn trình biên dịch như IAR Embedded Workbench và Keil C Trong bài viết này, mình sẽ tập trung vào việc sử dụng Keil C để phát triển ứng dụng.
Thư viện lập trình: có nhiều loại thư viện lập trình cho STM32 như:
The Standard Peripheral Libraries for STM32 offer a well-established and widely used option for developers, providing support for various peripherals while ensuring clarity in programming Each library, including STM32snippets, STM32Cube LL, STM32Cube HAL, and Mbed core, has its own advantages and disadvantages, but the Standard Peripheral Libraries stand out for their longevity and ease of understanding.
Mạch nạp: có khá nhiều loại mạch nạp như : ULINK, J-LINK , CMSIS-DAP, STLINK… ở đây mình sử dụng Stlink vì giá thành khá rả và debug lỗi cũng tốt
Cấu hình chi tiết của STM32F103C8T6:
• ARM 32-bit Cortex M3 với clock max là 72Mhz
• Bộ nhớ: o 64 kbytes bộ nhớ Flash (bộ nhớ lập trình) o 20 kbytes SRAM
The article discusses clock management and power source controls, highlighting operational voltage ranges from 2.0V to 3.6V It covers essential features such as Power On Reset (POR), Power Down Reset (PDR), and Programmable Voltage Detector (PVD) The use of external quartz crystals is emphasized, with frequencies ranging from 4MHz to 20MHz, while internal quartz operates at either 8MHz or 40kHz Additionally, a 32.768kHz external quartz crystal is specified for Real-Time Clock (RTC) applications.
Trong trường hợp điện áp thấp, thiết bị có thể hoạt động ở các chế độ như ngủ, ngừng hoạt động hoặc chế độ chờ Để duy trì hoạt động của bộ RTC và lưu trữ dữ liệu khi mất nguồn cấp chính, nguồn điện sẽ được cung cấp qua chân Vbat bằng pin.
• 2 bộ ADC 12 bit với 9 kênh cho mỗi bộ o Khoảng giá trị chuyển đổi từ 0 – 3.6V o Lấy mẫu nhiều kênh hoặc 1 kênh o Có cảm biến nhiệt độ nội
Bộ chuyển đổi DMA giúp tăng tốc độ xử lý mà không cần can thiệp sâu của CPU, với 7 kênh DMA hỗ trợ cho các giao thức ADC, I2C, SPI và UART.
Bài viết mô tả về các bộ đếm thời gian trong hệ thống, bao gồm 7 bộ đếm thời gian 16 bit hỗ trợ các chế độ IC/OC/PWM, 1 bộ đếm thời gian 16 bit chuyên dùng để điều khiển động cơ với các chế độ bảo vệ như ngắt input và dead-time, cùng với 2 bộ đếm watchdog timer để bảo vệ và kiểm tra lỗi Ngoài ra, còn có 1 bộ đếm sysTick 24 bit đếm xuống, phục vụ cho các ứng dụng như hàm Delay.
• Hỗ trợ 9 kênh giao tiếp bao gồm: o 2 bộ I2C(SMBus/PMBus) o 3 bộ USART(ISO 7816 interface, LIN, IrDA capability, modem control) o 2 SPIs (18 Mbit/s) o 1 bộ CAN interface (2.0B Active) o USB 2.0 full-speed interface
• Điện áp cấp 5VDC qua cổng Micro USB sẽ được chuyển đổi thành 3.3VDC qua IC nguồn và cấp cho Vi điều khiển chính
• Tích hợp sẵn thạch anh 8Mhz
• Tích hợp sẵn thạnh anh 32Khz cho các ứng dụng RTC
• Ra chân đầy đủ tất cả các GPIO và giao tiếp: CAN, I2C, SPI, UART,
• Tích hợp Led trạng thái nguồn, Led PC13, Nút Reset
• Kích thước: 53.34 x 15.24mm o ST-Link Mini o J-link o USB TO COM
• Kết nối chân khi nạp bằng ST-Link Mini
• Nạp theo chuẩn SWD o TCK — SWCLK o TMS — SWDIO o GND — GND o 3.3V — 3.3V
ESP8266
ESP8266 là một mạch vi điều khiển mạnh mẽ, cho phép người dùng điều khiển các thiết bị điện tử một cách linh hoạt Đặc biệt, mạch này được tích hợp Wi-Fi 2.4GHz, hỗ trợ lập trình và kết nối Internet dễ dàng.
ESP8266 có thể hoạt động như một module WiFi bên ngoài, sử dụng firmware lệnh AT chuẩn Nó có thể được kết nối với bất kỳ bộ vi điều khiển nào qua giao thức UART hoặc có thể được lập trình trực tiếp để trở thành bộ vi điều khiển hỗ trợ WiFi.
Các chân GPIO cho phép IO Analog và Digital, cộng với PWM, SPI, I2C, v.v
ESP8266 có nhiều ứng dụng khi nói đến IoT Đây chỉ là một số chức năng mà chip này được sử dụng
Kết nối mạng: Ăng-ten Wi-Fi của module cho phép các thiết bị nhúng kết nối với bộ định tuyến và truyền dữ liệu
Xử lý dữ liệu bao gồm việc tiếp nhận và xử lý đầu vào từ các cảm biến analog và kỹ thuật số, nhằm thực hiện các phép tính phức tạp hơn thông qua hệ điều hành thời gian thực (RTOS) hoặc bộ phát triển phần mềm (SDK) không phụ thuộc vào hệ điều hành.
Kết nối P2P: Tạo giao tiếp trực tiếp giữa các ESP và các thiết bị khác bằng kết nối IoT P2P
Máy chủ Web: Truy cập các trang được viết bằng HTML hoặc ngôn ngữ phát triển
WiFi: 2.4 GHz hỗ trợ chuẩn 802.11 b/g/n
- Điện áp vào: 5V thông qua cổng USB
- Số chân I/O: 11 (tất cả các chân I/O đều có Interrupt/PWM/I2C/One-wire
- Số chân Analog Input: 1 (điện áp vào tối đa 3.3V)
- Giao tiếp: Cable Micro USB ( tương đương cáp sạc điện thoại )
- Hỗ trợ bảo mật: WPA/WPA2
- Tích hợp giao thức TCP/IP
- Lập trình trên các ngôn ngữ: C/C++, Micropython,…
DHT11
DHT-11 là một module cảm biến nhiệt độ và độ ẩm sử dụng giao tiếp một dây (one wire), bao gồm một điện trở nhiệt và một cảm biến độ ẩm điện dung Bên trong module, có các mạch chuyển đổi tín hiệu từ tương tự sang số, cùng với bộ tiền xử lý giúp đảm bảo dữ liệu nhận được chính xác mà không cần phân tích hay tính toán thêm Thông số kỹ thuật của module DHT-11 được cung cấp rõ ràng để người dùng dễ dàng tham khảo.
- Điện áp hoạt động +5Vdc
- Dòng điện hoạt động cực đại là 2,5mA
- Dải độ ẩm hoạt động 20%÷90% RH, sai số ±4%RH (range humidity)
- Dải nhiệt độ hoạt động 0÷50℃, sai số ±2℃
- Nhiệt độ và độ ẩm đều có độ phân giải 16 bit
- Tốc độ lấy mẫu không quá 1Hz (mỗi giây một lần)
- Tốc độ cảm nhận: trung bình 2s
- Khoảng cách truyền tối đa 20m
- Chân DATA được nối với giắc cắm DATA trên KIT thí nghiệm IoT
Module cảm biến độ ẩm đất
Cảm biến này sử dụng công nghệ điện dung để đo hàm lượng nước trong đất, cho phép xác định độ ẩm một cách chính xác Khi được cắm vào đất, cảm biến sẽ báo cáo trạng thái hàm lượng nước dưới dạng phần trăm, giúp người dùng dễ dàng theo dõi và quản lý độ ẩm của đất.
• Đầu ra digital DO (0 và 1)
• Đầu ra điện áp analog AO
Module cảm biến ánh sáng
• Sử dụng cảm biến photoresistor loại nhạy
• Dùng IC so sánh LM393 cho dòng ra lớn đến 15mA
• Đầu ra digital DO (0 và 1)
• Đầu ra điện áp analog AO
• Một lỗ bu lông cố định để lắp đặt dễ dàng
Khi ánh sáng xung quanh chưa đạt ngưỡng tối ưu, nồng độ DO sẽ ở mức cao Tuy nhiên, khi ánh sáng vượt quá ngưỡng đã thiết lập, nồng độ DO sẽ giảm xuống mức thấp.
• Đầu ra DO có thể được kết nối trực tiếp với vi điều khiển hoặc các module khác (có thể là các mạch điều khiển ánh sáng)
Đầu ra AO có khả năng kết nối với vi điều khiển thông qua chức năng ADC, giúp bạn nhận được các giá trị cường độ ánh sáng xung quanh một cách chính xác hơn.
CÁC GIAO TIẾP SỬ DỤNG
Hệ điều hành FREERTOS
RTOS, hay hệ điều hành thời gian thực, là một loại hệ điều hành được sử dụng chủ yếu trong các vi điều khiển để điều khiển thiết bị một cách nhanh chóng và hỗ trợ đa nhiệm Để hiểu rõ về RTOS, trước tiên cần làm rõ khái niệm về hệ điều hành.
Hệ điều hành (Operating System - OS) là phần mềm thiết yếu dùng để quản lý và điều hành tất cả các thành phần của thiết bị điện tử, bao gồm cả phần cứng và phần mềm.
Hệ điều hành hoạt động như một hội đồng quản trị, có quyền quyết định về vai trò và thời gian làm việc của các nhân viên và ứng dụng Các ứng dụng nhận lệnh từ hệ điều hành và thực hiện công việc theo đúng chức năng đã được phân công.
Hệ điều hành thời gian thực (realtime) được thiết kế cho các tác vụ yêu cầu phản hồi nhanh, thường được sử dụng trong các vi điều khiển mà không có giao diện người dùng (GUI) Sự cần thiết phải phản hồi nhanh là do hầu hết các tác vụ tương tác với thiết bị và máy móc, không phải con người Với tài nguyên hạn chế, bất kỳ sự chậm trễ nào cũng có thể dẫn đến sai lệch trong hoạt động của hệ thống.
Hệ điều hành thời gian thực còn chia thành 2 loại:
Soft-realtime: Sử dụng cho các ứng dụng cruise control (điều khiển hành trình) trong ô tô và các ứng dụng viễn thông
Hard-realtime: Sử dụng trong các ứng dụng điều khiển máy bay, động cơ điện
Khi nào bạn cần sử dụng RTOS ?
Các ứng dụng không cần dùng RTOS:
- Ứng dụng đơn (ứng dụng chỉ có 1 chức năng)
- Ứng dụng có vòng lặp đơn giản
Các ứng dụng cần RTOS:
- Ứng dụng nhiều trạng thái máy (States Machine)
- Ứng dụng liên quan tới các tác vụ xử lý nhanh, xử lý ảnh, âm thanh
Khi ứng dụng của bạn ngày càng lớn và phức tạp, RTOS trở nên rất hữu ích Nó giúp chia nhỏ các ứng dụng phức tạp thành những phần dễ quản lý hơn, từ đó tối ưu hóa hiệu suất và quản lý tài nguyên hiệu quả hơn.
RTOS được sử dụng rất nhiều khi lập trình ESP32, ESP8266, STM32 và các dòng chip khác
RTOS là một thành phần quan trọng trong chương trình, có nhiệm vụ điều phối các tác vụ, lập lịch và xác định mức độ ưu tiên cho từng tác vụ, đồng thời quản lý việc truyền nhận thông điệp giữa các tác vụ.
RTOS là một hệ điều hành thời gian thực phức tạp, chủ yếu thực hiện việc quản lý và xử lý các trạng thái máy (State Machine) Để hiểu rõ hơn về khái niệm này, bạn có thể tham khảo bài viết về State Machine và lập trình nhúng.
Nhân Kernel điều phối hoạt động của các tác vụ (Task) với mức ưu tiên khác nhau và thực thi chúng theo chu kỳ cố định Khi có sự can thiệp như ngắt, tín hiệu hoặc tin nhắn, Kernel sẽ chuyển tiếp thông tin đến Task tương ứng với mã lệnh đó.
Sự chuyển dịch giữa các Task rất linh động, độ trễ thấp mang lại độ tin cậy cao cho chương trình
Thay thì chạy từ trên xuống trong cùng một chương trình thì chúng sẽ được chạy theo các Task khác nhau Được chia nhỏ và chạy đồng thời
Kernel, hay còn gọi là Nhân, đóng vai trò quan trọng trong việc quản lý và điều phối các tác vụ (Task) Tất cả các sự kiện như ngắt, Timer, và dữ liệu truyền đến đều được Kernel xử lý để đưa ra quyết định về các hành động tiếp theo.
Thời gian xử lý của Kernel thường rất nhanh nên độ trễ rất thấp
Task là một đoạn chương trình thực thi một hoặc nhiều vấn đề gì đó, được Kernel quản lý
Kernel sẽ đảm nhiệm việc chuyển đổi giữa các tác vụ, lưu trữ ngữ cảnh của tác vụ sắp bị hủy và khôi phục ngữ cảnh của tác vụ tiếp theo.
Kiểm tra thời gian thực thi đã được định nghĩa trước (time slice được tạo ra bởi ngắt systick)
Khi có các sự kiện unblocking một task có quyền cao hơn xảy ra (signal, queue, semaphore,…)
Khi task gọi hàm Yield() để ép Kernel chuyển sang các task khác mà không phải chờ cho hết time slice
Khi khởi động thì kernel sẽ tạo ra một task mặc định gọi là Idle Task
Kết nối Inter-task & Chia sẻ tài nguyên
Các Task cần phải kết nối và trao đổi dữ liệu với nhau để có thể chia sẻ tài nguyên Với Inter-task Communication:
Signal Events – Đồng bộ các task
A message queue facilitates communication between tasks using a First-In-First-Out (FIFO) method, while a mail queue enables data exchange among tasks by utilizing a memory block's waiting line Both mechanisms are essential for effective resource sharing in computing environments.
Semaphores – Truy xuất tài nguyên liên tục từ các task khác nhau
Mutex – Đồng bộ hóa truy cập tài nguyên sử dụng Mutual Exclusion
Signal event được dùng để đồng bộ các task, ví dụ như bắt task phải thực thi tại một sự kiện nào đó được định sẵn
Ví dụ: Một cái máy giặt có 2 task là Task A điều khiển động cơ, Task B đọc mức nước từ cảm biến nước đầu vào
Task A cần phải chờ nước đầy trước khi khởi động động cơ Việc này có thể thực hiện được bằng cách sử dụng signal event
Task A phải chờ signal event từ Task B trước khi khởi động động cơ
Khi phát hiện nước đã đạt tới mức yêu cầu thì Task B sẽ gửi tín hiệu tới Task A
Trong trường hợp này, task sẽ ở trạng thái WAITING cho đến khi nhận được tín hiệu để thực thi Bên cạnh đó, người dùng có thể thiết lập một hoặc nhiều tín hiệu trong bất kỳ task nào khác.
Mỗi task có thể được gán tối đa là 32 signal event
Message queue – Hàng đợi tin nhắn
Message queue là cơ chế kết nối các task với nhau thông qua một buffer FIFO (First In First Out) Buffer này được xác định bởi độ dài, tức số lượng phần tử có thể lưu trữ, và kích thước dữ liệu, tức kích thước của các thành phần trong buffer.
- Một ứng dụng tiêu biểu là buffer cho Serial I/O, buffer cho lệnh được gửi tới task
- Task có thể ghi vào hằng đợi (queue)
- Task sẽ bị khóa (block) khi gửi dữ liệu tới một message queue đầy đủ
- Task sẽ hết bị khóa (unblock) khi bộ nhớ trong message queue trống
- Trường hợp nhiều task mà bị block thì task với mức ưu tiên cao nhất sẽ được unblock trước
- Task có thể đọc từ hằng đợi (queue)
- Task sẽ bị block nếu message queue trống
- Task sẽ được unblock nếu có dữ liệu trong message queue
- Tương tự ghi thì task được unblock dựa trên mức độ ưu tiên
Chuyển đổi ADC
ADC, viết tắt của bộ chuyển đổi analog sang kỹ thuật số, là mạch chuyển đổi giá trị điện áp liên tục (analog) thành giá trị nhị phân (kỹ thuật số) mà thiết bị kỹ thuật số có thể hiểu Mạch ADC có thể tồn tại dưới dạng vi mạch hoặc được tích hợp vào bộ vi điều khiển, phục vụ cho các tính toán kỹ thuật số.
Trong thời đại hiện nay, thiết bị điện tử chủ yếu sử dụng công nghệ kỹ thuật số, đánh dấu sự kết thúc của thời kỳ máy tính analog Tuy nhiên, thực tế là thế giới xung quanh chúng ta vẫn mang tính analog và phong phú về màu sắc, không chỉ đơn thuần là đen và trắng.
Cảm biến nhiệt độ LM35 tạo ra điện áp tương ứng với nhiệt độ, với mức tăng 10mV cho mỗi độ Celsius Nếu kết nối trực tiếp cảm biến này với đầu vào kỹ thuật số, tín hiệu sẽ chỉ ghi nhận là cao hoặc thấp tùy thuộc vào ngưỡng, điều này dẫn đến việc sử dụng không hiệu quả.
Chúng ta sử dụng bộ ADC để chuyển đổi điện áp analog thành chuỗi bit, cho phép kết nối trực tiếp với bus dữ liệu của bộ vi xử lý để phục vụ cho các phép tính.
ADC hoạt động như thế nào
ADC hoạt động như một bộ chia tỷ lệ toán học, ánh xạ các giá trị điện áp sang số nhị phân Quá trình này cho phép chuyển đổi giá trị từ một dải này sang một dải khác, giúp dễ dàng xử lý và lưu trữ thông tin.
Chúng ta cần một thiết bị chuyển đổi điện áp thành các mức logic, như trong một thanh ghi, vì thanh ghi chỉ chấp nhận mức logic đầu vào Kết nối tín hiệu trực tiếp với đầu vào logic sẽ không mang lại kết quả tốt Do đó, cần có một giao diện giữa tín hiệu logic và điện áp đầu vào analog, cùng với điện áp tham chiếu.
Không có bộ chuyển đổi ADC nào hoàn hảo, và điện áp được ánh xạ tới giá trị nhị phân lớn nhất được gọi là điện áp tham chiếu Chẳng hạn, trong bộ chuyển đổi 10 bit với điện áp tham chiếu 5V, giá trị nhị phân cao nhất 1111111111 tương ứng với 5V, trong khi giá trị thấp nhất 0000000000 tương ứng với 0V.
Mỗi bước nhị phân trong hệ thống ADC đại diện cho khoảng 4,9mV, với tổng cộng 1024 chữ số Nếu điện áp thay đổi dưới 4,9mV mỗi bước, ADC sẽ rơi vào vùng chết, dẫn đến lỗi nhỏ trong kết quả chuyển đổi Để khắc phục lỗi này, có thể sử dụng ADC có độ phân giải cao hơn, chẳng hạn như bộ ADC 24 bit, mặc dù tần số chuyển đổi có thể thấp.
Tốc độ mẫu là số lượng chuyển đổi từ analog sang kỹ thuật số mà bộ chuyển đổi thực hiện mỗi giây, ví dụ như một bộ ADC chất lượng cao có thể đạt tốc độ mẫu 300Ms/s, tương đương một triệu mẫu mỗi giây Tiền tố SI được áp dụng trong đơn vị này.
Tốc độ lấy mẫu phụ thuộc vào loại bộ chuyển đổi và mức độ chính xác yêu cầu Đối với những ứng dụng cần độ chính xác cao, ADC thường dành nhiều thời gian hơn để xử lý tín hiệu đầu vào, trong khi nếu độ chính xác không quá quan trọng, quá trình lấy mẫu có thể diễn ra nhanh chóng.
Nguyên tắc chung là tốc độ và độ chính xác tỷ lệ nghịch với nhau, điều quan trọng là phải chọn ADC tùy thuộc vào ứng dụng.
Giao tiếp One Wire
OneWire là hệ thống bus giao tiếp do Dallas Semiconductor Corp phát triển, cho phép truyền nhận dữ liệu qua chỉ một dây duy nhất.
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
Giống như các chuẩn giao tiếp khác, 1-Wire cho phép truyền dữ liệu với nhiều Slave trên cùng một đường truyền, nhưng chỉ cho phép một Master, tương tự như giao thức SPI.
One Wire hoạt động như thế nào ?
So với các chuẩn giao tiếp cơ bản như UART, SPI, I2C, OneWire có cách hoạt động đặc biệt hơn Như hình minh họa cho thấy, đường dây trong giao thức OneWire luôn được duy trì ở 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) như hình vẽ dưới
Có 4 thao tác cơ bản như sau:
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)
Thiết bị Master gửi bit 0 bằng cách kéo bus xuống mức 0 trong thời gian C (às) và trở về mức 1 trong thời gian D (às) Để đọc bit, thiết bị Master kéo bus xuống mức 1 trong khoảng thời gian A (às).
Trong quá trình lấy mẫu, thiết bị master sẽ xác định giá trị bit dựa trên trạng thái của bus Nếu bus ở mức 1, thiết bị master sẽ đọc bit 1; ngược lại, nếu bus ở mức 0, thiết bị master sẽ đọc bit 0.
Reset: Thiết bị Master sẽ kộo bus trong khoảng thời gian H (às) và sau đó trở về mức 1 Khoảng thời gian này được gọi là tín hiệu reset Trong khoảng thời gian I (às) tiếp theo, thiết bị Master thực hiện việc lấy mẫu Nếu thiết bị Slave kết nối với bus gửi tín hiệu về.
Khi bus ở mức 0, master nhận biết rằng thiết bị slave vẫn đang hoạt động và quá trình trao đổi dữ liệu tiếp tục diễn ra Ngược lại, nếu slave gửi tín hiệu 1 (bus ở mức 1), master sẽ hiểu rằng không có thiết bị slave nào hiện diện và sẽ dừng quá trình truyền dữ liệu.
Giao tiếp UART
UART, hay bộ thu-phát không đồng bộ đa năng, là một trong những phương thức giao tiếp kỹ thuật số đơn giản và lâu đời giữa các thiết bị Nó có thể được tìm thấy trong các mạch tích hợp (IC) hoặc dưới dạng các linh kiện riêng lẻ Giao tiếp UART diễn ra giữa hai nút riêng biệt thông qua một cặp dây dẫn và một nối đất chung.
Chân Tx của một chip kết nối trực tiếp với chân Rx của chip khác và ngược lại Quá trình truyền thường diễn ra ở mức điện áp 3.3V hoặc 5V UART là giao thức một master, một slave, cho phép một thiết bị giao tiếp với duy nhất một thiết bị khác.
Dữ liệu truyền đến và đi từ UART song song với thiết bị điều khiển (ví dụ: CPU)
Khi gửi trên chân Tx, UART đầu tiên sẽ dịch thông tin song song này thành nối tiếp và truyền đến thiết bị nhận
UART thứ hai nhận dữ liệu qua chân Rx và chuyển đổi nó thành dạng song song để giao tiếp với thiết bị điều khiển.
UART truyền dữ liệu nối tiếp, theo một trong ba chế độ:
- Full duplex: Giao tiếp đồng thời đến và đi từ mỗi master và slave
- Simplex: Chỉ giao tiếp một chiều
Dữ liệu truyền qua UART được tổ chức thành các gói Mỗi gói chứa 1 bit bắt đầu,
5 đến 9 bit dữ liệu (tùy thuộc vào UART), một bit chẵn lẻ tùy chọn và 1 hoặc 2 bit dừng
Đường truyền dữ liệu UART thường duy trì mức điện áp cao khi không có dữ liệu được truyền Để bắt đầu quá trình truyền, UART sẽ kéo đường truyền từ mức cao xuống mức thấp trong một chu kỳ clock Khi UART nhận diện sự chuyển đổi từ điện áp cao sang thấp, nó sẽ bắt đầu đọc các bit trong khung dữ liệu với tần số tương ứng của tốc độ truyền.
Khung dữ liệu chứa thông tin thực tế được truyền, với độ dài từ 5 đến 8 bit khi sử dụng bit chẵn lẻ, hoặc 9 bit nếu không sử dụng Thông thường, dữ liệu được gửi theo thứ tự từ bit ít quan trọng nhất đến bit quan trọng nhất.
Bit chẵn lẻ là một phương pháp mà UART sử dụng để xác định sự thay đổi dữ liệu trong quá trình truyền Các bit có thể bị ảnh hưởng bởi bức xạ điện từ, tốc độ truyền không đồng nhất hoặc khoảng cách truyền xa Khi nhận khung dữ liệu, UART đếm số bit có giá trị 1 và xác định xem tổng số đó là chẵn hay lẻ Nếu bit chẵn lẻ là 0, tổng số bit 1 phải là chẵn; nếu bit chẵn lẻ là 1, tổng số bit 1 sẽ là lẻ Khi bit chẵn lẻ phù hợp với dữ liệu, UART xác nhận rằng không có lỗi trong quá trình truyền Ngược lại, nếu bit chẵn lẻ là 0 và tổng là lẻ, hoặc bit chẵn lẻ là 1 và tổng là chẵn, UART sẽ nhận ra rằng dữ liệu trong khung đã bị thay đổi.
Bit dừng là tín hiệu báo hiệu kết thúc gói dữ liệu, trong đó UART điều khiển đường truyền dữ liệu bằng cách chuyển đổi từ điện áp thấp sang điện áp cao trong thời gian tối thiểu khoảng 2 bit.
Quá trình truyền dữ liệu diễn ra qua các gói dữ liệu, bắt đầu với một bit khởi đầu và đường tín hiệu được kéo xuống mức thấp Tiếp theo, từ năm đến chín bit dữ liệu được truyền trong khung của gói, sau đó là bit chẵn lẻ tùy chọn để xác minh tính chính xác của việc truyền Cuối cùng, một hoặc nhiều bit dừng được gửi khi đường tín hiệu trở lại mức cao, đánh dấu sự kết thúc của một gói dữ liệu.
UART là giao thức không đồng bộ, không sử dụng đường clock để điều chỉnh tốc độ truyền dữ liệu, vì vậy người dùng cần thiết lập cùng một tốc độ cho cả hai thiết bị Tốc độ này, được gọi là tốc độ truyền, được đo bằng bit trên giây (bps) và có thể dao động từ 9600 baud đến 115200 hoặc cao hơn Tuy nhiên, tốc độ truyền giữa thiết bị gửi và nhận chỉ có thể chênh lệch khoảng 10% trước khi thời gian của các bit trở nên không đồng bộ.
Mặc dù UART là một giao thức cũ chỉ cho phép giao tiếp giữa một master và một slave duy nhất, nhưng nó dễ dàng thiết lập và rất linh hoạt, khiến nó trở thành lựa chọn phổ biến trong các dự án vi điều khiển Bạn có thể không nhận ra rằng UART có thể là một phần của hệ thống mà bạn sử dụng hàng ngày Bài viết này sẽ phân tích những ưu và nhược điểm của giao thức UART.
Không có giao thức truyền thông nào hoàn hảo, nhưng UART vẫn thực hiện tốt nhiệm vụ của mình Dưới đây là những ưu điểm và nhược điểm của UART để bạn có thể xác định xem nó có đáp ứng được nhu cầu của mình hay không.
Chỉ sử dụng hai dây
Không cần tín hiệu clock
Có một bit chẵn lẻ để cho phép kiểm tra lỗi
Cấu trúc của gói dữ liệu có thể được thay đổi miễn là cả hai bên đều được thiết lập cho nó
Kích thước của khung dữ liệu được giới hạn tối đa là 9 bit
Không hỗ trợ nhiều hệ thống slave hoặc nhiều hệ thống master
Tốc độ truyền của mỗi UART phải nằm trong khoảng 10% của nhau
Giao tiếp MQTT
MQTT (Message Queueing Telemetry Transport) là một giao thức mạng nhẹ, được thiết kế để truyền thông điệp theo mô hình publish/subscribe Giao thức này sử dụng băng thông thấp, đảm bảo độ tin cậy cao và có khả năng hoạt động hiệu quả ngay cả trong điều kiện đường truyền không ổn định.
Kiến trúc giao thức MQTT
Kiến trúc mức cao nhất của MQTT gồm 2 thành phần chính là Broker và Clients
Broker được coi là trung tâm, là điểm giao, là trục chính giao với tất cả các
Broker có nhiệm vụ chính là nhận và quản lý các giao tiếp từ thiết bị xuất bản, sắp xếp chúng theo hàng đợi và chuyển tới địa chỉ cụ thể Ngoài ra, broker còn có thể thực hiện một số tính năng phụ như bảo mật giao tiếp, lưu trữ và ghi lại lịch sử giao tiếp, giúp tối ưu hóa quá trình truyền thông.
Client được chia thành hai nhóm: xuất bản giao tiếp và theo dõi Được thiết kế cho thiết bị di động, Client hoạt động linh hoạt và nhẹ nhàng Chúng thực hiện hai chức năng chính: xuất bản thông điệp lên kênh cụ thể hoặc theo dõi kênh để nhận thông điệp MQTT Clients tương thích với nhiều nền tảng hệ điều hành, bao gồm MAC OS, Windows, Linux, Android và iOS.
Kết nối trong MQTT có vai trò thông báo về việc thiết lập kết nối với máy chủ, đồng thời tạo ra liên kết giữa các nút trong mạng từ thiết bị đến máy chủ.
Trong hệ thống sử dụng giao thức MQTT, nhiều node trạm (client) kết nối tới một máy chủ MQTT (Broker) Mỗi client sẽ đăng ký một số kênh (topic) để gửi và nhận dữ liệu.
Quá trình đăng ký dữ liệu trên các kênh như “/client1/channel1” và “/client1/channel2” được gọi là “subscribe”, tương tự như việc đăng ký nhận tin trên kênh Youtube Mỗi client sẽ nhận dữ liệu từ bất kỳ trạm nào gửi thông tin đến kênh mà họ đã đăng ký Khi một client gửi dữ liệu tới kênh, quá trình này được gọi là xuất bản.
MQTT Broker là phần mềm máy tính cho phép kết nối giữa các MQTT client và thiết bị trong mạng, có thể được xây dựng bởi người vận hành hoặc bên thứ ba Nó hoạt động như một trạm bưu điện, nhận và chuyển nội dung thông qua các kênh (topic) mà không sử dụng địa chỉ của client nhận Các client cần đăng ký kênh để nhận nội dung, và có thể cùng lúc đăng ký nhiều kênh hoặc sản xuất nội dung Broker có thể triển khai vật lý hoặc trên đám mây, với ưu điểm là dễ dàng hỗ trợ khi gặp sự cố Nó quản lý và theo dõi mọi phiên làm việc của nội dung, kênh và client trong hệ thống.
Có thể tóm lại một số ưu điểm của Broker hay cũng là ưu điểm khi sử dụng giao thức MQTT là:
+ Quản lý, loại bỏ các kết nối client mà có dấu hiệu nguy hiểm, dễ bị tấn công hoặc không an toàn
Quản lý quy mô tổng thể của mạng trở nên dễ dàng, cho phép mở rộng hoặc thu nhỏ linh hoạt dựa trên số lượng thiết bị, số lượng client, số kênh và số Broker.
Quản lý trạng thái và thông tin của client trong mạng trở nên dễ dàng hơn bao giờ hết, bao gồm các yếu tố như chứng chỉ mạng, tình trạng bảo mật, xác thực bảo mật, và kết nối hoặc trạng thái nghỉ.
+ Giảm thiểu tình trạng quá tải của hệ thống trong mạng, giảm thiểu nguy cơ tấn công quá tải truy cập
Giao tiếp trong MQTT chủ yếu sử dụng định dạng plain-text, cho phép người đọc dễ dàng tiếp cận thông điệp Tuy nhiên, người dùng có khả năng cấu hình để sử dụng các định dạng khác nhau Trong giao tiếp của MQTT, có ba loại tin nhắn chính cần lưu ý.
Thông điệp ngắt kết nối (Disconnect) thông báo về việc chờ phiên làm việc TCP/IP giữa máy chủ Broken và các nút mạng cũng như thiết bị trong mạng.
Thông điệp này có nhiệm vụ thông báo đẩy gói tin vào luồng làm việc của ứng dụng, đồng thời chuyển yêu cầu đến MQTT client ngay sau khi thông báo được phát đi.
Kênh được xem như một "đường truyền" logic kết nối giữa hai điểm là xuất bản và theo dõi Khi một giao tiếp được xuất bản lên kênh, tất cả các theo dõi của chủ đề đó sẽ nhận được thông điệp này Giao thức MQTT hỗ trợ việc khai báo các chủ đề theo kiểu phân cấp.
Giao tiếp API
API, hay Giao diện Lập trình Ứng dụng, là các phương thức và giao thức kết nối với thư viện và ứng dụng khác Nó cho phép truy cập vào một tập hợp các hàm thường dùng, từ đó hỗ trợ việc trao đổi dữ liệu giữa các ứng dụng một cách hiệu quả.
Web API hoạt động bằng cách xây dựng một URL API, cho phép bên thứ ba gửi yêu cầu dữ liệu đến máy chủ cung cấp nội dung và dịch vụ thông qua giao thức HTTP hoặc HTTPS.
Trên máy chủ web cung cấp nội dung, các ứng dụng nguồn sẽ thực hiện xác thực nếu cần thiết và truy cập vào tài nguyên phù hợp để tạo ra nội dung trả về kết quả.
Server trả về kết quả theo định dạng JSON hoặc XML thông qua giao thức
Tại nơi yêu cầu ban đầu là ứng dụng web hoặc ứng dụng di động , dữ liệu
JSON/XML sẽ được phân tích để trích xuất dữ liệu Sau khi có dữ liệu, các hoạt động tiếp theo bao gồm lưu trữ vào cơ sở dữ liệu và hiển thị thông tin.
HOẠT ĐỘNG CỦA HỆ THỐNG
Phương thức hoạt động
Các cảm biến thu thập dữ liệu về độ ẩm, nhiệt độ, ánh sáng và độ ẩm đất từ môi trường, sau đó truyền cho vi điều khiển Vi điều khiển gửi dữ liệu này đến ESP8266 qua giao thức UART ESP8266 tiếp nhận các thông số và truyền lên máy chủ web Máy chủ lưu trữ dữ liệu vào cơ sở dữ liệu và đồng thời hiển thị trên web.
• Cảm biến DHT11 giao tiếp với STM32 bằng giao tiếp One Wire
• Cảm biến ánh sáng, độ ẩm đất sử dụng chuyển đổi ADC gửi thông số về cho STM32
• STM32 gửi dữ liệu qua ESP8266 bằng UART
• STM32 điều khiển các thiết bị bằng chân I/O
• ESP8266 gửi dữ liệu lên Web sever bằng giao thức MQTT qua Wifi
• Web sever lưu dữ liệu vào MySQL và gửi lên Web bằng API
Lưu đồ thuật toán
• Đầu tiên khi hoạt động chương trình sẽ khởi tạo GPIO, Uart, ADC
• Khởi tạo các Task, vì hoạt động trên hệ điều hành FreeRtos (HĐH thời gian thực) nên chương trình sẽ được chạy theo các tác vụ (Task)
• Khởi tạo Queue, các Task sẽ được đưa vào hàng đợi (Queue) để vi điều khiển xử lý
• Task chuyển đổi ADC, giao tiếp DHT11, Uart trên STM32 sau đó gửi dữ liệu vào hàng đợi
• Chương trình chính nhận dữ liệu từ Queue và xử lý, gửi dữ liệu qua cho esp8266
• ESP8266 gửi dữ liệu lên web sever bằng MQTT
• Web sever lưu dữ liệu vào Database và gửi dữ liệu hiwwnr thị lên Web
• Tạo các điều kiện để điều khiển các thiết bị từ Web sever
➢ Độ ẩm đất < 50% => bật bơm > 50% => tắt
➢ Ánh sáng < 50% => bật đèn > 50% => tắt