5. Phương pháp nghiên cứu
5.7.2. Lắp đặt module báo khói
Hình 5.28. Cháy dữ dội tại một tòa nhà
Module báo khói được lắp đặt trên các hành lang, cầu thang bộ, hộp kỹ thuật và trong các phòng của các căn hộ. Module báo khói cần nguồn nuôi 12V DC, được nối với PIC bằng 2 sợi dây, để cung cấp cho PIC tín hiệu có khói hay không. Riêng đối với thang máy, mỗi thang cần một module trung tâm và module báo khói gắn với trung tâm này. Các module báo khói được lắp đặt ở trên trần, giữa phòng, cách quạt trần ít nhất 1 m.
5.7.2.1. Lắp đặt module báo khói ở hành lang (hình 5.29)
Mỗi module cách nhau 9.5 m.
5.7.2.2. Lắp đặt module báo khói ở trong phòng ở hoặc phòng làm việc.
Trong phòng ở (hình 5.30): lắp tất cả các phòng ngủ, phòng khách. Trong sảnh: lắp gần phòng ngủ. Không lắp ở bếp, phòng tắm, phòng ăn, phòng giặt, là quần áo.
Hình 5.30. Sơ đồ bố trí vị trí lắp đặt cảm biến khói trong phòng ở
Trong phòng làm việc (hình 5.31):
CHƢƠNG 6
KẾT LUẬN VÀ HƢỚNG PHÁT TRIỂN 6.1. Các kết quả đạt đƣợc
Về mặt lý thuyết:
- Nắm được kiến thức tổng quan về cảm biến độ ẩm và cảm biến khói;
- Nắm được kiến thức cơ bản về truyền thông không dây và hệ truyền tin GSM;
- Nắm và sử dụng được các vi điều khiển PIC, ARM;
- Nắm và sử dụng được các phần mềm: thiết kế mạch Protel 99se, lập trình điều khiển Keil ARM, lập trình điều khiển PIC MPLAB.
Về mặt thực nghiệm:
Đã đạt được các mục tiêu đề ra cho đề tài như: - Đo được độ ẩm, phát hiện được có khói hay không;
- Truyền kết quả về trung tâm bằng công nghệ không dây ISM;
- Hiển thị kết quả đo độ ẩm và có khói hay không có khói lên màn hình LCD;
- Khi độ ẩm vượt quá ngưỡng cho phép, hay khi có khói thì hệ thống phát tín hiệu còi, gửi tin nhắn SMS cảnh báo tới một số điện thoại di động bằng mạng GSM.
6.2. Các kết quả chƣa đạt đƣợc
Do khối lượng kiến thức để xây dựng hệ thống cảnh báo môi trường trong tòa nhà lớn, gồm cả phần cứng và phần mềm. Do mất nhiều thời gian xây dựng, vận hành hệ thống dẫn đến thời gian kiểm thử độ tính ổn định của hệ thống đi vào thực tiễn chưa được nhiều, khoảng cách truyền chưa đạt đến 30 m, thời gian truyền một bản tin với khoảng cách từ 15m trở lên lớn (từ 5 đến 10 giây). Nếu để thời gian giữa 2 lần đo độ ẩm là 1 phút, sử dụng yêu cầu ngắt (interrupt request) để phục vụ báo khói, đặt PIC ở chế độ ngủ (sleep mode) khi không làm việc, chỉ truyền tin về trung
tâm khi có thông số vượt ngưỡng sẽ tiết kiệm được năng lượng pin gắn với khối PIC hơn nữa.
6.3. Khó khăn gặp phải trong quá trình làm luận văn
Khối lượng tài liệu tham khảo lớn, để thiết kế mạch sao cho tối ưu phải lựa chọn các chip phù hợp với chi phí và yêu cầu. Các phần mềm điều khiển nhiều khi phát sinh lỗi do lỗi bảo mật và bản quyền. Chất lượng của linh kiện không đảm bảo do sản xuất tại Trung Quốc, mua số lượng ít, gây nhiều khó khăn trong quá trình kiểm thử. Khoảng cách truyền dẫn, độ nhạy của module nRF24L01 không như tài liệu của hãng công bố.
6.4 Định hƣớng phát triển trong tƣơng lai
Hoàn thiện các chức năng đã xây dựng, làm tăng khoảng cách truyền tin, độ nhạy, độ ổn định của hệ thống để đưa sản phẩm sớm áp dụng trong các tòa nhà.
DANH MỤC TÀI LIỆU THAM KHẢO
[1] Denes K. Roveti,July 1, 2001. Choosing a Humidity Sensor: A Review of Three Technologies.
[2] Jack Ganssle, Micheal Barr, Embedded System Dictionary, CMP Books, 2003. [3] Micheal Barr, Anthony Massa, 2nd Edition, O'Reilly Media, October 1, 2006, Programming Embedded Systems: with C and GNU Development tools,
[4] Monson, Heidi,SysOpt.com. Retrieved 17 February 2009. "Bluetooth echnology and Implications".
[5] Preeti Jain, Humididy sensor.
[6] Ryan Hunter and Dan Miller, Spring, 2011, GPS Waypoint Navigation via Head Mounted Vibrotactor.
[7] ARM, Processors, http://arm.com/products/processors/index.php, 2010. [8] HC Serial Bluetooth Product.
[9] HD44780 datasheet. [10] HS1101 Data Sheet.
[11] Keil ARM, Advantages of the µVision IDE for ARM. [12] nRF24L01P_Product_Specification_1_0.
[13] PIC16F683 Data Sheet.
[14] SIM908_AT Command Manual_V1.01.
[15] SIM908 Reference Design Guide Application note V1.00.
[16] STM32F103xC STM32F103xD STM32F103xE CD00191185.pdf.
[17] STM32F101xx, STM32F102xx and STM32F103xx low-power modes.pdf. [18]. Wireless Sensor Networks Research Group. Sensor-networks.org. 2008-11-17. Retrieved 2012-10-18.
[19] Yun Yang YSD-30L datasheet.
[20] Tài liệu ARM-Cortex M3 STM32F103x: http://www.st.com/. [21] PGS.TS Nguyễn Đình Tiến, "Độ ẩm và sức khỏe con người". [22] ] Trần Thành Vinh – THCNKSCLC K53, Đồ án tốt nghiệp. [23] http://en.wikipedia.org/wiki/Short_Message_Service.
[24] http://en.wikipedia.org/wiki/ZigBee. [25] http://quocnam.com.vn/news/nguyen-ly-hoat-dong-cua-thiet-bi-bao-chay. [26] http://tech.vietfuji.com/2013/02/short-range-wireless-technologies. [27] http://vi.wikipedia.org/wiki/Wi-Fi. [28] https://www.osha.gov/SLTC/etools/evacuation/fire_detection.html. [29] http://www.ufba.org.nz/brigade/greytown_volunteer_fire_brigade/page/1340.
PHỤ LỤC
1. Phần mềm điều khiển module trung tâm (ARM)
/******************************************************************* ***********
* @file main.c
* @author Pham Anh Vu * @version V3.5.0
* @brief Main program body ******************************************************************* *********** */ #include <stm32f10x.h> /* Includes ---*/ #include <stdio.h> /* standard I/O .h-file */ #include "main.h" #include "lcd.h" #include "simcom.h" #include "rcc.h" #include "gpio.h" #include "nvic.h" #include "uarts.h" #include "delay.h" #include "nrf24l01.h" #include "reprintf.h" #include "string.h" /* Private typedef ---*/ int counter1; int counter2; //char a[50],ch; /* Private macro ---*/
/* Private variables ---*/ uint8_t hum_seach(uint16_t frq);
void mesg_analys(void);
//================================ uint8_t RxBuffer1[1000];
__IO uint16_t RxCounter1 = 0x00; uint8_t RxBuffer2[1000];
__IO uint16_t RxCounter2 = 0x00; uint32_t MiliSec; uint32_t Humi_Counter=0; uint8_t LCD_Menu_Pos=0; uint8_t LCD_Menu_Flag=1; uint32_t SysDelay=0; char Alarm=0; char Alarm_msg=0;
char message_smk[50]="canh bao bao chay modul 0\x0"; char message_hum[50]="canh bao do am 000% modul 0\x0"; // 012345678901234567890123456
// char message[50]="canh bao do am hoac bao chay\x0"; char PhoneNumber[50]="0913097868\x0";
void Init(void) {
SystemInit();
/* System clocks configuration ---*/ //---
/* Setup SysTick Timer for 1 millisec interrupts, also enables Systick and Systick-Interrupt */
if (SysTick_Config(SystemCoreClock / 1000)) {
/* Capture error */ while (1);
} RCC_Configuration(); /* NVIC configuration ---*/ NVIC_Configuration(); /* GPIO configuration ---*/ GPIO_Configuration(); sim_hardwareconfig(); /* initialize ADC */ lcd_Init(); } /**
* @brief Main program * @param None
* @retval None */
extern uint16_t humi[]; extern uint8_t smk[]; unsigned char RxBuf[32]; uint8_t index=1;
uint16_t ms_delay=0;
//unsigned char TxBuf[32]="THU NGHIEM GUI THONG TIN RF \r\n"; unsigned char TxBuf[32]="request slave?\r\n";
uint8_t alm_smk_status[2]; uint8_t alm_hum_status[2]; uint8_t alm_hum[2]; uint8_t alm_smk[2]; int main(void) { Init(); lcd_Clear();
lcd_GotoXY(0,0); BEEP_UP(); delay_ms(500); BEEP_DOWN(); GSM_POW_DOWN(); LCD_Menu_Flag=1; PowerUpSIMCOM(); delay_ms(3000); simcom_init(); SignalReport(); BEEP_UP(); delay_ms(500); BEEP_DOWN(); delay_ms(11000); BEEP_UP(); delay_ms(500); BEEP_DOWN(); / init_NRF24L01(); SetRX_Mode(); lcd_GotoXY(0,0); printf("System TXMODE ");
alm_smk_status[0]=0; // clear alm status alm_hum_status[0]=0;
alm_smk_status[1]=0; alm_hum_status[1]=0; while (1)
if(Alarm) {
if(Alarm_msg==0) {
Alarm_msg=5; // 15s sau gui sms neu chua xoa alm // SendTextMessage(message,PhoneNumber); } //--- if(alm_hum[0]) { if(alm_hum_status[0]==0) { SendTextMessage(message_hum,PhoneNumber); }
alm_hum_status[0]=1; // da gui tin nhan canh bao do am }
if(alm_smk[0]) {
if(alm_smk_status[0]==0)SendTextMessage(message_smk,PhoneNumber); alm_smk_status[0]=1; // da gui tin nhan canh bao khoi } //----modul 2 if(alm_hum[1]) { if(alm_hum_status[1]==0) { SendTextMessage(message_hum,PhoneNumber); }
alm_hum_status[1]=1; // da gui tin nhan canh bao do am }
{
if(alm_smk_status[1]==0)SendTextMessage(message_smk,PhoneNumber); alm_smk_status[1]=1; // da gui tin nhan canh bao khoi } //--- BEEP_UP(); } else BEEP_DOWN(); //---
if(ms_delay==0) // Neu nhan duoc du lieu { ms_delay=100; //1 s if(Alarm_msg>0)--Alarm_msg; if(index==0) index=1; else index=0; // index=0; SetTX_Mode(); UART4send(TxBuf);
nRF24L01_TxPacket(TxBuf,index); // Transmit data request SPI_RW_Reg(RF_WRITE_REG+STATUS,0XFF); // Clear Bit Send SetRX_Mode(); } // rf rec
if(nRF24L01_RxPacket(RxBuf)==1) // Neu nhan duoc du lieu {
UART4send("\r\n RF rec "); UART4send(RxBuf); SetRX_Mode(); mesg_analys();
} } } //====== void mesg_analys(void) {
// static uint16_t avr_hummi=50; uint16_t tg;
if((RxBuf[4]=='1')||(RxBuf[4]=='2')) {
message_hum[26]=RxBuf[4]; // lay so module message_smk[26]=RxBuf[4]; // lay so module alm_smk[0]=0; // clear alm
alm_smk[1]=0; alm_hum[0]=0; alm_hum[1]=0; ///--- tg=(RxBuf[8]-48)*1000; tg=tg+((RxBuf[9]-48)*100); tg=tg+((RxBuf[10]-48)*10); tg=tg+(RxBuf[11]-48);
if(RxBuf[4]=='1') // cho slave 1 { humi[0]=tg; if(RxBuf[15]=='Y') smk[0]='Y'; else smk[0]='N'; // alm gen if((smk[0]=='Y')||(humi[0]>97)) { Alarm=1; } else Alarm=0;
//---
if(smk[0]=='Y') // neu canh bao khoi bat co canh bao khoi {
alm_smk[0]=1; }
if(humi[0]>97) // neu canh bao do am. bat co canh bao do am {
// lay thong tin ve do am message_hum[15]=RxBuf[9]; message_hum[16]=RxBuf[10]; message_hum[17]=RxBuf[11]; alm_hum[0]=1; } }
else // cho slave 2 { humi[1]=tg; if(RxBuf[15]=='Y') smk[1]='Y'; else smk[1]='N'; // alm if((smk[1]=='Y')||(humi[1]>97)) { Alarm=1; } else Alarm=0; //---
if(smk[1]=='Y') // neu canh bao khoi bat co canh bao khoi {
alm_smk[1]=1; }
if(humi[1]>97) // neu canh bao do am. bat co canh bao do am {
// lay thong tin ve do am message_hum[15]=RxBuf[9]; message_hum[16]=RxBuf[10]; message_hum[17]=RxBuf[11]; alm_hum[1]=1; } } } }
2. Phần mềm điều khiển module Wireless gắn với ARM
//nRF24L01 for ARM
#include "stm32f10x_gpio.h" #include "nrf24l01.h"
//****************************************************************** **************
unsigned char TX_ADDRESS_0[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //
unsigned char RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //
unsigned char TX_ADDRESS_1[RX_ADR_WIDTH]= {0x43,0x34,0x10,0x10,0x01}; //
/******************************************************************* ***********************/
void Delay_Us(unsigned char n) {
uint8_t i; for(;n>0;n--)
{ for(i=0;i<30;++i); } } //****************************************************************** ********************** //*NRF24L01 //****************************************************************** *********************/ void init_NRF24L01(void) { GPIO_InitTypeDef GPIO_InitStructure; //--- RF --- //--- CE--- GPIO_InitStructure.GPIO_Pin = CE_pin; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(CE_port, &GPIO_InitStructure); //--- SCK--- GPIO_InitStructure.GPIO_Pin = SCK_pin; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(SCK_port, &GPIO_InitStructure); //--- MISO--- GPIO_InitStructure.GPIO_Pin = MISO_pin; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(MISO_port, &GPIO_InitStructure); //--- CSN--- GPIO_InitStructure.GPIO_Pin = CSN_pin; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(CSN_port, &GPIO_InitStructure); //--- MOSI--- GPIO_InitStructure.GPIO_Pin = MOSI_pin; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(MOSI_port, &GPIO_InitStructure); //inerDelay_us(100); Delay_Us(100);
// CE=0; // chip enable // CSN=1; // Spi disable
// SCK=0; // Spi clock line init high CE_L; // chip enable CSN_H; // Spi disable
SCK_L; // Spi clock line init high
SPI_Write_Buf(RF_WRITE_REG + TX_ADDR, TX_ADDRESS_0, TX_ADR_WIDTH); //
SPI_Write_Buf(RF_WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); //
// SPI_Write_Buf(RF_WRITE_REG + RX_ADDR_P1, RX_ADDRESS_P1, RX_ADR_WIDTH); // THEM DIA CHI PIPE 1
SPI_RW_Reg(RF_WRITE_REG + EN_AA, 0x01); // EN P0
SPI_RW_Reg(RF_WRITE_REG + EN_RXADDR, 0x01); //Enable data P0 SPI_RW_Reg(RF_WRITE_REG + RF_CH, 0); // Chanel 0 RF = 2400 + RF_CH* (1or 2 M)
SPI_RW_Reg(RF_WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); // Do rong data truyen 32 byte
// SPI_RW_Reg(RF_WRITE_REG + RX_PW_P1, RX_PLOAD_WIDTH); // Do rong data truyen 32 byte
SPI_RW_Reg(RF_WRITE_REG + RF_SETUP, 0x07); // 1M, 0dbm
SPI_RW_Reg(RF_WRITE_REG + CONFIG, 0x0e); // Enable CRC, 2 byte CRC, Send
}
/******************************************************************* *********************************/
//unsigned char SPI_RW(unsigned char Buff) //NRF24L01
/******************************************************************* *********************************/
unsigned char SPI_RW(unsigned char Buff) {
unsigned char bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit {
if ((Buff & 0x80)==0x80) MOSI_H ; // output 'uchar', MSB to MOSI else MOSI_L;
Delay_Us(5);
Buff = (Buff << 1); // shift next bit into MSB.. SCK_H; // Set SCK high..
Delay_Us(5);
Buff |=MISO; // capture current MISO bit SCK_L; // ..then set SCK low again }
return(Buff); // return read uchar }
/******************************************************************* *********************************/
//unsigned char SPI_Read(unsigned char reg) //NRF24L01
/******************************************************************* *********************************/
unsigned char SPI_Read(unsigned char reg) {
CSN_L; // CSN low, initialize SPI communication... SPI_RW(reg); // Select register to read from..
reg_val = SPI_RW(0); // ..then read registervalue
CSN_H; // CSN high, terminate SPI communication return(reg_val); // return register value
}
/******************************************************************* *********************************/
//unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value)
/******************************************************************* *********************************/
unsigned char SPI_RW_Reg(unsigned char reg,unsigned char value) {
unsigned char status1;
CSN_L; // CSN low, init SPI transaction status1 = SPI_RW(reg); // select register
SPI_RW(value); // ..and write value to it.. CSN_H; // CSN high again
return(status1); // return nRF24L01 status uchar }
/******************************************************************* *********************************/
//unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char uchars)
//
/******************************************************************* *********************************/
unsigned char SPI_Read_Buf(unsigned char reg,unsigned char *pBuf,unsigned char uchars)
unsigned char status1,uchar_ctr;
CSN_L; // Set CSN low, init SPI tranaction
status1 = SPI_RW(reg); // Select register to write to and read status uchar for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
pBuf[uchar_ctr] = SPI_RW(0); // CSN_H;
return(status1); // return nRF24L01 status uchar }
/******************************************************************* **************************************/
//uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
/******************************************************************* **********************************/
unsigned char SPI_Write_Buf(unsigned char reg,unsigned char *pBuf,unsigned char uchars)
{
unsigned char status1,uchar_ctr; CSN_L; //SPI
status1 = SPI_RW(reg);
for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) // SPI_RW(*pBuf++); CSN_H; //SPI return(status1); // } /******************************************************************* *********************************/ //void SetRX_Mode(void) //
/******************************************************************* *********************************/
void SetRX_Mode(void) {
CE_L;
SPI_RW_Reg(RF_WRITE_REG + CONFIG, 0x0f); // Enable CRC, 2 byte CRC, Recive CE_H; Delay_Us(130); // } /******************************************************************* *********************************/