probleme mit attiny + virtual wire + dht22 + sleepmode

hallo zusammen,

wie oben beschrieben hab ich leider probleme, das ans laufen zu bekommen.....

ich verwende einen attiny84 mit 8mhz

und virtual wire 1.27

und diese library für den dht22:
http://playground.arduino.cc/Main/DHTLib

und sleepmodus + watchdog.

außerdem lese ich die batteriespannung aus und sende dieser per funk.

wenn ich die dht lib draussen lasse und für die temp und rlf werte platzhalter eintrage, funktioniert alles wunderbar...

und wenn ich statt der virtual wire bzw funk softserial verwende, funktioniert auch alles.......

entweder hängt der sender sich auf.
oder es kommen irgendwelche zeichen beim empfänger an.
ich hab auch schon mit verschiednen OSCCAL werten rumprobiert, mit dem ergebniss, das mit manchen zumindest irgendwelche zeichen angekommen sind und mit dem faktory-wert lief es zb gar nicht.

Hallo,
ich habe mal so ein ähnliches Projekt allerdings mit einem 18B20 statt DHT22 gebaut. Vielleicht kannst du mit dem Sketch was anfangen, ich habe die Probleme im Sketch dokumentiert.

/* 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]="ID03"; //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 = 1093044L / 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 (Spannungsversorgung für den DS18B20 und den Sender)
   bitClear(PRR, PRADC); ADCSRA |= bit(ADEN); // AD-Wandler einschalten
   delay(5);
   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
    
}

vielen dank !

bei mir war der sende-string zu lang, weil ich noch alles mögliche mitgesendet hab.....
jetzt läufts (;

trotzdem danke ! sehr interessant zu sehen, welche alternativen es gibt um so etwas umzusetzen.....