Vềcơ bản, kết quảđạt đuợc của đề tài đáp ứng đuợc yêu cầu đặt ra ban đầu.
Tuy nhiên, do vấn đề thời gian nên phần mềm ứng dụng chưa đuợc xây dựng hoàn thiện. Phần mềm sẽđược hoàn chỉnh khi được thiết lập thêm phần quản lý cơ sở dữ liệu: quản lý thời gian tiết kiệm điện từđó đưa ra chi phí tiết kiệm và thống kê theo các khoảng thời gian tuỳ chọn.
Việc phát triển đồ án này rất có ý nghĩa thực tế. Với việc sử dụng điện thoại di động như hiện nay thì việc phát triển module GSM đểđiều khiển thiết bị từ xa là một điều không quá khó khăn và phù hợp với mọi đối tượng sử dụng.
Ngoài việc sử dụng tin nhắn và internet đểđiều khiển thiết bị như trong đồán đã trình bày, thì có thể kết hợp với các cảm biến báo khói, báo cháy, cảm biến khí ga,
ả ế ển động để ự ệ ệc khác như làm hệ ố
để gửi tin nhắn mỗi khi có cháy, báo động khi có hỏa hoạn, đột nhập. Điều này sẽ giúp người sử dụng có nhiều lựa chọn và sẽ di động hơn, không quá cứng nhắc.
Đồng thời, hệ thống có thể tích hợp hệ thống với các hệ thống khác trong “tòa nhà thông minh” để hỗ trợ, bổsung thêm các tính năng cho các ngôi nhà ngoài ứng dụng trong các trường đại học và cao đẳng. Ví dụnhư khi phát hiện có đột nhập, hệ thống sẽ gửi tin thông báo và người sử dụng có thể thực hiện việc điều khiển bất kỳ theo ý muốn của mình mà không cứng nhắc là bắt buộc phải phải làm gì đó theo chương trình có sẵn. Ngoài ra, có thể kết hợp hệ thống vừa giám sát thông qua các cảm biến, vừa điều khiển thiết bị như đèn, quạt, nồi cơm điện để tiết kiệm chi phí và nâng cao hiệu suất sử dụng.
Tài li ệ u tham kh ả o
[1] Nguyễn Trung Chính, Tập lệnh AT của Module Sim508 dùng cho SMS, 2009 [2] Phan Hiếu Nhân, Hà Thị Thu Hòa, Thiết kế và thi công hệ thống điều khiển thiết bị từ xa bằng điện thoại di động dùng SMS, đồ án tốt nghiệp trường Đại học sư phạm kỹ thuật TP. Hồ Chí Minh, 2011
[4] Shanghai SIMCom wireless solutions Ltd , Hardware Design SIM 900_HD_V1.01 [5] Shanghai SIMCom wireless solutions Ltd, SIM 900 AT_Command Manual_V 1.03 [6] Shanghai SIMCom wireless solutions Ltd, SIM 900_Serial Port_Application Note_V 1.02
[7] Nguồn Internet:
http://www.alldatasheet.com/
http://www.developershome.com/sms/
http://www.microchip.com/
www.dientuvietnam.net http://machtudong.vn/
http://www.simcom.us www.arm.vn
www.4tech.com.vn www.codientu.org www.dientuvietnam.net www.google.com
PH Ụ L Ụ C
Code lập trình cho vi điều khiển
File ‘main.c’
/*
*******************************************************************
*****
* @file USART/Interrupt/main.c * @author MCD Application Team * @version V3.5.0
* @date 08-April-2011 * @brief Main program body
*******************************************************************
*****
*/
/* Includes ---*/
#include "stm32f10x.h"
#include "stm32f10x_conf.h"
#include "GPRS.h"
u8 data[1000];
u8 i = 0;
u8 flag_pwk = 0;
u8 flag_connect_server = 0;
/** @addtogroup STM32F10x_StdPeriph_Examples
* @{
*/
/** @addtogroup USART_Interrupt * @{
*/
/* Private variables ---*/
USART_InitTypeDef USART_InitStructure;
/* Private function prototypes ---*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void USART_Configuration(void);
void delay_ms(u16 time) {
u16 i,j;
for (i = 0; i < 1000; i++) for ( j = 0; j < time * 10; j++);
}
/* Private functions ---*/
/**
* @brief Main program * @param None
* @retval None */
int main(void) {
/*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f10x_xx.s) before to branch to application main.
To reconfigure the default setting of SystemInit() function, refer to system_stm32f10x.c file
*/
/* System Clocks Configuration */
RCC_Configuration();
/* NVIC configuration */
NVIC_Configuration();
/* Configure the GPIO ports */
GPIO_Configuration();
USART_Configuration();
while(1) {
if ( flag_pwk == 0) SIM900_ON();
if (( flag_pwk == 1) & ( flag_connect_server == 0)) {
SIM900_OFF();
delay_ms(4000);
connect_server();
flag_connect_server = 1;
} }
}
/**
* @brief Configures the different system clocks.
* @param None * @retval None */
void RCC_Configuration(void) {
/* Enable GPIO clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC|
RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);
/* Enable USART1 Clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
}
void NVIC_Configuration(void) {
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure the NVIC Preemption Priority Bits */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
/* Enable the USARTy Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
} /**
* @brief Configures the different GPIO ports.
* @param None * @retval None */
void GPIO_Configuration(void) {
GPIO_InitTypeDef GPIO_InitStructure;
/* Configure USARTy Rx as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure USARTy Tx as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure Output pin for nRF24L01 module */
/* LED1 pin */
// PE2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/* Configure Output pin for nRF24L01 module */
/* LED2 pin */
// PE3
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/* Configure Output pin for nRF24L01 module */
/* SPEAKER pin */
// PD7
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
/* Configure Output pin for nRF24L01 module */
/* ROLE1 pin */
// PB0
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Configure Output pin for nRF24L01 module */
/* ROLE2 pin */
// PB1
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Configure Output pin for nRF24L01 module */
/* SIM900_PWR pin */
// PA12
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void USART_Configuration(void) {
/* USARTy and USARTz configuration --- ---*/
/* USARTy and USARTz configured as follow:
- BaudRate = 9600 baud - Word Length = 8 Bits - One Stop Bit
- No parity
- Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
/* Configure USART1 */
USART_Init(USART1, &USART_InitStructure);
/* Enable USARTy Receive and Transmit interrupts */
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
/* Enable the USART1 */
USART_Cmd(USART1, ENABLE);
} /**
* @brief Configures the nested vectored interrupt controller.
* @param None * @retval None */
#ifdef USE_FULL_ASSERT /**
* @brief Reports the name of the source file and the source line number * where the assert_param error has occurred.
* @param file: pointer to the source file name
* @retval None */
void assert_failed(uint8_t* file, uint32_t line) {
/* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* Infinite loop */
while (1) {
} }
#endif /**
* @}
*/
/**
* @}
*/
File ‘GPRS.c’
#include "GPRS.h"
////////////////////////////////////////////////////////////////
void uart_puts(const char* s) {
while(*s != '\0'){
USART_SendData(USART1, *s);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) ==
RESET)
{ } s++;
} }
////////////////////////////////////////////////////////////////
void LED1_ON(void) {
GPIOE->BSRR = GPIO_Pin_2;
}
////////////////////////////////////////////////////////////////
void LED1_OFF(void) {
GPIOE->BRR = GPIO_Pin_2;
}
////////////////////////////////////////////////////////////////
void LED2_ON(void) {
GPIOE->BSRR = GPIO_Pin_3;
}
////////////////////////////////////////////////////////////////
void LED2_OFF(void) {
GPIOE->BRR = GPIO_Pin_3;
}
////////////////////////////////////////////////////////////////
void SPEAKER_ON(void) {
GPIOD->BSRR = GPIO_Pin_7;
}
////////////////////////////////////////////////////////////////
void SPEAKER_OFF(void) {
GPIOD->BRR = GPIO_Pin_7;
}
////////////////////////////////////////////////////////////////
void ROLE1_OPEN(void) {
GPIOB->BSRR = GPIO_Pin_0;
}
////////////////////////////////////////////////////////////////
void ROLE1_CLOSE(void) {
GPIOB->BRR = GPIO_Pin_0;
}
///////////////////////////////////////////////////////////////
void ROLE2_OPEN(void) {
GPIOB->BSRR = GPIO_Pin_1;
}
///////////////////////////////////////////////////////////////
void ROLE2_CLOSE(void) {
GPIOB->BRR = GPIO_Pin_1;
}
///////////////////////////////////////////////////////////////
void SIM900_ON(void) {
GPIOA->BSRR = GPIO_Pin_12;
}
///////////////////////////////////////////////////////////////
void SIM900_OFF(void) {
GPIOA->BRR = GPIO_Pin_12;
}
///////////////////////////////////////////////////////////////
unsigned char check_Call_Ready(unsigned char *str, int index) {
unsigned char ma[10]= "Call Ready";
int i;
int j = 0;
for(i = index - 9; i < index + 1 ; i++) {
if(ma[j]!= str[i]) {
return 0;
}
j ++;
if ( j > 9) j = 0;
}
return 1;
}
///////////////////////////////////////////////////////////////
unsigned char check_CONNECT_OK(unsigned char *str, int index) {
unsigned char ma[10]= "CONNECT OK";
int i;
int j = 0;
for(i=index-9; i<index+1; i++) {
if(ma[j]!= str[i]) {
return 0;
}
j ++;
if ( j > 9) j = 0;
}
return 1;
}
///////////////////////////////////////////////////////////////
unsigned char check_CONNECT_FAIL(unsigned char *str, int index) {
unsigned char ma[13]= "CONNECT FAIL";
int i;
int j = 0;
for (i=index-11;i<index+1;i++) {
if (ma[j]!=str[i]) {
return 0;
}
j ++;
if ( j > 12) j = 0;
}
return 1;
}
///////////////////////////////////////////////////////////////
unsigned char check_NORMAL_P0WER_DOWN(unsigned char *str, int index) {
unsigned char ma[18]= "NORMAL POWER DOWN";
int i;
int j = 0;
for (i=index-17;i<index+1;i++) {
if (ma[j]!=str[i]) {
return 0;
}
j ++;
if ( j > 17) j = 0;
}
return 1;
}
///////////////////////////////////////////////////////////////
unsigned char check_CLOSED(unsigned char *str, int index) {
unsigned char ma[7]= "CLOSED";
int i;
int j = 0;
for (i=index-6;i<index+1;i++) {
if (ma[j]!=str[i]) {
return 0;
}
j ++;
if ( j > 6) j = 0;
}
return 1;
}
///////////////////////////////////////////////////////////////
void connect_server(void) {
uart_puts("AT+CIPSTART=\"TCP\",\"192.168.0.114\",\"2020\"");
USART_SendData(USART1,'\r');
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) { }
}
///////////////////////////////////////////////////////////////
u8 check_COMMAND(unsigned char *srt, int index) {
u8 i = 0;
unsigned char header[4] = "THUY";
u8 flag = 10;
if (( header[0] == srt[index - 4]) & ( header[1] == srt[index - 3]) & ( header[2] == srt[index - 2]) & ( header[3] == srt[index - 1]))
{
switch (srt[index]) {
case 'A':
flag = 0;
break;
case 'a':
break;
case 'B':
flag = 2;
break;
case 'b':
flag = 3;
break;
case 'C':
flag = 4;
break;
case 'c':
flag = 5;
break;
case 'D':
flag = 6;
break;
case 'd':
flag = 7;
break;
} }
return flag;
}
File ‘stm32f10x_it.c’
/*
*******************************************************************
****
* @file USART/Interrupt/stm32f10x_it.c * @author MCD Application Team
* @version V3.5.0 * @date 08-April-2011
* @brief Main Interrupt Service Routines.
* This file provides template for all exceptions handler and peripherals * interrupt service routine.
*******************************************************************
***** */
/* Includes ---*/
#include "stm32f10x_it.h"
#include "stm32f10x_conf.h"
#include "gprs.h"
/** @addtogroup STM32F10x_StdPeriph_Examples * @{
*/
* @{
*/
/* Private typedef ---*/
/* Private define ---*/
/* Private macro ---*/
/* Private variables ---*/
extern u8 data[1000];
extern u8 i;
extern u8 flag_pwk;
extern u8 flag_connect_server;
/* Private function prototypes ---*/
/* Private functions ---*/
/*******************************************************************
***/
/* Cortex-M3 Processor Exceptions Handlers */
/*******************************************************************
***/
/**
* @brief This function handles NMI exception.
* @param None
* @retval None */
void NMI_Handler(void) {
}
/**
* @brief This function handles Hard Fault exception.
* @param None * @retval None */
void HardFault_Handler(void) {
/* Go to infinite loop when Hard Fault exception occurs */
while (1) {
} }
/**
* @brief This function handles Memory Manage exception.
* @param None * @retval None */
void MemManage_Handler(void) {
/* Go to infinite loop when Memory Manage exception occurs */
while (1) {
} }
/**
* @brief This function handles Bus Fault exception.
* @param None * @retval None */
void BusFault_Handler(void) {
/* Go to infinite loop when Bus Fault exception occurs */
while (1) {
} }
/**
* @brief This function handles Usage Fault exception.
* @param None
* @retval None */
void UsageFault_Handler(void) {
/* Go to infinite loop when Usage Fault exception occurs */
while (1) {
} }
/**
* @brief This function handles SVCall exception.
* @param None * @retval None */
void SVC_Handler(void) {
}
/**
* @brief This function handles Debug Monitor exception.
* @param None * @retval None */
void DebugMon_Handler(void) {
}
/**
* @brief This function handles PendSV_Handler exception.
* @param None * @retval None */
void PendSV_Handler(void) {
}
/**
* @brief This function handles SysTick Handler.
* @param None * @retval None */
void SysTick_Handler(void) {
}
/*******************************************************************
***/
/*******************************************************************
***/
/**
* @brief This function handles USART1 global interrupt request.
* @param None * @retval None */
void USART1_IRQHandler(void) {
//USART_SendData(USART1,USART_ReceiveData(USART1));
data[i] = USART_ReceiveData(USART1);
if (check_Call_Ready(data,i) == 1) {
flag_pwk = 1;
}
if (check_CONNECT_OK(data,i) == 1) {
LED1_ON();
}
switch(check_COMMAND(data,i)) {
case 0:
LED2_ON();
case 1:
LED2_OFF();
break;
case 2:
SPEAKER_ON();
break;
case 3:
SPEAKER_OFF();
break;
case 4:
ROLE1_OPEN();
break;
case 5:
ROLE1_CLOSE();
break;
case 6:
ROLE2_OPEN();
break;
case 7:
ROLE2_CLOSE();
break;
} i ++;
if ( i == 1000) i = 0;
}
/**
* @brief This function handles USART2 global interrupt request.
* @param None * @retval None */
void USART2_IRQHandler(void) {
}
/*******************************************************************
***/
/* STM32F10x Peripherals Interrupt Handlers */
/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */
/* available peripheral interrupt handler's name please refer to the startup */
/* file (startup_stm32f10x_xx.s). */
/*******************************************************************
***/
/**
* @brief This function handles PPP interrupt request.
* @param None * @retval None */