TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘIVIỆN CƠ KHÍ ------ BÁO CÁO BÀI TẬP LỚN Môn học: KỸ THUẬT LẬP TRÌNH TRONG CƠ ĐIỆN TỬ Đề tài: Hệ thống tưới cây tự động Giảng viên hướng dẫn: TS.. Khái ni
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN CƠ KHÍ - -
BÁO CÁO BÀI TẬP LỚN Môn học: KỸ THUẬT LẬP TRÌNH TRONG CƠ ĐIỆN TỬ
Đề tài: Hệ thống tưới cây tự động
Giảng viên hướng dẫn: TS Dương Văn Lạc
Trang 2MỤC LỤC
Mục lục 1
Tóm tắt sản phẩm 2
Chương I: Tổng quan về hệ thống tưới cây tự động 3
Chương II: Các phần tử của mạch điều khiển hệ thống tưới cây tự động 5
2.1.Mạch điều khiển: Kit Arduino Leonardo 6
2.2.Cảm biến độ ẩm đất 7
2.3.Cảm biến nhiệt độ LM35 8
2.4.Module thời gian thực(DS1307) 9
2.5.Màn hình LCD 20x04(I2C) 11
2.6.Rơ-le(5VDC) 12
2.7.Máy bơm chìm mini 13
2.8 Nguồn 14
Chương III: Thiết kế hệ thống tưới cây 15
3.1 Sơ đồ nối mạch 15
3.2 Sơ đồ thuật toán 22
Chương IV.Lập trình 23
4.1.Code Adruino 23
4.2.Code chương trình điều khiển 30
Chương V:Kết luận 49
Tài liệu tham khảo 50
Trang 3Tóm tắt sản phẩm
1.Tên sản phẩm :Máy tưới cây tự động
2.Chức năng
- Đảm bảo cung cấp đây đủ nước cho cây trồng cũng như theo dõi được nhiệt độ ,
độ ẩm của môt trường đất
3.Các linh kiện cấu thành:
Kít Adruino Leonardo
Module thời gian thực DS1307
Relay 5v đóng ngắt thiết bị
Màn hình LCD 20x04 I2C
Cảm biến nhiệt độ LM35 và cảm biến độ ẩm đất
Máy bơm chìm mini
3 viên pin 1.5V
Các dây kết nối
Trang 4Chương I TỔNG QUAN VỀ HỆ THỐNG TƯỚI CÂY TỰ ĐỘNG
1.1 Khái niệm về hệ thống tự động
Hệ thống điều khiển tự động là hệ thống bao gồm các phần tử tự động nhằm điều khiển các quá trình xảy ra trong thiên nhiên, cuộc sống mà không có sự tham gia trực tiếp của cong người.
Hệ thống điều khiển tự động: là tập hợp các thành phần vật lý có mối liên quan và tác động qua lại lẫn nhau để chi huy, tự hiệu chỉnh hoặc điều khiển một hệ thống khác.
Hệ thống điều khiển tự động xuất hiện ngày nay rất phổ biến.
- Hệ thống điều hòa không khí.
- Hệ thống điều chỉnh độ ẩm.
- Hệ thống tự báo cháy v.v
Trong môi trường sản xuất:
- Các máy tự động.
- Các đường dây sản xuất, lắp ráp.
- Các máy điều khiển theo chương trình, Máy tính , Robot v.v
1.2 Vai trò của tự đông hóa trong sản xuất
Nền sản xuấ hiện đại hiện nay là thành quả của quá trình cơ giới hóa và điện khí hóa công cụ lao động và phương tiện lao đông Mỗi khi có những đột phá mới trong lĩnh vực vật liệu hay điện tử và IT thì công nghệ tự động hóa lại có cơ hội phát triển mạnh mẽ, đem lại những giá trị thiết thực cho xã hội Tự động hóa là yếu
tố then chốt cho sự phát trỉển của nền sản xuất hiện đại.
Trong thực tiễn, khi tự đông hóa được áp dụng trong quá trình sản xuất sẽ mang lại lợi ích lớn hơn nhiều lần so với việc sử dụng lao động thủ công Khi quá trình sản xuất được vận hành tự động thì không chỉ năng suất lao động tăng cao, chi phí nhân công được cắt giảm mà còn giúp nâng cao trình độ của người lao động… Từ đó sẽ tăng khả năng cạnh trạnh của doanh nghiệp cũng như cá nhân, đáp ứng được nhu cầu ngày càng cao hiện nay.
Trang 5Nền nông nghiệp lạc hậu yêu cầu một số lượng lớn người lao động trong quá trình sản xuất mà năng suất vẫn không đáp ứng được cả chất lượng cũng như năng suất, sản lượng Ứng dụng tự động vào trong quá trình sản xuất sẽ giúp giảm bớt sức người, nâng cao giá trị sản phẩm,
Mặc dù hiện nay tự động hóa đã được ứng dụng từ lâu cho viêc tưới tiêu song nó chỉ phổ biến ở các nước phát triển, còn đối với các nước đang phát triển hay các nước kém phát triển tuy nông nghiệp chiếm tỉ trọng lớn nhưng việc ứng dụng tự động hóa trong việc tưới cây còn chưa được phổ biến Hiên nay để đáp ứng được nhu cầu từ thực tiễn thì tự động hóa đã và đang được mở rộng dần dần quy trong đời sống hiện nay.
Ngày nay với những thành tựu to lớn của khoa học công nghệ thì tự động hóa đã có thể được áp dụng hầu hết trên mọi lĩnh vực Có thể nói tự động hóa đã trở thành xu thế tất yếu cho mọi quốc gia hiện nay.
Trang 6CHƯƠNG 2 CÁC PHẦN TỬ CỦA HỆ THỐNG TƯỚI CÂY TỰ
ĐỘNG
Hệ thống được thiết kế gồm 7 khối:
Khối thu gồm cảm biến nhiệt độ LM 35, cảm biến độ ẩm đất
Nguồn
Khối xử lý trung tâm sử dụng Kit Arduino Leonardo
Khối hiển thị: Màn hình LCD 2004 I2C
Khối điều khiển thiết bị sử dụng :Relay 5VDC
Khối thời gian thực (hẹn giờ) :DS1307
Cơ cấu chấp hành: máy bơm chìm mini
Sơ đồ khối của mạch
Hình 2.1: Sơ đồ khối của hệ thống
-Chức năng của từng khối:
Khối xử lý trung tâm : Kit Adruino Leonardo điều khiển toàn bộ hoạt động của mạch là nhận dự liệu giải mã tín hiệu nhiệt độ và độ ẩm Sau đó hiển thị trên màn LCD và đưa tín hiệu điều khiển bật/tắt thiết bị.
Khối hiển thị: Là màn hình LCD 4 dòng 20 kí tự thể hiện nhiệt độ, độ
ẩm của môi trường đất, thời gian thực.
Trang 7 Khối thời gian thực: DS1307 là một IC thời gian thực với nguồn cung cấp nhỏ, dùng để cập nhật thời gian và ngày tháng
Nguồn: Cung cấp năng lượng cho hệ thống
Khối thu: đo tín hiệu độ ẩm , nhiệt độ
Cơ cấu chấp hành : Bơm nước để tưới cây
2.1 Kit Adrunio Leonardo
2.1.1 Sơ đồ chân của Adruino Leornardo
Hình 2.2 Sơ đồ chân của Adruino Leonardo
2.1.2 Thông số của Adruino Leonardo
Trang 8Vi điều khiển ATmega32u4 (họ 8bit)
Dòng tiêu thụ ở các chân I/O 40mA
Điện áp vào khuyên dùng 7-12V – DC
Số chân Digital I/O 14 (7 chân PWM)
Số chân Analog 12 (các chân PWM có thể dùng như chân Analog bình thường - nghĩa là có
thể dùng Analog read) (độ phân giải 10bit
Dòng tối đa trên mỗi chân I/O 40 mA
Trang 9- Cảm biến đo độ ẩm của đất có 4 chân với kết nối như sau
Cảm biến độ ẩm đất , trạng thái đầu ra mức thấp (0V), khi đất thiếu nước đầu ra
sẽ là mức cao (5V), độ nhạy cao chúng ta có thể điều chỉnh được bằng biến trở Phần đầu đo được cắm vào đất để phát hiện độ ẩm của đất, khi độ ầm của đất đạt ngưỡng thiết lập, đầu ra DO sẽ chuyển trạng thái từ mức thấp lên mức cao.
Trang 10Kích thước: 4.3 × 4.3mm
-Nguyên lý hoạt động:
Cảm biến LM35 hoạt động bằng cách cho ra một giá trị điện áp nhất định tại chân VOUT (chân giữa) ứng với mỗi mức nhiệt độ Như vậy, bằng cách đưa vào chân bên trái của cảm biến LM35 điện áp 5V, chân phải nối đất, đo hiệu điện thế ở chân giữa, bạn sẽ có được nhiệt độ (0-100ºC) tương ứng với điện áp đo được.
2.4.Module thời gian thực DS1307
DS1307 là chip thời gian thực hay RTC( Read time clock) Đây là một IC tích hợp cho thời gian bởi vì tính chính xác về thời gian tuyệt đối cho thời gian:
Thứ ngày, tháng , năm, giờ , phút giây.
Hình 2.5 Module DS1307
Sơ đồ chân DS1307
-Hình ảnh sau đây cho thấy hình dạng và sơ đồ chân của IC RTC DS1307 Để giảm công suất tiêu thụ, số lượng chân trên IC phải giảm Do đó, DS1307 RTC sử dụng Giao tiếp I2C.
Trang 11Chức năng các chân của module DS1307
Châ
1 X1 Đây là các chân kết nối với thạch anh tần số 32.768 KHz để kích
hoạt bộ dao động nội
6 SCL Chân đầu vào xung đồng hồ nối tiếp (Serial Clock) Đây là chân ngõ vào xung nhịp của giao thức I2C Chân này cũng phải được
kéo đến 5V thông qua một điện trở 10kΩ.
7 SQW/OUT Ngõ xuất ra xung vuông, tần số có thể lập trình để thay đổi từ 1Hz, 4Khz, 8Khz, 32Khz Nếu không được sử dụng, chân này có
Trang 122.5.Màn hình LCD20x04 I2C
Màn hình LCD 2004 là màn hình 4 dòng, mỗi dòng hiển thị 20 ký tự Màn hình Màn hình LCD 2004 được sử dụng phổ biến trong các ứng dụng: máy photo, máy fax, máy in laser, các thiết bị công nghiệp, thiết bị mạng như router, thiết bị lưu trữ
Với việc kết hợp Màn hình LCD 2004 + Module I2C giúp tiếp kiệm chân trong giao tiếp LCD2004 với Arduino, Raspberry (chỉ 4 pin) Bên cạnh đó sử dụng màn hình LCD2004 tích hợp I2C mang lại tiện lợi khi sử dụng
Hình 2.7 Module LCD 20x04 I2C
Thông số kỹ thuật màn hình LCD 2004 :
Dạng hiển thị: 4 dòng, mỗi dòng 20 ký tự
Dạng hiển thị: ký tự
Màu đèn nền: Màu xanh dương
Góc quan sát rộng với độ tương phản cao
Bên trong tích hợp chip HD44780 cho điều khiển LCD
Trang 13Hình 2.8.Sơ đồ nguyên lý
2.6.Relay 5V
Rơ-le là một công tắc (khóa K) Nhưng khác với công tắc ở một chỗ cơ bản,
rơ-le được kích hoạt bằng điện thay vì dùng tay người.
Hình 2.9 Relay 5V kích ở mức thấp
Khối điều khiển thiết bị điện sử dụng Relay để đóng/ ngắt mạch điện khối công suất này nhận lệnh điều khiển từ vi điều khiển ( Sử dụng điện áp thấp đống mở điện áp cao )
Trang 14Kích thước 50 * 26 * 18.5 mm
2.7.Máy bơm chìm mini
Máy bơm chìm ngang mini 3V-6V bơm ngang được ứng dụng bơm mini công suất nhỏ, phù hợp để tưới cây trong nhà, trong bể cá, hòn non bộ, chế bình rót rượu tự động…
Hinh 2.10 Máy bơm chìm mini
Trang 15Nguyên lý hoạt động của máy bơm chìm :
Máy bơm chìm đẩy nước lên bề mặt bằng cách biến lực đẩy ly tâm từ các bánh công tác thành động lực tạo ra năng lượng áp suất Điều này được thực hiện khi nước được tràn vào bơm: Đầu tiên nước đi vào thông qua của hút, tràn đến buồng bơm nơi các cánh quạt đẩy nước thông qua bộ khuếch tán Từ đó, nước được đẩy lên bề mặt.
Hình 2.11 Minh họa nguyên lý làm viêc
của máy bơm chìm mini
Trang 16CHƯƠNG III: THIẾT KẾ HỆ THỐNG TƯỚI CÂY 3.1 Sơ đồ nối mạch và cách nối dây
-Sơ đồ tổng thể:
Hình 2.13 Sơ đồ nối mạch
Trang 17Hình 2.14 Cách nối dây của cảm biến
đo độ ẩm đất với vi điều khiển
Trang 18-Cảm biến nhiệt độ LM35 và Adruino
Trang 22Máy bơm chìm mini
Trang 233.2 Sơ đồ thuật toán
Trang 24CHƯƠNG IV: LẬP TRÌNH 4.1 Code ardunio
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "RTClib.h"
#define pin_analog A0 //Khai báo cảm biến độ ẩm đất tại chân A0
#define pin_relay 12 //Khai báo relay tắt bật máy bơm tại chân 12
RTC_DS1307 rtc; //Module thời gian thực rtc2307
LiquidCrystal_I2C lcd(0x27,20,4); //Màn hình LCD2004
int sensorPin = A1; //Khai báo cảm biến nhiệt độ tại chân A1
int state1 = 0, state = 0, relay = 0, auto1 = 1; //Biết lưu các lệnh và trường hợp để chạy chương trình long time_now = 0; //Biến thời gian chạy
int do_am_dat, reading; //Biết độ ẩm đất và biến đọc dữ liệu cảm biến nhiệt độ
float voltage, nhiet_do; //Biến nhiệt độ và biến để tính toán chỉ số nhiệt độ
int y, mt, d, h, m, s; //Biến lưu dữ liệu thời gian thực đọc từ module ds1307
int y1 = 0, mt1 = 0, d1 = 0, h1 = 0, m1 = 0, s1 = 0; //Biến lưu thời gian tưới cây lần gần nhất
double TG1 = 7, TG2 = 17, ND1 = 21, ND2 = 27; //Chỉ số điều kiện tưới cây trong chế độ tự động
void setup() {
Serial.begin(9600); //Khởi động Serial 9600
pinMode (pin_analog, INPUT); //Khai báo cổng ra cảm biến độ ẩm đất
pinMode (pin_relay, OUTPUT); //Khai báo cổng vào điều khiển relay
//lcd.init(); //Khởi động màn LCD
//lcd.backlight(); //Bật đèn màn LCD
if (! rtc.begin()) { //Kiểm tra xem rtc đã bật chưa
//lcd.setCursor(0,0);
Trang 25SetCase(); //Chạy các trường hợp đã cài
Change(); //Thay đổi điều kiệu tưới cây trong trường hợp tưới tự động
CheckAuto(); //Kiểm tra chế độ chạy thủ công hay tự động
do_am_dat = analogRead(pin_analog); //Đọc chân A0
reading = analogRead(sensorPin); //Đọc chân A1
DateTime now = rtc.now(); //Đọc thời gian từ module ds1307
y = now.year(); //Đọc năm
mt = now.month(); //Đọc tháng
d = now.day(); //Đọc ngày
h = now.hour(); //Đọc giờ
Trang 26nhiet_do = voltage * 100.0; //Tính toán nhiệt độ qua vol }
void lcdPrint() //Hàm in lên màn hình LCD2004
{
lcd.clear(); //Xóa màn hình
lcd.setCursor(0,0); //In thời gian hiện tại lên màn LCD
if (h<=9) { lcd.print("0"); lcd.print(h, DEC);}
else lcd.print(h, DEC);
lcd.print(':');
if (m<=9) { lcd.print("0"); lcd.print(m, DEC);} else lcd.print(m, DEC);
lcd.print(':');
if (s<=9) { lcd.print("0"); lcd.print(s, DEC);}
else lcd.print(s, DEC);
lcd.print('-');
if (d<=9) { lcd.print("0"); lcd.print(d, DEC);}
else lcd.print(d, DEC);
Trang 27else lcd.print("Dat am");
else {digitalWrite(pin_relay,HIGH); relay = 0;}
} else {digitalWrite(pin_relay,HIGH); relay = 0;}
} else {digitalWrite(pin_relay,HIGH); relay = 0;}
char temp = Serial.read(); //temp nhận lệnh từ phần mềm
if(temp == '0') state = 0; //Xét temp và đặt cho biến state
Trang 28if(temp == 'h') state1 = 8;
if(temp == 'i') state1 = 9;
if(temp == 'j') auto1 = 0; //Xét temp và đặt cho biến auto1
if(temp == 'k') auto1 = 1;
if(temp == 'x') relay = 1; //Xét temp và đặt cho biết relay
if(temp == 'y') relay = 0;
Trang 29Serial.print("|");
if (h<=9) { Serial.print("0"); Serial.print(h, DEC);} //In ra dữ liệu thời gian thực đọc từ ds1307 else Serial.print(h, DEC);
Serial.print(':');
if (m<=9) { Serial.print("0"); Serial.print(m, DEC);}
else Serial.print(m, DEC);
Serial.print(':');
if (s<=9) { Serial.print("0"); Serial.print(s, DEC);}
else Serial.print(s, DEC);
Serial.print('-');
if (d<=9) { Serial.print("0"); Serial.print(d, DEC);}
else Serial.print(d, DEC);
Serial.print('/');
if (mt<=9) { Serial.print("0"); Serial.print(mt, DEC);}
else Serial.print(mt, DEC);
if (m<=9) { Serial.print("0"); Serial.print(m1, DEC);}
else Serial.print(m1, DEC);
Serial.print(':');
if (s<=9) { Serial.print("0"); Serial.print(s1, DEC);}
Trang 30else Serial.print(d1, DEC);
Serial.print('/');
if (mt<=9) { Serial.print("0"); Serial.print(mt1, DEC);}
else Serial.print(mt1, DEC);
}
Trang 31if (auto1 == 1) { //Nếu biến auto1 = 1 thì cho chạy chế độ tự động
Auto(); //Chạy chế độ tưới tự động
} else { //Nếu biến auto1 khác 1 thì chạy chế độ thủ công
if (relay == 1) digitalWrite(pin_relay,LOW); //Nếu biến relay = 1 thì bật máy bơm nước else digitalWrite(pin_relay,HIGH); //Nếu biết relay khác 1 thì tắt máy bơm nước }
Trang 32string SDatas1 = String.Empty; //Chuỗi nhận dữ liệu nhiệt độ từ Serial
string SDatas2 = String.Empty; //Chuỗi nhận dữ liệu độ ẩm từ Serial
string SRealtime = String.Empty; //Chuỗi nhận dữ liệu thời gian thực từ Serial
string SLasttime = String.Empty; //Chuỗi nhận dữ liệu thời gian tưới gần nhất từ Serial
string SStarttime = String.Empty; //Chuỗi nhận dữ liệu thời gian bắt đầu chạy từ Serial
string SAuto = String.Empty; //Chuỗi nhận lệnh chạy tự động hay không
double datas1 = 0; //Biến lưu nhiệt độ
double datas2 = 0; //Biến lưu độ ẩm
double starttime = 0; //Biến lưu thời gian chạy
double auto1 = 0; //Biến lưu chế độ chạy tự động hay thủ công
int status = 0; //Biến dùng để in dữ liệu ra viewList và vẽ đồ thị
string ND1 = String.Empty; //Chuỗi nhận dữ liệu nhiệt độ giới hạn dưới trong chế độ chạy tự động từ Serial
string ND2 = String.Empty; //Chuỗi nhận dữ liệu nhiệt độ giới hạn trên trong chế độ chạy tự động từ Serial
string TG1 = String.Empty; //Chuỗi nhận dữ liệu thời gian giới hạn dưới trong chế độ chạy tự động từ Serial
string TG2 = String.Empty; //Chuỗi nhận dữ liệu thời gian giới hạn trên trong chế độ chạy tự động từ Serial
double nd1 = 0, nd2 = 0, tg1 = 0, tg2 = 0; //Các biến lưu điều kiện nhiệt độ và thời gian để chạy tự động
Trang 33{
InitializeComponent();
getAvailableComPorts(); //Lây các cổng đang có sẵn
disableAuto(); //Vô hiệu hóa chế độ tự động
disableDisplay(); //Vô hiệu hóa hiển thị
checkBox1.Enabled = false; //Vô hiệu hóa chế độ thủ công
foreach (string port in ports)
Trang 34progressBar1.Value = 100; //Cho thanh progressBar bằng 100
Data_Listview(); //Chạy lệnh in dữ liệu ra viewList và vẽ đồ thị
status = 0; //Cho biến Status = 0;
tbND1.Text = ND1; //Hiển thị nhiệt độ giới hạn dưới vào TextBox tbND1
tbND2.Text = ND2; //Hiển thị nhiệt độ giới hạn trên vào TextBox tbND2
tbTG1.Text = TG1; //Hiển thị thời gian giới hạn dưới vào TextBox tbTG1
tbTG2.Text = TG2; //Hiển thị thời gian giới hạn trên vào TextBox tbTG2
textBox1.Text = SRealtime; //Hiển thị thời gian thực vào TextBox1
textBox2.Text = SLasttime; //Hiển thị thời gian tưới cây gần nhất vào TextBox2
if (datas2 > 800) //Nếu chỉ số độ ẩm đất > 800
{
textBox3.Text = "Đất khô!!!"; //Hiển thị đất khô vào TextBox3
textBox3.BackColor = Color.Red; //Đặt màu TextBox3 sang màu đỏ
}
else
{
textBox3.Text = "Đất ẩm"; //Hiển thị đất ẩm vào TextBox3
textBox3.BackColor = Color.Green; //Đặt màu TextBox3 sang màu xanh
SRealtime = arrList[0]; // Chuỗi thời gian thực lưu vào SRealtime
SDatas1 = arrList[1]; // Chuỗi nhiệt độ lưu vào SDatas1
SDatas2 = arrList[2]; // Chuỗi độ ẩm đất lưu vào SDatas2
TG1 = arrList[3]; //Chuỗi thời gian giới hạn dưới vào TG1