Hình 3. 7.Mạch thực tế sau khi thiết kế và chạy thử
Mạch thực tế sau khi thiết kế và chạy thử đã điều khiển đóng ngắt chính xác thiết bịđiện theo thời gian cài đặt.
41
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN ĐỀ TÀI 4.1. Đánh giá kết quả
Trong quá trình thực hiện đề tài em đã tìm hiểu về hệ thống tưới cây tự động. Do vậy em đã tìm hiểu về hệ thống tự động vì nó là cơ sở lý thuyết quan trọng trong đề tài này.
- Tìm hiểu về các hệ thống tưới cây tự động: phân loại, nguyên lý, cách chế tạo…
- Tìm hiểu về vi điều khiển PIC 16F877A, phương pháp sử dụng vi điều khiển PIC để xử lý và hiển thị kết quả trên LCD.
- Thiết kế mạch và viết chương trình cho vi điều khiển, đảm bảo mạch
điều khiển hoạt động tốt
4.2. Hạn chế của đề tài
Do điều kiện có hạn nên đề tài này em chỉ thực hiện ở việc thiết kế ra mạch
điều khiển đóng ngắt thiết bị điện (bơm) theo độẩm.
4.3. Hướng phát triển đề tài
Có thể lập trình lên 3, 4 lần tưới trong ngày thay vì 2 lần tưới hiện tại. Lập trình điều khiển nhiều thiết bị hơn (các van điện từ).
Thiết kế thêm vào hệ thống bộ phận thông báo cho người sử dụng biết được tình trạng của hệ thống (Sử dụng Simcom).
42
TÀI LIỆU THAM KHẢO
[1] TS Nguyễn Trường Giang (2011), Kĩ thuật vi xử lý, NXB: Trường Đại học Giao thông vận tải.
[2] Trần Xuân Trường (2010), Tài liệu sử dụng CCS, NXB: Trường Đại học Bách khoa TP Hồ Chí Minh.
[3] Datasheet PIC 16F877a của Microchip
[4] PGS. TS Hoàng Đức Liên (2007),Thủy lực và cấp thoát nước trong Nông nghiệp, NXB: Trường ĐH Nông Nghiệp.
Danh mục các website tham khảo:
1. http://catalogdatasheet.com
2. http://ccsinfo.com/forum
3. http://dientuvietnam.net
43 PHỤ LỤC Code chương trình File main.h #include <16F877A.h> #device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES BORV21 //Brownout reset at 2.1V
#FUSES NOPUT //No Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES STVREN //Stack full/underflow will cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NOPBADEN //PORTB pins are configured as digital I/O on RESET
#FUSES NOWRTC //configuration not registers write protected #FUSES NOWRTB //Boot block not write protected
#FUSES NOEBTR //Memory not protected from table reads
44
#FUSES NOCPB //No Boot Block code protection
#FUSES LPT1OSC //Timer1 configured for low-power operation #FUSES MCLR //Master Clear pin enabled
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#use delay(clock=20000000)
#use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3)
File chương trình chính main.c #include "main.h"
#include "PIC16F877A_registers.h"
#include "DS1307_interface.c"
#include "dht11.c"
#include <Drive_LCD.c>
#define MODE PIN_C5
#define UP PIN_C6
#define DOWN PIN_C7
#define BOM PIN_C0
unsigned char sec=0,hour=12,min=11,dow=4,day=16,mth=4,year=14;
int8 H_level_1 = 50,H_level_2 = 60,H_level_3 = 70,H_level_4 = 80;
int8 TIMER_RUN_LEVER_1 = 4,TIMER_RUN_LEVER_2 = 3,TIMER_RUN_LEVER_3 = 2,TIMER_RUN_LEVER_4 = 1; int menu= 0; int time = 0; int hour_alarm_first = 6; int min_alarm_first = 0; int hour_alarm_second = 18; int min_alarm_second = 0;
int1 chophep_bom1 = 0,chophep_bom2 = 0;
45
int Thoi_gian_bom(int do_am);
void Dieu_khien_bom(int do_am); void main()
{
char sec1,sec2;
unsigned char dh_nhiet_do,dh_do_am; //float temp; setup_adc_ports(NO_ANALOGS|VSS_VDD); setup_adc(ADC_OFF|ADC_TAD_MUL_0); setup_psp(PSP_DISABLED); setup_spi(SPI_SS_DISABLED); setup_wdt(WDT_OFF); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256); //set_timer0(55770); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
output_low(BOM); lcd_init(); ds1307_init(); ds1307_get_time(hour,min,sec1); delay_ms(2000); ds1307_get_time(hour,min,sec2); if(sec2 == sec1) {
ds1307_set_date_time( day, mth, year, dow, hour, min, sec);
46
printf(lcd_putc,"\fTuoi cay");
delay_ms(1000);
printf(lcd_putc,"\n Tu Dong");
delay_ms(1000);
// TODO: USER CODE!!
while(true) { delay_ms(100); Modify_time(); if(menu == 0) { Dieu_khien_bom(dh_do_am); ds1307_get_time(hour,min,sec); if(DHT_GetTemHumi(&dh_nhiet_do,&dh_do_am)) {
printf(lcd_putc,"\fRH= %u%% T= %uoC",dh_do_am,dh_nhiet_do);
printf(lcd_putc,"\n %u:%u:%u ",hour,min,sec);
}
}
else if(menu == 1)
{
printf(lcd_putc,"\f chinh gio ");
printf(lcd_putc,"\n %u:%u ",hour,min);
}
else if(menu == 2)
{
printf(lcd_putc,"\f chinh phut ");
printf(lcd_putc,"\n %u:%u ",hour,min);
47
else if(menu == 3)
{
printf(lcd_putc,"\f Gio tuoi 1 ");
printf(lcd_putc,"\n %u:%u ",hour_alarm_first,min_alarm_first);
}
else if(menu == 4) {
printf(lcd_putc,"\f Phut tuoi 1 ");
printf(lcd_putc,"\n %u:%u ",hour_alarm_first,min_alarm_first);
}
else if(menu == 5)
{
printf(lcd_putc,"\f Gio tuoi 2 ");
printf(lcd_putc,"\n %u:%u ",hour_alarm_second,min_alarm_second);
}
else if(menu == 6)
{
printf(lcd_putc,"\f Phut tuoi 2 ");
printf(lcd_putc,"\n %u:%u ",hour_alarm_second,min_alarm_second);
} else if(menu == 7) { printf(lcd_putc,"\f Muc do am 1 "); printf(lcd_putc,"\n %u ",H_level_1); } else if(menu == 8) {
printf(lcd_putc,"\fThoi gian chay 1 ");
48 } else if(menu == 9) { printf(lcd_putc,"\f Muc do am 2 "); printf(lcd_putc,"\n %u ",H_level_2); } else if(menu == 10) {
printf(lcd_putc,"\fThoi gian chay 2 ");
printf(lcd_putc,"\n %u ",TIMER_RUN_LEVER_2); } else if(menu == 11) { printf(lcd_putc,"\f Muc do am 3 "); printf(lcd_putc,"\n %u ",H_level_3); } else if(menu == 12) {
printf(lcd_putc,"\fThoi gian chay 3 ");
printf(lcd_putc,"\n %u ",TIMER_RUN_LEVER_3); } else if(menu == 13) { printf(lcd_putc,"\f Muc do am 4 "); printf(lcd_putc,"\n %u ",H_level_4); } else if(menu == 14) {
49 printf(lcd_putc,"\n %u ",TIMER_RUN_LEVER_4); } } } void Modify_time(void) { if(input(MODE)== 0) { delay_ms(100); if(input(MODE)== 0) { menu ++; if(menu == 15) menu = 0; } } if(input(UP)== 0) { while(!input(UP));
if(menu == 1)// chinh gio
{
hour++;
if(hour == 24) hour = 0;
}
else if(menu == 2)// chinh phut
{
min++;
if(min == 60) min = 0;
}
50
{
hour_alarm_first ++;
if(hour_alarm_first == 24) hour_alarm_first = 0;
}
else if(menu == 4)// chinh phut hen thu nhat
{
min_alarm_first ++;
if(min_alarm_first == 31) min_alarm_first = 0;
}
else if(menu == 5) // chinh gio hen thu 2
{
hour_alarm_second ++;
if(hour_alarm_second == 24) hour_alarm_second = 0;
}
else if(menu == 6) // chinh phut hen thu 2
{
min_alarm_second ++;
if(min_alarm_second == 31) min_alarm_second = 0;
}
else if(menu == 7) // chinh do am khong che 1
{ H_level_1 ++; if(H_level_1 == 100) H_level_1 = 0; } else if(menu == 8) { TIMER_RUN_LEVER_1++; if(TIMER_RUN_LEVER_1== 30) TIMER_RUN_LEVER_1 = 0; }
51
else if(menu == 9) // chinh do am khong che 2
{ H_level_2 ++; if(H_level_2 == 100) H_level_2 = 0; } else if(menu == 10) { TIMER_RUN_LEVER_2++; if(TIMER_RUN_LEVER_2== 30) TIMER_RUN_LEVER_2 = 0; }
else if(menu == 11) // chinh do am khong che 3
{ H_level_3 ++; if(H_level_3 == 100) H_level_3 = 0; } else if(menu == 12) { TIMER_RUN_LEVER_3++; if(TIMER_RUN_LEVER_3== 30) TIMER_RUN_LEVER_3 = 0; }
else if(menu == 13) // chinh do am khong che 4
{ H_level_4 ++; if(H_level_4 == 100) H_level_4 = 0; } else if(menu == 14) { TIMER_RUN_LEVER_4++; if(TIMER_RUN_LEVER_4== 30) TIMER_RUN_LEVER_4 = 0;
52
}
ds1307_set_date_time( day, mth, year, dow, hour, min, sec); }
if(input(DOWN)== 0)
{
while(!input(DOWN)); if(menu == 1)// chinh gio
{
hour--;
if(hour == 255) hour = 23;
}
else if(menu == 2)// chinh phut
{
min--;
if(min == 255) min = 59;
}
else if(menu == 3)// chinh gio hen thu nhat
{
hour_alarm_first --;
if(hour_alarm_first == 255) hour_alarm_first = 0;
}
else if(menu == 4)// chinh phut hen thu nhat
{
min_alarm_first --;
if(min_alarm_first == 255) min_alarm_first = 30;
}
else if(menu == 5) // chinh gio hen thu 2
{
53
if(hour_alarm_second == 255) hour_alarm_second = 23;
}
else if(menu == 6) // chinh phut hen thu 2
{
min_alarm_second --;
if(min_alarm_second == 255) min_alarm_second = 30; }
else if(menu == 7) // chinh do am khong che 1
{ H_level_1 --; if(H_level_1 == 255) H_level_1 = 100; } else if(menu == 8) { TIMER_RUN_LEVER_1--; if(TIMER_RUN_LEVER_1== 255) TIMER_RUN_LEVER_1 = 30; }
else if(menu == 9) // chinh do am khong che 2
{ H_level_2 --; if(H_level_2 == 255) H_level_2 = 100; } else if(menu == 10) { TIMER_RUN_LEVER_2--; if(TIMER_RUN_LEVER_2== 255) TIMER_RUN_LEVER_2 = 30; }
else if(menu == 11) // chinh do am khong che 3
54 H_level_3 --; if(H_level_3 == 255) H_level_3 = 100; } else if(menu == 12) { TIMER_RUN_LEVER_3--; if(TIMER_RUN_LEVER_3== 255) TIMER_RUN_LEVER_3 = 30; }
else if(menu == 13) // chinh do am khong che 4
{ H_level_4 --; if(H_level_4 == 255) H_level_4 = 100; } else if(menu == 14) { TIMER_RUN_LEVER_4--; if(TIMER_RUN_LEVER_4== 255) TIMER_RUN_LEVER_4 = 30; }
ds1307_set_date_time( day, mth, year, dow, hour, min, sec);
}
}
int Thoi_gian_bom(int do_am)
{ int time_run; if(do_am <H_level_1) { time_run = TIMER_RUN_LEVER_1; }
55
{
time_run = TIMER_RUN_LEVER_2; }
else if(do_am <H_level_3)
{
time_run = TIMER_RUN_LEVER_3; }
else if(do_am <H_level_4)
{ time_run = TIMER_RUN_LEVER_4; } else { time_run = 0; } return(time_run); }
void Dieu_khien_bom(int do_am)
{
if(chophep_bom1 == 0||chophep_bom2 == 0)
{
time = Thoi_gian_bom(do_am);
}
if(hour == hour_alarm_first && min == min_alarm_first)
{
chophep_bom1 = 1;
}
if(hour == hour_alarm_second && min == min_alarm_second)
56 chophep_bom2 = 1; } if(chophep_bom1 == 1) { if(min <= min_alarm_first+time) { output_high(BOM); } else { chophep_bom1=0; output_low(BOM); } } if(chophep_bom2 == 1) { if(min <= min_alarm_second+time) { output_high(BOM); } else { chophep_bom2=0; output_low(BOM); } } } File DHT11.h
57
#define DHT_DATA_IN PORTA0
#define DHT_DATA_OUT LATA0
#define DHT_DDR_DATA TRISA0
/******************************************
/* Kieu So Nguyen Co Dau */ #ifndef __DHT11_H
#define __DHT11_H
typedef int1 bit;
typedef int int8_t;
typedef long int16_t;
typedef long long int32_t;
/* Kieu So Nguyen Khong Dau */
typedef unsigned int uint8_t;
typedef unsigned long uint16_t;
typedef unsigned long long uint32_t;
/* Kieu So Thuc */
typedef float float32_t;
#define DHT_ER 0
#define DHT_OK 1
/*******************************************************************************
Noi Dung : Kiem tra dap ung cua DHT11 sau yeu cau chuyen doi.
Tham Bien : Khong.
Tra Ve : DHT_ER: Dap ung cua DHT bi loi.
DHT_OK: Dap ung cua DHT thanh cong.
********************************************************************************/
//uint8_t DHT_IsOk(void);
Noi Dung : Doc 1 byte du lieu tu DHT11.
58
Tra Ve : 1 byte du lieu.
*******************************************************************************/ uint8_t DHT_ReadByte(void);
/*******************************************************************************
Noi Dung : Doc 1 khung du lieu tu DHT11 gui ve.
Tham Bien : array: mang so nguyen 8 bit luu tru khung du lieu. Tra Ve : - DHT_OK: Neu DHT va MCU gui du lieu thanh cong.
- DHT_ER: Neu DHT va MCU gui du lieu that bai.
*******************************************************************************/
Noi Dung : Doc gia tri nhiet do, do am tu DHT.
Tham Bien : *tem: con tro luu tru gia tri nhiet do.
*humi: con tro luu tru gia tri do am.
Tra Ve : - DHT_OK: Neu do nhiet do,do am thanh cong.
- DHT_ER: Neu do nhiet do, do am xay ra loi.
*******************************************************************************/
Noi Dung : MCU gui yeu cau chuyen doi den DHT11.
Tham Bien : Khong.
Tra Ve : Khong.
********************************************************************************/
#include "dht11.h"
uint8_t DHT_GetTemHumi (uint8_t *tem,uint8_t *humi)
{
uint8_t buffer[5]={0,0,0,0,0};
uint8_t ii,i,checksum;
DHT_DDR_DATA=0; // set la cong ra
DHT_DATA_OUT=1;
delay_us(60);
DHT_DATA_OUT=0;
59
DHT_DATA_OUT=1;
//delay_us(40); // doi DHT dap ung trong vong 20us-40us DHT_DDR_DATA=1;
delay_us(60);
if(DHT_DATA_IN)return DHT_ER ;
else while(!(DHT_DATA_IN)); //Doi DaTa len 1 delay_us(60);
if(!DHT_DATA_IN)return DHT_ER;
else while((DHT_DATA_IN)); //Doi Data ve 0
//Bat dau doc du lieu
for(i=0;i<5;i++)
{
for(ii=0;ii<8;ii++)
{
while((!DHT_DATA_IN));//Doi Data len 1
delay_us(50);
if(DHT_DATA_IN)
{
buffer[i]|=(1<<(7-ii));
while((DHT_DATA_IN));//Doi Data xuong 0
} } } checksum=buffer[0]+buffer[1]+buffer[2]+buffer[3]; //DHT_DDR_DATA=DDROUT; //DHT_DATA_OUT=1; if((checksum)!=buffer[4])return DHT_ER; *tem = buffer[2]; *humi = buffer[0];
60
return DHT_OK;