Gennnemsnit temp. (Læst 621x)

Offline DanFr

  • U=I*R
  • ***
  • Indlæg: 44
  • Antal brugbare Indlæg: 0
    • Vis profil
Gennnemsnit temp.
« Dato: September 23, 2022, 13:54:24 »
Hej.
Jeg har lavet en lille kodning i Arduino som skal styre nogle relæ'er alt efter hvor temperaturen er på min DS18B20 temperatur sensor.
Der SKAL være et relæ trukket hele tiden, så jeg har selvfølgelig lidt problemer med at relæ'erne står og danser frem og tilbage, og det er ikke rigtig godt, jeg kan selvfølgelig give den en høj Delay time, så er det knapt så voldsomt. Skal lige siges at det er en ude temperatur jeg måler

Jeg har læst lidt om at finde gennemsnit forskellige steder, men jeg forstår det ikke rigtigt, jeg er meget ny i denne verden, så måske der var en herinde der kunne hjælpe, Hvis jeg bare kunne få rette mit Sketch, så skal jeg skam nok sidde og nørde med det for at finde ud af hvordan og hvorfor.. Tænker hvis der feks kunne laves 10 målinger og så giver den en gennemsnit værdi, ved ikke om det kan laves så jeg selv kan vælge om der skal være 1 eller 15 sek mellem de 10 målinger? Har lidt svære ved at se mig ud af det.
Den kodning jeg har lavet kan med garanti laves på en helt anden og forenklet måde, men viser jo bare hvor ny jeg er i det. Men kom gerne med input.

Mvh Dan

#include <OneWire.h>
#include <DallasTemperature.h>

float Temp1 = 22.0;
float Temp2 = 24.0;
float Temp3 = 26.0;
float Temp4 = 28.0;
float Temp5 = 30.0;
float Temp6 = 32.0;
float Temp7 = 29.0;
float Temp8 = 30.0;   
float Temp9 = 31.0;

#define ONE_WIRE_BUS 2
#define K101 3
#define K102 4
#define K103 5
#define K104 6
#define K105 7
#define K106 8
#define K107 9
#define K108 10

 
OneWire oneWire(ONE_WIRE_BUS);
 
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
 
void setup(void)
{
  Serial.begin(9600);
  pinMode(K101, OUTPUT);
  pinMode(K102, OUTPUT);
  pinMode(K103, OUTPUT);
  pinMode(K104, OUTPUT);
  pinMode(K105, OUTPUT);
  pinMode(K106, OUTPUT);
  pinMode(K107, OUTPUT);
  pinMode(K108, OUTPUT);
   

  sensors.begin();
}
 
void loop(void)
{
  sensors.requestTemperatures();
  float current_temp = sensors.getTempCByIndex(0);
 
  Serial.print("Ude Temperatur: ");
  Serial.println(current_temp);

 
if(current_temp < Temp1)
  {
    digitalWrite(K101, HIGH);
    digitalWrite(K102, LOW);
    digitalWrite(K103, LOW);
    digitalWrite(K104, LOW);
    digitalWrite(K105, LOW);
    digitalWrite(K106, LOW);
   
  }
  if(current_temp >= Temp1)
  {
    digitalWrite(K101, LOW);
    digitalWrite(K102, HIGH);
    digitalWrite(K103, LOW);
    digitalWrite(K104, LOW);
    digitalWrite(K105, LOW);
    digitalWrite(K106, LOW);
   
   }
   if(current_temp >= Temp2)
  {
    digitalWrite(K101, LOW);
    digitalWrite(K102, LOW);
    digitalWrite(K103, HIGH);
    digitalWrite(K104, LOW);
    digitalWrite(K105, LOW);
    digitalWrite(K106, LOW);
   
   }
    if(current_temp >= Temp3)
  {
    digitalWrite(K101, LOW);
    digitalWrite(K102, LOW);
    digitalWrite(K103, LOW);
    digitalWrite(K104, HIGH);
    digitalWrite(K105, LOW);
    digitalWrite(K106, LOW);
     
   }
   if(current_temp >= Temp4)
  {
    digitalWrite(K101, LOW);
    digitalWrite(K102, LOW);
    digitalWrite(K103, LOW);
    digitalWrite(K104, LOW);
    digitalWrite(K105, HIGH);
    digitalWrite(K106, LOW);
     
   }
   if(current_temp >= Temp5)
  {
    digitalWrite(K101, LOW);
    digitalWrite(K102, LOW);
    digitalWrite(K103, LOW);
    digitalWrite(K104, LOW);
    digitalWrite(K105, LOW);
    digitalWrite(K106, HIGH);
     
   } 
   
   
    delay(2000);
  }

 

Offline dani8303

  • Spændingsdeler
  • ****
  • Indlæg: 54
  • Antal brugbare Indlæg: 8
  • ESP8266, Linux server, PHP, JS, så spiller det.
    • Vis profil
    • Egen side til styring, energi mm. tag et kig :-)
Sv: Gennnemsnit temp.
« Svar #1 Dato: September 23, 2022, 15:58:56 »
Hej
Du kan sagtens lave noget gennemsnit, men tror ikke det vil hjælpe dig her. Jeg kender DS18B20 og de giver en meget stabil udlæsning. I stedet skal du bruge hysteresis. Desuden tænder og slukker du faktisk udgangene en masser gange. Det går bare så hurtigt at du ikke opdager det  ;). Du skal i stedet overveje at bruge noget "if else". Der er mange måder at gøre det på, men jeg har prøvet lave lidt ændringer i dit kode. Vil ikke garantere at det virker, da jeg ikke har testet det:
#include <OneWire.h>
#include <DallasTemperature.h>

float Temp1 = 22.0;
float Temp2 = 24.0;
float Temp3 = 26.0;
float Temp4 = 28.0;
float Temp5 = 30.0;
float Temp6 = 32.0;
float Temp7 = 29.0;
float Temp8 = 30.0;   
float Temp9 = 31.0;

#define ONE_WIRE_BUS 2
#define K101 3
#define K102 4
#define K103 5
#define K104 6
#define K105 7
#define K106 8
#define K107 9
#define K108 10

// Buffer til opbevaring af værdier mens de behandles
bool K101_buffer = 0;
bool K102_buffer = 0;
bool K103_buffer = 0;
bool K104_buffer = 0;
bool K105_buffer = 0;
bool K106_buffer = 0;

//Værdi der bruges til beregninger:
float current_temp = 0;
float temp_hys = 0.2;//Hysteresis. Prøv at google det. Så står relæerne ikke og danser.

 
OneWire oneWire(ONE_WIRE_BUS);
 
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
 
void setup(void)
{
  Serial.begin(9600);
  pinMode(K101, OUTPUT);
  pinMode(K102, OUTPUT);
  pinMode(K103, OUTPUT);
  pinMode(K104, OUTPUT);
  pinMode(K105, OUTPUT);
  pinMode(K106, OUTPUT);
  pinMode(K107, OUTPUT);
  pinMode(K108, OUTPUT);
   

  sensors.begin();
}
 
void loop(void)
{
  sensors.requestTemperatures();
  float current_temp_unhandled = sensors.getTempCByIndex(0);

  Serial.print("Ude Temperatur: ");
  Serial.println(current_temp_unhandled);

    //Bestemmer om temperaturen skal opdateres. Sikre at relæet ikke danser.
    //ABS() tager længden af værdien 10-> 10 og -10 -> 10. Altså fjerner minus fortegn..
    if(abs(current_temp_unhandled-current_temp)>temp_hys){
        current_temp = current_temp_unhandled;
    }else{
        Serial.println("Ingen opdatering af temperatur");
    }
 

    //I udgangspunktet skal de alle være slukket
    K101_buffer = 0;
    K102_buffer = 0;
    K103_buffer = 0;
    K104_buffer = 0;
    K105_buffer = 0;
    K106_buffer = 0;
 

  if(current_temp >= Temp5)
  {
      K106_buffer = 1;
    /*digitalWrite(K101, LOW);
    digitalWrite(K102, HIGH);
    digitalWrite(K103, LOW);
    digitalWrite(K104, LOW);
    digitalWrite(K105, LOW);
    digitalWrite(K106, LOW);*/
   
   }
   else if(current_temp >= Temp4)
  {
      K105_buffer = 1;
    /*digitalWrite(K101, LOW);
    digitalWrite(K102, LOW);
    digitalWrite(K103, HIGH);
    digitalWrite(K104, LOW);
    digitalWrite(K105, LOW);
    digitalWrite(K106, LOW);*/
   
   }
    else if(current_temp >= Temp3)
  {
    K104_buffer = 1;
     
   }
   else if(current_temp >= Temp2)
  {
    K103_buffer = 1;
     
   }
   else if(current_temp >= Temp1)
  {
    K102_buffer = 1;
     
   }else {
       K101_buffer = 1;
   }

   //Sender buffer til pins
   digitalWrite(K101, K101_buffer);
    digitalWrite(K102, K102_buffer);
    digitalWrite(K103, K103_buffer);
    digitalWrite(K104, K104_buffer);
    digitalWrite(K105, K105_buffer);
    digitalWrite(K106, K106_buffer);
   
   
    delay(2000);
  }

 

Offline Icecap

  • Jordet Basic
  • **
  • Indlæg: 152
  • Antal brugbare Indlæg: 18
    • Vis profil
Sv: Gennnemsnit temp.
« Svar #2 Dato: September 23, 2022, 20:13:22 »
Løsningen ser jeg som en grænse + X som ska opnås - men det er grænsen - X som gælder på returen.

 

Offline dani8303

  • Spændingsdeler
  • ****
  • Indlæg: 54
  • Antal brugbare Indlæg: 8
  • ESP8266, Linux server, PHP, JS, så spiller det.
    • Vis profil
    • Egen side til styring, energi mm. tag et kig :-)
Sv: Gennnemsnit temp.
« Svar #3 Dato: September 23, 2022, 20:57:09 »
Som svar til Icecap:
Denne funktionalitet fås ved at bruge abs().
Følgende to udsagn vil give det samme:
abs(current_temp_unhandled-current_temp)>temp_hys

abs(current_temp-current_temp_unhandled)>temp_hys

Altså det virker både ved faldende og stigende værdier i forhold til udgangspunktet.
Lige netop den funktionalitet er jo hvad man er interesseret i med en hysterese. Overstående vil kun være sandt hvis den nye værdi variere for meget fra den gamle.
Ny værdi: current_temp_unhandled
Gammel værdi: current_temp
Hysterese: temp_hys

Håber det giver mening


 

Offline DanFr

  • U=I*R
  • ***
  • Indlæg: 44
  • Antal brugbare Indlæg: 0
    • Vis profil
Sv: Gennnemsnit temp.
« Svar #4 Dato: September 24, 2022, 09:31:13 »
Hej dany8303

Tak for svar, giver meget god mening det du forklare og har lavet, umiddelbart virker det også, synes bare der er noget som ikke passer med mine setpunkter, leger lige lidt med det.
Den ABS værdi du skriver om med -10- hvor har du gemt den henne, den kan ikke lige gennemskue, og hvad den skal bruges til.

Det med den føler DALLAS DS18B20, ser jeg ikke som så stabil som du skriver, den hopper rund med 0,5 til 1 hel grad. og det er alle 4 jeg har prøvet at sætte på(kun en af gangen) prøvet med kort/langt kabelføring osv, det er det samme, føleren ligger pakket ind i en klud, netop så jeg er sikker på at der ikke er pludselige temp udsving. ) Og det skulle være en original DALLAS og ikke en fra Kina.

 

Offline dani8303

  • Spændingsdeler
  • ****
  • Indlæg: 54
  • Antal brugbare Indlæg: 8
  • ESP8266, Linux server, PHP, JS, så spiller det.
    • Vis profil
    • Egen side til styring, energi mm. tag et kig :-)
Sv: Gennnemsnit temp.
« Svar #5 Dato: September 24, 2022, 09:43:14 »
Hej Dan

ABS() med 10 var bare et eksempel. Desuden mener jeg også at Dallas biblioteket til Arduino har indbygget CRC kontrol. Det gør at fejlaflæsning ikke skulle kunne opstå i selve kablet til sensoren.

Her er nogle af de udlæsninger som mine sensorer laver. Det er også DS18B20, dog direkte fra Kina. Dem jeg har fået virker ganske fornuftigt.
https://dannerelv.dk/radi/28ae3856b513c6a/2022/266.vlog

 

Offline DanFr

  • U=I*R
  • ***
  • Indlæg: 44
  • Antal brugbare Indlæg: 0
    • Vis profil
Sv: Gennnemsnit temp.
« Svar #6 Dato: September 24, 2022, 10:54:25 »
Hej dani8303
Her har du min udlæsning med 2 sek delay (Føleren sidder ikke ude..!)

Ude Temperatur: 20.44
Ingen opdatering af temperatur
Ude Temperatur: 20.37
Ude Temperatur: 21.12  >> hop på 0,75gr
Ude Temperatur: 21.06
Ingen opdatering af temperatur
Ude Temperatur: 21.00
Ingen opdatering af temperatur
Ude Temperatur: 21.06
Ingen opdatering af temperatur
Ude Temperatur: 21.00
Ingen opdatering af temperatur
Ude Temperatur: 21.00
Ingen opdatering af temperatur
Ude Temperatur: 21.19
Ingen opdatering af temperatur
Ude Temperatur: 20.62  >> drop på 0,57gr og tilbage igen
Ingen opdatering af temperatur
Ude Temperatur: 21.19
Ingen opdatering af temperatur
Ude Temperatur: 21.12
Ingen opdatering af temperatur
Ude Temperatur: 21.19
Ingen opdatering af temperatur
Ude Temperatur: 21.00
Ingen opdatering af temperatur
Ude Temperatur: 20.44  >> drop på 0,68gr
Ude Temperatur: 21.12
Ude Temperatur: 21.06
Ingen opdatering af temperatur
Ude Temperatur: 21.00

Synes det er meget når den ligger på et bord og er pakket ind i et viskestykke, der skulle temperaturen være meget stabil. Nogen ide om hvad det kan være? For det hjælper jo også til at de relæ'er vil stå og danse..

 

Offline dani8303

  • Spændingsdeler
  • ****
  • Indlæg: 54
  • Antal brugbare Indlæg: 8
  • ESP8266, Linux server, PHP, JS, så spiller det.
    • Vis profil
    • Egen side til styring, energi mm. tag et kig :-)
Sv: Gennnemsnit temp.
« Svar #7 Dato: September 24, 2022, 13:29:36 »
Hej Dan

Min umiddelbare mistanke er det bibliotek du bruger til DS18b20 vælger der kun skal bruges 9bit opløsning. Herved fås der hurtigere målinger, men også med større udsving. I din kode kan du dog regne gennemsnit, hvorved det nok undgås. Her er et eksempel på hvordan det kan gøres, dog ikke testet:
#include <OneWire.h>
#include <DallasTemperature.h>

float Temp1 = 22.0;
float Temp2 = 24.0;
float Temp3 = 26.0;
float Temp4 = 28.0;
float Temp5 = 30.0;
float Temp6 = 32.0;
float Temp7 = 29.0;
float Temp8 = 30.0;   
float Temp9 = 31.0;

#define ONE_WIRE_BUS 2
#define K101 3
#define K102 4
#define K103 5
#define K104 6
#define K105 7
#define K106 8
#define K107 9
#define K108 10

// Buffer til opbevaring af værdier mens de behandles
bool K101_buffer = 0;
bool K102_buffer = 0;
bool K103_buffer = 0;
bool K104_buffer = 0;
bool K105_buffer = 0;
bool K106_buffer = 0;

//Værdi der bruges til beregninger:
float current_temp = 0;
float temp_hys = 0.2;//Hysteresis. Prøv at google det. Så står relæerne ikke og danser.

//Bruges til gennemsnit
float temp_avg_sum = 0;//Summen der bruges til beregning af gennemsnit
int temp_avg_runs = 0;//Antal beregninger der indgår i gennemsnittet
int Number_of_runs = 10;//Hvor mange målinger der skal udgøre en gennemsnitsberegning

 
OneWire oneWire(ONE_WIRE_BUS);
 
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
 
void setup(void)
{
  Serial.begin(9600);
  pinMode(K101, OUTPUT);
  pinMode(K102, OUTPUT);
  pinMode(K103, OUTPUT);
  pinMode(K104, OUTPUT);
  pinMode(K105, OUTPUT);
  pinMode(K106, OUTPUT);
  pinMode(K107, OUTPUT);
  pinMode(K108, OUTPUT);
   

  sensors.begin();
}
 
void loop(void)
{
  if(temp_avg_runs<Number_of_runs){
    sensors.requestTemperatures();
    float current_temp_unhandled += sensors.getTempCByIndex(0);
    temp_avg_sum += current_temp_unhandled;//Lægger den nye måling til den summerede værdi.
    temp_avg_runs++; //Der er blevet tilføjet endnu en måling til den summerede værdi.
    Serial.print("Ude Temperatur: ");
    Serial.println(current_temp_unhandled);
  }else{//Der er nu foretaget nok målinger til at beregne et gennemsnit.

    float temp_avg_unhandled = temp_avg_sum / temp_avg_runs;//Beregner gennemsnit. Summerede værdi delt med antal målinger
    temp_avg_sum = 0;//Nulstiller, så der tages nye målinger næste gang loop køres
    temp_avg_runs = 0;
    //Bestemmer om temperaturen skal opdateres. Sikre at relæet ikke danser.
    //ABS() tager længden af værdien 10-> 10 og -10 -> 10. Altså fjerner minus fortegn..
    if(abs(temp_avg_unhandled-current_temp)>temp_hys){
      current_temp = temp_avg_unhandled;
    }else{
      Serial.println("Ingen opdatering af temperatur");
    }
 

    //I udgangspunktet skal de alle være slukket
    K101_buffer = 0;
    K102_buffer = 0;
    K103_buffer = 0;
    K104_buffer = 0;
    K105_buffer = 0;
    K106_buffer = 0;
 

    if(current_temp >= Temp5)
    {
      K106_buffer = 1;
    }
    else if(current_temp >= Temp4)
    {
      K105_buffer = 1;
    }
    else if(current_temp >= Temp3)
    {
      K104_buffer = 1;
    }
    else if(current_temp >= Temp2)
    {
      K103_buffer = 1;
    }
    else if(current_temp >= Temp1)
    {
      K102_buffer = 1;
    }else {
      K101_buffer = 1;
    }

    //Sender buffer til pins
    digitalWrite(K101, K101_buffer);
    digitalWrite(K102, K102_buffer);
    digitalWrite(K103, K103_buffer);
    digitalWrite(K104, K104_buffer);
    digitalWrite(K105, K105_buffer);
    digitalWrite(K106, K106_buffer);
  }
 
   
   
   
    delay(200);//Sat ned fra 2s til 0,2s, da antal målinger til gennemsnit er 10, hvorved relæerne opdateres med samme hastighed.
  }

 

Offline DanFr

  • U=I*R
  • ***
  • Indlæg: 44
  • Antal brugbare Indlæg: 0
    • Vis profil
Sv: Gennnemsnit temp.
« Svar #8 Dato: September 24, 2022, 14:33:49 »
Ser spændende ud, det må jeg lige teste og sætte mig ind i et STORT lærestadie.
Stort tak

Du siger det bibliotek jeg bruger, hmm findes der flere slags, skriver man det selv hvis man er hardcore ??

P.S. den kommer med en fejl, kan ikke lige se mig ud af hvad der mangler?
Arduino: 1.8.16 (Windows 10), Board: "Arduino Uno"

C:\Users\dan74\Documents\Arduino\Test_med_GNS\Test_med_GNS.ino: In function 'void loop()':

Test_med_GNS:67:34: error: expected initializer before '+=' token

     float current_temp_unhandled += sensors.getTempCByIndex(0);

                                  ^~

Test_med_GNS:68:21: error: 'current_temp_unhandled' was not declared in this scope

     temp_avg_sum += current_temp_unhandled;//Lægger den nye måling til den summerede værdi.

                     ^~~~~~~~~~~~~~~~~~~~~~

C:\Users\dan74\Documents\Arduino\Test_med_GNS\Test_med_GNS.ino:68:21: note: suggested alternative: 'current_temp'

     temp_avg_sum += current_temp_unhandled;//Lægger den nye måling til den summerede værdi.

                     ^~~~~~~~~~~~~~~~~~~~~~

                     current_temp

exit status 1

expected initializer before '+=' token



This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.
« Senest Redigeret: September 24, 2022, 14:44:35 af DanFr »

 

Offline dani8303

  • Spændingsdeler
  • ****
  • Indlæg: 54
  • Antal brugbare Indlæg: 8
  • ESP8266, Linux server, PHP, JS, så spiller det.
    • Vis profil
    • Egen side til styring, energi mm. tag et kig :-)
Sv: Gennnemsnit temp.
« Svar #9 Dato: September 24, 2022, 16:24:24 »
Tror jeg ved hvad fejlen er. Det var ikke meningen der skulle stå += i den linje. Kun =.
Prøv det her:
#include <OneWire.h>
#include <DallasTemperature.h>

float Temp1 = 22.0;
float Temp2 = 24.0;
float Temp3 = 26.0;
float Temp4 = 28.0;
float Temp5 = 30.0;
float Temp6 = 32.0;
float Temp7 = 29.0;
float Temp8 = 30.0;   
float Temp9 = 31.0;

#define ONE_WIRE_BUS 2
#define K101 3
#define K102 4
#define K103 5
#define K104 6
#define K105 7
#define K106 8
#define K107 9
#define K108 10

// Buffer til opbevaring af værdier mens de behandles
bool K101_buffer = 0;
bool K102_buffer = 0;
bool K103_buffer = 0;
bool K104_buffer = 0;
bool K105_buffer = 0;
bool K106_buffer = 0;

//Værdi der bruges til beregninger:
float current_temp = 0;
float temp_hys = 0.2;//Hysteresis. Prøv at google det. Så står relæerne ikke og danser.

//Bruges til gennemsnit
float temp_avg_sum = 0;//Summen der bruges til beregning af gennemsnit
int temp_avg_runs = 0;//Antal beregninger der indgår i gennemsnittet
int Number_of_runs = 10;//Hvor mange målinger der skal udgøre en gennemsnitsberegning

 
OneWire oneWire(ONE_WIRE_BUS);
 
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
 
void setup(void)
{
  Serial.begin(9600);
  pinMode(K101, OUTPUT);
  pinMode(K102, OUTPUT);
  pinMode(K103, OUTPUT);
  pinMode(K104, OUTPUT);
  pinMode(K105, OUTPUT);
  pinMode(K106, OUTPUT);
  pinMode(K107, OUTPUT);
  pinMode(K108, OUTPUT);
   

  sensors.begin();
}
 
void loop(void)
{
  if(temp_avg_runs<Number_of_runs){
    sensors.requestTemperatures();
    float current_temp_unhandled = sensors.getTempCByIndex(0);
    temp_avg_sum += current_temp_unhandled;//Lægger den nye måling til den summerede værdi.
    temp_avg_runs++; //Der er blevet tilføjet endnu en måling til den summerede værdi.
    Serial.print("Ude Temperatur: ");
    Serial.println(current_temp_unhandled);
  }else{//Der er nu foretaget nok målinger til at beregne et gennemsnit.

    float temp_avg_unhandled = temp_avg_sum / temp_avg_runs;//Beregner gennemsnit. Summerede værdi delt med antal målinger
    temp_avg_sum = 0;//Nulstiller, så der tages nye målinger næste gang loop køres
    temp_avg_runs = 0;
    //Bestemmer om temperaturen skal opdateres. Sikre at relæet ikke danser.
    //ABS() tager længden af værdien 10-> 10 og -10 -> 10. Altså fjerner minus fortegn..
    if(abs(temp_avg_unhandled-current_temp)>temp_hys){
      current_temp = temp_avg_unhandled;
    }else{
      Serial.println("Ingen opdatering af temperatur");
    }
 

    //I udgangspunktet skal de alle være slukket
    K101_buffer = 0;
    K102_buffer = 0;
    K103_buffer = 0;
    K104_buffer = 0;
    K105_buffer = 0;
    K106_buffer = 0;
 

    if(current_temp >= Temp5)
    {
      K106_buffer = 1;
    }
    else if(current_temp >= Temp4)
    {
      K105_buffer = 1;
    }
    else if(current_temp >= Temp3)
    {
      K104_buffer = 1;
    }
    else if(current_temp >= Temp2)
    {
      K103_buffer = 1;
    }
    else if(current_temp >= Temp1)
    {
      K102_buffer = 1;
    }else {
      K101_buffer = 1;
    }

    //Sender buffer til pins
    digitalWrite(K101, K101_buffer);
    digitalWrite(K102, K102_buffer);
    digitalWrite(K103, K103_buffer);
    digitalWrite(K104, K104_buffer);
    digitalWrite(K105, K105_buffer);
    digitalWrite(K106, K106_buffer);
  }
 
   
   
   
    delay(200);//Sat ned fra 2s til 0,2s, da antal målinger til gennemsnit er 10, hvorved relæerne opdateres med samme hastighed.
  }

 

Offline dani8303

  • Spændingsdeler
  • ****
  • Indlæg: 54
  • Antal brugbare Indlæg: 8
  • ESP8266, Linux server, PHP, JS, så spiller det.
    • Vis profil
    • Egen side til styring, energi mm. tag et kig :-)
Sv: Gennnemsnit temp.
« Svar #10 Dato: September 24, 2022, 16:50:35 »
Jeg har haft brugt det her bibliotek:
https://github.com/PaulStoffregen/OneWire

Dog en ældre version. Virker fint på både almindelig arduino(atmega328) og ESP8266.

 

Offline DanFr

  • U=I*R
  • ***
  • Indlæg: 44
  • Antal brugbare Indlæg: 0
    • Vis profil
Sv: Gennnemsnit temp.
« Svar #11 Dato: September 25, 2022, 09:36:17 »
Hej dani8303

Sidste gang jeg havde min Arduino fremme læste jeg godt noget omkring det bibliotek fra PoulStoffregen.
Altså den løsning med AVG temp fungere jo perfekt, det ser da sådan ud i hvert fald.
Skal lige klippe klister de 2 sidste temperaturer setpunkter ind og fjerne det som ikke bliver brug og tilføje egne noter.
Der er lige 2 ting.

1. >>Jeg har faktisk sat den til 20 målinger med et delay på 1000. Så var det jeg tænkte, for at holde programmet så enkelt som mulig kun det omkring "hys" og "abs" så fjernes, eller hvad tænker du? ( vil selvfølgelig holde "originalen" og lave noter til fremtidig brug)

2. >> ved ikke om det kan lade sig gøre? Men nu kommer den der tekst "Ingen opdatering af temperaturen" Kan den udregnet avg temperatur blive vist og fremhævet, så jeg kan følge med i hvad temp der bliver kigget på  ;D

mvh Dan

 

Offline dani8303

  • Spændingsdeler
  • ****
  • Indlæg: 54
  • Antal brugbare Indlæg: 8
  • ESP8266, Linux server, PHP, JS, så spiller det.
    • Vis profil
    • Egen side til styring, energi mm. tag et kig :-)
Sv: Gennnemsnit temp.
« Svar #12 Dato: September 25, 2022, 09:59:39 »
Hej Dan

1.
Ja du kan fjerne det, men gennemsnit løser ikke hele din udfordring. Hvad nu hvis gennemsnit beregnes til 25,99 det ene øjeblik og 26,01 det næste. Herefter så tilbage til 25,99. Når temperaturen står lige på vippen, så vil det stadig kunne give udfordringer, men med 20 målinger og delay 1000, så er sandsynligheden ikke særlig stor. Du kan dog roligt sætte temp_hys længere ned. Eksempelvis 0,05.

2:
Det kan sagtens lade sig gøre. Det synes jeg næsten selv du skal forsøge at ligge ind. Det burde du sagtens kunne finde ud af, ellers så bare skriv.

 

Offline DanFr

  • U=I*R
  • ***
  • Indlæg: 44
  • Antal brugbare Indlæg: 0
    • Vis profil
Sv: Gennnemsnit temp.
« Svar #13 Dato: September 25, 2022, 10:36:55 »
Ja okay giver meget god mening, jeg sidder jo også bare og påvirker føleren med et fryse element osv. når først den kommer ud, så vil temperaturen ligge meget ens over længere perioder.

Jeg prøver at kigge på det  ;D

 

Offline DanFr

  • U=I*R
  • ***
  • Indlæg: 44
  • Antal brugbare Indlæg: 0
    • Vis profil
Sv: Gennnemsnit temp.
« Svar #14 Dato: September 25, 2022, 12:01:55 »
Den funktion du har lagt ind med "ingen opdatering af temperaturen" hvad er det den kigger på? Jeg tror det er avg jeg har fået den til at vise, men hænger bare ikke sammen med ingen opdatering af temperaturen

AVG af ude temperatur: 7.65
Ude temperatur: 7.88
Ude temperatur: 7.88
Ude temperatur: 7.88
Ude temperatur: 7.88
Ude temperatur: 7.25
Ingen opdatering af temperatur
AVG af ude temperatur: 7.75
Ude temperatur: 7.19
Ude temperatur: 7.88
Ude temperatur: 7.88
Ude temperatur: 7.88
Ude temperatur: 7.25
Ingen opdatering af temperatur
AVG af ude temperatur: 7.61
Ude temperatur: 7.88
Ude temperatur: 7.31
Ude temperatur: 7.88
Ude temperatur: 7.88
Ude temperatur: 7.88
Ingen opdatering af temperatur
AVG af ude temperatur: 7.76

Ligger lige programmet ind
#include <OneWire.h>
#include <DallasTemperature.h>

float Temp1 = 8.0;
float Temp2 = 9.0;
float Temp3 = 10.0;
float Temp4 = 12.0;
float Temp5 = 13.0;
float Temp6 = 14.0;
float Temp7 = 15.0;
float Temp8 = 30.0;   
float Temp9 = 31.0;

#define ONE_WIRE_BUS 2
#define K101 3
#define K102 4
#define K103 5
#define K104 6
#define K105 7
#define K106 8
#define K107 9
#define K108 10

// Buffer til opbevaring af værdier mens de behandles
bool K101_buffer = 0;
bool K102_buffer = 0;
bool K103_buffer = 0;
bool K104_buffer = 0;
bool K105_buffer = 0;
bool K106_buffer = 0;

//Værdi der bruges til beregninger:
float current_temp = 0;
float temp_hys = 0.2;//Hysteresis. Prøv at google det. Så står relæerne ikke og danser.

//Bruges til gennemsnit
float temp_avg_sum = 0;//Summen der bruges til beregning af gennemsnit
int temp_avg_runs = 0;//Antal beregninger der indgår i gennemsnittet
int Number_of_runs = 5;//Hvor mange målinger der skal udgøre en gennemsnitsberegning

 
OneWire oneWire(ONE_WIRE_BUS);
 
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
 
void setup(void)
{
  Serial.begin(9600);
  pinMode(K101, OUTPUT);
  pinMode(K102, OUTPUT);
  pinMode(K103, OUTPUT);
  pinMode(K104, OUTPUT);
  pinMode(K105, OUTPUT);
  pinMode(K106, OUTPUT);
  pinMode(K107, OUTPUT);
  pinMode(K108, OUTPUT);
   

  sensors.begin();
}
 
void loop(void)
{
  if(temp_avg_runs<Number_of_runs){
    sensors.requestTemperatures();
    float current_temp_unhandled = sensors.getTempCByIndex(0);
    temp_avg_sum += current_temp_unhandled;//Lægger den nye måling til den summerede værdi.
    temp_avg_runs++; //Der er blevet tilføjet endnu en måling til den summerede værdi.
    Serial.print("Ude temperatur: ");
    Serial.println(current_temp_unhandled);
  }else{//Der er nu foretaget nok målinger til at beregne et gennemsnit.

    float temp_avg_unhandled = temp_avg_sum / temp_avg_runs;//Beregner gennemsnit. Summerede værdi delt med antal målinger
    temp_avg_sum = 0;//Nulstiller, så der tages nye målinger næste gang loop køres
    temp_avg_runs = 0;
    //Bestemmer om temperaturen skal opdateres. Sikre at relæet ikke danser.
    //ABS() tager længden af værdien 10-> 10 og -10 -> 10. Altså fjerner minus fortegn..
    if(abs(temp_avg_unhandled-current_temp)>temp_hys){
      current_temp = temp_avg_unhandled;
    }else{
      Serial.println("Ingen opdatering af temperatur");
    }
    Serial.print("AVG af ude temperatur: ");
    Serial.println(temp_avg_unhandled);
 

    //I udgangspunktet skal de alle være slukket
    K101_buffer = 0;
    K102_buffer = 0;
    K103_buffer = 0;
    K104_buffer = 0;
    K105_buffer = 0;
    K106_buffer = 0;
 

    if(current_temp < Temp1)
    {
      K101_buffer = 1;
    }
    else if(current_temp < Temp2)
    {
      K102_buffer = 1;
    }
    else if(current_temp < Temp3)
    {
      K103_buffer = 1;
    }
    else if(current_temp < Temp4)
    {
      K104_buffer = 1;
    }
    else if(current_temp < Temp5)
    {
      K105_buffer = 1;
    }
    else if(current_temp < Temp6)
    {
      K106_buffer = 1;
    }else{
      K106_buffer =1;
    }
   
   

    //Sender buffer til pins
    digitalWrite(K101, K101_buffer);
    digitalWrite(K102, K102_buffer);
    digitalWrite(K103, K103_buffer);
    digitalWrite(K104, K104_buffer);
    digitalWrite(K105, K105_buffer);
    digitalWrite(K106, K106_buffer);
  }
 
   
   
   
    delay(200);//Sat ned fra 2s til 0,2s, da antal målinger til gennemsnit er 10, hvorved relæerne opdateres med samme hastighed.