Tuesday, February 3, 2015

Intelligent Automated Home Lighting System

                         Intelligent Automated Home Lighting System

Description :Trong bài này mình xẽ hướng dẫn cho các bạn sử dụng 8051 và cảm biến quang LDR để thiết kế hệ thống  chiếu sáng thông minh.Mình là người mới bắt đầu học,còn thiếu nhiều kinh nghiệm về thực tế.Mong mọi người đóng góp cho mình ( cần thêm linh kiện hay cải thiện thuật toán lập trinh...) để mạch thực tế có thể chạy tốt
 Components: 2 LDR sensor,8051,LM324, 1 cổng logic AND,led đơn,7seg,resistor,biến trở,còn nguồn ánh sáng chiếu vào 2 LDR thì mình  nghĩ nên dùng 2 đèn laser, hoặc có thể thay bằng 2 cặp thu phát hồng ngoại(không biết cái nào giá tốt hơn và chạy ổn định hơn,mong ae góp ý kiến),Nguyên lý và code hoàn toàn tương tự
Circuit :
Nguyên lý :  Ở trạng thái bình thường, ánh sáng được chiếu vào 2 quang trở làm điện trở của nó bị giảm.Khi  có người đi qua chắn anh sáng chiếu vào làm điện trở của nó tăng lên.
Dựa vào thứ tự quang trở nào điện trở tăng lên trước mà ta có thể xác định được hướng của người đi vào hay đi ra.Khi điện trở LDR tăng làm điện áp đặt vào đầu + của LM324 giảm,khi nó giảm đến giá trị nhỏ hơn điện áp đặt vào đầu âm thì mức logic đầu ra của LM324 chuyển từ mức HIGH sang LOW.khi có người ra hoặc vào thì đầu ra của AND sẽ chuyển từ mức HIGH sang LOW.Từ đó do mình sử dụng ngắt ngoài,thì chương trình main sẽ bị ngừng và nhảy đến chương trình ngắt.Ở hàm ngắt này mình sẽ kiểm tra mức logic trên chân  P2_7 và P2_6 để xác định là người vào hay ra.
Bảng trạng thái :
                                                           Bảng 1
Các bước cài đặt  chế độ ngắt ngoài,cho phép ngắt ngoài mình đã chú thích trong Code.
Đây là chương trình ngắt

void tang(void) interrupt 2       // trinh phuc vu ngat ngoai 1

{         

         if(P2_7==0){                                                

         while(P2_7==0);

if(P2_6 ==0){

   while(P2_6==0);
   songuoi = songuoi +1;
if(songuoi>9){
songuoi =9;
}
 }
 }
 if(P2_6==0){
 while(P2_6==0);
  if(P2_7==0){
    while(P2_7==0);
songuoi = songuoi -1;
if(songuoi<0){
 songuoi = 0;
}
}
}   
}
Các bạn chú ý là trong trường hợp mà có 2 người cùng lúc đi vào thì đếm người sẽ bị sai,từ đó các bạn cần thêm 1 chức năng nút điều chỉnh giá trị số người khi bị sai(cũng có thể đợi khi không có người trong phòng các bạn nhấn nút reset để biến đếm trở về 0,như thế sẽ đơn giản hơn).Thứ 2 là các bạn có thể 1 quảng trở nữa để kiểm tra độ sáng trong phòng,trong trường hợp có người trong mà độ sáng trong phòng vẫn đủ thì đèn sẽ không được bật.Trong  bài này mình khống thêm các chức năng đó.Các bạn tự phát triển nhé!
Đây là lần đầu mình đăng bài,nếu có thiếu sót hoặc không hiểu phần nào có thể comment để mình giải thích cũng như bổ xung.Thank!
Code hoàn chỉnh 
#include <REGX52.H>   
volatile char songuoi = 0;  // kieu char,them volatile o truoc de the hien bien nay trong pham vi ca trinh interrupt
unsigned char code Code7Seg[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; 
void main()                                               
{  
P3_2 = 1; // chon 2 chan 3.2 va 3.3 la dau vao            
P3_3 =1;   // cac buoc thiet lap mode interrupt         
 IT1 = 1;  //chon mode ngat ngoai theo suon xung nhip cho ngat ngoai 1            
IE=0x84;  // cho phep ngat ngoai  va 1  
if(songuoi>0)
{  P2_5 = 1; // bat den khi co nguoi  } 
else 
{    
P2_5 =0; // tat den khi ko co nguoi   
}                          
while(1)                               
  {                
 P1 = Code7Seg[songuoi]; // hien thi so nguoi            
}
} 
void tang(void) interrupt 2       // trinh phuc vu ngat ngoai 1 
{                
 if(P2_7==0) 
{                                                          
while(P2_7==0);  
if(P2_6 ==0) 
{      
while(P2_6==0);      
songuoi = songuoi +1;  
if(songuoi>9) 
{ songuoi =9;  
}    
}  
 }    
if(P2_6==0) 
{  while(P2_6==0);    
if(P2_7==0) 
{      
while(P2_7==0);  
songuoi = songuoi -1;  
if(songuoi<0) 
{  songuoi = 0;  
}  
}  
}     
}



No comments:

Post a Comment