Praca domowa nr 3 - termostat

Praca domowa nr 3 - termostat
Photo by Joan Gamell / Unsplash
<!DOCTYPE html>
<html lang="pl">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Praca domowa 3</title>
</head>
<body>
    
<script>
/** Sprawdzanie wartości **/    
function getTemperature(){
    while(true){
        let minTemp = parseFloat(prompt("Podaj minimalną temperaturę optymalną w \u2103: "));
        let maxTemp = parseFloat(prompt("Podaj maksymalną temperaturę optymalną w \u2103: "));
        let iterNumber = parseInt(prompt("Podaj liczbę iteracji: ", "40"));
        if (isNaN(minTemp)){
            alert("Minimalna tempertatura nie jest liczbą!");
            continue;
        }
        else if (isNaN(maxTemp)){
            alert("Maksymalna tempertatura nie jest liczbą!");
            continue;
        }
        else if (isNaN(iterNumber) || iterNumber < 0){
            alert("Zła liczba iteracji!");
            continue;
        }
        else if (maxTemp <= minTemp){
            alert("Maksymalna tempertatura nie jest większa od minimalnej!");
            continue;
        }
        else if (minTemp < 0 || maxTemp > 50){
            alert("Podaj liczby w zakresie od 0\u2103 do 50\u2103!");
            continue;
        }
        
        return [minTemp, maxTemp, iterNumber];

    };
};

/** Szukanie temperatury docelowej **/ 
function getTargetTemp(minTemp, maxTemp){
    return (maxTemp+minTemp)/2;
};

/** PID **/ 
function regulateTemp(startTemp, targetTemp, factor = 0.3){
    diffTemp = targetTemp-startTemp;
    changeTemp = diffTemp*factor;
    return changeTemp + startTemp;
};
/** Rysowanie temperatury **/ 
function temperatureBar(currentTemp){
    let hashAmount = "";
    for(i = 0; i <50; i++){
        if (i < Math.round(currentTemp)){
            hashAmount += "#";
        }
        else{
            hashAmount += " ";
        }; 
    };
    return hashAmount;
};

/** Symulacja pracy termostatu **/ 
function countTemp(){
    const [minTemp, maxTemp, iterNumber] = getTemperature();
    let targetTemp = getTargetTemp(minTemp,maxTemp);
    let startTemp = 10;
    let tempBar;
    let disturbance;
    let historyTemp = [startTemp];
    for(let i=0; i<iterNumber; i++){
        console.log("Aktualna temperatura: ", startTemp, "\u2103");
        tempBar = "Pasek temperatury: 0\u2103 ["+temperatureBar(startTemp)+"] 50\u2103";
        console.log(tempBar);
        disturbance = Math.random() * (5 - (-7)) + (-7);
        startTemp += disturbance;
        startTemp = regulateTemp(startTemp, targetTemp);
        historyTemp.push(startTemp);
    }
    console.log("Minimalna optymalna temperatura wybrana przez użytkownika: ", minTemp,"\u2103");
    console.log("Maksymalna optymalna temperatura wybrana przez użytkownika: ", maxTemp,"\u2103");
    console.log("Liczba iteracji wybrana przez użytkownika: ", iterNumber);
    console.log("Temperatura docelowa: ", targetTemp,"\u2103. Temperatura osiągnięta: ", Math.round(historyTemp[historyTemp.length - 1],3),"\u2103");
    console.log("Historia temperatur w \u2103: ", historyTemp);
    console.log("Najmniejsza osiągnięta temperatura: ", Math.min(...historyTemp),"\u2103");
    console.log("Największa osiągnięta temperatura: ", Math.max(...historyTemp),"\u2103");
};
    
countTemp();

</script>
</body>
</html>
Przykład użycia