//S7-Balkontemperatur-Sender mit Mono-LED-Temperatur-/Relaisanzuganzeige
//Mono-LED-Steuerung: Blinkt erst fr 1-er, dann Pause 5sec. und blinkt fr 10-er im 200ms-Takt, danach Pause 2sec.und Dauer-LED wenn Relais angezogen fr 6sec.dann Pause 2sec.und wieder von vorne,
// wenn Sender ausgeschaltet bleibt LED nach der Temperaturanzeige dunkel,
// bei Minus-Graden blinkt die LED 9xschnell (100ms-Takt) vor der Temperaturanzeige
//Autor: Thomas Mhrling, 76135Karlsruhe, Moningerstr. 16
//Auf Digispark umgeschrieben 04.04.24
#include <OneWire.h>
#include <dmtimer.h>
//#define DS18S20_ID 0x10
#define DS18B20_ID 0x28
DMTimer timer1(600000000); //Create a timer at 1s interval
const int DLED = 0;//Temperatur-LED
const int Rel = 4;//(Heizerrelais)
const int IR = 3;
const int HWT = 5;//Hardwaretoolnummer(Empfngerhardwareadresse kein Port)
const int SenderNr = 5;//Hardwaretoolnummer(Empfngerhardwareadresse kein Port)
const int iv = 40000;
const int uv = 40000;
const int iv1 = 2000;
const int iv2 = 16000;
//S7-Datenempfangsbyte: WORD S7S1 -> Adresse 255Bit _ HWT 255Bit
// ^ ^
// xxxxxxxx _ xxxxxxxx
// HW-Adresse _ HW-Toolnummer
//HW-Adress)=Sendernummer, HW-Toolnummer=vergebene Hardwareteilnummer(kann beliebig definiert werden)
//
//S7-Datenempfangsbyte: WORD S7S2 -> Daten 255Bit _ Daten 255Bit
// ^ ^
// xxxxxxxx _ xxxxxxxx
// Temperatur _ Temperatur
int temp;
int TZ = 0;
int TE = 0;
int TNK = 0;
int Flag = 0;
int Flag1 = 0;
int Flag2 = 0;
unsigned long _millis = 0; //gendert am 17.05.2020
unsigned long millis_ = 0; //gendert am 17.05.2020
int temp0 = 0;
int temp1 = 0;
int temp2 = 0;
int temp3 = 0;
int temp4 = 0;
int temp5 = 0;
int count = 0;
word S7S1 = 0;
word S7S2 = 0;
int IR_ = 0;
OneWire ds(2);
byte data[12];
byte addr[8];
boolean readTemperature(){
//find a device
if (!ds.search(addr)) {
ds.reset_search();
return false;
}
if (OneWire::crc8( addr, 7) != addr[7]) {
return false;
}
if (addr[0] != DS18B20_ID) {
return false;
}
ds.reset();
ds.select(addr);
// Start conversion
ds.write(0x44, 1);
// Wait some time...
}
boolean getTemperature(){
byte i;
byte present = 0;
present = ds.reset();
ds.select(addr);
// Issue Read scratchpad command
ds.write(0xBE);
// Receive 9 bytes
for ( i = 0; i < 9; i++) {
data[i] = ds.read();
}
// Calculate temperature value
temp = ((( (data[1] << 8) + data[0] )*0.0625));//Fahrenheit:*1.8)+32;
return true;
}
/*
void BT_S(){//Balkontemperatur senden
Serial.print(S7S2);
//Serial.print(" ");
Serial.println(S7S1);
//Serial.print("Flag1: ");
//Serial.println(Flag1);
//Serial.print("Temp: ");
//Serial.println(temp);
}
*/
void IRD(){//IR-Sensor auswerten
IR_ = digitalRead(IR);
if(IR_){Flag2=1;}
// Serial.print("Flag2: ");
// Serial.println(Flag2);
}
void setup(){
// Serial.print("uv");
// Serial.println(uv);
// Serial.print("iv1 ");
// Serial.println(iv1);
// Serial.print("iv2 ");
// Serial.println(iv2);
pinMode(0, OUTPUT); //Temp.-LED
pinMode(3, INPUT);
millis_ = millis();
S7S1 = word(SenderNr, HWT);//Zusammensetzen von Word1-Sendebytes an S7-RS232-Modul->Sendernummer,Hardwarenummer(1=433MHz-Funkmodul HFY-J18A)
S7S2 = word(Flag1, temp);//Zusammensetzen von Word1-Sendebytes an S7-RS232-Modul->Temperaturvorzeichen(1=Minustemperatur),Temperatur
Serial.begin(2400);
// Serial.print("uv");
// Serial.println(uv);
}
void loop(){
// Serial.print("iv ");
// Serial.println(iv);
// Serial.print("iv1 ");
// Serial.println(iv1);
// Serial.print("iv2 ");
// Serial.println(iv2);
digitalWrite(DLED, LOW);
readTemperature();//liest Dallas18B20-Temperatur
delay(1000);
getTemperature();//bergibt den Wert einer Variablen
delay(1000);
_millis = millis();//bergibt aktuelle Laufzeit einer Variablen
if(temp < 0) {//wertet 10-er Stellen aus fr LED-Temperaturanzeige
temp1 = 10;
temp = temp*(-1);
Flag1 = 1;
}else Flag1 = 0;
if((temp > 0) && (temp < 10)){temp5 = 0;}
if((temp > 9) && (temp < 20)){temp5 = 1;}
if((temp > 19) && (temp < 30)){temp5 = 2;}
if((temp > 29) && (temp < 40)){temp5 = 3;}
if((temp > 39) && (temp < 50)){temp5 = 4;}
switch(temp5){//zergliedert die 1-er Stellen der verschiedenen 10-er Stellen gleichablaufend
case 0:
temp0 = temp;
break;
case 1:
temp0 = temp - 10;
if(temp == 10){temp0 = 1;}//temp0 mu 1 sein nicht null da sonst der for-Zhler nicht richtig funktioniert (zeigt 1-er Stelle an(LED blinkt einmal) anstatt nichts (LED bleibt aus)
break;
case 2:
temp0 = temp - 20;
if(temp == 20){temp0 = 1;}
break;
case 3:
temp0 = temp - 30;
if(temp == 30){temp0 = 1;}
break;
case 4:
temp0 = temp - 40;
if(temp == 40){temp0 = 1;}
break;
}
/*
if(temp < 5) {//Relaissteuerung fr externen Heizer, Temperatur ist fest programmiert (Frostschutzwchter)
digitalWrite(Rel, HIGH);//schaltet Relais bei Untertemperatur sofort Gradgenau, unabhngig von Intervallzeit (Temperaturanzeige)
Flag = 1;
}
else if((temp > 6) & (Flag1 == 0)){
digitalWrite(Rel, LOW);
Flag = 0;
}*/
// Serial.print("uv ");
// Serial.println(uv);
// if((timer1.isTimeReached())||(Flag2==1)){ //check if execution time has been reached
if(Flag2==1){
// if ((_millis - millis_>= uv)||(Flag2==1)) {//leitet nach Intervallzeit (Konstante) eine Temperaturanzeige ein
if(temp1 == 10) {//bei Minusgraden blinkt die LED erst 9xschnell
for(int i=0;i<temp1;i++){
digitalWrite(DLED, HIGH);
delay(100);
digitalWrite(DLED, LOW);
delay(100);
}
delay(2000);//erste Pause zur LED-Temperaturbetrachtung nur bei Minusgraden
}
for(int i=0;i<temp0;i++){//LED blinkt so oft wie warm (oder kalt, 1-er)
digitalWrite(DLED, HIGH);
delay(400);
digitalWrite(DLED, LOW);
delay(400);
}
count = 0;
delay(4000);//zweite Pause zur LED-Temperaturbetrachtung (bei warm und kalt)
for(int i=0;i<temp5;i++){//LED blinkt so oft wie warm (oder kalt, 10-er)
digitalWrite(DLED, HIGH);
delay(400);
digitalWrite(DLED, LOW);
delay(400);
}
temp5 = 0;
temp1 = 0;
millis_ = millis();//Reset Zeitzhler
_millis = millis();
Flag2 = 0;
delay(5000);
}
// if(_millis - millis_ >= iv1) {//leitet nach Temperaturanzeige Relayanzeige ein
// if(Flag == 1){digitalWrite(DLED, HIGH);}
// }
/* if(_millis - millis_ >= iv2) {
digitalWrite(DLED, LOW);
}*/
S7S2 = word(Flag1, temp);//Zusammensetzen von Word1-Sendebytes an S7-RS232-Modul->Temperaturvorzeichen(1=Minustemperatur),Temperatur
// BT_S();
delay(2);
//Serial.print("temp0: ");
//Serial.println(temp0);
//Serial.print("temp5: ");
//Serial.println(temp5);
IRD();
}
Comments