Tack!bruka skrev:Nu har jag ingen utbildning på elektronik men en spänningsdelare borde väl lösa problemet, 140 k motstånd tillsammans med ditt 100 k ger 10 volt (10 k = 1,6 volt) om du matar med 24 volt enligt Electrodroid i min mobil.
Men någon annan kanske har ett bättre förslag?
Jag har fixat ett motstånd på 150 kOhm, så då bör det väl vara lugnt?elf98 skrev:Sen får man inte glömma att det får ligga max 11V över DS2890.
Ja, själva utgången funkar fint.bruka skrev:ekdahl, Hur har det gått för dig, fått det att fungera?
Kod: Markera allt
<?php
// Debug?
define("DEBUG", true);
// Declare variables
$DeltaTime = 10;
$Continue = true;
$OutdoorTemp = 2;
// Quit nicely when asked to
function SignalHandler($signal)
{
switch ($signal) {
case SIGTERM:
case SIGINT:
$Continue = false;
break;
}
}
// Linear interpolation between two known points
function Interpolate($x0, $y0, $x1, $y1, $x)
{
if ($x == $x0)
return $y0;
if ($x == $x1)
return $y1;
else
return $y0+($x-$x0)*($y1-$y0)/($x1-$x0);
}
// Sets the valve position between 0 and 100 %
function SetValvePosition($position)
{
$Temp = Interpolate(0, 255, 100, 0, $position);
$Output = round(min(max(intval($Temp), 0), 255));
exec("owwrite -s 192.168.1.2 /shunt/wiper $Output");
echo "Wrote $Output to wiper\n";
}
function PIDController($setpoint, $actual_value)
{
$PGain = 1.0;
$IGain = 0.1;
$DGain = 10.0;
global $DeltaTime;
static $PreviousError = 0;
static $IntegralPart = 0;
// Calculate deviation
$Error = $setpoint - $actual_value;
// Proportional part
$Proportional = $PGain * $Error;
// Integral part
$IntegralPart = $IntegralPart + $Error * $DeltaTime;
$Integral = min(max($IGain * $IntegralPart, -100), 100);
// Derivative part
$Derivative = $DGain * ($Error - $PreviousError)/$DeltaTime;
// Combine P, I and D
$Output = $Proportional + $Integral + $Derivative;
// Limit output
$Output = min(max($Output, 0), 100);
if (DEBUG) echo "Regulator output: ".round($Output, 1)." %\n";
if (DEBUG) echo "P: ".round($Proportional, 1);
if (DEBUG) echo " I: ".round($Integral, 1);
if (DEBUG) echo " D: ".round($Derivative, 1)."\n";
// Update error
$PreviousError = $Error;
return $Output;
}
// Setup signal handler
pcntl_signal(SIGTERM, "SignalHandler");
// Main loop
while ($Continue)
{
// Get supply temp
$SupplyTemp = floatval(exec("owread -s 192.168.1.2 /uncached/framledning_rad/temperature"));
if (DEBUG) echo "Supply temperature: $SupplyTemp C\n";
// Get outdoor temp
// implement later
// Calculate setpoint
$Setpoint = Interpolate(-20, 50, 20, 20, $OutdoorTemp);
if (DEBUG) echo "Setpoint: $Setpoint C\n";
// Call PID regulator
$PIDOutput = PIDController($Setpoint, $SupplyTemp);
// Set the valve position
SetValvePosition($PIDOutput);
// Wait a while
sleep($DeltaTime);
}
?>
Kul! Man blir mäkta nöjd när man fjärrstyr sina grejer och det fungerarMartinF skrev:Jätteintressant! Vad gäller värmen så styr jag själv ännu bara golvvärmeventilerna med ett perl-script. Radiatorshunten styrs via en Danfoss-regulator som dock har en override-funktion som jag använder för nattsänkning och vid frånvaro. På väg hem från Gran Canaria härom veckan så slog jag på värmen när vi var över Danmark.![]()
Det har iaf fungerat en vecka nu. Att jag valde php istället för t.ex. C var för att slippa krångla med kompilering och att det är lätt att använda databasen vid behov. Tänkte lägga in reglerparametrarna i databasen senare, så att det ska bli lätt att ändra dessa via webbsidan.MartinF skrev:Har inte ens funderat över en while-loop i php och en NAS. Får du inte time-out efter ett tag? Hur initieras scriptet vid strömavbrott?