You are on page 1of 14

AVR PROJECT REPORT

AUTOMATIC ROOM LIGHT CONTROLLER WITH


BIDIRECTIONAL VISITOR COUNTER
Submitted by:
Mafaz Ahmed

1882-F12

Abstract:
This Project Automatic Room Light Controller with
Bidirectional Visitor Counter is reliable that takes over the task of
controlling the room lights as well us counting number of
persons/visitors in the room very accurately. When somebody
enters into the room then the counter is incremented by one and
the
light in the room will be switched ON and when any one leaves the
room then the
counter is decremented by one. The light will be only switched
OFF until all the persons in the room go out. The total number of
persons inside the room is also displayed on the LCD. Whenever a
person enter a room, he or she have to enter a password using a
keypad interfaced with the microcontroller. Only those enter
the room who know the password.

INTRODUCTION:
The objective of this project is to make a
controller based model to count number of persons visiting
particular room and accordingly light up the room. Here we can
use sensor and can know present number of persons. In todays
world, there is a continuous need for automatic appliances. With
the increase in standard of living, there is a sense of urgency for
developing circuits that would ease the complexity of life. Also if
at all one wants
to know the number of people present in room so as not to have
congestion, this circuit proves to be helpful.

Block Diagram:
KEYPAD
ENTER
SENSOR
EXIT
SENSOR

A
T
LCD

E
G
A
1
6

DOOR RELAY
FAN Control
LIGHT CONTOL

LIST OF COMPONENTS:

Microcontroller ATMEGA16
Infrared Sensor
Preset 4.7K
Reset button switch
Diode IN4148
Transistor TIP41
LCD 16x2
Keypad
LEDs
IC-LM324

Microcontroller ATMEGA16:
An Atmel ATmega16 microcontroller in a
40 pin DIP package. It has 16 KB programmable flash memory,
static RAM of 1 KB and EEPROM of 512 Bytes. There are 32 I/O
(input/output) lines which are
divided into four 8-bit ports
designated as PORTA, PORTB,
PORTC and PORTD. It has
various in-built peripherals
like USART, ADC, ATmega16 has
various in-built peripherals
alternative task related to inbuilt peripherals.

LCD
LCD (Liquid Crystal Display) screen is an electronic display module and fnd a wide
range of applications. A 16x2 LCD display is very basic module and is very
commonly used in various devices and circuits. These modules are preferred over
seven segments and other multi segment LEDs. The reasons being: LCDs are
economical;
easily
programmable;
have
no
limitation
of
displaying
special & even custom characters (unlike in seven segments), animations and so
on.
A 16x2 LCD means it can display 16 characters per line and there are 2 such
lines. In this LCD each
character is displayed in 5x7 pixel matrix. This LCD has two registers, namely,
Command and Data.
The command register stores the command instructions given to the LCD. A
command is an instruction given to LCD to do a predefned task like initializing it,
clearing its screen, setting the cursor position, controlling display etc. The data
register stores the data to be displayed on the LCD. The data is the ASCII
value of the character to be displayed
on the LCD.

LM324:
LM324 is a 14pin IC consisting of four
independent operational amplifiers (op-amps)
compensated in a single package.
Op-amps are high gainelectronic
voltage amplifier with
differential input and,
usually, a single-ended
output. The output voltage
is many times higher than
the voltage difference
between input terminals of
an op-amp.

IR Sensor-:
This is the most fundamental type of sensor available in the market.
The basic concept is simple. There is an emitter which emits infrared (IR)
rays. These IR rays are detected by a
detector. This concept is used to make
proximity sensor (to check if something
obstructs the path or not, etc), contrast
sensors (used to detect contrast difference
between black and white, like in line follower
robots), etc.

TIP41:
The Bipolar Power Transistor is designed for general purpose power amplifier
and switching applications. The TIP41, TIP41A, TIP41B, TIP41C (NPN); and
TIP42, TIP42A, TIP42B, TIP42C (PNP) are complementary devices.
Collector-Emitter Saturation Voltage - VCE(sat) = 1.5 V<subdc< sub="" style="fontfamily: Verdana, Arial, H
serif;"> (Max) @ IC = 6.0 Adc</subdc<>

Collector-Emitter Sustaining Voltage -VCEO(sus) = 60 Vdc (min) - TIP41A, TIP42A


=80 Vdc (min) - TIP41B, TIP42B
=100 Vdc (min) - TIP41C, TIP42C

High Current Gain Bandwidth


Product fT = 3 MHz (min) @ IC
= 500 mAdc

Compact TO-220 AB Package

These are Pb-Free Packages

Circuit:

CODE:

#define F_CPU 8000000UL // Define the crystal frequency


#include <avr/io.h> // Standard header file for input and output functionality
#include <util/delay.h> // For delay function
#include <avr/interrupt.h>

#define LCD_PRT PORTA //LCD DATA PORT


#define LCD_DDR DDRA
//LCD DATA DDR
#define LCD_PIN PINA //LCD DATA PIN
#define LCD_RS 0
//LCD RS
#define LCD_RW 1
//LCD RW
#define LCD_EN 2
//LCD EN
LCD
#define KEY_PRT PORTC
#define KEY_DDR DDRC
#define KEY_PIN PINC
char ROW=0, COL=0;
char keypad[4][3]= {'1','2','3',
'4','5','6',
'7','8','9',
'*','0','#' };
unsigned char cnt=0;
ISR (TIMER2_OVF_vect)
{if(cnt==0){OCR2 =255;}
if(cnt>=1){OCR2 =191;}
if(cnt>=3){OCR2=127;}
if(cnt>=5){OCR2=0;} }

//Enable/disable pin for

void lcdcmd(unsigned char cmnd)


{
// LCD command function
LCD_PRT = (LCD_PRT & 0x0F) | (cmnd & 0xF0);
LCD_PRT &= ~ (1<<LCD_RS);
//RS = 0 for command
LCD_PRT &= ~ (1<<LCD_RW) ;
//RW = 0 for
write
LCD_PRT |= (1<<LCD_EN); //EN = 1 for H-to-L
_delay_us (50) ; //wait to make EN wider
LCD_PRT &= ~ (1<<LCD_EN);
//EN = 0 for H-to-L
_delay_us(50) ; //wait
LCD_PRT = (LCD_PRT & 0x0F) | (cmnd << 4);
LCD_PRT |= (1<<LCD_EN); //EN = 1 for H-to-L
_delay_us (1) ;
//wait to make EN wider
LCD_PRT &= ~ (1<<LCD_EN); } //EN = 0 for H-to-L
void lcddata(unsigned char data)
// LCD Data function
{
LCD_PRT = (LCD_PRT & 0X0F) | (data & 0XF0);
LCD_PRT |= (1<<LCD_RS); //RS = 1 for data
LCD_PRT &= ~ (1<<LCD_RW) ;
//RW = 0 for
write
LCD_PRT |= (1<<LCD_EN); //EN = 1 for H-to-L

_delay_us(50) ;
LCD_PRT &= ~ (1<<LCD_EN) ;
LCD_PRT = (LCD_PRT & 0x0F) | (data<<4);
LCD_PRT |= (1<<LCD_EN);
_delay_us(50);
LCD_PRT &= ~ (1<<LCD_EN);
}
void lcd_init()
{
LCD_DDR = 0xFF;
LCD_PRT &=~(1<<LCD_EN);
_delay_us(2000);
lcdcmd(0x33);
_delay_us (100);
lcdcmd(0x32);
_delay_us (100);
lcdcmd(0x28);
_delay_us (100);
lcdcmd(0x0E);
_delay_us(100);
lcdcmd(0x01);
_delay_us(2000);
lcdcmd(0x06);
_delay_us(100);
}
void lcd_gotoxy (unsigned char x, unsigned char y)
{ //Table 12-5
unsigned char firstCharAdr[]={0x80,0xC0,0x94,0xD4};
lcdcmd(firstCharAdr[ y-1]+x-1);
_delay_us(100) ;
}
void lcd_string(unsigned char *str)
//function to show string on LCD
{ unsigned char i = 0;
while (str[ i] !=0)
{lcddata(str[ i] );
i++;
}
}
//look up table for keypad function

char key_pad()
{

// key pad function

while(1)
{
KEY_PRT=0x7E;
//MAKE FIRST ROW IN KEYPAD TO ZERO
// MAKE ALL COL'S AS HIGH
if((KEY_PIN&0x10)==0){while((KEY_PIN&0x10)==
0);ROW=1;COL=1;break;}
if((KEY_PIN&0x20)==0){while((KEY_PIN&0x20)==
0);ROW=1;COL=2;break;}
if((KEY_PIN&0x40)==0){while((KEY_PIN&0x40)==
0);ROW=1;COL=3;break;}
KEY_PRT=0x7D;
//MAKE SECOND ROW IN KEYPAD TO ZERO
// MAKE ALL COL'S AS HIGH
if((KEY_PIN&0x10)==0){while((KEY_PIN&0x10)==
0);ROW=2;COL=1;break;}
if((KEY_PIN&0x20)==0){while((KEY_PIN&0x20)==
0);ROW=2;COL=2;break;}
if((KEY_PIN&0x40)==0){while((KEY_PIN&0x40)==
0);ROW=2;COL=3;break;}
KEY_PRT=0x7B;
//MAKE THIRD ROW IN KEYPAD TO ZERO
// MAKE ALL COL'S AS HIGH
if((KEY_PIN&0x10)==0){while((KEY_PIN&0x10)==
0);ROW=3;COL=1;break;}
if((KEY_PIN&0x20)==0){while((KEY_PIN&0x20)==
0);ROW=3;COL=2;break;}
if((KEY_PIN&0x40)==0){while((KEY_PIN&0x40)==
0);ROW=3;COL=3;break;}
KEY_PRT=0x77;
//MAKE 4TH ROW IN KEYPAD TO ZERO
// MAKE ALL COL'S AS HIGH
if((KEY_PIN&0x10)==0){while((KEY_PIN&0x10)==
0);ROW=4;COL=1;break;}
if((KEY_PIN&0x20)==0){while((KEY_PIN&0x20)==
0);ROW=4;COL=2;break;}

if((KEY_PIN&0x40)==0){while((KEY_PIN&0x40)==
0);ROW=4;COL=3;break;}
}
return keypad[ROW-1][COL-1];
}
unsigned char ps[]="ENTER PASSWARD";
unsigned char un[]="UNLOCKED";
unsigned char lo[]="LOCKED";
unsigned char wr[]="WRONG PASSWARD";
unsigned char ea[]="ENTER AGAIN";
unsigned char passward[]={'4','6','2','2'};
unsigned char user[4];
unsigned char d;
void enter(){lcd_init();
lcd_gotoxy(2,1);
lcd_string(ps);
lcdcmd(0xC6);
for(d=0;d<4;d++)
{ user[d]=key_pad(); lcddata(user[d]);}
_delay_ms(100);
if((user[0]==passward[0])&&(user[1]==passward[1])&&(user[2]==passward[2])&
&(user[3]==passward[3]))
{ lcd_init(); lcd_gotoxy(5,1); lcd_string("WELCOME");
PORTB|=(1<<2);
while(1){if(PINB &
0x02){cnt++;PORTB&=~(1<<2);if(cnt>0){PORTB|=(1<<3);}_delay_ms(200);bre
ak;}}}
else
{lcd_init();
lcd_gotoxy(3,1);
lcd_string(wr); _delay_ms(500);}
}
void exit()
{PORTB|=(1<<2);
while(1){if(PINB & 0x01){cnt--;
PORTB&=~(1<<2);lcd_init();lcd_gotoxy(5,1);lcd_string("GOOD
BY");if(cnt<=0)PORTB&=~(1<<3);
_delay_ms(1000);while(PINB & 0x01);break;}

}
unsigned char count=0;
int main(void) //main function
{
DDRD |= (1<<7); //PB3 as output
OCR2 =
255;
TCCR2 = 0x76;;
TIMSK |= (1<<TOIE2) ;
sei( );
DDRB=0x0C; // PB 0,1 input and PB.2 ,PB.3
KEY_DDR=0x0F;
while(1)
{ lcd_init();
lcd_gotoxy(5,1);
lcd_string("Count=");
count=cnt&0x0F;
count=count|0x30;
lcddata(count);
while(1){if(PINB & 0x01){enter();break;}if(PINB &
0x02){exit();break;}}
//while(1){if(PINB & 0x01){enter();break;}if(PINB &
0x02){exit();break;}}
_delay_ms(100);
}
return 0;}

PCB CIRCUIT DESIGN:

CONCLUSION:
Hereby we come to the end of our project
AUTOMATIC ROOM LIGHT CONTROLLER WITH BIDIRECTIONL
VISITOR COUNTER.
Application of this project
For counting purposes
For automatic room light control

Advantages of this project


Low cost
Easy to use
Implement in single door
Future Expansion
By using this circuit and proper power supply we can implement
various applications such as fans, tube lights, etc.
By modifying this circuit and using two relays we can achieve a task
of opening and closing the door

Reference:

. http://www.engineersgarage.com/electronic-components/lm324n-datasheet
http://www.engineersgarage.com/electroniccomponents/atmega16- microcontroller

You might also like