Microsoft Word N02 05 BÃ thçy sinh thông minh 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 BÀI TẬP LỚN HỌC PHẦN ĐỒ ÁN THIẾT KẾ HỆ THỐNG NHÚNG Đề tài Bể thủy sinh thông minh Giảng viên hướng dẫn Nguyễn Ngọc Minh Sinh viên thực hiện Nguyễn Quang Khánh MSV B18DCDT112 Lê Đăng Khoa MSV B18DCDT116 Lê Văn Nam MSV B18DCDT164 Nhóm bài tập 05 HÀ NỘI – 2022 Đồ án thiết kế hệ thống nhúng GVHD Nguyễn Ngọc Minh 2 Nhóm 5 BỘ THÔNG TIN VÀ TRUYỀN THÔNG HỌC VIỆN CÔNG NGHỆ BƯU CH.
TÌM HIỂU VÀ PHÂN TÍCH DỰ ÁN
Đặt vấn đề
Hiện nay, bể cá cảnh và bể thủy sinh ngày càng trở nên phổ biến, không chỉ là vật trang trí cho không gian sống mà còn mang lại phong thủy tốt và giúp người chơi thư giãn sau những giờ làm việc căng thẳng Tuy nhiên, việc chăm sóc bể thủy sinh không hề đơn giản do nhiều yếu tố khác nhau.
Bể thủy sinh yêu cầu một hệ thống chăm sóc đặc biệt và chính xác để duy trì sự cân bằng trong hệ sinh thái Thực vật và động vật trong bể cần đủ ánh sáng trong thời gian hợp lý mỗi ngày Tuy nhiên, việc bật đèn quá lâu có thể dẫn đến sự phát triển của rêu hại và tảo nâu, làm giảm tính thẩm mỹ của bể.
Động và thực vật cần nhiệt độ phù hợp để phát triển, vì nhiệt độ quá cao hoặc quá thấp có thể ảnh hưởng tiêu cực đến sự phát triển của hệ sinh thái trong bể.
Động vật trong bể thủy sinh cần ăn một lượng thức ăn hợp lý và khoảng thời gian hợp lý trong ngày
Do đó, chúng em lên ý tưởng xây dựng một hệ thống tích hợp các chức năng để giải quyết các vấn đề trên b Các chức năng của hệ thống
Hệ thống điều khiển bể cá thông minh được nhóm em xây dựng gồm có các chức năng sau:
Đo nhiệt độ của nước, hiển thị nhiệt độ lên LCD
Khi nhiệt độ quá thấp, hệ thống sẽ bật sưởi để bảo vệ động vật trong bể;
Khi nhiệt độ quá cao, hệ thống bật quạt để làm mát cho bể;
Sử dụng RTC để tạo đồng hồ, hiển thị thời gian lên LCD;
Hẹn giờ bật tắt đèn theo thời gian cố định;
Lấy thời gian trên internet để cập nhật tự động cho hệ thống;
Tự động cho thả cám cho cá ăn theo thời gian đặt trước.
Nền tảng kỹ thuật
- Dựa trên nguyên lý hoạt động của một hệ thống tự động trong bể thủy sinh ta cần giải quyết các vấn đề sau:
Hiển thị thời gian thực và sử dụng thời gian thực đó để điều khiển
Sử dụng hệ điều hành thời gian thực để các tác vụ được hoạt động độc lập
Xác định thời gian bật tắt đèn cụ thể trong ngày để thực vật và động vật phát triển và màu sắc đẹp nhất (dựa vào thời gian thực)
Cho động vật trong bể ăn một lượng cụ thể và vào thời gian cụ thể (dựa vào thời gian thực và động cơ servo)
Luôn giữ nhiệt độ bể trong khoảng hợp lý tránh bị lạnh (dựa trên cảm biến nhiệt độ)
Khó khăn lớn nhất trong dự án là việc thiết lập giao tiếp hiệu quả giữa hai vi điều khiển STM32 và ESP8266 Bằng cách kết nối hai vi điều khiển này, chúng ta có thể khắc phục những điểm yếu của từng loại, tối ưu hóa hiệu suất và chức năng của hệ thống.
ĐẶC ĐIỂM CỦA CÁC KHỐI TRONG HỆ THỐNG
Khối điều khiển
- STM32F103C8T6 là vi điều khiển 32bit, thuộc họ F1 của dòng chip STM32 hãng ST
- Tốc độ tối đa 72Mhz
- Clock, reset và quản lý nguồn
Điện áp hoạt động từ 2.0 → 3.6V
Sử dụng thạch anh ngoài từ 4Mhz → 20Mhz
Thạch anh nội dùng dao động RC ở mode 8Mhz hoặc 40Khz
Hình 1: Sơ đồ khối hệ thống
M3 Điều khiển sưởi Động cơ servo
KHỐI HIỂN THỊ LCD 16x2 Điều khiển đèn
- Chế độ điện áp thấp:
Có các mode: ngủ, ngừng hoạt động hoặc hoạt động ở chế độ chờ
Cấp nguồn ở chân Vbat bằng pin ngoài để dùng bộ RTC và sử dụng dữ liệu được lưu trữ khi mất nguồn cấp chính
- 2 bộ ADC 12 bit với 9 kênh cho mỗi bộ
Khoảng giá trị chuyển đổi từ 0 – 3.6 V
Có chế độ lấy mẫu 1 kênh hoặc nhiều kênh
Có hỗ trợ DMA cho ADC, UART, I2C, SPI
3 Timer 16 bit hỗ trợ các mode Input Capture/ Output Compare/ PWM
1 Timer 16 bit hỗ trợ để điều khiển động cơ với các mode bảo vệ ngắt Input, dead-time
2 Watchdog Timer để bảo vệ và kiểm tra lỗi
1 Systick Timer 24 bit đếm xuống cho hàm Delay,…
- Có hỗ trợ 9 kênh giao tiếp:
- Kiểm tra lỗi CRC và 96-bit ID
- Các thông số kĩ thuật:
Đ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ạch 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, USB,
Tích hợp Led trạng thái nguồn, Led PC13, Nút Reset
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 dễ dàng Với khả năng tích hợp Wi-Fi 2.4GHz, nó trở thành một công cụ lý tưởng cho việc lập trình và phát triển các ứng dụng IoT.
Hình 3: Kit ESP8266 Thông số kỹ thuật
Hình 4: Sơ đồ chân kit ESP8266
- 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, trừ chân D0)
- 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,…
RTC (Real Time Clock)
RTC hay Real Time Clock là một thiết bị ngoại vi hoạt động như một bộ đồng hồ và lịch thời gian thực Khái niệm "thời gian thực" đề cập đến thời gian trong cuộc sống hàng ngày của con người, khác với thời gian được tính toán bởi các bộ đếm thời gian khác.
- Ưu nhược điểm của RTC on chip so với các IC RTC khác như DS3231, DS1307
Tiết kiệm chi phí linh kiện, góp phần giảm giá thành sản phẩm
Có thể sử dụng thanh ghi Backup 16bit như 1 Eprom điều mà STM32 thiếu
Sai số từ bộ dao động lớn (1%), khi chạy lâu dài sẽ dẫn tới sai thời gian
- Các thông số chính của STM32 RTC
Có ba nguồn cấu hình Clock đầu vào: HSE, sử dụng thạch anh ngoài với tốc độ cao 62.5 kHz, được chia từ 8 MHz thành 62.5 kHz; LSI RC, sử dụng bộ dao động RC nội với tốc độ 40 kHz; và LSE, sử dụng thạch anh ngoài với tốc độ thấp 32.768 kHz.
Bộ chia clock lên đến 20 bit, giúp bộ RTC hoạt động chính xác
Độ phân giải của timer RTC lên đến 32 bit – tức là 2^32 giây mới tràn và cần reset lại
3 nguồn clock source có thể được sử dụng
2 loại Reset RTC riêng biệt
Có các ngắt hỗ trợ là : ngắt Alarm, ngắt mỗi giây, ngắt tràn bộ đếm
Hình 5: Giản đồ khổi RTC
- Hãy cùng phân tích giản đồ này để hiểu quá trình hoạt động của RTC trước khi chúng ta đi qua một số thanh ghi quan trọng trong RTC
- Bộ RTC ở đây sẽ gồm 2 phần chính:
APB1 Interface là thành phần quan trọng để giao tiếp với bus APB1, cho phép Core thực hiện việc đọc và ghi dữ liệu vào các thanh ghi của bộ RTC Trong quá trình truyền tải dữ liệu, APB1 Interface sẽ sử dụng đồng hồ bus APB1 để đảm bảo hiệu suất giao tiếp.
- Tiếp theo, các khối RTC được chia làm 2 phần chính:
Khối đầu tiên của RTC prescaler hoạt động bằng cách chia tần số sau khi nhận tín hiệu clock Qua bộ RTC_DIV, chúng ta có khả năng lập trình để tạo ra tần số tối đa lên đến 1Hz, tương đương với 1 giây.
The TR_CLK signal is supplied to a 32-bit programmable counter, where the value in RTC_CNT corresponds to the frequency of the incoming TR_CLK This RTC_CNT value is then compared to a preset value in RTC_ALR to generate an interrupt that wakes the system from Standby mode, which is designed for energy savings.
- Một số thanh ghi quan trọng :
RTC_CR – RTC control register
- Thanh ghi này bao gồm 2 thanh ghi high và low với các bit như sau:
OWIE: cờ báo ngắt tràn khi bộ đếm vượt qua giá trị 2^32
ALRIE: cờ báo ngắt Alarm – giống như báo thời gian báo thức trong đồng hồ hẹn giờ
SECIE : cờ báo ngắt 1s xảy ra
RTOFF: cờ báo bộ RTC có đang chạy hay không
CNF: Cờ báo có đang trong quá trình cấu hình hay đã cấu hình xong
RSF: cờ báo các thanh ghi đã được đồng bộ, thống nhất với nhau hay chưa
OWF : cờ báo tràn khi bộ đếm vượt qua giá trị 2^32
ALRF: cờ báo Alarm – giống như báo thời gian báo thức trong đồng hồ hẹn giờ
SECF: cờ báo mỗi 1s xảy ra
RTC_DIV – RTC prescaler divider register
RTC_CNT – RTC counter register
Thanh ghi này 32bit chứa giá trị bộ đếm của couter Muốn biết thời gian cần đọc giá trị từ thanh ghi này về.
Động cơ Servo
Tên loại động cơ sử dụng: SG90;
Hình 6: Cấu tạo động cơ servo
Cấu tạo: bao gồm 4 thành phần chính
Chiết áp được kết nối với bánh răng đầu ra nhằm thu nhận tín hiệu phản hồi Mạch điều khiển sử dụng tín hiệu này để điều chỉnh góc quay của động cơ, đảm bảo phù hợp với tín hiệu điều khiển từ vi xử lý.
Động cơ servo hoạt động dựa trên kỹ thuật điều khiển bằng xung PWM (Pulse Width Modulation) Sử dụng xung có tần số 50Hz, góc quay của servo sẽ thay đổi tùy thuộc vào chiều rộng của xung High Hình ảnh minh họa dưới đây cho thấy mối quan hệ giữa góc quay và tín hiệu PWM.
Hình 7: Cách điều khiển động cơ Servo bằng PWM
Khối hiển thị I2C
LCD 16x2 và giao tiếp với vi điều khiển :
- VEE của LCD được nối với biến trở và nguồn 5V để diều chỉnh độ sáng của LCD
- Hiển thị time 1 ngày của RTC lên LCD
+ 3 chân điều khiển (RS,RW,E )
+ Chân điều khiển độ sáng tối của LCD chân VEE ta sử dụng 1 biến trở để điều chỉnh thích hợp
Hình 8: Sơ đồ chân LCD 16x2
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
Module I2C LCD ra đời và giải quyết vấn để này
Sử dụng module I2C để kết nối với LCD 16×2 giúp tiết kiệm chân vi điều khiển, chỉ cần 2 chân (SCL, SDA) thay vì 6 chân như thông thường (RS, EN, D7, D6, D5 và D4) Module này hỗ trợ các loại LCD sử dụng driver HD44780, như LCD 16×2 và LCD 20×4, và tương thích với hầu hết các vi điều khiển hiện nay, mang lại sự tiện lợi và hiệu quả cho người dùng.
Tiết kiệm chân cho vi điều khiển
Dễ dàng kết nối với LCD
Điện áp hoạt động: 2.5-6V DC
Hỗ trợ màn hình: LCD1602,1604,2004 (driver HD44780)
Địa chỉ mặc định: 0X27 (có thể điều chỉnh bằng ngắn mạch chân A0/A1/A2)
Tích hợp Jump chốt để cung cấp đèn cho LCD hoặc ngắt
Tích hợp biến trở xoay điều chỉnh độ tương phản cho LCD
Các lỗi thường gặp khi sử dụng I2C LCD
Hiển thị một dãy ô vuông
Màn hình chỉ in ra một ký tự đầu
Các lỗi này chủ yếu là do sai địa chỉ bus, để fix lỗi chỉ cần thay địa chỉ mặc định là “0x27” thành “0x3F
Trong trường hợp vẫn không được các bạn fix lỗi bằng cách nạp code tìm địa chỉ bus của I2C
Sau khi tìm xong các bạn thay địa chỉ vừa tìm được vào vị trí “0x27” là xong.
Cảm biến nhiệt độ DS18P20
DS18B20 là cảm biến nhiệt độ bán dẫn với thiết kế nhỏ gọn và 3 chân, sử dụng giao tiếp 1 dây Nó có độ phân giải lên tới 12 bit và tiêu thụ dòng điện rất thấp, hoạt động trong dải điện áp rộng từ 3 đến 5.5V Cảm biến này cho phép kết nối nhiều thiết bị trên cùng một đường truyền, rất phù hợp cho việc đo đạc và thu thập nhiệt độ chính xác từ nhiều điểm khác nhau.
Hình 9: Cảm biến DS18B20 Cảm biến nhiệt độ DS18B20 có những tính năng như sau:
- Theo chuẩn giao tiếp 1-wire, Kết nối nhiều cảm biến DS18B20 trên 1 đường truyền
- Dãi nhiệt độ đo lường: -55°C to +125°C (-67°F to +257°F)
- Độ chính xác: ±0.5°C trong khoảng đo -10°C to +85°C
- Độ phân giải 9 đến 12 bit có thể chương trình
- Mỗi thiết bị có mã định danh duy nhất 64 bit
- Có thể dùng nguồn ký sinh (không cần cung cấp nguồn cho chip, chip lấy nguồn từ tín hiệu)
Hình 10: Một số cách đóng gói cảm biến DS18B20
Mỗi DS18B20 đều có mã định danh với độ lớn 64 bit duy nhất được lưu trong ROM
- 8 bit thấp nhất của ROM chứa đựng mã quy ước của họ dòng đo nhiệt độ 1 dây DS18B20 với mã là :28h
- 48 bit tiếp theo là số serial duy nhất của thiết bị
- 8 bit cuối cùng mà mã kiểm tra CRC tính toán từ 56 bit trước
Bộ nhớ của DS18B20 bao gồm SRAM scratchpad, các thanh ghi TH và TL để lưu trữ cảnh báo cao và thấp, cùng với thanh ghi cấu hình, tất cả đều có bộ nhớ EEPROM Nếu không sử dụng chức năng cảnh báo, thanh ghi TH và TL có thể hoạt động như bộ nhớ đa mục đích Byte 0 và Byte 1 chứa LSB và MSB của nhiệt độ và chỉ có thể đọc, trong khi Byte 2 và 3 truy cập thanh ghi TH và TL, và Byte 4 chứa dữ liệu cấu hình Byte 5, 6 và 7 dành riêng cho thiết bị và không thể ghi, còn Byte 8 lưu mã CRC của các byte trước đó Dữ liệu trong thanh ghi EEPROM không bị mất khi ngắt nguồn và sẽ được nạp lại vào bộ nhớ nháp khi có nguồn cấp lại, có thể thực hiện bằng lệnh E2 [B8h].
Thanh ghi cấu hình của DS18B20 được lưu trữ ở byte thứ 4 của bộ nhớ nháp, cho phép người dùng thiết lập độ phân giải thông qua các bit R0 và R1 Mặc định, khi cấp nguồn, R0 và R1 đều có giá trị 1, tương ứng với độ phân giải 12 bit Các bit 7 và bit 0 đến bit 4 trong thanh ghi cấu hình được dành riêng cho thiết bị và không thể ghi đè.
Bảng cấu hình độ phân giải và thời gian chuyển đổi tương ứng
(Bit) Thời gian chuyển đổi tối đa
NGUYÊN LÝ HOẠT ĐỘNG GIỮA CÁC KHỐI TRONG DỰ ÁN
Thời gian thực (giao tiếp giữa 2 vi điều khiển STM32 và ESP8266)
- Config được thời gian thực trong STM32
- Lấy thời gian thực lấy trực tiếp từ ESP8266 có kết nối Internet sau đó truyền qua STM32 và nạp vào RTC
Để đảm bảo truyền thời gian ổn định giữa ESP8266 và STM32, chúng ta sử dụng nút nhấn để kích hoạt quá trình truyền Việc lấy thời gian liên tục từ ESP8266 có thể gặp lỗi, do đó, bộ RTC trong STM32 sẽ được sử dụng để cải thiện độ tin cậy Giao tiếp giữa STM32 và ESP8266 sẽ diễn ra hiệu quả hơn nhờ vào giải pháp này.
- Sử dụng UART để giao tiếp giữa 2 vi điều khiển
- Làm việc với ESP8266 theo các bước :
Thực hiện kết nối mạng cho ESP8266
Viết chương trình lấy thời gian thực cho ESP8266
Khai báo các chân UART để giao tiếp với STM32
- Làm việc với STM32 theo các bước :
Khai báo các chân nhận tín hiệu từ ESP8266
Viết chương trình thực hiện nhận tín hiệu từ ESP8266 c Thời gian thực của hệ thống
- Config RTC từ STM32 dựa trên Reference manual void RTC_Configuration(void){
// bat cho clock on dinh while (!(RCC->BDCR & ( 1