#include <OneWire.h>
#include <DallasTemperature.h>
#include <RunningMedian.h>
#include <RCSwitch.h>
// Data wire is conntec to the Arduino digital pin 4
#define ONE_WIRE_BUS 4
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature sensor
DallasTemperature sensors(&oneWire);
RunningMedian samples = RunningMedian(100);
// Get starting time
unsigned long previousTime1;
unsigned long previousTime2;
unsigned long currentMillis;
const unsigned long periodShort = 1000;
const unsigned long periodLong = 5000;
float previousMedianTemp;
float currentMedianTemp;
float DeltaMedianTemp;
float ChangeT;
int DeltaMillis;
// LED Setup
#define LED_PIN 12
// RC 433 Setup
RCSwitch RCsender = RCSwitch();
void setup(void){
// Start serial communication for debugging purposes
Serial.begin(9600);
// Start up the library
sensors.begin();
// Set intial timers
previousTime1 = millis(); //initial start time
previousTime2 = millis(); //initial start time
//LED Setup
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
// RC Setup (https://daniel-ziegler.com/arduino/mikrocontroller/2017/06/16/Funksteckdose-arduino/)
RCsender.enableTransmit(3); // An Pin 3
RCsender.setProtocol(1);
RCsender.setPulseLength(187);
//Get starting temperature
sensors.requestTemperatures();
previousMedianTemp = sensors.getTempCByIndex(0);
}
void loop(void){
sensors.requestTemperatures();
samples.add(sensors.getTempCByIndex(0));
currentMedianTemp = samples.getMedian();
currentMillis = millis();
if(currentMillis - previousTime1 >= periodShort){
Serial.print("Celsius temperature: ");
// Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire
Serial.print(sensors.getTempCByIndex(0));
Serial.print(" / ");
Serial.println(currentMedianTemp);
previousTime1 = millis();
}
DeltaMillis = currentMillis - previousTime2;
if(DeltaMillis >= periodLong){
// Calculate difference in T between this and previous LONG period
DeltaMedianTemp = currentMedianTemp-previousMedianTemp;
// Calculate change in T between this and previous LONG period in °C per min
ChangeT = (DeltaMedianTemp/(DeltaMillis/1000)*60);
// Print output
Serial.print(" - time: ");
Serial.println(DeltaMillis);
Serial.print(" - Median Temp: ");
Serial.println(currentMedianTemp);
Serial.print(" - Temp-diff: ");
Serial.println(DeltaMedianTemp);
Serial.print(" - Temp-change: ");
Serial.println(ChangeT);
previousMedianTemp = currentMedianTemp;
previousTime2 = millis();
// Control LEDs
if(ChangeT<=20 & currentMedianTemp<=30){
digitalWrite(LED_PIN, HIGH);
RCsender.sendTriState("FFF0FFF10001");
}
else{
digitalWrite(LED_PIN, LOW);
RCsender.sendTriState("FFF0FFF100010");
}
}
//delay(50);
}