8051 Tưới cây tự động dùng vi điều khiển 8051 (ánh sáng, nhiệt độ, độ ẩm). Mô phỏng Proteus + code C.Giao tiêp cảm biếm với 8051: LCD 16x2, cảm biến DHT11, Cảm biến ánh sáng LDR sensorHệ thống tưới cây tự đông dùng vi điều khiển vi xử lý 8051
KHẢO SÁT YÊU CẦU CÔNG NGHỆ
Thiết kế một bộ điều khiển tưới tự động cho khoảng 20 chậu hoa trong nhà, phù hợp với kích thước như trong ảnh, nhằm duy trì độ ẩm cho cây trong thời gian chủ nhà vắng mặt do công tác.
Lưu ý cây cần: ánh sáng và nhu cầu nước theo độ ẩm và nhiệt độ môi trường gồm không khí phòng và đất trong chậu.
Cơ sở thực tiễn của đề tài
Ngày nay, sự phát triển nhanh chóng của các ngành khoa học kỹ thuật, đặc biệt là kỹ thuật điện tử và kỹ thuật số, đóng vai trò quan trọng trong các lĩnh vực như khoa học – kỹ thuật, quản lý và công nghiệp tự động hóa Để góp phần vào sự phát triển chung của nền khoa học – kỹ thuật và kỹ thuật điện tử, chúng ta cần nắm bắt và vận dụng hiệu quả các công nghệ này.
Trong bối cảnh xã hội ngày càng phát triển và nhu cầu thực tế gia tăng, chúng tôi đã nghiên cứu và hoàn thiện mạch đo nhiệt độ, độ ẩm đất và cường độ ánh sáng Sản phẩm này đạt độ chính xác cao, phù hợp với các hệ thống nông nghiệp tự động.
Mục đích nghiên cứu của đề tài
- Đo nhiệt độ: dải đo 0-50 độ C
- Đo độ ẩm: dải đo 20-90%
- Đo cường độ ánh sáng: dải đo 0-1000 LUX
- Vi điều khiển: họ vi điều khiển nhà 8051
- Sử dụng LCD để hiển thị trực tiếp kết quả đo và trạng thái làm việc của thiết bị
Ta có thể xét điều kiện môi trường như sau:
Nhiệt độ lý tưởng cho môi trường là Tset0 độ C, với độ ẩm phù hợp là Hsetp% Để đảm bảo sự phát triển tốt nhất, cường độ ánh sáng cần đạt trên 600 lux, trong đó 600 là giá trị ánh sáng được hiển thị trên cảm biến.
H>70: bật hệ thống hút ẩm ( thông gió)
H600: Tắt hệ thống chiếu sáng
AS600 (Lux): ánh sáng ổn định
Khi độ rọi AS80
- Chỉ số chống thấm: IP66
Thiết bị hút ẩm: Máy hút ẩm công nghiệp Fujie HM-650EB
- Công nghệ hút ẩm: Ngưng tụ lạnh
- Công suất hút ẩm (lít/ngày): 50
- Thể tích bình chứa nước (lít): 6 lít
- Kích thước: 350 mm x 455 mm x 603mm
- Thời gian bảo hành: 24 tháng
- Điện áp sử dụng: 220V/50Hz/1 pha
Dùng bơm tăng áp mini 12V: Sinleader 12V
- Cường độ dòng điện: max 4-7A
- Có trang bị rơ le tự ngắt khi khóa đầu ra
- Dòng điện vào 12v( dùng được với bình ắc quy xe máy hoặc sử dụng đổi nguồn - adapter)
Ngoài ra cần thêm 1 số linh kiện khác như: nút bấm,
VẼ SƠ ĐỒ GHÉP NỐI NGOẠI VI CHO VI ĐIỀU KHIỂN
Sơ đồ ghép nối ngoại vi với vi điều khiển 8051
Khối xử lý trung tâm
- Chân 18,19 mắc với mạch thạch anh 12Mhz ngoài
- Chân 9 (reset) mắc với mạch reset
- Chân 31 (EA) cấp nguồn 5V từ khối nguồn 12/5VDC
- Cổng P1 kết nối với đầu ra của ADC0804 (DB0-DB7)
- Cổng P0: mắc điện trở treo 10kOhm, P0_0 đến P0_2 mắc lần lượt tới 3 chân của LCD 16x2 là RS, RW, EN Từ P0_4 đến P0_7 mắc lần lượt với
Cổng P2: P2_0 kết nối với đầu ra của khối cảm biến nhiệt độ, độ ẩm DHT11
P2_1 đến P2_4 và P3_0 có khả năng kết nối với 5 thiết bị chấp hành, bao gồm đèn sưởi (DS), bơm nước (BOM), quạt thông gió (QUAT), máy hút ẩm (HUTAM) và hệ thống chiếu sáng (CHIEUSANG).
P2_5 đến P2_7: kết nối lần lượt với 3 chân điều khiển của ADC0804 là RD(read), WR(write), INTR(interrupt)
Chân VCC kết nối với nguồn 5V
Các chân DB0-DB7, RD, WR, INTR kết nối với vi điều khiển 8051
Chân CS, AGND, DGND, Vin- nối mass.
Chân Vin+ nối với khối cảm biến ánh sáng
Chân CLK IN, CLK R mắc mới mạch điện trở và tụ điện có giá trị như hình trên.
Cảm biến ánh sáng: dùng quang trở o Chân Vin+ nối với ADC0804
Cảm biến nhiệt độ và độ ẩm DHT11 o Chân VDD nối nguồn 5V, chân GND nối mass o Chân DATA nối đến vi điều khiển 8051, mắc thêm điện trở kéo 4.7kOhmm
- Chân VSS nối mass, chân VDD nối nguồn 5V, chân VEE nối biến trở để điều chỉnh độ tương phản của LCD.
- Các chân RS, RW, E, D4, D5, D6, D7 nối với vi điều khiển 8051
- Chân 5V cấp nguồn cho vi điều khiển và các ngoại vi hoạt động.
- Các chân ra của các relay và thiết bị kết nối với vi điều khiển 8051.
THIẾT LẬP CẤU TRÚC CHƯƠNG TRÌNH TRÊN C
Khai báo thư viện
// khai bao thu vien su dung
Định nghĩa biến
// gan cac chan cua LCD
#define LCD_D4 P0_4 //4 chan du lieu ca0 (D4,D5,D6,D7) cua LCD
#define ADC0804_RD P2_5 // chan doc du lieu: dung de extract du lieu tu thanh ghi trong den ADC0804
#define ADC0804_WR P2_6 // chan ghi du lieu: duoc su dung de bat dau chuyen doi
#define ADC0804_INTR P2_7 // chan ngat: kiem tra qua trinh chuyen doiADC, xuong muc low khi qua trinh chuyen doi hoan tat
#define ADC0804_DATA P1 // cong vao de doc gia tri cua ADC
// gan cam bien DHT11 voi chan P2_1
#define DHT11 P2_0 // gan cam bien DHT11 voi chan P2_1
// gan cac chan cua cac thiet bi khoi chap hanh
#define DS P2_1 // Den suoi chan P2_2
#define BOM P2_2 // He thong bom, tuoi chan P3_2
#define QUAT P2_3 // quat gio chan P2_4
#define HUTAM P2_4 // hut am chan P2_5
#define CHIEUSANG P3_0 // he thog chieu sang
// gan trang thai hoat dong
Đoạn mã trên định nghĩa các biến cần thiết cho việc xử lý dữ liệu cảm biến, bao gồm các biến nguyên và thập phân cho độ ẩm (RH) và nhiệt độ (T) Cụ thể, các biến `I_RH` và `D_RH` lưu trữ giá trị độ ẩm nguyên và thập phân, trong khi `I_Temp` và `D_Temp` lưu trữ giá trị nhiệt độ Biến `CheckSum` được sử dụng để kiểm tra tính toàn vẹn của dữ liệu Các biến `v1`, `v2`, `v3`, `v4` đại diện cho giá trị ánh sáng ở các đơn vị khác nhau, còn `ADC_Value` lưu trữ giá trị đọc được từ bộ chuyển đổi tương tự sang số (ADC) Cuối cùng, biến `as` được khai báo để phục vụ cho các phép toán khác trong chương trình.
Chương trình chính
/* - chuong trinh chinh -*/ void main(void){ unsigned char i; int temp, humi; unsigned char duLieu[20]; // khai bao mang du lieu gom 20 phan tu nguyen duong
EX0=1; // cho phep ngat ngoai 0
EA=1; // cho phep ngat hoat dong
LCD_Init(); // khoi tao LCD
LCD_Puts("wellcome Group1"); delay_ms(1000);
LCD_Puts(" starting "); delay_ms(1000);
Request(); /* 8051 gui xung khoi dong */
I_RH=Receive_data(); /* gia tri do am nguyen luu tai 8 bit dau tien I_RH */
D_RH=Receive_data(); /* gia tri do am phan thap phan luu tai
I_Temp=Receive_data(); /* gia tri phan nguyen nhiet do luu tai
D_Temp=Receive_data(); /* gia tri phan thap phan nhiet do luu tai 8 bit thu 4 D_Temp */
CheckSum=Receive_data(); /* tong 4 gia tri tren luu tai 8 bit cuoi CheckSum */ if ((I_RH + D_RH + I_Temp + D_Temp) != CheckSum) // kiem tra checksum
// hien thi do am LCD_Gotoxy(0,0);
LCD_Puts(" Hum= "); sprintf(duLieu,"%d.%d",I_RH,D_RH);
LCD_Puts(" Tem= "); sprintf(duLieu,"%d.%d",I_Temp,D_Temp);
// hien thi anh sang LDR_Sensor();
// vong lap kiem tra dieu kien moi truong for(i=0;i70){
LCD_Puts(" Hut am: ON"); delay_ms(2000);
LCD_Puts(" Van tuoi: ON"); delay_ms(2000);
LCD_Puts("Hut am, Van: OFF"); delay_ms(2000);
} // nhiet do sprintf(duLieu,"%d",I_Temp); temp = convert(duLieu); sprintf(duLieu,"%d",I_Temp); temp = atoi(duLieu); if(temp>30){
LCD_Puts(" Quat: ON"); delay_ms(2000);
LCD_Puts(" Den suoi: ON"); delay_ms(2000);
LCD_Puts("Quat,DenSuoi:OFF"); delay_ms(2000);
ADC0804_read(); if(as>`0){ // cuong do anh sang >`0 lux thif tat he thong den chieu sang
LCD_Puts("Anh sang on dinh");
LCD_Puts("Chieu sang: OFF"); delay_ms(2000);
} else { // nguoc lai thi bat he thong den chieu sang
LCD_Puts("Thieu anh sang");
LCD_Puts("Chieu sang: ON"); delay_ms(2000);
Chương trình con
/* - cac ham con tao tre -*/
/* ham tao tre us */ void delay_us(unsigned int t){ unsigned int i; for(i=0;i>4); // gui 4 bit DL cao va dich chung sang 4 LCD_Enable();
LCD_Send4Bit(Command); // gui 4 bit DL thap
/* ham xoa man hinh LCD */ void LCD_Clear(){
LCD_SendCommand(0x01); // 0x01: xoa toan bo noi dung tren man hinh delay_us(10);
/* ham khoi tao LCD */ void LCD_Init(){
LCD_Send4Bit(0x00); // bat LCD delay_ms(20);
LCD_Send4Bit(0x03); // function setting
LCD_Enable(); // gui xung kich hoat delay_ms(5);
LCD_Send4Bit(0x02); // di chuyen con tro ve dau man hinh
LCD_SendCommand(0x28); //su dung giao tiep 4bit, hien thi 2 dong, kich thuoc font 5x7
LCD_SendCommand(0x0c); // bat hien thi va bat con tro
LCD_SendCommand(0x06); // tu dong di chuyen con tro den vi tri ke tiep LCD_SendCommand(0x01); //xoa toan bo noi dung dang hien thi tren man hinh
LCD_Gotoxy(unsigned char x, unsigned char y){ // x: la cot, y: la hang unsigned char address; if(!y)address=(0x80+x); else address=(0xc0+x); delay_us(1000);
LCD_SendCommand(address); delay_us(50);
/* ham gui 1 ki tu len LCD */ void LCD_PutChar(unsigned char Data){
LCD_RS=1; // keo chan RS len muc cao => LCD hoat dong o che do ghi
LCD_SendCommand(Data); // gui ra man hinh chuoi Data
LCD_RS=0; // keo chan RS ve muc thap
/* ham gui 1 chuoi du lieu len LCD */ void LCD_Puts(char *s){ while(*s){
/* - chuong trinh giao tiep DHT11 -*/ /* ham gui xung den cam bien DHT11 */ void Request() // 8051 gui xung khoi dong hoac yeu cau toi DHT11
DHT11 = 0; // dat chan du lieu cua DHT11 o muc thap delay_ms(20); // delay 20ms (thoi gian toi thieu la 18ms)
DHT11 = 1; // dat chan du lieu cua DHT11 o muc cao }
/* ham phan hoi tu DHT11 */ void Response(){ while(DHT11==1); // cho chan P2_1 len muc cao while(DHT11==0); //cho chan P2_1 xuong muc thap while(DHT11==1); //cho chan P2_1 len muc cao
/* ham nhan du lieu */ int Receive_data(){ int q,c=0; for (q=0; q=0; i ){ num=num+(s[i]-18)*pow(10,mu); mu++;
// chuong trinh phuc vu ngat ( dung khan cap) void Stop(void) interrupt 0 { // X=0: dung ngat ngoai 0
DS=BOM=QUAT=HUTAM=CHIEUSANG=1;
LCD_Puts(" EMERGENCY STOP"); delay_ms(2000);
// ham doc gia tri tu ADC unsigned char ADC0804_read(){ unsigned char kq;
ADC0804_WR=0; // chan ghi du lieu muc low delay_ms(10); // tre
ADC0804_WR=1; // chan ghi du lieu muc high while(ADC0804_INTR==0); // kiem tra xem ngat o muc high de ket thuc qua trinh chuyen doi
ADC0804_RD=0; // chan doc du lieu ow muc low kqC0804_DATA; // luu ket qua vua doc duoc
ADC0804_RD=1; // chan doc du lieu ow muc low return kq;
// ham chuyen doi BCD (BINARY to DEC) void LDR_Sensor(){
ADC_ValueC0804_read(); as=(ADC_Value-66)*5.291f; // gia tri cuong do chieu sang LUX, 66- 2559, chuyen thang do 189 len thang 1000 v1=as/1000+0x30; // nghin v2=as%1000/100+0x30; // tram v3=as%100/10+0x30; // chuc v4=as%10+0x30; // don vi
XÂY DỰNG LƯU ĐỒ CHO TỪNG HÀM VÀ CODE
Hàm đọc dữ liệu nhiệt độ độ ẩm từ DHT11
Hàm hiển thị giá trị nhiệt độ và độ ẩm ra LCD
Hiển thị cường độ ánh sáng của môi trường
Hàm kiểm tra điều kiện môi trường