Hallo,
ich wollte mal kurz mein Projekt Einzelraumregelung für Fußbodenheizung vorstellen.
Da ich vor knapp 30 Jahren leider keine Kabel von den einzelnen Räumen zur Heizungsanlage verlegt habe, mußte ich jetzt alles mit Funksendern ausstatten. In den Sendekisten ist ein DS18B20, ein Poti zum Ändern der Raumtemperatur um +/- 5K, sowie ein billiger 433MHz Sender. Übertragen wird die ist-Temperatur, die eingestellte Temperaturdifferenz, die Batteriespannung, sowie eine ID für jeden Sender.
Auf der Empfangsseite habe ich einen billigen Empfänger, eine DS3231, sowie ein 8-fach SSR Relais Board an einem Pro Mini mit denen ich 8 Thermoelektrische Stellantriebe 230V NC ansteuere. Ich brauche bei mir keine Mischersteuerung und keine Außentemperatur abhängige Regelung, da das bereits meine Heizungsanlage macht.
Vielleicht hat jemand von euch ähnliche Probleme und kann die Regelung gebrauchen.
LG
Ardubu
/*ATtiny_DS18B20_1_Funk_Sender_ID_VBat_T_delta.ino
Attiny Core Files von hier:https://code.google.com/p/arduino-tiny/
Bevor das Programm auf den Attiny übertragen wird, muß der Bootloader installiert werden
um den Attiny auf 8MHz zu Fusen
5974 Bytes
Bu.Kli.
09.02.2014
Belegung des Attiny:
1 (SS)PB5 | \/ | Vcc 8
2 ADC3 PB3 | | PB2 (SCK) 7
3 PB4 | | PB1 (MISO) 6
4 GND | | PB0 (MOSI) 5
8k Falsh, 512Bytes Ram
*/
#include <OneWire.h>
#include <VirtualWire.h> // bei verwendung von VirtualWire.h und JeeLib.h, die crc16.h
#include <JeeLib.h> // von C:\Program Files (x86)\Arduino\hardware\tools\avr\avr\include\util nach
//C:\Program Files (x86)\Arduino\libraries\VirtualWire\util kopieren
//und vorher die bestehende Datei umbenennen.
#undef abs
#undef double
#undef round
ISR(WDT_vect) {Sleepy::watchdogEvent();}
#define tx_Pin PB1 //auf dem ProMini 12
#define dallas_Data_Pin PB4 //auf dem ProMini 9
#define T_delta_Pin PB3 //auf dem ProMini 14
#define schlafzeit 39000 //zeit in ms, die der MC schlafen soll
char ID[5]="ID01"; //muß für jeden Sender fortlaufend einzeln vergeben werden von 00 bis xx
char UBat[5];
char Temp_ist[5];
char Temp_delta[5];
char line[22];
byte i;
byte present = 0;
byte data[12];
byte addr[8];
int T_ist;
int T_delta;
OneWire ds(dallas_Data_Pin);
//___________________________________________________________________________________________________________________
int readVcc() {
bitClear(PRR, PRADC); ADCSRA |= bit(ADEN); // AD-Wandler einschalten
long result;
// Read 1.1V reference against Vcc
#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
ADMUX = _BV(MUX5) | _BV(MUX0);
#elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
ADMUX = _BV(MUX3) | _BV(MUX2);
#else
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); //ATmega328
#endif
delay(5);
ADCSRA |= _BV(ADSC);
while (bit_is_set(ADCSRA,ADSC));
result = ADCL;
result |= ADCH<<8;
result = 1073434L / result;
ADCSRA &= ~ bit(ADEN); bitSet(PRR, PRADC); // AD-Wandler ausschalten um Strom zu sparen
return result;
}
//______________________________________________________________________________________________________________________
void setup(void) {
analogReference(INTERNAL);
DDRB=6;//PB1 + PB2 als Ausgang setzen
vw_setup(2000);
vw_set_tx_pin(tx_Pin);
}
//_______________________________________________________________________________________________________________________
void loop(void) {
PORTB=4;//PB2 auf High setzen
bitClear(PRR, PRADC);
ADCSRA |= bit(ADEN); // AD-Wandler einschalten
delay(5);
T_delta=analogRead(T_delta_Pin);
ADCSRA &= ~ bit(ADEN); bitSet(PRR, PRADC); // AD-Wandler ausschalten um Strom zu sparen
//Dallas DS18B20 auslesen
if ( !ds.search(addr)) {
ds.reset_search();
return;}
ds.reset();
ds.select(addr);
ds.write(0x44,0); // 0=ohne 1=mit parasite power
delay(750); // vielleicht sind 750ms genug
present = ds.reset();
ds.select(addr);
ds.write(0xBE);
for ( i = 0; i < 9; i++) {
data[i] = ds.read();}
T_ist = ((data[1] << 8) + data[0] );
//Umwandlung Integer zu Char
itoa(readVcc(),UBat,10);
itoa(T_ist,Temp_ist,10);
itoa(T_delta,Temp_delta,10);
//Sendestring aufbereiten
strcpy(line,ID);
strcat(line,",");
strcat(line,UBat);
strcat(line,",");
if (T_ist<1000){strcat(line,"0");}
if (T_ist<100){strcat(line,"0");}
if (T_ist<10){strcat(line,"0");}
strcat(line,Temp_ist);
strcat(line,",");
if (T_delta<1000){strcat(line,"0");}
if (T_delta<100){strcat(line,"0");}
if (T_delta<10){strcat(line,"0");}
strcat(line,Temp_delta);
//Senden
vw_send((uint8_t *)line, strlen(line));
vw_wait_tx();
PORTB=0;//alle Ausgänge auf 0 setzen
Sleepy::loseSomeTime(schlafzeit); //Schlafzeit in ms max 60000
}
Regelung_FBH_Empf_3.ino (4.62 KB)