16
Arduino & Lign. / Sv: Gennnemsnit temp.
« 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.
}
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.
}