TỔNG QUÁT VỀ HỆ THỐNG VƯỜN RAU THÔNG MINH
Tổng quát về hệ thống vườn rau thông minh
1.1.1 Giới thiệu về hệ thống tưới rau thông minh
Trong cuộc sống bận rộn hiện nay, nhiều người vẫn tìm niềm vui từ việc trồng rau ở những không gian trống như sân thượng hay ban công Tuy nhiên, việc tưới nước cho vườn rau thường gặp khó khăn do lịch trình dày đặc và tốn nhiều thời gian Hệ thống vườn rau thông minh giúp tự động hóa quá trình tưới nước, giảm bớt lo lắng về việc chăm sóc cây trồng Áp dụng công nghệ không chỉ tiết kiệm thời gian mà còn đảm bảo nguồn thực phẩm sạch, cho phép chúng ta yên tâm khi đi vắng mà không cần lo lắng về việc cây sẽ chết khô vì thiếu nước.
1.1.2 Một số hệ thống tưới rau và chọn hệ thống tối ưu
- Hệ thống tưới nước nhỏ giọt:
Hình 1.1: Hệ thống tưới nước nhỏ giọt
Hệ thống tưới nước nhỏ giọt là phương pháp tưới hiệu quả, cung cấp nước trực tiếp vào đất dưới dạng giọt nhỏ từ thiết bị tạo giọt gần gốc cây Kỹ thuật này giúp cây trồng hấp thụ nước tối đa, đồng thời giảm thiểu tình trạng nước bị văng ra ngoài, từ đó tiết kiệm nước cho gia đình một cách tối ưu.
- Ưu điểm của hệ thống
Tiết kiệm được tối đa lượng nước cho gia đình bạn
Hạn chế được bay hơi, thất thoát nước
Lượng nước được phân bố đồng đều ở các vị trí gốc cây
- Nhược điểm của hệ thống
Chỉ tưới được ở phần gốc cây
Không kiểm soát được độ ẩm của đất
Dễ bị tắt nghẽn đầu phun nếu không lắp thiết bị lọc
Hệ thống này chỉ phù hợp cho những cây có khả năng chịu được hạn hán cao vì lượng nước đầu ra tương đối ít
- Hệ thống tưới phun mưa:
Hình 1.2: Hệ thống tưới phun mưa
Hệ thống tưới phun mưa là một kỹ thuật hiệu quả để cung cấp nước cho cây trồng thông qua việc phun nước giống như mưa tự nhiên Kỹ thuật này sử dụng máy bơm nước có cột áp cao, kết hợp với ống dẫn và mũi phun, giúp tưới cây, cỏ, và các mô hình nhà kính một cách đồng đều và tiết kiệm nước.
- Ưu điểm của hệ thống
Lượng nước tưới đều, không bỏ sót khu vực nào
Có thể điều chỉnh được lưu lượng nước tưới ở từng khu vực và từng gốc cây
Ứng dụng tưới cho nhiều loại cây khác nhau
- Nhược điểm của hệ thống
Lưu lượng nước sử dụng lớn
Chi phí lắp đặt cao
Phù hợp cho mọi loại địa hình
Gây lãng phí nước khi cây đã đạt được độ ẩm nhất định
- Hệ thống tưới phun sương:
Hình 1.3: Hệ thống tưới phun sương
Hệ thống tưới phun sương là giải pháp làm mát hiệu quả, mang lại không khí thoáng đãng và dễ chịu Ngoài ra, hệ thống này còn giúp người dùng tiết kiệm tối đa chi phí điện nước.
- Ưu điểm của hệ thống
Phù hợp cho các giống hoa, rau trồng
Tốn ít lượng nước cần thiết
- Nhược điểm của hệ thống
Nước dễ bị bay hơi
Rễ cây hấp thụ được ít nước
Chỉ phù hợp với một số hệ thống nhà kính trồng rau
1.1.3 Mục tiêu của đề tài
- Có thể giám sát được độ ẩm và nhiệt độ của hệ thống
- Sử dụng cảm biến độ ẩm đất để biết được cây trồng có thiếu nước hay không
Từ đó, tưới nước cho cây cho hợp lý và tránh tình trạng gây lãng phí nước
- Ứng dụng, sử dụng được thiết bị di động để kiểm tra được độ ẩm, nhiệt độ và gửi về điện thoại thông minh
1.1.4 So sánh và lựa chọn hệ thống
Sau khi khảo sát các hệ thống tưới rau, nhóm chúng em quyết định chọn hệ thống tưới rau phun mưa vì những ưu điểm vượt trội của nó Hệ thống tưới phun sương có nhược điểm là lượng nước ở đầu phun ít và dễ bị bay hơi, chỉ phù hợp cho một số loại hoa hoặc rau trong nhà kính Trong khi đó, hệ thống tưới nhỏ giọt chỉ thích hợp với cây chịu hạn, do lượng nước đầu ra thấp Hơn nữa, các hệ thống trên thường phải bật tắt bằng tay và không đo được độ ẩm của đất, dẫn đến khó khăn trong việc tưới cây và lãng phí nước Vì vậy, với vai trò là sinh viên ngành tự động hóa, chúng em đã nghiên cứu và thiết kế thêm các tính năng cho hệ thống tưới rau phun mưa, giúp nó hoạt động tự động và giảm thiểu công sức tưới nước cho vườn rau.
Trong đợt thực tập tốt nghiệp tại nhà máy và tham quan các doanh nghiệp sản xuất, chúng tôi đã chứng kiến nhiều quy trình tự động hóa trong sản xuất Bên cạnh đó, sự phổ biến ngày càng tăng của thiết bị điện thoại di động trong đời sống hiện nay cũng là một điểm đáng chú ý.
Nhu cầu cuộc sống ngày càng tăng đã dẫn đến ý tưởng phát triển mô hình vườn rau thông minh sử dụng Mô-đun Sim800L.
TỔNG QUAN VỀ ARDUINO VÀ GIỚI THIỆU PHẦN CỨNG
Tổng quan về Arduino
Arduino là nền tảng mã nguồn mở lý tưởng cho việc phát triển các dự án điện tử Nó bao gồm cả bảng mạch lập trình (vi điều khiển) và phần mềm IDE, cho phép người dùng viết và tải mã máy tính lên bo mạch dễ dàng.
Arduino đã trở thành lựa chọn phổ biến cho hàng nghìn dự án nhờ vào tính đơn giản và dễ tiếp cận Phần mềm Arduino không chỉ thân thiện với người mới bắt đầu mà còn đủ linh hoạt cho những người dùng nâng cao Khác với các bo mạch lập trình trước đây, Arduino cho phép tải mã mới chỉ bằng cáp USB mà không cần phần cứng riêng Hơn nữa, Arduino IDE sử dụng phiên bản đơn giản của C++, giúp việc học lập trình trở nên dễ dàng hơn.
Nếu bạn muốn tạo ra robot hoặc hiệu ứng LED nhấp nháy theo nhạc, nhưng gặp khó khăn do thiếu thời gian và kiến thức về điện tử, thì Arduino chính là giải pháp lý tưởng cho bạn.
Hình 2.1: Các nhà sáng lập ra Arduino
Hiện nay, có nhiều phiên bản Arduino được thiết kế phục vụ cho các mục đích khác nhau của người dùng Arduino Nano nổi bật với tính nhỏ gọn, tiện dụng và đơn giản, trong khi Arduino Mega2560 thường được sử dụng cho các dự án phức tạp cần nhiều chân I/O Ngoài ra, còn có nhiều loại khác như Arduino Uno R3 CH340, Arduino Pro Mino và Arduino Industrial.
Khi nhắc đến mạch Arduino, Arduino Uno là dòng mạch đầu tiên được nghĩ tới Hiện tại, Arduino Uno đã phát triển đến thế hệ thứ 3 (R3) Tìm hiểu về mạch này sẽ giúp bạn dễ dàng lập trình và khám phá các dòng Arduino khác.
- Các thông số của Arduino Uno R3:
Vi xử lý: Atmega328P Điện áp hoạt động : 5 Volts
Dòng tiêu thụ : khoảng 30mA
Số chân Digital I/O : 14 (với 6 chân là PWM)
Dòng tối đa trên mỗi chân I/O : 30 mA Dòng ra tối đa (5V) : 500 mA Dòng ra tối đa (3.3V) : 50 mA
Bộ nhớ flash : 32 KB với 0.5 KB dùng bở bootloader
- Sơ đồ chân của Arduino Uno R3
Hình 2.3: Sơ đồ chân của Arduino Uno R3
Arduino cung cấp nhiều các chân I/O (hay còn gọi là Pin) để ta giao tiếp hay gửi lệnh điều khiển các thiết bị (xem Hình 2.3)
Arduino Uno R3 sở hữu 14 chân digital từ 0 đến 13, cho phép đọc và xuất tín hiệu với mức điện áp điều khiển từ 0V đến 5V Mỗi chân có dòng vào/ra tối đa là 40 mA Đặc biệt, một số chân digital còn hỗ trợ chức năng PWM.
Chân PWM, được đánh dấu bằng dấu '~', cho phép xuất xung PWM với độ phân giải 8 bit, tương ứng với giá trị từ 0 đến 255, điều này có nghĩa là mức giao động điện áp của chân có thể từ 0V đến 5V Trong khi đó, các chân không phải PWM chỉ có khả năng chọn giá trị điện áp cố định từ 0V đến 5V.
Arduino Uno có 6 chân analog (A0 đến A5) cung cấp độ phân giải tín hiệu 10 bit
Arduino UNO có khả năng đọc giá trị điện áp trong khoảng từ 0V đến 5V với dải từ 0 đến 1023 Ngoài ra, nó cũng được trang bị hai chân A4 (SDA) và A5 (SCL) để hỗ trợ giao tiếp I2C/TWI với các thiết bị khác.
Chân TXD và RXD trên Arduino Uno là các chân Serial quan trọng, được sử dụng để gửi (TX) và nhận (RX) dữ liệu Những chân này không chỉ cho phép giao tiếp dữ liệu với các thiết bị khác mà còn hỗ trợ nạp code cho mạch mà không cần sử dụng cổng USB.
2.1.4 Phần mềm lập trình cho Arduino
Các mạch Arduino và các mạch dựa trên nền tảng Arduino được lập trình bằng một ngôn ngữ riêng, tương tự như ngôn ngữ C đơn giản, giúp người dùng dễ dàng tiếp cận Để lập trình, gửi lệnh và nhận tín hiệu từ mạch Arduino, người dùng cần sử dụng môi trường lập trình Arduino IDE.
Hình 2.4: Phần mềm lập trình Arduino IDE
Giới thiệu về phần cứng
In this project, we will utilize key components including the Sim 800L module, Arduino Uno R3, humidity sensor, temperature sensor, rain sensor, relay module, LM2596 voltage regulator, circuit breaker, indicator light, and contactor.
2.2.1 Giới thiệu về Mô-đun Sim800L
Mô- đun sim 800L dùng để điều khiển các thiết bị hoặc cảnh báo từ xa thông qua mạng di động như gọi điện, nhắn tin, GPRS (xem Hình 2.5)
Dễ giao tiếp với các họ vi điều khiển như Pic, 8051, AVR, Arduino …
Mô-đun Sim 800L được sử dụng phổ biến trong các ứng dụng như phòng thông minh, ngôi nhà thông minh và IoT Việc điều khiển mô-đun này rất đơn giản nhờ vào bộ lệnh AT, đồng thời tiêu thụ điện năng thấp, lý tưởng cho các dự án cần sử dụng pin hoặc ắc-quy.
Lưu ý rằng trong quá trình khởi động, module có thể tiêu thụ dòng lên đến 2A và điện áp giao tiếp UART là 2.8V Vì vậy, cần cung cấp nguồn cho board với đặc tính 4V/2A và thực hiện chuyển đổi điện áp giao tiếp để đảm bảo module hoạt động hiệu quả nhất.
Chân 12 Điện áp hoạt động 3.7V – 4.2V
Dòng khi hạt động 100mA – 1mA (nên chọn nguồn trên 1A
Dòng ở chế độ chừo 10 mA
TXD : Chân truyền Uart TX
RXD : Chân nhận Uart RX
SPKP, SPKN: Ngõ ra âm thanh, nối với loa
MICP, MICN: Ngõ vào âm thanh, phải gắn thêm Micro để thu âm thanh
Reset : Chân khởi động lại sim800L
RING : Báo có cuộc gọi đến
- Tập lệnh AT điều khiển cuộc gọi
Mô tả: Hiển thị thông tin cuộc gọi đến
Lệnh: ATD[Số_Điện_Thoại];
Mô tả: Lệnh thực hiện cuộc gọi
Mô tả: Lệnh thực hiện kết thúc cuộc gọi, hoặc cúp máy khi có cuộc gọi đến
Mô tả: Lệnh thực hiện chấp nhận khi có cuộc gọi đến
Mô tả: Lệnh đưa SMS về chế độ Text, phải có lệnh này mới gửi nhận tin nhắn dạng Text
Lệnh AT+CMGR =x x là địa chỉ tin nhắn cần đọc
Mô tả: Đọc một tin nhắn vừa gửi đến, lệnh được trả về nội dung tin nhắn, thông tin người gửi, thời gian gửi
Lệnh: AT+CMGDA=”DEL ALL”
Mô tả: Xóa toàn bộ tin nhắn trong các hộp thư
Mô tả: Hiển thị nội dung tin nhắn ngay khi có tin nhắn đến
Sau mỗi lệnh các bạn thường thấy được thực chất nó là hai mã điều khiển tương ứng 0x0D(hexa), tương ứng 0x0A(hexa) [2]
Mạch giảm áp LM2596 là một mô-đun điều chỉnh điện áp với khả năng cung cấp dòng ra lên đến 3A IC LM2596 tích hợp đầy đủ các thành phần cần thiết, cho phép giảm áp từ nguồn 9V xuống các mức thấp hơn như 5V hoặc 3,3V.
Kích thước mạch : 53mmx26mm
Để sử dụng mô-đun, chỉ cần cấp nguồn thô vào chân INPUT + và INPUT – để nhận nguồn ra từ chân OUTPUT + và OUTPUT – Bên cạnh đó, điện áp đầu ra có thể được điều chỉnh bằng cách vặn biến trở trên mô-đun Nếu sau khi vặn biến trở mà không thấy thay đổi điện áp, hãy tiếp tục vặn thêm 10 vòng hoặc ngược lại để điều chỉnh.
Rơ-le là một loại công tắc điện tử (khóa K) được kích hoạt bằng điện, khác với công tắc thông thường cần sự tác động của tay người Rơ-le hoạt động với hai trạng thái cơ bản: đóng và mở, cho phép điều khiển dòng điện một cách hiệu quả.
Hình 2.7: Mô-đun Rơ-le
Thời gian tác động: 10ms
Thời gian nhã hãm: 5ms
Nhiệt độ hoạt động: -45 o C đến 75 o C
- Sơ đồ cấu tạo rơ-le
Chân 1 và chân 2: được nối vào cuộn hút, khi có điện vào cuộn hút sẽ hút tiếp điểm chuyển từ vị trí 4 xuống tiếp điểm
Chân 3: đặt điện áp (nếu là loại 12V thì đặt 12V DC vào)
Chân 4 và chân 5: là tiếp điểm (xem Hình 2.8)
Hình 2.8: Sơ đồ cấu tạo Rơ-le
Cảm biến mưa là thiết bị dùng để phát hiện giọt nước hoặc lượng mưa, hoạt động như một công tắc Nó bao gồm hai phần chính: đệm cảm biến và mô-đun cảm biến Khi mưa rơi trên bề mặt cảm biến, mô-đun sẽ đọc dữ liệu từ đệm để xử lý và chuyển đổi thành đầu ra tương tự hoặc kỹ thuật số Đầu ra của cảm biến mưa có hai dạng tín hiệu: tương tự (Analog AO) và kỹ thuật số (Digital DO).
Mạch cảm biến mưa hoạt động bằng cách so sánh hiệu điện thế giữa mạch cảm biến ngoài trời và giá trị định trước, có thể điều chỉnh thông qua biến trở màu xanh Khi có sự thay đổi, mạch sẽ phát ra tín hiệu để đóng hoặc ngắt rơ-le qua chân D0.
Khi thời tiết khô ráo, chân D0 của mô-đun cảm biến duy trì ở mức cao (5V-12V) Ngược lại, khi có nước xuất hiện trên bề mặt do trời mưa, đèn LED màu đỏ sẽ bật sáng và chân D0 sẽ giảm xuống mức thấp (0V).
Điện áp hoạt động trong khoảng từ 3-5V
Hoạt động dựa trên nguyên lý: Nước rơi vào board sẽ tạo ra môi trường dẫn điện
Có 2 dạng tín hiệu: Analog (AO) và Digital (DO)
Dạng tín hiệu: TLL, đầu ra 100 mA (có thể sử dụng trực tiếp Rơ-le, còi công suất nhỏ …)
Điều chỉnh độ nhạy bằng biến trở
Sử dụng LM358 để chuyển AO DO
- Cách nối dây Arduino và cảm biến mưa
2.2.5 Cảm biến nhiệt độ DS18B20
Cảm biến nhiệt độ DS18B20d dây mềm là phiên bản chống nước và chống ẩm của cảm biến DS18B20, thuộc dòng cảm biến Digital mới của hãng MAXIM với độ phân giải cao 12bit Sử dụng giao tiếp 1 dây, cảm biến này dễ dàng lập trình và tích hợp Nó có khả năng cảnh báo nhiệt độ khi vượt ngưỡng và hỗ trợ cấp nguồn từ chân data (parasite power) Mặc dù có thể hoạt động ở nhiệt độ lên đến 125°C, nhưng với cáp bọc PVC, người dùng nên giữ cảm biến dưới 100°C Là cảm biến kỹ thuật số, DS18B20d không bị suy hao tín hiệu khi sử dụng ở khoảng cách dài.
Hình 2.10: Cảm biến nhiệt độ
Dải đo nhiệt độ : -55 đến 125 0 C (-57 đến 267 0 F)
Sai số : ± 0.5 0 C khi đo ở dải -10 – 85 0 C
Độ phân giải : Người dùng có thể chọn từ 9 – 12 bits
Chuẩn giao tiếp : 1-wire (1 dây)
Đường kính đầu dò : 6mm
Thời gian chuyển đổi nhiệt độ tối đa 750ms (khi chọn độ phân giải 12 bit)
Có cảnh báo nhiệt khi vượt ngưỡng cho phép và cấp nguồn từ chân data
Mỗi IC có một mã riêng (lưu trên EEPROM của IC) nên có thể giao tiếp nhiều DS18B20 trên cùng 1 dây
Ống thép không gỉ (chấm ẩm, nước) đường kính 6mm, dài 50mm
Cảm biến độ ẩm đất hoạt động với đầu ra mức thấp (0V) khi đất khô và mức cao (5V) khi đất đủ nước Độ nhạy của cảm biến có thể điều chỉnh bằng biến trở Đầu đo được cắm vào đất để theo dõi độ ẩm, và khi đạt ngưỡng thiết lập, đầu ra DO sẽ chuyển từ mức thấp sang mức cao Điều này cho phép người dùng sử dụng vi điều khiển để đọc giá trị từ cảm biến, hỗ trợ trong việc quản lý độ ẩm đất hiệu quả.
Hình 2.11: Cảm biến độ ẩm
Kích thước PCB : 3cm * 1.6cm
DO : Đầu ra tín hiệu số (0 và 1)
AO : Đầu ra Analog (Tín hiệu tương tự)
Led đỏ báo nguồn vào, Led xanh báo độ ẩm
Khi cấp nguồn, đèn LED báo nguồn sẽ sáng với hai đầu ra D0 (Digital Output) và A0 (Analog Output) Đối với chân Digital Output, mạch hoạt động bằng cách cài đặt ngưỡng so sánh qua biến trở; điện trở của cảm biến tỷ lệ thuận với độ ẩm, với độ ẩm càng cao thì điện trở càng lớn Theo sơ đồ phân áp, điện áp đầu ra tỷ lệ thuận với điện trở cảm biến, do đó độ ẩm đất tỷ lệ thuận với điện áp đầu ra Khi độ ẩm thay đổi, điện trở trên cảm biến cũng thay đổi, dẫn đến sự thay đổi điện áp đầu ra vào cổng so sánh trên opam Nếu điện áp từ cảm biến chưa vượt ngưỡng cài đặt, đầu ra D0 sẽ ở mức thấp và LED không sáng; khi điện áp vượt ngưỡng, đầu ra D0 sẽ ở mức cao và LED sẽ sáng lên Đối với chân Analog Output, nó được kết nối trực tiếp với mạch phân áp của cảm biến, không qua mạch so sánh opam, nhằm cung cấp tín hiệu điện áp trực tiếp tới đầu ra A0 cho các mục đích đo lường và giám sát.
Hình 2.12: Sơ đồ nguyên lý
Màn hình LCD (Liquid Crystal Display) được ứng dụng rộng rãi trong các hệ thống vi điều khiển nhờ vào nhiều ưu điểm vượt trội LCD có khả năng hiển thị đa dạng các ký tự như chữ, số và hình ảnh đồ họa một cách trực quan Bên cạnh đó, nó dễ dàng tích hợp vào các mạch ứng dụng thông qua nhiều giao thức giao tiếp khác nhau và tiêu tốn rất ít tài nguyên hệ thống.
Điện áp hoạt động là 5V
Khoảng cách giữa hai chân kết nối là 0.1 inch tiện dụng khi kết nối với Bereadboard
Tên các chân được ghi ở mặt sau của màn hình LCD hổ trợ việc kết nối, đi dây điện
Có đèn led nền, có thể dùng biến trở hoặc PWM điều chỉnh độ sáng để sử
Có thể điều khiển với 6 dây tín hiệu
Có bộ ký tự được xây dựng hỗ trợ tiếng Anh và tiếng Nhật
- Chức năng của từng chân của LCD 16x2 (xem Hình 2.14)
Chân số 1 – VSS: chân nối đất cho LCD được nối với GND của mạch điều khiển
Chân số 2- VDD: chân cấp nguồn cho LCD, được nối với VCC = 5V của mạch điều khiển
Chân số 3 – VưE: điều chỉnh tương phản của LCD
Chân số 4 – RS: Chân chọn thanh ghi, được nối với logic “0” hoặc logic “1”
Chân số 5 – R/W: chân chọn chế độ đọc/ghi (Read/Write), được nối với logic
Chân số 6 – E (Enable) là chân cho phép các lệnh được thực hiện sau khi các tín hiệu bus DB0-DB7 được đặt tên Các lệnh chỉ được chấp nhận khi có tín hiệu cho phép từ chân này.
+ Ở chế độ ghi: Dữ liệu ở bus sẽ được LCD chuyển vào thanh ghi bên trong khi phát hiện một xung (high - to – low transition của tín hiệu chân E
Khi ở chế độ đọc, dữ liệu sẽ được LCD xuất ra các chân DB0-DB7 khi phát hiện sự chuyển tiếp từ mức thấp lên mức cao tại chân E Dữ liệu này sẽ được giữ trên bus cho đến khi chân E trở về mức thấp.
TÍNH TOÁN THIẾT KẾ VÀ CHẾ TẠO MÔ HÌNH
Sơ đồ khối trong hệ thống
Hình 3.1: Sơ đồ khối của hệ thống
Khi cảm biến nhiệt độ và độ ẩm đất phát hiện tín hiệu thấp hơn hoặc vượt quá mức cho phép, vi điều khiển sẽ gửi tín hiệu đến Rơ-le để điều khiển máy bơm Cảm biến mưa kiểm tra mức nước trong hệ thống và thông báo lỗi nếu cần Màn hình LCD hiển thị các giá trị từ cảm biến nhiệt độ và độ ẩm trong nhà kính Điện thoại được sử dụng để giám sát trạng thái và các giá trị nhiệt độ, độ ẩm của nhà kính thông qua mạch điều khiển Mô-đun 2596 đảm bảo ổn định điện áp cho mô-đun sim800L.
Thiết kế các khối trong hệ thống
Việc tính toán thiết kế là một bước quan trọng không thể thiếu trong bất kỳ đề tài nào, vì nó ảnh hưởng trực tiếp đến kết quả cuối cùng Để đạt được hiệu quả tối ưu, mọi thiết bị và linh kiện cần được tính toán một cách cẩn thận và chi tiết.
Theo sơ đồ nguyên lý, nhóm chúng em sẽ thiết kế theo sơ đồ nguyên lý gồm có các phần:
Khối xử lý trung tâm : 1 Arduino Uno R3
Khối cảm biến : cảm biến độ ẩm, cảm biến nhiệt độ, cảm biến mưa
Khối chấp hành : Rơ-le
Khối chuyển đổi : Mô-đun hạ áp LM2596
Khối nguồn : Nguồn 12V lấy từ Adapter
Smartphone : 1 điện thoại thông minh
- Khối xử lý trung tâm : gồm có 1 vi điều khiển được lập trình để (xem Hình 3.2):
Nhận dữ liệu từ các mô-đun cảm biến
Điều khiển hệ thống qua mô-đun sim800L
Hình 3.2: Khối xử lý trung tâm
Cảm biến độ ẩm đất:
Dựa trên yêu cầu thiết kế, nhóm chúng em đã lựa chọn cảm biến độ ẩm đất E2000115, nhờ vào kích thước nhỏ gọn, giá thành hợp lý và tính dễ sử dụng Cảm biến này sẽ được kết nối với chân tín hiệu A2 của Arduino Uno R3, như thể hiện trong sơ đồ nguyên lý Hình 3.3.
Hình 3.3 Mô-đun cảm biến độ ẩm đất kết nối với Arduino Uno R3
Dựa vào yêu cầu thiết kế, nhóm chúng em đã chọn cảm biến mưa để phát hiện hệ thống có còn nước hay không Cảm biến này có giá thành rẻ, nhỏ gọn và dễ sử dụng, phù hợp với nhu cầu của dự án (xem Hình 3.4).
Hình 3.4: Cảm biến mưa kết nối với Arduino Uno R3
Dựa vào yêu cầu thiết kế, nhóm chúng em cần một cảm biến đo nhiệt độ môi trường và đã nghiên cứu nhiều loại cảm biến như DHT12 và LM35 Cuối cùng, chúng em quyết định chọn cảm biến nhiệt độ DS18B20 vì nó nhỏ gọn, giá thành thấp và dễ sử dụng Cảm biến này được kết nối với chân tín hiệu D9 của Arduino Uno R3, như thể hiện trong sơ đồ nguyên lý.
Hình 3.5: Cảm biến nhiệt độ
Hình 3.6: Cảm biến nhiệt độ kết nối với Arduino Uno R3
Dựa trên yêu cầu thiết kế, nhóm chúng em cần một thiết bị có khả năng hiển thị nhiệt độ và độ ẩm của đất Để đáp ứng yêu cầu này, chúng em đã quyết định sử dụng màn hình LCD 16x2, vì nó không chỉ đáp ứng đủ số dòng cần thiết mà còn được hỗ trợ bởi thư viện giao tiếp.
Trong sơ đồ nguyên lý (xem Hình 3.7) thì LCD được kết nối 2 chân SCL và SDA vào chân A4 và A5 của Arduino Uno R3 để truyền dữ liệu qua giao thức I2C
Hình 3.7: LCD kết nối với Arduino Uno R3
Sau khi nhận tín hiệu từ Arduino, thiết bị chấp hành sẽ thực hiện việc đóng cắt dòng điện, đảm bảo an toàn cho phần điều khiển và tránh sự cố Để đáp ứng yêu cầu này, chúng tôi lựa chọn rơ-le 12V (xem Hình 3.8) vì đây là giải pháp tối ưu với nhiều ưu điểm như kích thước nhỏ gọn, chi phí thấp và dễ sử dụng.
Để cung cấp nguồn cho mô-đun Sim800L, cần hạ áp xuống 4.2V, vì vậy chúng tôi sử dụng mô-đun hạ áp LM2596 để cấp nguồn cho mô-đun Sim (xem Hình 3.9).
Hình 3.9: Mô-đun hạ áp LM2596
Nguồn cấp cho Arduino Uno R3, Rơ-le 12VDC
Nguồn cấp cho cảm biến nhiệt độ, độ ẩm và LCD lấy từ chân 5V Arduino
Nguồn cấp cho mô-đun Sim800L được cấp từ LM2596 với điện áp 4.2V/2A
Nguồn cấp cho động cơ bơm là 220VAC
Các phần trong hệ thống
Hình 3.10 là hình ảnh mạch in mà chúng em đã thiết kế và vẽ trên phần mềm Altium
Mạch điều khiển nhận giá trị từ cảm biến độ ẩm, nhiệt độ (độ ẩm < 60 % và nhiệt độ >
Khi nhiệt độ đạt 24°C, rơ-le sẽ kích hoạt để cấp điện cho Contactor và máy bơm, đồng thời gửi tin nhắn “Máy bơm bật” đến điện thoại Nếu máy bơm hoạt động mà cảm biến mưa không có tín hiệu, hệ thống sẽ gửi tin nhắn “Hệ thống hết nước” đến số điện thoại đã thiết lập và tắt máy bơm Khi cảm biến đọc giá trị nhiệt độ và độ ẩm, nếu độ ẩm > 70% và nhiệt độ < 20°C, mạch điều khiển sẽ gửi tín hiệu đến rơ-le để ngắt điện Contactor, tắt máy bơm và gửi tin nhắn “Máy bơm tắt” đến điện thoại Xem Hình 3.11 để hiểu rõ hơn về nguyên lý hoạt động của mạch.
- Các linh kiện có trong mạch
Nguồn : Dùng Apdapter hạ áp 220VAC – 12VDC-2A
Mô-đun hạ áp LM2596 : hạ áp xuống 4.2V-2A
Mô-đun Sim800L : nơi gắn sim trực tiếp và điều khiển qua điện thoại
Rơ-le 12V : Đóng cắt khi nhận tín hiệu điều khiển
Cảm biến mưa : Cảm biến nước từ máy bơm để đưa tín hiệu về Arduino
Arduino Uno R3 là bộ xử lý trung tâm, nhận tín hiệu từ mô-đun Sim800L và các cảm biến, sau đó xử lý và truyền tín hiệu để điều khiển rơ-le.
Nguyên lý hoạt động của tủ điện điều khiển dựa trên việc cấp nguồn điện áp định mức cho Contactor, tạo ra lực từ hút lõi từ di động và hình thành mạch kín Khi đó, máy bơm sẽ bắt đầu hoạt động, như minh họa trong Hình 3.12.
Hình 3.13: Sơ đồ hoàn chỉnh
- Nguyên Lý hoạt động của Hình 3.13:
Mô hình hoạt động bằng cách cấp nguồn cho hệ thống với hai nguồn điện: 220V AC từ lưới điện cho mạch động lực và 12V DC từ Adapter cho mạch điều khiển Sau khi cấp nguồn, hệ thống sẽ khởi động và hiển thị nhiệt độ, độ ẩm trên LCD Mô-đun Sim800L gửi tin nhắn “Da san sang” Chế độ tự động hoặc bằng tay được chọn qua công tắc 3 vị trí Trong chế độ tự động, nếu nhiệt độ > 24°C hoặc độ ẩm < 60%, rơ-le sẽ đóng điện cho Contactor và máy bơm hoạt động Nếu máy bơm chạy mà không có cảm biến mưa tác động, hệ thống sẽ gửi tin nhắn “He thong het nuoc” và dừng hoạt động Để khởi động lại, cần bổ sung nước Hệ thống tắt máy bơm khi độ ẩm > 70% hoặc nhiệt độ < 20°C Nếu không đạt yêu cầu, máy bơm sẽ tiếp tục chạy Khi máy bơm dừng, tin nhắn “may bom tat” sẽ được gửi.
Khi mạch điều khiển gặp sự cố, có thể điều khiển mạch động lực bằng cách xoay công tắc 3 vị trí sang chế độ bằng tay Trong trường hợp này, máy bơm sẽ hoạt động và bơm nước liên tục cho đến khi được tắt.
Hình ảnh sản phẩm thực tế
Những linh kiện có trong mạch điều khiển ở Hình 3.14 gồm:
- 1 Mô-đun hạ áp LM2596
- 1 Cảm biến độ ẩm đất
Những linh kiện có trong mạch điều khiển ở Hình 3.15 gồm:
Hình 3.15: Mạch động lực thực tế
Hình 3.16 là mô hình thực tế mà chúng em đã hoàn thành
Hình 3.17: Mô hình thực tế
LẬP TRÌNH ĐIỀU KHIỂN
Quy trình công nghệ
Hệ thống được cấp nguồn từ hai nguồn điện: nguồn 220V AC lấy từ lưới điện để cung cấp cho mạch động lực và nguồn 12V.
DC được cấp từ Adapter cho mạch điều khiển, sau đó chờ một thời gian ngắn để mạch hoạt động Khi mạch khởi động, LCD hiển thị nhiệt độ và độ ẩm từ cảm biến, đồng thời mô-đun Sim800L gửi tin nhắn “Da san sang” Để chọn chế độ tự động hoặc bằng tay, sử dụng công tắc 3 vị trí đã thiết lập Trong chế độ tự động, mạch điều khiển theo dõi cảm biến nhiệt độ và độ ẩm; nếu nhiệt độ > 24°C hoặc độ ẩm < 60%, rơ-le đóng, bật máy bơm Nếu máy bơm bật nhưng không có cảm biến mưa, mạch sẽ gửi tin nhắn “He thong het nuoc” và tắt máy bơm Hệ thống tắt máy bơm khi độ ẩm > 70% hoặc nhiệt độ < 20°C; nếu chưa đạt điều kiện, máy bơm vẫn hoạt động Khi máy bơm tắt, sẽ gửi tin nhắn “may bom tat”.
Khi mạch điều khiển gặp sự cố, hệ thống vẫn có thể được điều khiển bằng chế độ tay Bằng cách chọn chế độ điều khiển này, máy bơm sẽ hoạt động liên tục cho đến khi công tắc được xoay về vị trí chính giữa, lúc đó máy bơm sẽ tự động tắt.
Lưu đồ thuật toán
Khi hệ thống được cấp điện, mô-đun khởi tạo và gửi tin nhắn "Da san sang" đến số điện thoại đã thiết lập Mạch điều khiển sẽ đọc giá trị từ các cảm biến độ ẩm và nhiệt độ, hiển thị thông tin trên LCD Ngoài việc xem trên LCD, người dùng có thể gửi tin nhắn "KT" để nhận thông tin về nhiệt độ và độ ẩm hiện tại Hệ thống kiểm tra để bật máy bơm khi nhiệt độ > 24°C hoặc độ ẩm < 60% Nếu máy bơm đã bật nhưng cảm biến mưa không kích hoạt, mô-đun Sim800L sẽ gửi tin nhắn "He thong het nuoc" và "May bom tat" Nếu cảm biến mưa được kích hoạt, máy bơm sẽ dừng khi nhiệt độ dưới 20°C hoặc độ ẩm trên 70%.
Hình 4.1: Lưu đồ thuật toán
Chương trình điều khiển
Chương trình con cho hệ thống đã sẵn sàng
Chương trình này có nhiệm vụ chính là sẽ gửi một tin nhắn về số điện thoại mà ta đã thiệt lập với nội dung là “Da san sang”
Chương trình về hệ thống đã sẵn sàng void sansang() { mySerial.println("AT+CMGS=\"+84357770321\""); delay(500); mySerial.print("Da san sang"); delay(500); mySerial.write(26);
Serial.print("Da gui tin nhan\n");
Chương trình con về việc máy bơm tắt
Chương trình con này có nhiệm vụ là nhắn tin về số điện thoại đã được thiết đặt với nội dung tin nhắn là “May bom da tat”
Chương trình con về máy bơm đã bật void maybomtat() { delay(500); mySerial.println("AT+CMGS=\"+84357770321\""); delay(500); mySerial.print("May bom da tat"); delay(500); mySerial.write(26);
Chương trình con về việc máy bơm bị lỗi
Chương trình này sẽ báo đến số điện thoại được thiết đặt với nội dung là “He thong het nuoc”
Chương trình con về máy bơm lỗi
{ delay(500); mySerial.println("AT+CMGS=\"+84357770321\""); delay(500); mySerial.print("He thong het nuoc"); delay(500); mySerial.write(26);
Chương trình con về việc máy bơm đã bật
Chương trình con này sẽ gửi tin nhắn về số điện thoại đã được thiết lập với nội dung là “ May bom da bat”
Chương trình về máy bơm đã bật
{ delay(500); mySerial.println("AT+CMGS=\"+84357770321\""); delay(500); mySerial.print("May bom da bat"); delay(500); mySerial.write(26);
Chương trình con này có nhiệm vụ đọc giá trị từ cảm biến nhiệt độ và độ ẩm, sau đó hiển thị lên màn hình LCD Đặc biệt, để hiển thị chính xác độ ẩm đất, cần phải chuyển đổi giá trị ảo của cảm biến thành giá trị thực Nếu không thực hiện bước chuyển đổi, kết quả hiển thị độ ẩm sẽ bị sai lệch Trong đoạn mã, hàm `cambien()` sử dụng `sensors.requestTemperatures()` để lấy dữ liệu nhiệt độ, sau đó hiển thị lên LCD với cú pháp `lcd.print()` và `lcd.setCursor()` để định vị trí hiển thị.
Chúng ta sẽ sử dụng một vòng lặp for để đọc giá trị từ cảm biến 10 lần, từ đó tính toán giá trị trung bình nhằm đạt được độ chính xác cao nhất.
Để tính giá trị trung bình, sử dụng biến TBcb với công thức `TBcb=doc_cb/10` Chuyển đổi giá trị analog thành phần trăm bằng cách sử dụng hàm `map`, kết quả được lưu trong biến `phantramao` Giá trị phần trăm thực được tính bằng `phantramthuc = 100 - phantramao`, chuyển đổi điện thế khô thành ẩm Giá trị độ ẩm được gán cho biến `doam` Để hiển thị trên màn hình LCD, đặt con trỏ tại vị trí (11, 1) và in giá trị `phantramthuc` Nếu giá trị `phantramthuc` nhỏ hơn 100, đặt con trỏ tại vị trí (13, 1) và in một khoảng trắng.
} else if (phantramthuc < 10) { lcd.setCursor(12, 1); lcd.print(' ');
} lcd.print('%'); delay (500); doc_cb=0;
Chương trình con về kiểm tra tin nhắn
Chương trình con này có nhiệm vụ kiểm tra tin nhắn đến; nếu nội dung là “KT”, hệ thống sẽ trả về nhiệt độ và độ ẩm hiện tại Không cần phải ghi in hoa nội dung tin nhắn, vì chương trình đã tự động chuyển đổi các ký tự thành chữ hoa Điều này giúp tránh sai cú pháp, đảm bảo hệ thống luôn gửi giá trị cảm biến về điện thoại.
Chương trình kiểm tra tin nhắn void CheckSMS() { if(mySerial.available()>0) { delay(100); while(mySerial.available()) { incomingByte = mySerial.read(); inputString += incomingByte;
} delay(10); inputString.toUpperCase(); if (inputString.indexOf("KT") > -1) { delay(1000);
The code initiates the process of sending an SMS by first printing "Sending SMS " to the serial monitor and introducing a brief delay It then sends the AT command to the specified phone number, followed by another delay The message includes temperature and humidity readings, formatted with one decimal place, before sending the SMS Finally, it concludes the message by sending a control character to signify the end of the SMS transmission.
Chương trình chính thì sẽ các nhiệm vụ sau:
Khi nhiệt độ vượt quá 24°C hoặc độ ẩm giảm xuống dưới 50%, máy bơm sẽ được bật Để đảm bảo máy bơm hoạt động hiệu quả, cần kiểm tra rằng máy không gặp lỗi và đang ở trạng thái tắt trước khi khởi động.
Chương trình máy bơm bật: if(((nhietdo>24) || (doam10000) if(!CheckRainSensor() && maybom) {
Serial.println("Da tat may bom"); maybom=0; maybomloi();
Hiển thị lên màn hình máy tính các giá trị về độ ẩm, nhiệt độ và trạng thái máy bơm và cảm biến mưa (On hay Off)
Các lệnh hiển thị cho phép chúng ta theo dõi giá trị của cảm biến và trạng thái máy bơm từ, giúp xác định tính ổn định trong hoạt động của chúng Nếu phát hiện phần tử nào bị hư hỏng hoặc không hoạt động, chúng ta có thể nhanh chóng tiến hành thay thế hoặc sửa chữa.
Chương trình hiển thị lên màn hình máy tính: cambien();
Serial.print("May bom "); if(digitalRead(12)) Serial.print("ON"); else Serial.print("OFF");
Serial.print("CB mua: "); if(!digitalRead(6)) Serial.print("ON"); else Ser;ial.println("OFF");
#define ONE_WIRE_BUS 9 OneWire oneWire(ONE_WIRE_BUS);
The code initializes a SoftwareSerial object on pins 3 (TX) and 2 (RX) and sets up a relay on pin 12, along with a temperature and humidity sensor connected to analog pin A2 It defines several variables, including `doc_cb` for sensor readings, `TBcb` for thresholds, and `luu` for storage The variable `mua` is assigned to pin 11 for additional functionality, while `nhietdo` and `doam` are used to store temperature and humidity values, respectively Additionally, `time1` tracks time, and two boolean flags, `Error` and `maybom`, are initialized to manage error states and pump status.
String inputString; char incomingByte; void setup() {
Serial.println("Initializing "); mySerial.begin(9600);//SIM mySerial.println("AT"); delay(100); updateSerial(); mySerial.println("AT+CMGF=1");
// Configuring TEXT mode updateSerial(); mySerial.println("AT+CNMI=1,2,0,0,0");
// Decides how newly arrived SMS messages should be handled mySerial.println("AT+CMGDA=\"DEL ALL\""); updateSerial();
Serial.println("HE THONG DA SAN SANG!"); sansang(); pinMode (cb, INPUT);
//Tín hiệu vào từ cảm biến pinMode (mua, INPUT); pinMode (relay, OUTPUT);
//Tín hiệu xuất ra từ relay digitalWrite (relay, LOW); lcd.init(); // khoi tao lcd lcd.backlight(); // bat den lcd lcd.print("Nhiet do: ");
// in ra man nhietdo lcd.createChar( 1,degree) ; lcd.setCursor(0,1);
// thiết lập vị trí con trỏ ở hàng đầu tiên lcd.print("Do am : ");
} void sansang() { mySerial.println("AT+CMGS=\"+84357770321\""); delay(500); mySerial.print("Da san sang"); delay(500); mySerial.write(26);
Serial.print("Da gui tin nhan\n");
{ delay(500); while (Serial.available()) { mySerial.write(Serial.read());
//Forward what Serial received to Software Serial Port } while(mySerial.available()) {
//Forward what Software Serial received to Serial Port }
} void maybomtat() { delay(500); mySerial.println("AT+CMGS=\"+84357770321\""); delay(500); mySerial.print("May bom da tat"); delay(500); mySerial.write(26);
} void maybomloi() { delay(500); mySerial.println("AT+CMGS=\"+84357770321\""); delay(500); mySerial.print("He thong het nuoc"); delay(500); mySerial.write(26);
} void maybombat() { delay(500); mySerial.println("AT+CMGS=\"+84357770321\""); delay(500); mySerial.print("May bom da bat"); delay(500); mySerial.write(26);
} void cambien() { sensors.requestTemperatures(); lcd.setCursor(0,0); lcd.print("Nhietdo: "); lcd.setCursor(9,0); nhietdo = sensors.getTempCByIndex(0); lcd.print(sensors.getTempCByIndex(0));
Để đọc giá trị cảm biến chính xác, chúng ta sẽ sử dụng hàm for để thực hiện 10 lần đo Mỗi lần đo, giá trị sẽ được cộng dồn vào biến doc_cb thông qua lệnh analogRead(cb) Cuối cùng, chúng ta sẽ tính giá trị trung bình để có được kết quả chính xác nhất.
} TBcb=doc_cb/10; //Tính giá trị trung bình int phantramao = map(TBcb, 0, 1023, 0, 100);
//Chuyển giá trị Analog thành giá trị % int phantramthuc = 100 - phantramao;
//Tính giá trị phần trăm thực, chuyển điện thế khô thành ẩm doam = phantramthuc; lcd.setCursor(11, 1); lcd.print(phantramthuc); if (phantramthuc < 100) { lcd.setCursor(13, 1); lcd.print(' ');
} else if (phantramthuc < 10) { lcd.setCursor(12, 1); lcd.print(' ');
} lcd.print('%'); delay (500); doc_cb=0;
} bool CheckRainSensor() { if(!digitalRead(6)) return 1; else return 0;
} void CheckSMS() { if(mySerial.available()>0) { delay(100); while(mySerial.available()) { incomingByte = mySerial.read(); inputString += incomingByte;
Serial.println(inputString); inputString.toUpperCase(); if (inputString.indexOf("KT") > -1) { delay(1000);
To send an SMS with temperature and humidity data, the code initiates the process by printing "Sending SMS " and introducing a brief delay It then sends the AT command to the specified phone number, followed by another delay The message includes the temperature, formatted to one decimal place, and the humidity percentage, each preceded by descriptive labels After preparing the message, the code concludes by sending a control character to finalize the SMS transmission.
CheckRainSensor();///chú ý CheckSMS(); if(digitalRead(12)) if((millis()-time1)>10000) if(!CheckRainSensor() && maybom) {
Serial.println("Da tat may bom"); maybom=0; maybomloi();
Serial.print("May bom "); if(digitalRead(12)) Serial.print("ON"); else Serial.print("OFF");
Serial.print("CB mua: "); if(!digitalRead(6)) Serial.print("ON"); else Serial.println("OFF"); if(((nhietdo>24) || (doam