Mạch chống trộm và cảnh báo rò khí gas báo qua tín nhắn sms
+ Mạch sẽ tự động bật còi hú khi cảm biến chống trộm hồng ngoại bị trộm kích hoạt và gửi tin nhắn sms cho chủ nhà qua điện thoại
+ Bật relay quạt gió khi phát hiện rò rỉ khí gas và báo động còi hú , gửi tin nhắn sms cho chủ nhà biết qua điện thoại
Mạch sử dụng module sim 900A, vi điều khiển PIC16F877A
Sơ đồ và layout mạch in mình vẽ trên proteus :
Sơ đồ mạch nguồn 12V - 3.3V cấp cho mạch :
Code C : mình viết trên phần mềm biên dịch CCS
#include <16F877A.h>
#include <def_877a.h>
#include <string.h>
#FUSES NOWDT
#FUSES HS
#FUSES NOPUT
#FUSES NOPROTECT
#FUSES NODEBUG
#FUSES NOBROWNOUT
#FUSES NOLVP
#FUSES NOCPD
#FUSES NOWRT
#FUSES RESERVED
#use delay(clock=10000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#include <ce_lcd.c>
#define use_portb_lcd TRUE
#define PWU RD6
#define TXD RC6
#define RXD RC7
#define buffer_size 80
char buffer[buffer_size];
int xbuff=0x00;
char c=0x00;
char c1=0x00;
short sms_mode=false;
char gas,ir;
int1 x=0,y=1;
char z=0;
char so[13]="01216512808"; // so dien thoai gui tin nhan canh bao
void send_sms(char so[12],char vitri);
void erase_buffer(void);
void init_sim900(void);
void read_sms();
void at(void);
short wait_ok (void);
short wait_error (void);
/////////////////////////////////////////////////////////////////////////////////
#INT_RDA
RDA_isr()
{
c=getc();
if(c=='*'){
c1=c;
xbuff=0;
}
if (c=='#' && c1=='*')
{
sms_mode=true;
}
if (xbuff >= buffer_size)
{xbuff=0;}
else{ buffer[xbuff++]=c;}
return 0;
}
//////////////////////////////////////////////////////////////////////////////
void main()
{
char ir_temp;
set_tris_a(0b11111111);
set_tris_d(0x00);
set_tris_c(0b10000000);
RD3=0;RD2=0;
RD1=1;
RD7=1;
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(AN0_AN1_AN3);
lcd_init();
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Dang khoi dong..");
init_sim900();
RD7=0;
lcd_gotoxy(1,1);
lcd_putc(" xong... ");
delay_ms(1500);
lcd_putc("\f");
lcd_putc(" Xin Chao \n");
lcd_putc(" 220von.com ") ;
send_sms(so,1);
lcd_putc("\f");
lcd_putc(" Module SIM 900 \n");
lcd_putc(" ............... ") ;
delay_ms(1000);
set_adc_channel(1);
delay_us(20);
ir_temp=read_adc();
delay_us(20);
lcd_putc("\f");
while(true)
{
set_adc_channel(0);
delay_us(20);
gas=read_adc();
delay_us(20);
set_adc_channel(1);
delay_us(20);
ir=read_adc();
delay_us(20);
if((gas>120)&&(x==1)){z=1;RD3=1;RD2=1;lcd_putc("\f");lcd_gotoxy(1,1);lcd_putc("Ro ri khi gas");
send_sms(so,3);
x=0;
}
if((gas<100)&&(x==0)){x=1;lcd_putc("\f");lcd_gotoxy(1,1);lcd_putc("He thong an toan") ;z=0;}
if(z==1){RD3=1;RD2=1;RD1=1;delay_ms(200);RD1=0;delay_ms(200);}
if(z==2){RD2=1;RD1=1;delay_ms(200);RD1=0;delay_ms(200);}
if(z==0){RD3=0;RD2=0;RD1=0;}
if((ir<(ir_temp-30))&&(y==1)){z=2;RD2=1;lcd_putc("\f");lcd_gotoxy(1,0);lcd_putc("Co trom dot nhap");
send_sms(so,4);
y=0;
}
if(sms_mode==TRUE){read_sms();erase_buffer();}
}
}
/////////////////////////////////////////////////////////////////////////////////////////
void erase_buffer(void)
{
int i;
for(i=0;i<buffer_size;i++){ buffer[i]=0x00; }
xbuff=0x00;
c=0x00;
c1=0x00;
sms_mode=false;
return;
}
//////////////////////////////////////////////////////////////////////////////////////////
void init_sim900(void)
{
PWU=1;
delay_ms(1000);
PWU=0;
delay_ms(9000);
do
{
printf("AT");
putc(13);
delay_ms(800);
}
while (wait_ok()==false);
return;
}
///////////////////////////////////////////////////////////////////////////////////////
void read_sms()
{
char *ptr;
char text1[]="tat bao dong";
ptr=strstr(buffer,text1);
if(strncmp(ptr,text1,12)==0)
{
z=0;
y=1;
RD3=0;RD2=0;
lcd_putc("\f");lcd_gotoxy(1,1);lcd_putc("He thong an toan");
send_sms(so,2);
}
}
////////////////////////////////////////////////////////////////////////////////////////
void send_sms(char so[12],char vitri)
{
printf("AT+CMGS=");
delay_ms(100);
putc(34); // "
delay_ms(100);
printf(so);
delay_ms(100);
putc(34); //
printf(";");
delay_ms(100);
putc(13);
delay_ms(1500);
switch(vitri)
{
case 0:break;
case 1:
{
printf("Thiet bi da khoi dong thanh cong ...\n\r");
break;
}
case 2:
{
printf("Da tat bao dong ...\n\r");
break;
}
case 3:
{
printf("Canh bao ! : Phat hien ro ri khi GAS. Da bat quat thong gio...\n\r");
break;
}
case 4:
{
printf("Canh bao ! : Co trom dot nhap vao nha. Da bat coi hu...\n\r");
break;
}
}
delay_ms(1000);
putc(26);
delay_ms(6000);
}
///////////////////////////////////////////////////////////////////////////////////////////
void at(void)
{
do
{
printf("AT");
putc(13);
delay_ms(1000);
}
while (wait_ok()==false);
return;
}
///////////////////////////////////////////////////////////////////////////////////////
short wait_ok (void){
char *ptr;
char r1_ok[]="OK";
ptr=strstr(buffer,r1_ok);
if(strncmp(ptr,r1_ok,2)==0){
return true;
}
else{return false;}
erase_buffer();
}
Video test mạch :
+ Bật relay quạt gió khi phát hiện rò rỉ khí gas và báo động còi hú , gửi tin nhắn sms cho chủ nhà biết qua điện thoại
Mạch sử dụng module sim 900A, vi điều khiển PIC16F877A
Sơ đồ và layout mạch in mình vẽ trên proteus :
220von |
220von |
Sơ đồ mạch nguồn 12V - 3.3V cấp cho mạch :
220von |
Code C : mình viết trên phần mềm biên dịch CCS
#include <16F877A.h>
#include <def_877a.h>
#include <string.h>
#FUSES NOWDT
#FUSES HS
#FUSES NOPUT
#FUSES NOPROTECT
#FUSES NODEBUG
#FUSES NOBROWNOUT
#FUSES NOLVP
#FUSES NOCPD
#FUSES NOWRT
#FUSES RESERVED
#use delay(clock=10000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#include <ce_lcd.c>
#define use_portb_lcd TRUE
#define PWU RD6
#define TXD RC6
#define RXD RC7
#define buffer_size 80
char buffer[buffer_size];
int xbuff=0x00;
char c=0x00;
char c1=0x00;
short sms_mode=false;
char gas,ir;
int1 x=0,y=1;
char z=0;
char so[13]="01216512808"; // so dien thoai gui tin nhan canh bao
void send_sms(char so[12],char vitri);
void erase_buffer(void);
void init_sim900(void);
void read_sms();
void at(void);
short wait_ok (void);
short wait_error (void);
/////////////////////////////////////////////////////////////////////////////////
#INT_RDA
RDA_isr()
{
c=getc();
if(c=='*'){
c1=c;
xbuff=0;
}
if (c=='#' && c1=='*')
{
sms_mode=true;
}
if (xbuff >= buffer_size)
{xbuff=0;}
else{ buffer[xbuff++]=c;}
return 0;
}
//////////////////////////////////////////////////////////////////////////////
void main()
{
char ir_temp;
set_tris_a(0b11111111);
set_tris_d(0x00);
set_tris_c(0b10000000);
RD3=0;RD2=0;
RD1=1;
RD7=1;
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(AN0_AN1_AN3);
lcd_init();
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Dang khoi dong..");
init_sim900();
RD7=0;
lcd_gotoxy(1,1);
lcd_putc(" xong... ");
delay_ms(1500);
lcd_putc("\f");
lcd_putc(" Xin Chao \n");
lcd_putc(" 220von.com ") ;
send_sms(so,1);
lcd_putc("\f");
lcd_putc(" Module SIM 900 \n");
lcd_putc(" ............... ") ;
delay_ms(1000);
set_adc_channel(1);
delay_us(20);
ir_temp=read_adc();
delay_us(20);
lcd_putc("\f");
while(true)
{
set_adc_channel(0);
delay_us(20);
gas=read_adc();
delay_us(20);
set_adc_channel(1);
delay_us(20);
ir=read_adc();
delay_us(20);
if((gas>120)&&(x==1)){z=1;RD3=1;RD2=1;lcd_putc("\f");lcd_gotoxy(1,1);lcd_putc("Ro ri khi gas");
send_sms(so,3);
x=0;
}
if((gas<100)&&(x==0)){x=1;lcd_putc("\f");lcd_gotoxy(1,1);lcd_putc("He thong an toan") ;z=0;}
if(z==1){RD3=1;RD2=1;RD1=1;delay_ms(200);RD1=0;delay_ms(200);}
if(z==2){RD2=1;RD1=1;delay_ms(200);RD1=0;delay_ms(200);}
if(z==0){RD3=0;RD2=0;RD1=0;}
if((ir<(ir_temp-30))&&(y==1)){z=2;RD2=1;lcd_putc("\f");lcd_gotoxy(1,0);lcd_putc("Co trom dot nhap");
send_sms(so,4);
y=0;
}
if(sms_mode==TRUE){read_sms();erase_buffer();}
}
}
/////////////////////////////////////////////////////////////////////////////////////////
void erase_buffer(void)
{
int i;
for(i=0;i<buffer_size;i++){ buffer[i]=0x00; }
xbuff=0x00;
c=0x00;
c1=0x00;
sms_mode=false;
return;
}
//////////////////////////////////////////////////////////////////////////////////////////
void init_sim900(void)
{
PWU=1;
delay_ms(1000);
PWU=0;
delay_ms(9000);
do
{
printf("AT");
putc(13);
delay_ms(800);
}
while (wait_ok()==false);
return;
}
///////////////////////////////////////////////////////////////////////////////////////
void read_sms()
{
char *ptr;
char text1[]="tat bao dong";
ptr=strstr(buffer,text1);
if(strncmp(ptr,text1,12)==0)
{
z=0;
y=1;
RD3=0;RD2=0;
lcd_putc("\f");lcd_gotoxy(1,1);lcd_putc("He thong an toan");
send_sms(so,2);
}
}
////////////////////////////////////////////////////////////////////////////////////////
void send_sms(char so[12],char vitri)
{
printf("AT+CMGS=");
delay_ms(100);
putc(34); // "
delay_ms(100);
printf(so);
delay_ms(100);
putc(34); //
printf(";");
delay_ms(100);
putc(13);
delay_ms(1500);
switch(vitri)
{
case 0:break;
case 1:
{
printf("Thiet bi da khoi dong thanh cong ...\n\r");
break;
}
case 2:
{
printf("Da tat bao dong ...\n\r");
break;
}
case 3:
{
printf("Canh bao ! : Phat hien ro ri khi GAS. Da bat quat thong gio...\n\r");
break;
}
case 4:
{
printf("Canh bao ! : Co trom dot nhap vao nha. Da bat coi hu...\n\r");
break;
}
}
delay_ms(1000);
putc(26);
delay_ms(6000);
}
///////////////////////////////////////////////////////////////////////////////////////////
void at(void)
{
do
{
printf("AT");
putc(13);
delay_ms(1000);
}
while (wait_ok()==false);
return;
}
///////////////////////////////////////////////////////////////////////////////////////
short wait_ok (void){
char *ptr;
char r1_ok[]="OK";
ptr=strstr(buffer,r1_ok);
if(strncmp(ptr,r1_ok,2)==0){
return true;
}
else{return false;}
erase_buffer();
}
Video test mạch :
Ah phân tích ý nghĩa từng dòg lệh đc k ạ
Trả lờiXóa