#!/usr/bin/perl

#Sucht die günstigste Reihenschaltung zweier Widerstände aus den Normreihen E12 und E24
#um einen Sollwiderstandswert zu erhalten.

$r=1234;



@e12=qw(10 12 15 18 22 27 33 39 47 56 68 82);
@e24=qw(10 11 12 13 15 16 18 20 22 24 27 30 33 36 39 43 47 51 56 62 68 75 82 91);

@eLow=qw(1.0 1.2 1.5 1.8 2.2 2.7 3.3 3.9 4.7 5.6 6.8 8.2 10);


sub ausgabe{
  my ($v)=@_;

  if ($v<1000){
      $v=~s/\./R/;
      unless ($v=~/R/){
        $v.="R";
      }
  }else{
    if ($v<1000000){
      $v/=1000;
      $v=~s/\./K/;
      unless ($v=~/K/){
        $v.="K";
      }
    }else{
      $v/=1000000;
      $v=~s/\./M/;
      unless ($v=~/M/){
        $v.="M";
      }
    }
  }
  return $v;
}
sub build{
  @r=();
  my $n=$#reihe + 1;

  my $dekade=sprintf("%d",log($r)/log(10)+0.5) -1; #floor

  #Suche über 3 Dekaden (genauer sind die Widerstände ja gar nicht)
    $dez2 = 10 ** $dekade;
    $dez1 = $dez2 / 10;
    $dez0 = $dez1 / 10;

  #Baue die Reihen
  push(@r,0);
  for ($i=0; $i<$n; $i++){
    $x= $reihe[$i] * $dez0;
    push(@r,$x) if $x <= $r;
  }

  for ($i=0; $i<$n; $i++){
    $x= $reihe[$i] * $dez1;
    push(@r,$x) if $x <= $r;
  }

  for ($i=0; $i<$n; $i++){
    $x= $reihe[$i] * $dez2;
    push(@r,$x) if $x <= $r;
  }

# print "Probiert mit:\n";
# print join(' ',@r);
# print "\n";

}
sub calc2{
  build();
  $n=$#r + 1;
  $best=999999999;

  #Probier einfach alle durch... (sind maximal (24*3)**2=5184)
  for ($i=0; $i<$n; $i++){
    for ($j=0; $j<$n; $j++){
      $x=$r[$i] + $r[$j];
      if (abs($x-$r) < $best){
        $ist =$x;
        $best=abs($x-$r);
        $r1=$r[$i];
        $r2=$r[$j];
        #$result = "$r[$i]+$r[$j]";
      }
#      last if $x>$r;
    }
  }
  $pcent=sprintf("%1.2f",(($ist-$r)/$r)*100);
#  print "\n\n";
  $r1=ausgabe($r1);
  $r2=ausgabe($r2);
#  print "$ist Ohm aus $r1 + $r2 \t($e) $best Ohm Abweichung ($pcent%) \n";
  print "$r1 + $r2 Ohm   Abweichung $pcent% \n";
}
sub calcParallel2{
  $r*=10;
  @r=@eLow; #build();
  $r/=10;
  $n=$#r + 1;
  $best=999999999;

  #Probier einfach alle durch... (sind maximal (24*3)**2=5184)
  for ($i=0; $i<$n; $i++){
    for ($j=0; $j<$n; $j++){
      #$x=$r[$i] + $r[$j];
#      print "i=$r[$i]  j=$r[$j]\n";
      $x= 1/( 1/$r[$i] + 1/$r[$j] +1/4.7 + 1/5.6);
      
      if (abs($x-$r) < $best){
        $ist =$x;
        $best=abs($x-$r);
        $r1=$r[$i];
        $r2=$r[$j];
        #$result = "$r[$i]+$r[$j]";
      }
#      last if $x>$r;
    }
  }
  $pcent=sprintf("%1.2f",(($ist-$r)/$r)*100);
#  print "\n\n";
  $r1=ausgabe($r1);
  $r2=ausgabe($r2);
#  print "$ist Ohm aus $r1 + $r2 \t($e) $best Ohm Abweichung ($pcent%) \n";
  print "$r1 + $r2 Ohm   Abweichung $pcent% \n";
  
}
sub calcParallel3{
  $r*=10;
  @r=@eLow; #build();
  $r/=10;
  $n=$#r + 1;
  $best=999999999;
  #Probier einfach alle durch... (sind maximal (24*3+1)**3=389017)
  for ($i=0; $i<$n; $i++){
    for ($j=0; $j<$n; $j++){
      for ($k=0; $k<$n; $k++){
        $x= 1/( 1/$r[$i] + 1/$r[$j]+ 1/$r[$k] +1/4.7 + 1/5.6);
        if (abs($x-$r) < $best){
          $ist =$x;
          $best=abs($x-$r);
          $r1=$r[$i];
          $r2=$r[$j];
          $r3=$r[$k];
        }
#        last if $x>$r;
      }
#      last if $xx>$r;
    }
    $pcent=sprintf("%1.2f",(($ist-$r)/$r)*100);
  }
  $r1=ausgabe($r1);
  $r2=ausgabe($r2);
  $r3=ausgabe($r3);
#  print "$ist Ohm aus $r1 + $r2 + $r3 \t($e) $best Ohm Abweichung ($pcent%) \n";
  print "$r1 + $r2 + $r3 Ohm   Abweichung $pcent% \n";
}


sub calc3{
#  build();
  $n=$#r + 1;
  $best=999999999;

  #Probier einfach alle durch... (sind maximal (24*3+1)**3=389017)
  for ($i=0; $i<$n; $i++){
    for ($j=0; $j<$n; $j++){
      $xx=$r[$i] + $r[$j];
      for ($k=0; $k<$n; $k++){
        $x= $xx+ $r[$k];
        if (abs($x-$r) < $best){
          $ist =$x;
          $best=abs($x-$r);
          $r1=$r[$i];
          $r2=$r[$j];
          $r3=$r[$k];
        }
        last if $x>$r;
      }
      last if $xx>$r;
    }
    $pcent=sprintf("%1.2f",(($ist-$r)/$r)*100);
  }
  $r1=ausgabe($r1);
  $r2=ausgabe($r2);
  $r3=ausgabe($r3);
#  print "$ist Ohm aus $r1 + $r2 + $r3 \t($e) $best Ohm Abweichung ($pcent%) \n";
  print "$r1 + $r2 + $r3 Ohm   Abweichung $pcent% \n";
}



#main
system "color F1";
print "Sicht auf Loetkelche der Buchse:\n";
print "MT1  GND   -    +    Unorm\n";
print "  MT2    9V  ACIN  16V\n";
print "\n";
print "MT1, MT2 und GND verbinden zum laden mit 1C\n";
print "\n";
print "Spannung[V]:";
$u=<STDIN>;
chomp($u);
$u=~s/,/\./;
$z=int($u / 1.2+0.5);
$r=($z-1) * 33000;
print "$z Zellen. Widerstand zwischen + und Unorm:$r Ohm\n";


$e="E12";
@reihe=@e12;
calc2();
print "\n";
print "\n";


print "Strom[mA]:";
$ma=<STDIN>;
chop($ma);
$r=0.38/$ma*1000;
print "Widerstand zwischen - und GND: $r Ohm\n";
print "(intern: 4R7 und 5R6 parallel)\n";
@reihe=@e12;
calcParallel2();
calcParallel3();
print "\n";
print "\n";

getc;
#EOF
