Skript für AVR-NET-IO und PT100

Hallo zusammen,

nachdem ich mit der Hilfe von EHB und tommy erfolgreich mein AVR zusammen mit den PT100-Fühlern ans Laufen gebracht habe, möchte ich euch die dafür geschriebenen Skripte zur Verfügung stellen.
Getriggert wird das Skript bei Änderung der ADC-Messwerte der RegisterVariable. Ich hab es bewusst nicht in das Skript von EHB gepackt, um eine zusätzliche Kontrolle zu haben, was der AD-Wandler liefert.
Ein Skript beinhaltet die Kennlinie des PT100, ein weiteres liefert einen interpolierten Wert aus einer Kennlinie.

PT100-Kennlinie:

<?
// create arrays for scaling and curve:
$PT100_sca_spd = array(80.31, 84.27, 88.22, 92.16, 96.09, 100, 103.9, 107.79, 109.74, 111.67, 115.54, 119.4, 123.24, 127.07, 130.89, 134.7, 138.5, 142.29, 146.06, 149.82, 153.58, 157.31);
$PT100_curve = array(-50, -40, -20, -10, 0, 10, 20, 25, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150);
?>

Interpolationsroutine:

<?
function ip_1D ($sca_spd, $curve, $bp) {

// check base point against the maximum of the scaling:
if ($bp >= $sca_spd[sizeof($sca_spd)-1]) {
	$val = $curve[sizeof($curve)-1]; // base point is too big --> return last data point
	return $val;
	
}
// check base point against the minimum of the scaling:
if ($bp <= $sca_spd[0]) {
	$val = $curve[0]; // base point is too low --> return first data point
	return $val;
}
// execute base point search to get index:
$i = 0;
while ($bp > $sca_spd[$i]) {
  $i += 1;
}
   
// calculate interpolation factor:
$bp_range = $sca_spd[$i] - $sca_spd[$i-1];
$bp_part = $bp - $sca_spd[$i-1];
$fac = $bp_part / $bp_range;

// perform interpolation:
$val = $curve[$i-1] + ($fac * $curve[$i] - $curve[$i-1]);

// return interpolated value:
return $val;
}
?>

Umrechnung des ADC-Werts:

<?
include(IPS_GetScriptIDByName("fct_ip_1D", 33588 /*[.System\Skripts]*/).".ips.php"); // C1D-Interpolation
include(IPS_GetScriptIDByName("PT100", 33588 /*[.System\Skripts]*/).".ips.php"); // PT100-Kennlinie
$U = ($IPS_VALUE / 1024) * 5;
$R = 100 / (5.06 / $U - 1);
$T = ip_1D($PT100_sca_spd, $PT100_curve, $R);
SetValue(34846 /*[Heizung\Wärmepumpe\Vorlauftemperatur 1]*/, round($T,2));
?>

Vielleicht kann es der Ein oder Andere ja gebrauchen.

Gruß
dfhome