Probleme mit stromsparen ATTINY85+DS18S20+433Mhz

Guten Tag Arduino Fans, habe ein rätselhaftes Problem das ich seit ein paar Tage nicht lösen kann. Also ich habe ein Sender mit Hilfe eines ATTINY85 + DS18S20+433MHz Gebaut , wie man im Sketch sieht geht der Winzling nach dem senden eine Weile schlafen. Wacht auf und sendet die Temperatur erneut. Mein Problem er sendet immer 127° , das kuriose wen ich im Sketch die Stromspargeschichte weglasse sendet er die richtige Temperatur. Benutze ich aber einen DS18B20(natürlich ist die Abfrage auf den 18B20 angepasst) läuft alles Super. Bin einfach ratlos, habe das Netz auch nach anderen Möglichkeiten durchsucht aber nichts gefunden oder ähnlichen fällen ... es liegt denke ich an der avr/sleep.h und avr/wdt.h + DS18S20 hat jemand das Problem gehabt???? Und die Delay(xxx); hat überhaupt keine Auswirkung im Programm egal was ich da eingebe Delay(100) oder Delay(10000) auch komisch..

/ ATtiny85 + DS18S20 sensor

#include <VirtualWire.h>
#include <OneWire.h>
#include <avr/sleep.h>
#include <avr/wdt.h>


#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

int HighByte, LowByte, TReading, SignBit, Tc_100, Fract , Whole;

int led = PB0;//PB0
int sen = PB1;//++ Sensor
int sender = PB2;//++ sender


  float temp;
  char msg[20];

volatile boolean f_wdt = 1;


OneWire  ds(3);  // 1-wire bus D4

// 10 D5 3A E 3 8 0 6A   DS18S20 Familie ohne 4,7k
byte addr[8]={0x10, 0xD5, 0x3A, 0x0E, 0x03, 0x08, 0x00, 0x6A}; //loose sensor #1






void setup(void) {
 
    pinMode(led, OUTPUT);  
    pinMode(sender, OUTPUT);   
    pinMode(sen, OUTPUT); 

    vw_set_ptt_inverted(true); // Required for RF Link module
    vw_setup(2000); // Bits per sec
    vw_set_tx_pin(4); // pin x 433 empfänger
   
     setup_watchdog(9); // approximately 8 seconds sleep
   }


void loop(void) 
    {       
     abfrage();                                       

    // loop around and give delay of 2 * 9sec = 18 sec
   for (int myLoop= 0; myLoop < 2; myLoop++) {
      // reset flag
      if (f_wdt==1) {  // wait for timed out watchdog / flag is set when a watchdog timeout occurs
    f_wdt=0; }    

    system_sleep();
     
     }
    delay(500);
  
  }//ende loop


// set system into the sleep state
// system wakes up when wtchdog is timed out
void system_sleep() {
 
  cbi(ADCSRA,ADEN);                    // Schalter Analog zu Digitalwandler AUS
  set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Sleep-Modus wird hier eingestellt
  sleep_enable();
  sleep_mode();                        // System schläft hier
  sleep_disable();                     // Das System setzt die Ausführung hier fort, wenn die Watchdog-
  sbi(ADCSRA,ADEN);                // Schalter Analog zu Digitalwandler An

}


void  abfrage()
{
   pinMode(led, OUTPUT); 
   pinMode(sen, OUTPUT); 
   pinMode(sender, OUTPUT);
   digitalWrite(led, HIGH); 
   digitalWrite(sen, HIGH); 
   digitalWrite(sender, HIGH);
   delayMicroseconds (3000); 

  byte i;
  byte present = 0;
  byte data[12];

      ds.reset();
    ds.select(addr);
    ds.write(0x44,0);         // start conversion, with parasite power on at the end

    delay(1000);     // maybe 750ms is enough, maybe not
    // we might do a ds.depower() here, but the reset will take care of it.
    //ds.depower(); 
    present = ds.reset();
    ds.select(addr);    
    ds.write(0xBE);         // Read Scratchpad

    for ( i = 0; i < 9; i++) 
    {           // we need 9 bytes
      data[i1] = ds.read();
    }

    LowByte = data[0];
    HighByte = data[1];
    TReading = (HighByte << 8)+ LowByte;
     SignBit = TReading & 0x8000;  // test most sig bit
    if (SignBit) // negative
    {
      TReading = (TReading ^ 0xffff) + 1; // 2's comp
    }
    Tc_100 = (TReading*100/2);    

     Whole = Tc_100/ 100;  // separate off the whole and fractional portions
     Fract = Tc_100 % 100;
     sprintf(msg, "Temp %c%d.%d\ C",SignBit ? '-' : '+', Whole , Fract < 10 ? 0 : Fract/10);
    
   vw_send((uint8_t *)msg, strlen(msg));
   vw_wait_tx();                                         // Wait for message to finish
   delay(500);
   digitalWrite(led, LOW); 
   delay(500);
 
    digitalWrite(sen, LOW); 
    digitalWrite(sender, LOW);
    pinMode(sen, INPUT);
    pinMode(led, INPUT); 
    pinMode(sender, INPUT);
}

// 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms
// 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec
void setup_watchdog(int ii) {

  byte bb;
  int ww;
  if (ii > 9 ) ii=9;
  bb=ii & 7;
  if (ii > 7) bb|= (1<<5);
  bb|= (1<<WDCE);
  ww=bb;

  MCUSR &= ~(1<<WDRF);
  // start timed sequence
  WDTCR |= (1<<WDCE) | (1<<WDE);
  // set new watchdog timeout value
  WDTCR = bb;
  WDTCR |= _BV(WDIE);
  //sei(); // Enable global interrupts
}
 
// Watchdog Interrupt Service / wird ausgeführt, wenn Watchdog abgelaufen ist
ISR(WDT_vect) {
  f_wdt=1;  // set global flag
}

werden Immer 127 gesendet......

#include <VirtualWire.h>
#include <OneWire.h>


  int HighByte, LowByte, TReading, SignBit, Tc_100, Fract , Whole;

  char msg[20];

float temp;


  

int led = PB0;//PB0
int sen = PB1;//++ Sensor
int sender = PB2;//++ sender


OneWire  ds(3);  // 1-wire bus D4


byte addr3[8]={0x10, 0xD5, 0x3A, 0x0E, 0x03, 0x08, 0x00, 0x6A}; //sensor 


void setup(void) {
 
    vw_set_ptt_inverted(true); // Required for RF Link module
    vw_setup(2000); // Bits per sec
    vw_set_tx_pin(4); // pin x 433 empfänger
    pinMode(led, OUTPUT);  
    pinMode(sender, OUTPUT);   
    pinMode(sen, OUTPUT);  
   
  digitalWrite(sen, HIGH); 
  digitalWrite(sender, HIGH);
  delay(200);  
 
}

void loop(void) {

  digitalWrite(led, HIGH);  

  byte i;
  byte present = 0;
  byte data[12];

      ds.reset();
    ds.select(addr3);
    ds.write(0x44,0);         // start conversion, with parasite power on at the end

    delay(1000);     // maybe 750ms is enough, maybe not
    // we might do a ds.depower() here, but the reset will take care of it.
    //ds.depower(); 
    present = ds.reset();
    ds.select(addr3);    
    ds.write(0xBE);         // Read Scratchpad

    for ( i = 0; i < 9; i++) 
    {           // we need 9 bytes
      data[1] = ds.read();
    }

    LowByte = data[0];
    HighByte = data[1];
    TReading = (HighByte << 8)+ LowByte;
     SignBit = TReading & 0x8000;  // test most sig bit
    if (SignBit) // negative
    {
      TReading = (TReading ^ 0xffff) + 1; // 2's comp
    }
    Tc_100 = (TReading*100/2);    

     Whole = Tc_100/ 100;  // separate off the whole and fractional portions
     Fract = Tc_100 % 100;
     sprintf(msg, "Temp %c%d.%d\ C",SignBit ? '-' : '+', Whole , Fract < 10 ? 0 : Fract/10);
    
   vw_send((uint8_t *)msg, strlen(msg));
   vw_wait_tx();                                         // Wait for message to finish
  delay(500);
  digitalWrite(led, LOW); 
  delay(500);
  
}

Läuft perfekt....nur ohne stromsparen

Warum soll es den der DS18S20 sein ?

HotSystems:
Warum soll es den der DS18S20 sein ?

Wie meinst du das warum? Warum ich ein genommen habe, weil grade noch paar rumliegen habe.

Ich glaube, er hat das gefragt, weil Du schriebst, dass es mit dem DS18B20 läuft. Damit hast Du den auch rumliegen :wink: und könntest den benutzen.

Gruß Tommy

Tommy, das stimmt.
Wenn der DS18B20 funktioniert, dann nehme ich doch den. Ausser es gibt einen wichtigen Grund, den nicht zu nehmen.

Tommy56:
Ich glaube, er hat das gefragt, weil Du schriebst, dass es mit dem DS18B20 läuft. Damit hast Du den auch rumliegen :wink: und könntest den benutzen.

Gruß Tommy

ja korrekt kann ich auch, nur irgendwann hat mich der Ehrgeiz gepackt das mit dem DS18S20 ans Laufen zu bekommen. ich möchte den Grund wissen warum es mit dem DS18S20 nicht hinhaut... entweder geht das prinzipiell nicht oder hmmmmm k.a.

Ich glaube, um das heraus zu finden musst Du beide Datenblätter vergleichen.
Evtl. hat der S eine längere Vorlaufzeit mit Spannung nötig oder ein anderes Einschaltverhalten.

Gruß Tommy

HotSystems:
Tommy, das stimmt.
Wenn der DS18B20 funktioniert, dann nehme ich doch den. Ausser es gibt einen wichtigen Grund, den nicht zu nehmen.

ist der B den besser als der S, die Genauigkeit +-0,5 ist ja gleich nur das der B-12bit ist und der S-9bit ,soweit ich weiß.... ist auch kein Problem ein DS18B20 zu nehmen, dachte nur einer hatte schon das Phonemen

Tommy56:
Ich glaube, um das heraus zu finden musst Du beide Datenblätter vergleichen.
Evtl. hat der S eine längere Vorlaufzeit mit Spannung nötig oder ein anderes Einschaltverhalten.

Gruß Tommy

ja aber wie gesagt es läuft ja super mit dem DS18S20 aber nur wen ich den ATTINY nicht schlafen schicke, sobald ich den Sketch mit Stromsparen nehme haut es nicht hin.... also liegt es doch an dem Teil was den ATTINY ins schlafen schickt..... oder sehe ich das Falsch

Ich habe noch das hier gefunden.
Bei gleicher Auflösung braucht der S länger. Evtl. braucht er auch länger zum Aufwachen.

Gruß Tommy

Tommy56:
Ich habe noch das hier gefunden.
Bei gleicher Auflösung braucht der S länger. Evtl. braucht er auch länger zum Aufwachen.

Gruß Tommy

JA Tommy56 das hatte ich auch gedacht und habe nachdem ich die Ports auf HIGH schalte Delay(xxxx) eingebaut, nur wie oben beschrieben merke ich überhaupt kein unterscheid, habe zusätzlich Delay() bei der LED eingebaut(um zu sehen ob der Ablauf stoppt und die Pause reinkommt ), ist das gleiche ob der ATTINY keine Delay's akzeptiert....... verstehe ich nicht.

Habe jetzt festgestellt wen ich den +V des DS18S20 von den ATTINY abmache und auf Dauer +V lege so funktioniert alles.... auch mit dem Stromsparmodus Wie gesagt die Delay(); haben keinen Einfluss warum auch immer Die ATTINY'S hatte ich aus China bestellt vielleicht Fehlerhaft, 2 Wahl oder so...

Wo genau hast du den den +V am ATtiny85 angeschlossen ?

HotSystems:
Wo genau hast du den den +V am ATtiny85 angeschlossen ?

Es sieht so aus DS18S20 +V an ATTINY(PB1), Datenleitung an ATTINY(PB3) // Sender +V an ATTINY(PB2) Datenleitung an ATTINY(PB4) // LED +V an ATTINY(PB0)--> Grund alle zusammen.

aber da der Sensor ca. 750-1000nA zieht im lehrlauf, denke ich brauch ich ihn nicht ausschalten um die Batterie zu schonen.

parabello:
Es sieht so aus DS18S20 +V an ATTINY(PB1), Datenleitung an ATTINY(PB3) // Sender +V an ATTINY(PB2) Datenleitung an ATTINY(PB4) // LED +V an ATTINY(PB0)--> Grund alle zusammen.

aber da der Sensor ca. 750-1000nA zieht im lehrlauf, denke ich brauch ich ihn nicht ausschalten um die Batterie zu schonen.

Ok, wenn du ihn ausschalten wolltest, müsstest du noch eine Zeit lang warten, bis dieser bereit ist.
Das wird dein Problem sein.
Du kannst ja probeweise mal eine Wartezeit (delay(1000):wink: bis zur eigentlichen Messung einbauen, das sollte reichen,

HotSystems:
Ok, wenn du ihn ausschalten wolltest, müsstest du noch eine Zeit lang warten, bis dieser bereit ist.
Das wird dein Problem sein.
Du kannst ja probeweise mal eine Wartezeit (delay(1000):wink: bis zur eigentlichen Messung einbauen, das sollte reichen,

JA HotSystems das denke ich auch aber wie gesagt Delay(1000); hat keine Auswirkung, wird nicht akzeptiert .. also wenn ich den +V-pin vom Sensor auf HIGH lasse(einmal im Setup) und nicht mehr auf LOW ziehe dan wird die temp. korrekt gemessen. SOBALD ich aber im Programm den PIN AUS oder EIN schalte nochmal MIT ODER OHNE DELAY wird nur 127° geliefert sehe unten ........DELAY FUNZT NICHT warum auch immer ob 100,1000,3000,3000000 >:( >:( >:( liegt's an der IDE????K.A.

     digitalWrite(sen, HIGH); 
     digitalWrite(sender, HIGH); 
     delay(3000);
  
     abfrage();
     
    digitalWrite(sen, LOW); 
    digitalWrite(sender, LOW);
    delay(3000);

BRINGT NICHTS man merkt auch nicht das er DELAY annimmt.........lasse ich immer auf HIGH Läuft alles gut....

parabello:
JA HotSystems das denke ich auch aber wie gesagt Delay(1000); hat keine Auswirkung, wird nicht akzeptiert .. also wenn ich den +V-pin vom Sensor auf HIGH lasse(einmal im Setup) und nicht mehr auf LOW ziehe dan wird die temp. korrekt gemessen. SOBALD ich aber im Programm den PIN AUS oder EIN schalte nochmal MIT ODER OHNE DELAY wird nur 127° geliefert sehe unten ........DELAY FUNZT NICHT warum auch immer ob 100,1000,3000,3000000 >:( >:( >:( liegt's an der IDE????K.A.

OK, verstehe ich.
Dann lass ihn auf HIGH, da der Strom sehr gering ist.
Da ich keinen DS18S20 habe, kann ich es leider nicht testen.
Bei mir läuft der DS18B20, allerdings ständig "unter Strom". :wink:

HotSystems:
OK, verstehe ich.
Dann lass ihn auf HIGH, da der Strom sehr gering ist.
Da ich keinen DS18S20 habe, kann ich es leider nicht testen.
Bei mir läuft der DS18B20, allerdings ständig "unter Strom". :wink:

Mit meinem HOLZ Multimeter gemessen sind 2müA unterschied, gut das du es fernstanden hast, was meinst du den ist das softwaren oder hardwaremesig was nicht in Ordnung? Habe auch ein zweiten DS18S20 angeschlossen das gleiche, wie gesagt warum akzeptiert das Ding kein DELAY(XXX); Das ist das Problem denke ich... Und der DS18B20 ist wahrscheinlich etwas flotter beim auslesen, mit ihm geht's ja.