Wednesday, 28 March 2012

week 11:

HARDWARE
This project will require following hardware:
a)      1 x PIC16F873A
b)      1 x PJT 11 Printed Circuit Board (PCB)
c)      1 x LCD
d)      1 x Buzzer
e)      2 x Temperature Sensor (LM35)
f)       Other related electronic component

Interface PIC16F873A with Temperature Sensor (LM35)
Signal pin (Vout) from LM35 can be connected to either one of analog input pin (AN0-AN4) except AN3 (pin 5) but make sure the ADC configuration is correct. In fact, pin 5 (Vref+)from PIC should be given for 1V but it may has offset, so a variable resistor (VR1) was installed for voltage adjusting. For more stability, user is recommended add a capasitor (104) between the analog signal and GND for every analog input such as signal from LM35 and variable resistor (VR1).

Interface PIC16F873A with LCD
The 16 header pin should be soldered to the LCD first. The following table shows the LCD (2X16 character) connection:
PIN
PIN NAME
FUNCTION
CONNECTION
1
VSS
Ground
GND
2
VCC
Positive supply for LCD
5V
3
VEE
Contrast adjust connected to a preset for contrast adjusting

4
RS
Select register, select instruction or data register
RA2
5
R/W
Select read or write
GND
6
E
Start data read or write
RA5
7
DB0
Data bus pin
RC0
8
DB1
Data bus pin
RC1
9
DB2
Data bus pin
RC2
10
DB3
Data bus pin
RC3
11
DB4
Data bus pin
RC4
12
DB5
Data bus pin
RC5
13
DB6
Data bus pin
RC6
14
DB7
Data bus pin
RC7
15
LED+
Backlight positive input
5V
16
LED-
Backlight negative input
GND
                                                                    TABLE 1

Wednesday, 21 March 2012

week 10:
OVERVIEW
This report describes the development project (PJT11). This project will use PIC16F873A to control NPN power transistor (BD135) further drive DC brushless fans, LEDs and buzzer when the certain temperature was detected. The value of temperature always displayed on a LCD screen. Circuit schematic and PIC source code will be provided.
FEATURES
PIC controlled DC brushless fan, LEDs and buzzer
-PIC16F873A with internal ADC read the analog voltage from LM35 (Temperature sensor) and      display it on LCD display.
BD135 power transistor
-Capable of driver DC brushless fan (0.12A)
Temperature sensor (LM35DZ)
-Sensor gain, 10mV/°C (average slope)
-0-100°C
-LCD display (always display the value of the temperature)
Fans, LEDs and buzzer are activated when the certain temperature was detected.

Wednesday, 14 March 2012

week 9:
Flow Chart



GENERAL DESCRIPTION 
PIC has been used to control the LED or buzzer directly for some other projects. But in this project, PIC cannot directly activate the DC brushless fan because it has not enough current.NPN power transistor (BD135) is required, so that dc brushless fan can be controlled by PIC.PIC16F873A will read the analog voltage (using ADC) from LM35 temperature sensor and display it on LCD display. A buzzer, LEDs or fans will be activated when temperature reach a certain temperature value.

For this project, temperature sensors (LM35) and cooling fans are connected to the circuit board through some wires and connectors. The length of the wires is various depend on the distance of certain where would be measured. Each polarity should be correctly connected. Differentiate the of the connector and please use 2510 connector for LM35 and 2532 connector for cooling fan.

Wednesday, 7 March 2012

week 8:
  •  holiday agains.... it so many holiday in this sem... 
it is time for the Honeymoon ideas 




Wednesday, 29 February 2012

week 7 :
This week phase test so there are not many things that can be done on our projects.
We only make final report........
and this our pic program........

//==================inckude=================================
#include<pic.h>

//===============configuration==============================
__CONFIG (0x3F32);

//===============define IO port=============================
#define lcd PORTC
#define RS RA2
#define E RA5
#define CHANNEL0 0b10000001 // AN0
#define CHANNEL1 0b10001001 // AN1
#define buzzer RB5
#define fanA RB4
#define fanB RB3
#define ledA RB2
#define ledB RB1

//==============FUNCTION PTOTOTYPE=========================
void e_pulse(void);
void delay(unsigned short i);
void send_char(unsigned char data);
void send_config(unsigned char data);
void lcd_goto(unsigned char data);
void lcd_clr(void);
void dis_num(unsigned long data);
void increment(unsigned long data);
void read_adc(void);
unsigned short read_temp(void);

//====================MAIN================================
unsigned short result;
unsigned short temp,tempA,tempB;

void main(void)
{
ADRESH=0; //clear A/D result
ADRESL=0; //clear A/D result

//setting ADCON1 Register
ADCON1=0b11000101; // A/D result right justified, 
// configure RA2 and RA5 as digital I/O

TRISA=0b11011011; //configure PORTA I/O direction
TRISB=0b00000000; //configure PORTB as output
TRISC=0b00000000; //configure PORTC as output

PORTA=0;
PORTB=0;

while(1)
{
send_config(0b00000001); //clear display at lcd
send_config(0b00000010); //Lcd Return to home
send_config(0b00000110); //entry mode-cursor increase 1
send_config(0b00001100); //diplay on, cursor off and cursor blink off
send_config(0b00111000); //function set

lcd_goto(0); //cursor start from beginning

//display character on LCD
send_char(' ');
send_char('T');
send_char('E');
send_char('M');
send_char('P');
send_char('.');
send_char('A');
send_char('=');

lcd_goto(20); //cursor go to 2nd line of the LCD

//display character on LCD
send_char(' ');
send_char('T');
send_char('E');
send_char('M');
send_char('P');
send_char('.');
send_char('B');
send_char('=');

while(1) //infinity loop
{
//sensor A
ADCON0=CHANNEL1; //CHANNEL1=0b10001001
lcd_goto(8);

read_adc();

temp=read_temp();
dis_num(temp/10);
send_char('.');
dis_num(temp%10);
send_char(0b11011111);
send_char('C');
send_char(' ');
send_char(' ');

tempA=temp;

//sensor B
ADCON0=CHANNEL0; //CHANNEL0=0b10000001

lcd_goto(28);

read_adc();

temp=read_temp();
dis_num(temp/10);
send_char('.');
dis_num(temp%10);
send_char(0b11011111);
send_char('C');
send_char(' ');
send_char(' ');

tempB=temp;

if((tempA>400)&&(tempB<350)) // *****************************************
{ // * LED A and Fan A activated only for  *
ledA=1; // * temperature A greater than 40'C *
ledB=0; // * and temperature B less than 35'C *
fanA=1; // *****************************************
fanB=0;
buzzer=0;
}

else if((tempB>350)&&(tempA<400))  // *****************************************
{ // * LED B and Fan B activated only for  *
ledA=0; // * temperature A less than 40'C and *
ledB=1; // * temperature B greater than 35'C *
fanA=0; // *****************************************
fanB=1;
buzzer=0;
}

else if((tempB>350)&&(tempA>400))  // *****************************************************
{ // * All LED A & LED B, Fan A & Fan B and Buzzer *
ledB=1; // * activated for temperature A greater than 40'C *
ledA=1; // * and temperature B greater than 35'C *
fanA=1; // *****************************************************
fanB=1;
buzzer=1;
}

else if((tempB<350)&&(tempA<400)) // *****************************************************
{ // * All LED A & LED B, Fan A & Fan B and Buzzer *
ledB=0; // * disactivated for temperature A less than 40'C *
ledA=0; // * and temperature B less than 35'C *
fanA=0; // *****************************************************
fanB=0;
buzzer=0;
}

delay(2000);

}

}

}



//==================subroutine LCD setting ==========================

void send_config(unsigned char data)
{
  RS=0;
lcd=data;
delay(500);
e_pulse();
}

void e_pulse(void)
{
E=1;
delay(500);
E=0;
delay(500);
}

void send_char(unsigned char data)
{
  RS=1;
lcd=data;
delay(500);
e_pulse();
}


void lcd_goto(unsigned char data)
{
  if(data<16)
{
  send_config(0x80+data);
}
else
{
  data=data-20;
send_config(0xc0+data);
}
}


void lcd_clr(void)
{
RS=0;
  send_config(0x01);
delay(600);
}


void dis_num(unsigned long data)
{
unsigned char hundred_thousand;
unsigned char ten_thousand;
unsigned char thousand;
unsigned char hundred;
unsigned char tenth;

hundred_thousand = data/100000;
data = data % 100000;
ten_thousand = data/10000;
data = data % 10000;
thousand = data / 1000;
data = data % 1000;
hundred = data / 100;
data = data % 100;
tenth = data / 10;
data = data % 10;

if(hundred_thousand>0)
{
send_char(hundred_thousand + 0x30); //0x30 added to become ASCII code
send_char(ten_thousand + 0x30);
send_char(thousand + 0x30);
send_char(hundred + 0x30);
send_char(tenth + 0x30);
send_char(data + 0x30);
}

else if(ten_thousand>0)
{
send_char(ten_thousand + 0x30); //0x30 added to become ASCII code
send_char(thousand + 0x30);
send_char(hundred + 0x30);
send_char(tenth + 0x30);
send_char(data + 0x30);
}
else if(thousand>0)
{
  send_char(thousand + 0x30); //0x30 added to become ASCII code
send_char(hundred + 0x30);
send_char(tenth + 0x30);
send_char(data + 0x30);
}
else if(hundred>0)
{
  send_char(hundred + 0x30); //0x30 added to become ASCII code
send_char(tenth + 0x30);
send_char(data + 0x30);
}
else if(tenth>0)
  {
send_char(tenth + 0x30); //0x30 added to become ASCII code
send_char(data + 0x30);
}
else send_char(data + 0x30); //0x30 added to become ASCII code
}

void increment(unsigned long data)
{
unsigned short j;
for(j=10;j>0;j--)
{ lcd_goto(32);
data=data+1;
dis_num(data);
delay(10000);
}

}

//==================subroutine ADC=========================

void read_adc(void)
{
unsigned short i;
unsigned long result_temp=0;
for(i=2000;i>0;i-=1) //looping 2000 times for getting average value
{
ADGO = 1; //ADGO is the bit 2 of the ADCON0 register
while(ADGO==1); //ADC start, ADGO=0 after finish ADC progress
result=ADRESH;
result=result<<8; //shift to left for 8 bit
result=result|ADRESL; //10 bit result from ADC

result_temp+=result;
}
result = result_temp/2000; //getting average value

}

unsigned short read_temp(void)
{
unsigned short temp;
temp=result;
return temp;

}

//==================subroutine DELAY==========================
void delay(unsigned short i)
{
for(;i>0;i--);
}