hier mal meine Version zur Einzelraumregelung
Sender:
/* ATtiny_DS18B20_3_Funk_Sender_ID_VBat_T_delta.ino
* Achtung BUG im Linker bei Sketches über 4 kB. Neuen Linker giebt es hier:https://github.com/TCWORLD/ATTinyCore/tree/master/PCREL%20Patch%20for%20GCC
* 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 59003 //zeit in ms, die der MC schlafen soll
char ID[5]="ID00"; //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(10); //warten bis sich die Referenzspannung eingestellt hat
ADCSRA |= _BV(ADSC);
while (bit_is_set(ADCSRA,ADSC));
result = ADCL;
result |= ADCH<<8;
result = 1093044L / result; // vcc = 1125300L / result; //Versorgungsspannung in mV berechnen (1100mV * 1023 = 1125300
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 (Spannungsversorgung für den DS18B20 und den Sender)
bitClear(PRR, PRADC); ADCSRA |= bit(ADEN); // AD-Wandler einschalten
delay(10);
T_delta=analogRead(T_delta_Pin); // Auslesen der Poti-Stellung
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
}
der Empfänger Code ist im Anhang als ZIP evtl kannst du es gebrauchen
Regelung_FBH_Empf_Mini_3_1_BK.zip (4.62 KB)