Using Home Computers To Control Household Device: Interfacing A Computer Parallel Printer Port
Using Home Computers To Control Household Device: Interfacing A Computer Parallel Printer Port
Using Home Computers To Control Household Device: Interfacing A Computer Parallel Printer Port
A laptop, Personal Computer, or any device with a printer port may be interfaced to external devices or circuitry. This
application has many uses, such as controlling greenhouse heating or lighting, driving a motor or pump, and so on.
Up to eight circuits may be controlled from one printer port. There are two key components: software to control the
switching, and an electronic interface to connect the computer to the external switching circuit.
The parallel printer port on the PC has 8 lines, and by convention these are referred to as bits 0 to 7, and they
represent an 8-bit binary number. They are all initialized at OFF, by writing the number zero to the printer port. The
section "Software to Control Device Via PC" describes how to do this.
Ads by Google
Motor Control Tutorials Free Web Tutorials from Galil, The World Leader in Motor Control. www.Galilmc.com
In the most simple case, where only one device needs to be controlled, the only numbers sent to the printer port are 0
and 1, so no binary to decimal conversion is needed. If a known combination of switches needs to be set, let OFF be
represented by 0, and ON be represented by 1.
For example, switch on the heating(switch 0), lighting (switch 1), and humidifier (switch 2). The binary number is 111,
and it can be converted using the Microsoft Excel function BIN2DEC(111), and will return the number 7. To set the
three switches, simply write the number 7 to the parallel printer port. For a more complete description of decimal and
binary conversion, see Decimal, Binary, Octal and Hexadecimal Number Systems.
Read On
Save Money, Save Energy, Save the Environment
How To Protect ADSL Connected PCs From Lightning
How to Set Up a Twisted Pair Local Area Network
#define LLEL_ADDR 0x378 /* Define the hexadecimal address of the parallel printer port */
void main(void)
while() /* Enter the conditions to wait for e.g. Wait for 6 hours */
{ }; /* Do nothing */
while() /* Enter the conditions to wait for e.g. Wait for 18 hours */
{ }; /* Do nothing */
} /* End of Main */
This example shows how to do the cycle once. For timer control of household devices that need to be switched at
certain times every day, a loop could be used:
do{}
while();
Figure 1 shows the circuit needed to interface one line from the parallel printer port to a small motor. If all that is
needed is to switch on a plug socket to operate mains-operated equipment, then only the opto-isolator is needed,
connected to a solid state relay.
A 12 Volt supply is needed, and can be obtained cheaply. On a standard 25-pin parallel port, pins 2 to 9 (i.e. bits 0 to
7) can each supply about 5 volts when switched on. Each line from the printer port needs to be completed by
attaching it to the PC ground, and these can be found at pins 18 to 25 of the 25-pin printer port.
The component values used are typically:
R1 220 Ω
R2 2200 Ω
R3 10,000 Ω
Opto-Isolator OPI 110C
Diode - Any: IN4002 is rated at 100 Volts
Transistor TIP141 is heavy-duty darlington pair that can drive a small motor. The motor M may be replaced with a
solid state relay (SSR) that is used to switch on any mains electricity. If a relay will be used to switch on household
devices, then the circuit will change, as described in the article Computer Control of External Devices Using a
Relay should be consulted.
Home computers, laptops, and even PDAs have a wide range of uses to control switching devices in the home,
garden, greenhouse or other areas. It is a simple task to program and wire the computer to an external device or
circuit via the parallel printer port, with readily available components.
http://www.suite101.com/content/using-home-computers-to-control-household-device-a99329
PARTS LIST:
Semiconductors:
ICl, IC2, IC3 – 74LS154 l-of-16 decoder
IC4, IC5, IC6 – 74LSO5 inverter
IC7-ICI4 – 74LS74 D-type flip/flop
ICI5, IC16 – ULN2803 octal Darlington array driver
Misc.
Power supply – 5V regulated DC, 12VregulatedDC
Relay – 12V,200-ohm, lC/O SPDT
BLOCK DIAGRAM:
The block diagram in Fig. 1 depicts the main components of the switching system for 255 electrical loads
using PC. The control command to switch on/off the appliances is given through the keyboard. The
software program scans the input and as per the input command, the data is available at the parallel
port.
Out of eight bits, first four bits (D0 through D3) are data signal bits and the remaining four bits (D4
through D7) are used as control signals. Control signals are given to decoder 1. The output of decoder 1
is given to Enable pins of decoders 2 and 3. Data signals are given to both decoders 2 and 3. The outputs
of decoders 2 and 3 are inverted and fed to a D-type flip/flop that is used to latch the data. The latched
data output is given to relay driver ICs ULN2803. The relay drivers drive the relays for switching the
appliances.
COMPONENT DESCRIPTION:
1. THE PARALLEL PORT:
The parallel port or line printer terminal (LPT) port is a 25-pin D-type female connector available at the
back of your PC. A basic IBM PC usually comes with one or two LPT ports. The original parallel port,
called standard parallel port (SPP), is a bundle of three ports (or registers), namely, data port, status
port, and control port. Pins 2 through 9 form the 8-bit data port. This port is purely a write-only port. This
means it can be used only to output some data through it. Pins I, 14, 16, and 17 form the control port,
which is capable of reading/writing. Pins 10 through 13 and pin 15 together form the status port. The
status port is a read-only port. The details of 25-pin parallel port are given in Table 1.
The base address of the first parallel port (LPT1) is 0378 in hexadecimal (hex) notation (or 888 in decimal
notation). The base address of the second parallel port (LPT2) is 0278 in hex. In this project, we’ve used
only LPT1.
2. DM74LS154 : 4-LINE TO 16-LINE DECODER / DE-MULTIPLEXER:
Each of these 4-line-to-16-line decoders utilizes TTL circuitry to decode four binary-coded inputs into one
of six-teen mutually exclusive outputs when both the strobe inputs, GI and G2, are LOW. The de-
multiplexing function is performed by using the 4 input lines to address the out-put line, passing data
from one of the strobe inputs with the other strobe input LOW. When either strobe input is HIGH, all
outputs are HIGH. These de-multiplexers are ideally suited for implementing high-performance memory
decoders.
All inputs are buffered and input clamping diodes are provided to minimize transmission line effects and
thereby simplify system design.
3. 74LS74 : DUAL D-TYPE POSITIVE-EDGE-TRIGGERED FLIP-FLOPS:
These devices contain two independent D-type positive-edge triggered flip-flops. A low level at the preset
or clear inputs sets or resets the outputs regardless of the levels of the other inputs. When preset and
clear are inactive (high), data at the D input meeting the setup time requirements are transferred to the
outputs on the positive-going edge of the clock pulse. Clock triggering occurs at a voltage level and is not
directly related to the rise time of the clock pulse. Following the hold time interval, data at the D input
may be changed without affecting the levels at the outputs.
4. HEX INVERTER:
It is used for inversion of input signal. Since outputs from the de-multiplexers are active low, we invert
them. This IC has 6 not-gates and hence called a hex-inverter.
5. ULN-2803 : OCTAL PERIPHERAL DRIVER ARRAYS:
The eight NPN Darlington connected transistors in this family of arrays are ideally suited for interfacing
between low logic level digital circuitry (such as TTL, CMOS or PMOS/NMOS) and the higher
current/voltage requirements of lamps, relays, printer hammers or other similar loads for a broad range
of computer, industrial, and consumer applications. All devices feature open-collector outputs and
freewheeling clamp diodes for transient suppression. The ULN2803 is designed to be compatible with
standard TTL families while the ULN2804 is optimized for 6 to 15volt high-level CMOS or PMOS.
6. RELAYS:
The relay is a device by means of which an electrical circuit can be controlled (opened or closed) by
sensing a change in the circuit in which it is connected. The relays can be either electromagnetic or
electronic. In this circuit the electromagnetic relay is used to connect or disconnect the supply to the
appliance to be controlled. It works on the principle of electromagnetic attraction and electromagnetic
induction. These relays can be actuated by AC or DC quantities. In these relays there are one or more
coils, movable elements, contact systems etc.
CIRCUIT DESCRIPTION AND WORKING:
The circuit comprises decoder, inverter, latch circuit, and relay driver sections. The circuit, excluding relay
drivers and relays, is powered by a 5V DC regulated supply. Relay drivers and relays are driven by a 12V
DC regulated supply. Each relay is rated 12V,200-ohm.
The circuit for switching on/off 6 loads is shown in Fig. 2. For more than 6 loads, you can add more ICs
in a similar way as shown in this circuit. IC 74LSI54 is a 24-pin, 4-to-16 line decoder IC. This IC is
designed to accept four inputs and provide 16outputs. Input addresses Al through A4 to pins 20 through
23 of IC1 and IC2 (IC 74LSI54) each are given from the data lines of the computer parallel port.
In this circuit, only pins 2 through 9 of the parallel port are used, where data lines D0 through D3 form
the 4-bit data input and D4 through D7 are address-select or control lines for the circuit. Pins 18 through
25 are shorted to ground. Data lines D0 through D3 are the input addresses for IC2, and data linesD4
through D7 are the input addresses for IC1.
When Enable pins EI and E2 (active low) are high, all the outputs go high irrespective of the address
inputs (AI through A4). Enable pins EI and E2 of ICI are grounded and its output pins YO through YI5 are
connected to Enable pins of the respective decoder ICs.
Initially all the data inputs (D0 through D7) are low. Thus, except Y0,all the outputs of ICI and IC2 are
high. The output Y0 of IC2 is not used, for the reason that when all the input data is low, none of the
outputs of IC 74LSI54 is used for switching the loads. Suppose, out of eight input data lines, D0 is high.
So, except Y1, all the outputs of IC2 will be high. YI is then inverted using IC4 (IC 74LS05). The output
of IC4 at pin 2 is given to pin 3 of IC7 (lC 74LS74). IC 74LS74 is a dual D-type flip-flop used for latching
the data.
With an active rising edge of the clock pulse (CP-1 or CP-2), the data input will be locked in IC7 through
IC14 until the next rising edge of the input clock pulse. The outputs of ICs 74LS74 are given to relay
driver ICs ULN2803 (lC-15 and IC-16), which, in turn, drive the relays. The relays are used to switch
on/off the appliances.
Fig 2. Circuit diagram of the project
SOFTWARE :
The program to control the appliances is written in C. it is compiled using Turbo C compiler. The flow
chart of the program is as follows
Fig-3: Flow chart for Implementation of Program
Fig-4: Flow charts of the functions Used
On running the program SRC_CODE.C the menu appears as shown below, asking for the operation to be
done.
The very first option shows the list of the loads that could be controlled using this software along with
their codes.
The outstanding part of this software is activating of required PROFILES at once so that the burden of
controlling of individual devices is eliminated.
The activation of night profile is as shown below. We can even set the user defined profiles.
As a basic requirement the control over individual devices is also provided. If the user by mistake tries to
switch ON the device which is already ON, the software detects it & the corresponding message is
displayed.
The software also allows the user to know the current status of the loads.
SOURCE CODE:
/* PROGRAM TO CONTROL MULTIPLE DEVICES USING PC’S PARALLEL PORT */
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<dos.h>
#include<string.h>
FILE *status;
int ch;
char *dev_list[]={“idle”,”TUBELIGHT”,”FAN”,”NIGHTLAMP”,”TELEVISION”,
”AIRCOOLER”,”REFRIGERATOR”,”DVD_PLAYER”,”end” };
int day[]={0,2,4,6,0,1,3,5,7,0};
int night[]={0,1,2,3,5,6,7,0,4,0};
int out[]={0,3,0,1,2,4,5,6,7,0};
int reset[]={0,0,1,2,3,4,5,6,7,0};
int device[256];
int port=0×378;
void activate(int *ptr);
void switch_load(int);
main()
{
int disp_menu();
void disp_load();
void profiles();
void switching();
void load_status();
void exit_code();
int welcome();
int choice;
int hour;
status_file();
for(;;)
{
clrscr();
hour=welcome();
choice=disp_menu();
switch(choice)
{
case 1: disp_load();
printf(“nnn Press any key to continue….”);
getch();
break;
case 2: profiles();
break;
case 3: switching();
break;
case 4: load_status();
break;
case 5: exit_code(hour);
default: printf(“nn INVALID CHOICE”);
printf(“nnnnn PRESS ANY KEY TO RETURN TO MAIN MENU…..”);
getch();
}
}
}
status_file()
{
int i=0;
status=fopen(“status.txt”,”r”);
if(status==NULL)
{
puts(“Unable to open device status file”);
exit(1);
}
while(1)
{
ch=fgetc(status);
if(i>=256)
break;
else
device[i]=ch;
i++;
}
fclose(status);
return(0);
}
welcome()
{
struct time t;
struct date d;
clrscr();
printf(“nnttt $$$ POWER CONTROL USING PC $$$nnn”);
gettime(&t);
getdate(&d);
printf(“nn TIME: %2d:%2d”,t.ti_hour,t.ti_min);
printf(“nn DATE: %2d/0%d/%2d”,d.da_day,d.da_mon,d.da_year);
if(t.ti_hour>=0×5&&t.ti_hour<0xb)
printf(“nn GOOD MORNING….n”);
if(t.ti_hour>=0xb&&t.ti_hour<0×11)
printf(“nn GOOD AFTERNOON….”);
if(t.ti_hour>=0×11&&t.ti_hour<0×16)
printf(“nn GOOD EVENING….”);
return(t.ti_hour);
}
int disp_menu()
{
int choice;
printf(“n 1.LIST OF LOADS & THEIR CODES”);
printf(“n 2.STANDARD PROFILES(DAY/NIGHT)”);
printf(“n 3.SWITCHING”);
printf(“n 4.LOAD’S STATUS”);
printf(“n 5.EXITn”);
printf(“tttt ENTER YOUR CHOICE:”);
scanf(“%d”,&choice);
return(choice);
}
void disp_load()
{
int i;
clrscr();
printf(“n THE LIST OF LOADS WHICH CAN BE CONTROLLED ARE:nn”);
for(i=1;strcmpi(&dev_list[i][0],”end”);i++)
printf(“nt %2d.%s”,i,dev_list[i]);
return;
}
void profiles()
{
char p;
for(;;)
{
clrscr();
printf(“n STANDARD PROFILES:n”);
printf(“nntt 1.DAY MODE”);
printf(“ntt 2.NIGHT MODE”);
printf(“ntt 3.OUT OF STATION”);
printf(“ntt 4.RESET”);
printf(“ntt 5.EXIT”);
printf(“nnnn ENTER YOUR CHOICE: “);
p=getchar();
switch(p)
{
case ‘d’:
case ‘D’:
case ’1′: activate(day);
return;
case ‘n’:
case ‘N’:
case ’2′: activate(night);
return;
case ‘o’:
case ‘O’:
case ’3′: activate(out);
return;
case ‘r’:
case ‘R’:
case ’4′: activate(reset);
return;
case ‘e’:
case ‘E’:
case ’5′: return;
}
}
}
void activate(int *ptr)
{
int i;
char c;
printf(“nnTHE FOLLOWING DEVICES WILL BE SWITCHED ON…..n”);
for(i=1;ptr[i]!=0;i++)
printf(“n%d.%s”,ptr[i],dev_list[ptr[i]]);
printf(“nnTHE FOLLOWING DEVICES WILL BE SWITCHED OFF…..n”);
for(i++;ptr[i]!=0;i++)
printf(“n%d.%s”,ptr[i],dev_list[ptr[i]]);
printf(“nn DO YOU WANT TO ACTIVATE THIS PROFILE….(y/n):”);
c=getch();
printf(“%c”,c);
getch();
if(c==’y'||c==’Y')
{
for(i=1;ptr[i]!=0;i++)
if(device[ptr[i]]==0)
switch_load(ptr[i]);
for(i++;ptr[i]!=0;i++)
if(device[ptr[i]]==1)
switch_load(ptr[i]);
}
}
void switching()
{
int i,on_off;
disp_load();
printf(“nnnnEnter the code of the device to be switched:”);
scanf(“%d”,&i);
printf(“OPTIONS:”);
printf(“t 0–OFFt 1–ONn”);
printf(“n ENTER YOUR CHOICE:”);
reenter: scanf(“%d”,&on_off) ;
if(on_off==1)
{
if(device[i]==1)
{
printf(“nThe Device is already ON”);
getch();
}
else
switch_load(i);
}
else if(on_off==0)
{
if(device[i]==0)
{
printf(“nThe Device is already OFF…”);
getch();
}
else
switch_load(i);
}
else
{
printf(“Invalid optionn Please Re-enter”);
goto reenter;
}
}
void load_status()
{
int i;
clrscr();
printf(“nn THE FOLLOWING DEVICES ARE ON:n”);
for(i=1;strcmpi(&dev_list[i][0],”end”);i++)
if(device[i]==1)
printf(“n%d.%s”,i,dev_list[i]);
printf(“nnTHE FOLLOWING DEVICES ARE OFF:n”);
for(i=1;strcmpi(&dev_list[i][0],”end”);i++)
if(device[i]==0)
printf(“n%d.%s”,i,dev_list[i]);
printf(“nnnnPress any key to continue……”);
getch();
}
void switch_load(int adrr)
{
if(device[adrr]==0)
{
device[adrr]=1;
outportb(port,adrr);
delay(50);
outportb(port,0×00);
}
else
{
evice[adrr]=0;
outportb(port,adrr);
delay(50);
outportb(port,0×00);
}
}
void exit_code(int hour)
{
clrscr();
printf(“ttt THANK YOU FOR USING THIS SOFTWARE n”);
if(hour>=0×13||hour<=0×4)
printf(“nn GOOD NIGHT….n”);
file_update();
printf(“nnnnnnn Press any key to EXIT……”);
getch();
exit(0);
}
file_update()
{
int i=0;
status=fopen(“status.txt”,”w+”);
if(status==NULL)
{
puts(“Unable to open device status file”);
exit(1);
}
while(1)
{
ch=device[i];
if(i>=256)
break;
else
fputc(ch,status);
i++;
}
fclose(status);
return 0;
}
CONCLUSION:
This project, can be effectively and conveniently utilized for the control of different appliances. As this
project could be extended to control about 255 devices, this could be used for computerization of an
office, home, or a firm. Though it is quiet costlier, the circuit is simple and the working mechanism could
be easily understood. An added advantage of this project is that we are able to know the status of the
device to be controlled. The program to control the appliances is written in C language which is more
user friendly and easy to understand than other programming languages.
Disadvantages / Improvements:-
If at all a new device has to be added to the hardware the software doesn’t support this to achieve
which the source code has to be changed manually.
The status of all the devices that are switched are maintained in a database which may not coincide with
actual status of the devices as we are not reading the status directly from the HARDWARE.
By
1. Anand Kumar. N. Ilkal
2. Anil Kumar Desai
3. Gara Naveen
4. Umesh. N. Sajjan
Author Name :
Ranjith
Total : 14 Comments
http://electrofriends.com/projects/computer-programming/device-switching-using-pc
%E2%80%99s-parallel-port/