0 0 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 10 9 8 7 6 5 4 3 2 1 10 9 8 7 6 5 4 3 2 1 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 0 0 6 5 4 3 2 1 10 9 8 7
Hình 38: Mạch điện điều khiển của Keyboard và LCD
3.4. Xây dựng phần mềm nhúng điều khiển cho hệ thống
3.4.1. Xây dựng phần mềm nhúng điều khiển cho mạch Slave dùng
Atmega8 3.4.1.1. Sơ đồ hoạt động Cảm biến Master Slave UART uC Atmega8 EXT_INT0 Rx Hỏi Tx
Hình 40: Sơ đồ khối hoạt động của mạch Master Slave Slave Rx Tx Master LCD Keyboard Tải uC Atmega128 Usart0 Usart1 Timer0 Timer1
3.4.2.2. Giải thích hoạt động
Trong chƣơng trình Account và Password đƣợc đặt là “123”. Sau khi ngƣời sử dụng nhập password vào từ keyboard và login vào đƣợc hệ thống, hệ thống hoạt động. Atmega128 luôn gửi tín hiệu quét hỏi slave thông qua Usart0_Tx. Khi sensor nhận đƣợc tín hiệu trong khu vực quét có ngƣời nó gửi tín hiệu đến ngắt ngoài của slave, tiếp đó slave gửi tín hiệu tới master thông qua Usart0_Rx của Atmega128. Khi nhận dữ liệu xong lúc này DATA_flag có giá trị là True, Usart1 nhận tín hiệu vào Master. Khi Master đã nhận đƣợc dữ liệu nó điều chỉnh điện áp ra để đóng Rơle điện cho đèn sáng, đèn sáng trong vòng 30 giây, đồng thời dữ liệu trong Master đƣợc xóa và công việc quét hỏi lại tiếp tục.
3.5. Kết quả và khả năng ứng dụng của hệ thống 3.5.1. Tính khoa học 3.5.1. Tính khoa học
Thế kỷ 20 - 21 là thế kỷ của Thông Tin Điện tử - Viễn Thông, là nền tảng quan trọng trong việc điều khiển tự động hóa phù hợp với xu hƣớng phát triển khoa học kỹ thuật.
Đề tài thể hiện tính ứng dụng đa năng trong kỹ thuật vi điều khiển.
Ngoài ra đề tài còn sử dụng phần mềm hiện đại CodeVisionAVR để xây dựng phần mềm nhúng cho bo mạch.
3.5.2. Khả năng triển khai ứng dụng vào thực tiễn
Mục tiêu của đề tài này là nghiên cứu, thiết kế và chế tạo bo mạch điện tử ứng dụng trong tự động hóa và xây dựng phần mềm điều khiển cho bo mạch nêu trên để điều khiển bật/tắt đèn chiếu sáng và điều khiển đóng ngắt các thiết bị điện dân dụng khác một cách tự động nhằm tạo sự tiện dụng cho con ngƣời và tiết kiệm năng lƣợng.
Hệ thống có khả năng điều khiển đƣợc nhiều bóng đèn. Tuy nhiên, đề tài này chỉ làm trên mô hình cho nên tôi chỉ đƣa ra điều khiển 1 bóng đèn mà thôi.
Hệ thống này tôi xây dựng để điều khiển bật/ tắt đèn chiếu sáng tự động, trên cơ sở này có thể phát triển mở rộng để điều khiển bật/ tắt các thiết bị điện khác.
những khu vực không cần chiếu sáng liên tục nhƣ cầu thang, hành lang, nhà vệ sinh và các khu vực khác mà không cần bật/ tắt đèn chiếu sáng. Điều này đem lại sự tiện dụng, thoải mái trong đời sống sinh hoạt của con ngƣời, đồng thời một lợi ích to lớn khác là tiết kiệm đƣợc năng lƣợng điện chiếu sáng góp phần vào công cuộc tiết kiệm tiêu thụ năng lƣợng điện toàn cầu.
Hơn nữa về tính khả thi trong tƣơng lai, đề tài mang tính kích thích thúc đẩy sự phát triển của ngành Công nghệ Điện tử Việt Nam. Từ đó góp phần xây dựng đất nƣớc ngày càng phồn vinh.
Hiện nay công nghệ tự động hóa đang đƣợc rất nhiều nhà khoa học quan tâm nghiên cứu cũng nhƣ nhu cầu sử dụng các sản phẩm đƣợc tích hợp công nghệ tự động hóa của ngƣời dân.
Luận văn đã trình bày đƣợc nhu cầu sử dụng các hệ thống điều khiển thông minh trong các tòa nhà, giới thiệu về một số phân hệ đƣợc sử dụng trong tòa nhà thông minh, những khái niệm về giao thức và chuẩn truyền thông sử dụng trong hệ thống điều khiển các phân hệ của tòa nhà thông minh. Đặc biệt luận văn đã trình bày việc thiết kế hệ thống điều khiển bật/ tắt đèn chiếu sáng trong tòa nhà cao tầng, cụ thể nhƣ:
Thiết kế các mạch điện tử sử dụng vi điều khiển Atmega8 và
Atmega128 trong hệ thống.
Thiết lập giao tiếp theo chuẩn RS485 giữa các mạch điện tử.
Sử dụng phần mềm CodeVisionAVR để xây dựng phần mềm nhúng
cho các mạch.
Sử dụng cảm biến JS-20 Largo Pir.
Qua đề tài này, học viên mong muốn nắm bắt đƣợc nền tảng kiến thức về lập trình cho vi điều khiển Atmega128, Atmega8 cũng nhƣ họ vi điều khiển AVR, đồng thời nắm bắt đƣợc kỹ thuật thiết kế mạch điện tử để ứng dụng vào điều khiển tự động hóa. Công nghệ mới luôn luôn phát triển không ngừng và có tính kế thừa, vì vậy việc nghiên cứu, cập nhật kiến thức để làm chủ thiết bị hiện đại là hết sức cần thiết.
[6]Trƣờng Đại học Giao thông Vận tải (2001), Các loại cáp mạng.
[7]Trƣờng ĐH Giao thông Vận tải (2001), Thiết kế môn học Mạng máy tính
và số liệu.
[8] Nguyễn Thúy Vân (1997), Kỹ thuật số, KHKT Hà Nội.
Tiếng Anh
[9] Gilbert Held (2003), Ethernet Networks: Design, Implementation,
Operation, Management, John Wiley & Sons, Ltd.
[10] Robert C, Elsenpeter Toby J. Velte (2003), Build Your Own Smart
Home
[11] F. H. Mitchell (1988), Introduction to Electronics Design, Printice Hall
[12] Kenvin Gilligan (2003), Honeywell Engineering Manual of Automatic
Control for Commercial Buildings
[13] John, Wiley (2005), RFID HandBook
Website: [14] http://en.wikipedia.org/wiki/Building_Management_System [15] http://www.ameco.com.vn/dch-v/38-dch-v/122-bms-giai-phap-tiet- kiem-nang-luong-trong-toa-nha.html [16] http://www.pcworld.com.vn/articles/quan-ly/giai-phap-cong- cu/2009/06/1194171/phat-trien-rfid-tai-viet-nam/ [17]www.atmel.com
Hình 41: Hình ảnh của hệ thống
Phần mã nguồn các phần mềm nhúng điều khiển cho các mạch
1- Phần mã nguồn điều khiển cho mạch Master Chip type : ATmega128
Program type : Application Clock frequency : 16.000000 MHz Memory model : Small
External SRAM size : 0 Data Stack size : 1024
*****************************************************/ #include <mega128.h> #include <delay.h> #include "lcdcustom.c" #include "sw.h" #include "LcdCommand.h" #include "acc.h" #define TX_MODE 1 #define RX_MODE 0
#define RS485_N0_DIR PORTD.7
#define MAX_SID 3 // Max slave IDs #define QUERY_TIMER 1 // N
#define TIMER QUERY_TIMER*10 // N x 16ms // Defines
#define FID_NO 1 #define A_LENGHT 13
unsigned char Dulieu_Floor[A_LENGHT]={'{','O','K',FID_NO,0,0,0,0,0,0,0,0,'}'}; unsigned int count=0;
unsigned char SID_NO; // IDs of Slave 0 -> 31
unsigned char FRAME_Length; // Length of receive frame
#define MAX_LENGTH 20 // Define max length of receive buffer unsigned char R_Buffer[MAX_LENGTH]; // Receive buffer for Slave IDs data union Long_Bytes
{
unsigned long DL_LONG;
unsigned char DL_BYTE[4]; } DULIEU;
bit DATA_Flag=FALSE; // Transmit to master when DATA ready #define UDRE0 UCSR0A.5
#define RXC0 UCSR0A.7 // Declare your global variables here
extern unsigned char STATE_MACHINE; extern flash byte coltech_0[8];
extern flash byte coltech_1[8]; extern flash byte coltech_2[8]; extern flash byte coltech_3[8]; extern flash byte coltech_4[8]; extern flash byte coltech_5[8]; void main(void)
{
while (1) {
// Place your code here switch(STATE_MACHINE) {
case ACC_LOGIN_STATE: ACC_LOGIN_ACTION(); break;
case PASS_LOGIN_STATE: PASS_LOGIN_ACTION(); break;
case CHECK: CHECK_ACTION(); break;
case MONITER: MONITER_ACTION(); break;
} };
}
//=======================================================
// Alphanumeric LCD Module functions #asm
.equ __lcd_port=0x18 ;PORTB #endasm
#include <lcd.h> void Init_uC() { #asm("cli")
PORTA=0xFF; DDRA=0xFF;
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00; DDRB=0x00; // Port C initialization PORTC=0xFF; DDRC=0xFF; // Port D initialization PORTD=0xFF; DDRD=0xFF; // Port E initialization PORTE=0xFF; DDRE=0xCF; // Port G initialization PORTG=0x1F; DDRG=0x1F; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 15.625 kHz // Mode: Normal top=FFh // OC0 output: Disconnected ASSR=0x00;
TCCR0=0x07; TCNT0=0x82; // 5 OCR0=0x00;
// Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 62.500 kHz // Mode: Normal top=FFFFh // OC1A output: Discon.
OCR1BH=0x00; OCR1BL=0x00; OCR1CH=0x00; OCR1CL=0x00;
// Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh
// OC2 output: Disconnected TCCR2=0x00;
TCNT2=0x00; OCR2=0x00;
// Timer/Counter 3 initialization // Clock source: System Clock
// Clock value: 15.625 kHz // Mode: Normal top=FFFFh // Noise Canceler: Off
// Input Capture on Falling Edge // OC3A output: Discon.
// OC3B output: Discon. // OC3C output: Discon.
// Timer 3 Overflow Interrupt: On // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off // Compare C Match Interrupt: Off
TCCR3A=0x00; TCCR3B=0x05; TCNT3H=0x00; TCNT3L=0x00; ICR3H=0x00; ICR3L=0x00; OCR3AH=0x00; OCR3AL=0x00; OCR3BH=0x00; OCR3BL=0x00; OCR3CH=0x00; OCR3CL=0x00;
// External Interrupt(s) initialization // INT0: Off
// INT1: Off // INT2: Off // INT3: Off // INT4: On
// INT4 Mode: Faling Edge // INT5: Off // INT6: Off // INT7: Off EICRA=0x00; EICRB=0x03; EIMSK=0x10; EIFR=0x10; // USART0 initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity // USART0 Receiver: On
// USART0 Transmitter: On // USART0 Mode: Asynchronous // USART0 Baud rate: 38400
UCSR1B=0xD8; UCSR1C=0x06;
UBRR1H=0x00;
UBRR1L=0x19;
// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x05;
ETIMSK=0x00;
// Analog Comparator initialization // Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80;
SFIOR=0x00;
// LCD module initialization lcd_init(20);
// Global enable interrupts #asm("sei")
}
//========================================================== // USART0 Transmitter interrupt service routine
interrupt [USART0_TXC] void usart0_tx_isr(void) {
To_SLAVE(); }
//========================================================== // Interrupt to get slave data
// USART0 Receiver interrupt service routine
interrupt [USART0_RXC] void usart0_rx_isr(void) {
static bit FRAME_flag = FALSE; static unsigned char byte_no = 0; unsigned char c; c=UDR0; if(c=='{') { byte_no=0; FRAME_flag=TRUE; } if(FRAME_flag) { R_Buffer[byte_no]=c; if(c=='}') { FRAME_flag=FALSE;
if((R_Buffer[1]=='O') & (R_Buffer[2]=='K')) { FRAME_Length=byte_no+1; //RS485_DATA_ToSend(R_Buffer[3]); DATA_Flag=TRUE; } } else { byte_no++; } } } //==========================================================
if(c!=CHECK_OK[byte_no]) byte_no=0; else { byte_no++; } } else { Command=c; byte_no=0; if(Command=='?') { if(DATA_Flag) To_MASTER(); } } } //======================================================= // Request slave data
#define Q_LENGHT 4
unsigned char QUESTION[Q_LENGHT]={'O','K',0xff,'?'}; void To_SLAVE()
{
static unsigned char byte_no = 0; if(byte_no<Q_LENGHT)