This light-weight Electronics Engineering Calculator app is pretty neat and good. It works on many platforms such as Android, Linux, and Windows. The app contains every calculator found on the calculator page on this site. The android version is not on google play yet, and I don’t know if it ever will. You can download the apk file and open it up on your Android File Manager. The file manager on my phone was called “Downloads”. Also, did I mention EECalc is open source written for Delphi or FreePascal?
Program eecalc;
//Android apk package com.delphieecalc
Uses sysutils,classes,math;
{$DEFINE Android}//Define that the os is android.
{$IFDEF Android}
const data_dir='/storage/emulated/0/eecalc.dir';
{$ENDIF}
{$IFNDEF Android}
const data_dir='eecalc.dir';
{$ENDIF}
{$IFDEF Windows}
//dont forget to compile it as a console app. use $APPTYPE Compiler Directive.
const dir_char='\';
{$ENDIF}
{$IFNDEF Windows}
const dir_char='/';
{$ENDIF}
Type
TEECommand = Record
proc: tprocedure;
help: string;
percentage: extended;
End;
PEECommand = ^TEECommand;
TMetricExponent = -12..12;
Const number_fmt = '#,###.000';
Var command: string;
commands: tstringlist;
cmd: peecommand;
Function getNumber(msg:String;Var y:extended): boolean;
Var s: string;
expo: tmetricexponent;
noExpo: boolean;
Begin
s := '';
noExpo := false;
write(msg,':');
readln(s);
s := trim(s);
expo := 0;
If length(s)>0 Then
Case s[length(s)] Of
'p','P': expo := -12;
'n','N': expo := -9;
'u','U': expo := -6;
'm': expo := -3;
'k','K': expo := 3;
'M': expo := 6;
'g','G': expo := 9;
't','T': expo := 12;
Else noexpo := true;
End;
If Not noexpo Then delete(s,length(s),1);
y := strtofloatdef(trim(s),0)*power(10,expo);
getNumber := (y=0);
End;
Procedure displayNumber(name:String;x:extended);
Var y: string;
C: char;
expo: tmetricexponent;
Begin
expo := -12;
If x>=power(10,-9)Then expo := -9;
If x>=power(10,-6)Then expo := -6;
If x>=power(10,-3)Then expo := -3;
If x>=1 Then expo := 0;
If x>=power(10,3)Then expo := 3;
If x>=power(10,6)Then expo := 6;
If x>=power(10,9)Then expo := 9;
If x>=power(10,12)Then expo := 12;
Case expo Of
-12: C := 'p';
-9: c := 'n';
-6: c := 'u';
-3: c := 'm';
0: c := ' ';
3: c := 'k';
6: c := 'M';
9: c := 'G';
12: c := 'T';
End;
writeln(name,':',formatfloat(number_fmt,x/power(10,expo)),c);
End;
Function divide(n,d:extended): extended;
Begin
divide := 0;
If d=0 Then
Begin
writeln(' Divide by 0 error');
exit;
End;
divide := n/d;
End;
Function CommandPercentage(s1,s2:String): extended;
Var i: integer;
Begin
commandpercentage := 0;
For i :=1 To min(length(s1),length(s2)) Do
If lowercase(s1[i])=lowercase(s2[i]) Then
commandpercentage := commandpercentage+1;
commandpercentage := (commandpercentage/length(s2))*100;
End;
Procedure VDivide;
Var vin,vout,r1,r2: extended;
Begin
writeln('Leave one answer blank,except for voltage in');
getnumber('Voltage In',vin);
getnumber('Voltage Out',vout);
getnumber('R1',r1);
getnumber('R2',r2);
If vout=0 Then
Begin
vout := divide(r2,r1+r2)*vin;
displaynumber('Voltage Out',vout);
exit;
End;
If r1=0 Then
Begin
r1 := divide(vin,vout)*r2;
displaynumber('R1',r1);
exit;
End;
r2 := r1*divide(1,divide(vin,vout)-1);
displaynumber('R2',r2);
End;
Procedure monostable;
Var r,kt,c,t: extended;
k,ts: string;
sec: tdatetime;
Begin
sec := encodetime(0,0,1,0);
write('Enter Time constant(number or t for 555 timer or q for transistor):');
k := '0';
readln(k);
kt := strtofloatdef(k,0);
If (kt=0)And(length(k)>0)Then
Case trim(k)[1] Of
't','T': kt := 1.1;
'q','Q': kt := 0.7;
End;
If kt<=0 Then
Begin
writeln('Constant must be a number and > 0 or a defines letter');
exit;
End;
Writeln('Leave one answer blank');
getnumber('Enter Period(in seconds)',t);
getnumber('Enter Resistance',r);
getnumber('Enter Capacitance',c);
If t=0 Then
Begin
t := r*c*kt;
writeln('Duration: '+formatdatetime('hh:mm:ss',t*sec));
displaynumber('Time Period',t);
End;
If r=0 Then displaynumber('Resistance',divide(t/sec,kt*c));
If c=0 Then displaynumber('Capacitance',divide(t/sec,r*kt));
End;
Function prompt: boolean;
Var index,i: integer;
Begin
write('EECalc>');
readln(command);
prompt := (uppercase(trim(command))<>'EXIT');
If Not prompt Then exit;
index := -1;
For i:= 0 To commands.count-1 Do
Begin
cmd := pointer(commands.objects[i]);
If commandpercentage(command,commands[i])>=cmd^.percentage Then index := i;
End;
If index=-1 Then
Begin
writeln('Bad command');
exit;
End;
cmd := pointer(commands.objects[index]);
cmd^.proc;
End;
Procedure help;
Var i: integer;
Begin
writeln('Heres all ',commands.count,' commands:');
For i:= 0 To commands.count-1 Do
Begin
cmd := pointer(commands.objects[i]);
writeln(commands[i],' ',cmd^.help);
End;
writeln;
writeln('All commands have no parameters');
End;
Procedure adc;
Var v,vref: extended;
s: string;
n,a: integer;
Begin
getnumber('Voltage Referemce',vref);
write('Enter Number Of Bits:');
readln(s);
n := strtointdef(s,0);
writeln('Leave One answer blank');
S := '';
write('Enter Analog Value:');
readln(s);
a := strtointdef(s,-1);
If a>-1 Then
Begin
displaynumber('Voltage Out',a*Divide(vref,power(2,n)-1));
exit;
End;
write('Enter Voltage:');
s := '';
readln(s);
v := strtofloatdef(s,-1);
a := trunc(divide(power(2,n)-1,vref)*v);
writeln('Analog Value: ',a);
End;
Procedure combo;
Var x,y: extended;
count: integer;
Begin
y := 0;
count := 1;
writeln('Enter a blank value when done');
While Not getNumber(format('Value#%d',[count]),x) Do
Begin
y := y+x;
inc(count);
End;
displaynumber('Result',y);
End;
Procedure fuses;
Const fusearray: array[1..16] Of extended = (30,25,20,15,10,8,6,5,4,3,2.5,2,1.5,1,0.5,0.25);
Var i,index: integer;
currentfuse,volts,amps,watts: Extended;
Begin
index := 0;
getnumber('Enter Voltage',volts);
getnumber('Enter Amps',amps);
watts := volts*amps;
currentfuse := (watts/volts)*1.25;
For i:=1 to 16 Do
If fusearray[i]>currentfuse Then index := i;
If index = 0 Then
Begin
writeln('Fuse not found');
exit;
End;
writeln('Fuse Rating: '+formatfloat('0.0',fusearray[index])+'A');
End;
Procedure recipcombo;
Var x,y: extended;
count: integer;
Begin
y := 0;
count := 1;
writeln('Enter a blank value when done');
While Not getNumber(format('Value#%d',[count]),x) Do
If x>0 Then
Begin
inc(count);
y := y+(1/x);
End;
displaynumber('Result',divide(1,y));
End;
Procedure ohmslaw;
Var v,a,r,w: extended;
s: string;
Begin
v := 0;
a := 0;
r := 0;
writeln('Leave one answer blank');
getnumber('Enter Voltage',v);
getNumber('Enter Current',a);
If a*v>0 Then
Begin
r := divide(v,a);
w := v*a;
displaynumber('Resistance',r);
displaynumber('Power',w);
exit;
End;
getnumber('Enter Resistance',r);
If v=0 Then
Begin
v := a*r;
displaynumber('Voltage',v);
End;
If a=0 Then
Begin
a := divide(v,r);
displaynumber('Curent',a);
End;
w := v*a;
displaynumber('Power',w);;
End;
procedure Astable;
var r1,r2,c,f,hit,lot:extended;
begin
getnumber('Enter R1',r1);
getnumber('Enter R2',r2);
getnumber('Enter Capacitance',c);
f:=divide(1,ln(2)*c*(r1+2*r2));
hit:=divide(1,f);
lot:=ln(2)*c*r2;
displaynumber('Frequency',f);
displaynumber('High Time',hit);
displaynumber('Low Time',lot);
end;
Procedure AmpHours;
Var t,ch: tdatetime;
a,ah: extended;
S: string;
Begin
ch := encodetime(1,0,0,0);
getnumber('Enter Amp Hour Rating',ah) ;
getNumber('Enter Load',a);
t := ch*(ah/a);
writeln('Duration: ',trunc(t),' days, ',formatdatetime('hh:mm:ss',t));
End;
Procedure ledcalc;
Var vin,vf,af,r: extended;
s: string;
Begin
getnumber('Enter Voltage In',vin);
getnumber('Enter Forward Voltage Drop',vf);
s := '';
write('Enter current in mA:');
readln(s);
af := strtofloatdef(s,0);
r := divide(vin-vf,af*0.001);
displaynumber('Resistance',r);
displaynumber('Power',sqr(af*0.001)*r);
End;
Procedure creact;
Var xc,c,f: extended;
Begin
writeln('Leave one value blank');
getnumber('Reactance(Xc)',xc);
getnumber('Capacitance',c);
getnumber('Frequency',f);
If xc=0 Then displaynumber('Reactance',divide(1,pi*2*f*c));
If c=0 Then displaynumber('Capacitance',divide(divide(1,xc),pi*2*f));
If f=0 Then displaynumber('Frequency',divide(divide(1,xc),2*pi*c));
End;
procedure lreact;
var xl,f,l:extended;
begin
writeln('Leave one answer blank');
getnumber('Reactance(Xl)',xl);
getnumber('Inductance',l);
getnumber('Frequency',f);
If xl=0 Then displaynumber('Reactance',pi*2*f*l);
If l=0 Then displaynumber('Inductance',divide(xl,2*pi*f));
If f=0 Then displaynumber('Frequency',divide(xl,2*pi*l));
End;
Procedure rcode;
Type tcolorcode = Record
digit: byte;
multipler,tolerance: extended;
End;
PColorCode = ^TColorCode;
Var scode: string;
y,tolerance: extended;
colors: tstringlist;
i: integer;
pcc: pcolorcode;
bands: array[1..5] Of pcolorcode;
Begin
colors := tstringlist.create;
new(pcc);
pcc^.digit := 0;
pcc^.multipler := 1;
pcc^.tolerance := 0;
colors.addobject('Black',tobject(pcc));
new(pcc);
pcc^.digit := 1;
pcc^.multipler := 10;
pcc^.tolerance := 1;
colors.addobject('Brown',tobject(pcc));
new(pcc);
pcc^.digit := 2;
pcc^.multipler := 100;
pcc^.tolerance := 2;
colors.addobject('Red',tobject(pcc));
new(pcc);
pcc^.digit := 3;
pcc^.multipler := 1000;
pcc^.tolerance := 0;
colors.addobject('Orange',tobject(pcc));
new(pcc);
pcc^.digit := 4;
pcc^.multipler := 10000;
pcc^.tolerance := 0;
colors.addobject('Yellow',tobject(pcc));
new(pcc);
pcc^.digit := 5;
pcc^.multipler := 100000;
pcc^.tolerance := 0.5;
colors.addobject('Green',tobject(pcc));
new(pcc);
pcc^.digit := 6;
pcc^.multipler := 1000000;
pcc^.tolerance := 0.25;
colors.addobject('Blue',tobject(pcc));
new(pcc);
pcc^.digit := 7;
pcc^.multipler := 10000000;
pcc^.tolerance := 0.1;
colors.addobject('Violet',tobject(pcc));
new(pcc);
pcc^.digit := 8;
pcc^.multipler := 100000000;
pcc^.tolerance := 0.05;
colors.addobject('Gray',tobject(pcc));
new(pcc);
pcc^.digit := 9;
pcc^.multipler := 1000000000;
pcc^.tolerance := 0;
colors.addobject('White',tobject(pcc));
new(pcc);
pcc^.digit := 10;
pcc^.multipler := 0.1;
pcc^.tolerance := 5;
colors.addobject('Gold',tobject(pcc));
new(pcc);
pcc^.digit := 10;
pcc^.multipler := 0.01;
pcc^.tolerance := 10;
colors.addobject('Silver',tobject(pcc));
writeln('Enter its code with the following digit, including tolerance digit');
For i:=0 To colors.count-1 Do
write(inttohex(i,1),'=',colors[i],',');
writeln;
write('Enter 4 or 5 band color code:');
readln(scode);
If (length(scode)<>4)And (length(scode)<>5)Then
Begin
writeln('No such thing as a ',length(scode),' band resistor');
exit;
End;
For i := 1 To length(scode) Do
If strtointdef('$'+scode[i],colors.count)>=colors.count Then
Begin
writeln('Band#',i,' is not a valid band');
exit;
End
Else bands[i] := pointer(colors.objects[strtoint('$'+scode[i])]);
If length(scode)=4 Then
Begin
If bands[1]^.digit=10 Then
Begin
writeln('Misused band 1');
exit;
End;
If bands[2]^.digit=10 Then
Begin
writeln('Misused band 2');
exit;
End;
y := ((bands[1]^.digit*10)+bands[2]^.digit)*bands[3]^.multipler;
tolerance := bands[4]^.tolerance;
End;
If length(scode)=5 Then
Begin
If bands[1]^.digit=10 Then
Begin
writeln('Misused band 1');
exit;
End;
If bands[2]^.digit=10 Then
Begin
writeln('Misused band 2');
exit;
End;
If bands[3]^.digit=10 Then
Begin
writeln('Misused band 3');
exit;
End;
y := ((bands[1]^.digit*100)+(10*bands[2]^.digit)+bands[3]^.digit)*bands[4]^.multipler;
tolerance := bands[5]^.tolerance;
End;
displaynumber('Resistance',y);;
writeln('Tolerance: ',floattostr(tolerance),'%');
For i:=0 To colors.count-1 Do
Begin
pcc := pointer(colors.objects[i]);
dispose(pcc);
End;
colors.free;
End;
procedure nop;
begin
//do nothing
end;
function LookForFile(ext:string):string;
var sr:tsearchrec;
filelist:tstringlist;
index,i:integer;
begin
lookforfile:='?';
writeln('Files ending with ',ext,' in ',data_dir,' :');
if findfirst(data_dir+dir_char+'*'+ext,faanyfile,sr)<>0 then exit;
filelist:=tstringlist.create;filelist.add(Sr.name);
while findnext(sr)=0 do filelist.add(sr.name);
for i:=0 to filelist.count-1 do writeln(i,'. ',filelist[i]);
write('Enter number or -1 to cancel: ');
readln(index);
findclose(sr);
if index=-1 then begin filelist.free; exit;end;
lookforfile:=filelist[index];
filelist.free;
end;
procedure vreg;
var dv,dvMin,dvmax,vin,vref,vout,r1,r2:extended;
choice,vrgname:string;
vrgfile:tstringlist;
begin
dv:=0;dvmin:=0;dvmax:=0;vref:=0;
vrgfile:=nil;
write('Load settings for LM317(y for yes, n for no, f from a file, or x for exit):');
readln(choice);
if length(choice)=0 then exit;
case choice[1] of
'y','Y':BEGIN dvmin:=3;dvmax:=40;vref:=1.25;end;
'n','N':nop;
'f','F':begin vrgname:=data_dir+dir_char+lookforfile('.vrg');
if not fileexists(vrgname) then begin writeln('File not found');exit;end;
vrgfile:=tstringlist.create;
vrgfile.loadfromfile(vrgname); vref:=strtofloatdef(vrgfile.values['Vref'],-1);dvmin:=strtofloatdef(vrgfile.values['dvMin'],-1);dvmax:=strtofloatdef(vrgfile.values['dvMax'],-1);
if (vref=-1)or (dvmin=-1) or (dvmax=-1)then begin
writeln('File is missing some variables. It needs a Vref, dvMin and a dvMax variable');exit;
end;
vrgfile.free; end;
'x','X':exit;
end;
if dvmin=0 then
if not getnumber('Enter Differnetial Min(or just press enter for no differnetial voltage)',dvmin) then
getnumber('Enter Differnetial Voltage Max',dvmax);
if dvmin*dvmax>0 then getnumber('Voltage In',vin);
if vref=0 then getnumber('Voltage Reference',vref);
getnumber('R1',r1);
writeln('Leave one answer blank');
getnumber('Voltage Out',vout);
getnumber('R2',r2);
if r2=0 then displaynumber('R2',divide(r1*(vout-vref),vref));
if vout=0 then displaynumber('Vout',vref*divide(1+r2,r1));
if vin*dvmin*dvmax>0 then dv:= vin-vout;
if (dv>dvmax)and (vin*dvmin*dvmax>0) then writeln('Input Voltage too high');
if (dv<dvmin)and (vin*dvmin*dvmax>0)then writeln('Warning! Input voltage may be too low');
end;
Begin
createdir(data_dir);
writeln('delphijustin EECalc v1.0');
writeln('For a list of commands type "help"');
commands := tstringlist.create;
commands.sorted := true;
new(cmd);
cmd^.percentage := 100;
cmd^.help := 'Inductive Reactance';
cmd^.proc := tprocedure(@lreact);
commands.addobject('lreact',tobject(cmd));
new(cmd);
cmd^.percentage := 100*(3/4);
cmd^.help := 'Voltage Regulator';
cmd^.proc := tprocedure(@vreg);
commands.addobject('vreg',tobject(cmd));
new(cmd);
cmd^.help := 'Calculates resistor color code';
cmd^.proc := tprocedure(@rcode);
cmd^.percentage := 100*(3/5);
commands.addobject('rcode',tobject(cmd));
new(cmd);
cmd^.help := 'Analog Digital Converter';
cmd^.proc := tprocedure(@adc);
cmd^.percentage := 100;
commands.addobject('adc',tobject(cmd));
new(cmd);
cmd^.help := 'Starts Ohms law calculator';
cmd^.proc := tprocedure(@ohmslaw);
cmd^.percentage := 75;
commands.Addobject('ohmslaw',tobject(cmd));
new(cmd);
cmd^.help := 'Parallel resistance';
cmd^.proc := tprocedure(@recipcombo);
cmd^.percentage := 100;
commands.Addobject('presistor',tobject(cmd));
new(cmd);
cmd^.percentage := 100;
cmd^.help := 'Series capacitance';
cmd^.proc := tprocedure(@recipcombo);
commands.Addobject('scap',tobject(cmd));
new(cmd);
cmd^.percentage := 100*(3/4);
cmd^.help :='Fuse rating';
cmd^.proc := tprocedure(@fuses);
commands.Addobject('fuse',tobject(cmd));
new(cmd);
cmd^.percentage := 100;
cmd^.help := 'Series resistance';
cmd^.proc := tprocedure(@combo);
commands.Addobject('sresistor',tobject(cmd));
new(cmd);
cmd^.percentage := 100;
cmd^.help := 'Parallel capacitance';
cmd^.proc := tprocedure(@recipcombo);
commands.Addobject('pcap',tobject(cmd));
new(cmd);
cmd^.percentage := 40;
cmd^.help := 'Calculates duration of a battery';
cmd^.proc := tprocedure(@amphours);
commands.Addobject('amphours',tobject(cmd));
new(cmd);
cmd^.percentage := 100;
cmd^.help := 'Capacitive Reactance';
cmd^.proc := tprocedure(@creact);
commands.Addobject('creact',tobject(cmd));
new(cmd);
cmd^.percentage := 100;
cmd^.help := 'LED Resistor calculator';
cmd^.proc := tprocedure(@ledcalc);
commands.Addobject('led',tobject(cmd));
new(cmd);
cmd^.percentage := 100;
cmd^.help := 'Ends EECalc';
cmd^.proc := Nil;
commands.addobject('exit',tobject(cmd));
new(cmd);
cmd^.percentage := 60;
cmd^.help :='555 Astable Multivibrator';
cmd^.proc := tprocedure(@astable);;
commands.addobject('astable',tobject(cmd));
new(cmd);
cmd^.help := 'Voltage Divider';
cmd^.percentage := 100;
cmd^.proc := tprocedure(@vdivide);
commands.addobject('vd',tobject(cmd));
new(cmd);
cmd^.help := 'Displays this screen';
cmd^.percentage := 100*(3/4);
cmd^.proc := tprocedure(@help);
commands.addobject('help',tobject(cmd));
new(cmd);
cmd^.help := 'Monostable multivibrator';
cmd^.percentage := 75;;
cmd^.proc := tprocedure(@monostable);
commands.addobject('mono',tobject(cmd));
While prompt Do
End.
Icons made by Freepik from www.flaticon.com
The short URL of the present article is: https://delphijustin.biz/go/0oyo
Circuit Simulator