Forum: Mikrocontroller und Digitale Elektronik Tiny85 Low Power Code Optimieren


von Stefan A. (ripper121)


Lesenswert?

Hallo:),
könntet ihr bitte mal drüber schauen was ich noch an der WakeUp Time 
(zeit in dem der µC aufgeweckt ist und was tut) verbessern kann (je 
kürzer desto besser).

Und ob ich noch Sachen abstellen kann um noch weniger Energie zu 
brauchen.


Es soll ein Reaktiv Licht werden, wenn man es im Dunkeln anleuchtet soll 
es Blinken. Die Blink Wiederholungen und Dauer sollen gleich bleiben 
genau so wie die Wakeups alle 0.5 Sec zum checken des Lichtsensors.
1
#ifndef F_CPU
2
#define F_CPU 8000000UL
3
#endif
4
#include <util/delay.h>
5
#include <avr/io.h>
6
#include <avr/interrupt.h>
7
#include <avr/sleep.h>
8
#define DARKVAL 40
9
#define DEVIATION 5
10
#define HYST 6
11
#define ADC_SAMPLES 3
12
unsigned char power_counter = 1;
13
float adc_in = 1024;
14
float adc_in_pref = 1024;
15
float adc_dev = 1024;
16
17
ISR(WDT_vect) {
18
  power_counter--;
19
}
20
21
int main(void)
22
{
23
    // set timer to 0.5s
24
    WDTCR |= (0 << WDP3) | (1 << WDP2) | (0 << WDP1) | (1 << WDP0);
25
    // Set watchdog timer in interrupt mode
26
    WDTCR |= (1 << WDIE);
27
    WDTCR |= (0 << WDE);
28
    sei(); // Enable global interrupts
29
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
30
    /* Replace with your application code */
31
    while (1) 
32
    {
33
      //-----POWER OFF START-----
34
      //PortB Input LOW
35
      DDRB = 0x00;
36
      PORTB = 0x00;
37
      //Turn off ADC
38
      ADCSRA &= ~(1 << ADEN);
39
      //Disable analog comparator
40
      ACSR |= _BV(ACD);
41
      //Go Sleep
42
      sleep_mode();
43
      //-----POWER OFF END  -----
44
45
      adc_in_pref = adc_in;
46
47
      //-----READ ADC START-----
48
      //PB2 Input Pullup
49
      DDRB &= ~(1 << DDB2);
50
      PORTB |= (1 << PB2);
51
      // Set the ADC input to PB2/ADC1
52
      ADMUX |= (1 << MUX0);
53
      ADMUX |= (1 << ADLAR);
54
      // Set the prescaler to clock/128 & enable ADC
55
      ADCSRA |= (1 << ADPS1) | (1 << ADPS0) | (1 << ADEN);
56
      for (unsigned char i = 0; i < ADC_SAMPLES; i++) {
57
        // Start the conversion
58
        ADCSRA |= (1 << ADSC);
59
        // Wait for it to finish
60
        while (ADCSRA & (1 << ADSC));
61
        adc_in += ADCH;
62
      }
63
      adc_in = adc_in / ADC_SAMPLES;
64
      //-----READ ADC END  -----
65
      
66
      if (power_counter < 1) {
67
        power_counter = 1;
68
        //Get DEVIATION
69
        if (adc_in > adc_in_pref)
70
        adc_dev = adc_in - adc_in_pref;
71
        else
72
        adc_dev = adc_in_pref - adc_in;
73
        //Check DEVIATION and DARKVAL
74
        if (adc_dev > DEVIATION && adc_in > DARKVAL) {
75
          //PortB 0,1,4 Output
76
          DDRB |= (1 << DDB0) | (1 << DDB1) | (1 << DDB4);
77
          //Toggle Ports
78
          for (unsigned char i = 0; i < 10; i++) {
79
            PORTB ^= (1 << PB0) | (1 << PB1) | (1 << PB4);
80
            _delay_ms(100);
81
          }
82
          //Set Hysteresis
83
          power_counter = HYST;
84
        }
85
      }
86
    }
87
  
88
  return 0;
89
}

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

Stefan A. schrieb:
> je
> kürzer desto besser

dann verzichte auf float

#define ADC_SAMPLES 3
     adc_in = adc_in / ADC_SAMPLES;

Division durch 3 ist für die CPU recht schwer, bei 4 hätte er es viel 
leichter.

von Stefan A. (ripper121)


Lesenswert?

Peter II schrieb:
> Stefan A. schrieb:
>> je
>> kürzer desto besser
>
> dann verzichte auf float
>
> #define ADC_SAMPLES 3
>      adc_in = adc_in / ADC_SAMPLES;
>
> Division durch 3 ist für die CPU recht schwer, bei 4 hätte er es viel
> leichter.

Aber dann misst er ja 4 mal, weis nicht ob das 1 mal mehr messen nicht 
mehr zeit / energie verbraucht als 3 mal.

von Michael U. (amiga)


Lesenswert?

Hallo,

wie gut funktioniert es denn bis jetzt?

Weil: wie bekommst Du den ADC aufg 1024? mehr als 1023 kann der doch 
garnicht.
Wozu der float-Kram?
Warum 3x messen? 2 oder 4x mal messen und die Divison als rechts 
schieben ist in jedem Fall schneller als eine float-Rechnung.

Woher weiß das programm eigentlich, ob es heller Tag ist oder ob es 
angeleuchtet wird?

Gruß aus Berlin
Michael

von Peter II (Gast)


Lesenswert?

Stefan A. schrieb:
> Aber dann misst er ja 4 mal

warum rechnest du dann durch 3?

von Stefan A. (ripper121)


Lesenswert?

Michael U. schrieb:
> Woher weiß das programm eigentlich, ob es heller Tag ist oder ob es
> angeleuchtet wird?
1
if (adc_dev > DEVIATION && adc_in > DARKVAL)

Er checkt den ADC wert, wenn er über 40 ist, ist es dunkel.
Wenn die letzte Messung > +/-5 ist erkennt er das er angeleuchtet wird.
In der Nacht wird denke innerhalb von 0.5 Sec das Licht sich nicht so 
schnell verändern das er aus versehen auslöst.


Ich habe die Float durch Int ersetzt und mache nur noch 1 ADC 
Auswertung.

Kann ich noch was tun?

von Edi_r (Gast)


Lesenswert?

Mach Dir keine Gedanken wegen dem bisschen Zeit, die der ADC länger 
misst, oder wegen der Division durch 3 oder durch 4. Das spielt in der 
Praxis keine Rolle. Bei meinem Nachtcache hängen auch zwei 
Reaktivlichter im Wald, und der Batterieverbrauch verursacht dabei die 
geringsten Kopfschmerzen. Mit einem Satz Batterien (2xAA) komme ich 
locker drei Jahre aus. Ja, auch über den Winter.

Weil der Nachtcache sowieso am Tag nicht gesucht werden soll, habe ich 
einen Tag- und einen Nachtmodus. In der Nacht wird alle 250 ms geschaut, 
ob jemand leuchtet (d. h. ob die Helligkeit deutlich höher ist als bei 
der letzten Messung). Am Tag schaue ich nur alle 8 Sekunden nach, ob es 
inzwischen schon wieder Nacht ist. Den Durchschnittsverbrauch (ohne 
LED-Blinken) habe ich auf knapp über 4 µA senken können. Rein 
rechnerisch würde das bei einer Kapazität von 2 Ah über 50 Jahre 
reichen, aber in der Praxis machen die Batterien schon die 
Selbstentladung früher schlapp. Aber daran sieht man, dass es wenig Sinn 
hat, hier das letzte Mikroampere herausoptimieren zu wollen.

Natürlich sieht die Sache etwas anders aus, wenn man eine Knopfzelle als 
Stromquelle nimmt, aber Lithiumzellen möchte ich im Wald nicht 
aufhängen, wenn ich nicht weiß, ob nicht irgendwann ein Harvester kommt 
und die Zelle zermalmt (das ist bei meinem Nachtcache mal passiert).

Ich kann heute abend mal meinen Sourcecode rauskramen und hier 
reinstellen (allerdings für einen ATtiny13), wenn Du Interesse hast. 
Momentan habe ich nichts dabei.

von Stefan A. (ripper121)


Lesenswert?

Ja kannst du gern machen :)

Ich will das mit einer CR2032 betreiben und soll eine Boje / Marker für 
Angler sein die nachts kurz mit der Taschenlampe über den See leuchten 
und so erkenne könne wo ihre Marker liegen.
Das ganze hat in einem kleine PETling platz.

Hier der aktuelle code mit Änderungen:
- 4µA im Power Down
- 10µA währen Wakeup mit ADC Messung
1
/*
2
* ReactiveLight.cpp
3
*
4
* Created: 01.06.2016 15:46:07
5
* Author : Ripper121
6
*/
7
#ifndef F_CPU
8
#define F_CPU 1000000L
9
#endif
10
#include <util/delay.h>
11
#include <avr/io.h>
12
#include <avr/interrupt.h>
13
#include <avr/sleep.h>
14
#define DARKVAL 40
15
#define DEVIATION 5
16
#define HYST 6
17
#define ADC_SAMPLES 3
18
unsigned char power_counter = 1;
19
float adc_in = 1024;
20
float adc_in_pref = 1024;
21
float adc_dev = 1024;
22
23
ISR(WDT_vect) {
24
  power_counter--;
25
}
26
27
int main(void)
28
{
29
  // set timer to 0.5s
30
  WDTCR |= (0 << WDP3) | (1 << WDP2) | (0 << WDP1) | (1 << WDP0);
31
  // Set watchdog timer in interrupt mode
32
  WDTCR |= (1 << WDIE);
33
  WDTCR |= (0 << WDE);
34
  // Enable global interrupts
35
  sei();
36
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
37
  while (1)
38
  {
39
    //-----POWER OFF START-----
40
    //PortB Input LOW
41
    DDRB = 0x00;
42
    PORTB = 0x00;
43
    //Turn off ADC
44
    ADCSRA &= ~(1 << ADEN);
45
    //Disable analog comparator
46
    ACSR |= _BV(ACD);
47
    //Go Sleep
48
    sleep_mode();
49
    //-----POWER OFF END  -----
50
51
    //-----READ ADC START-----
52
    //Save old value
53
    adc_in_pref = adc_in;
54
    //PB2 Input Pullup
55
    DDRB &= ~(1 << DDB2);
56
    PORTB |= (1 << PB2);
57
    // Set the ADC input to PB2/ADC1
58
    ADMUX |= (1 << MUX0);
59
    ADMUX |= (1 << ADLAR);
60
    // Set the prescaler to clock/128 & enable ADC
61
    ADCSRA |= (1 << ADPS1) | (1 << ADPS0) | (1 << ADEN);
62
    // Start the conversion
63
    ADCSRA |= (1 << ADSC);
64
    // Wait for it to finish
65
    while (ADCSRA & (1 << ADSC));
66
    adc_in = ADCH;
67
    //-----READ ADC END  -----
68
69
    if ((power_counter < 1) | (power_counter > HYST)) {
70
      power_counter = 1;
71
      //Get DEVIATION
72
      if (adc_in > adc_in_pref)
73
      adc_dev = adc_in - adc_in_pref;
74
      else
75
      adc_dev = adc_in_pref - adc_in;
76
      //Check DEVIATION and DARKVAL
77
      if (adc_dev > DEVIATION && adc_in > DARKVAL) {
78
        DDRB |= (1 << DDB0) | (1 << DDB1) | (1 << DDB4);
79
        for (unsigned char i = 0; i < 10; i++) {
80
          PORTB ^= (1 << PB0) | (1 << PB1) | (1 << PB4);
81
          _delay_ms(100);
82
        }
83
        power_counter = HYST;
84
      }
85
    }
86
  }
87
  
88
  return 0;
89
}

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

du könntest die AD-Wandlung auch noch wärend des SLEEPs machen. Siehe 
ADC-Noise-Reduction (gibts denke ich bein tn85 auch). Auch zum Blinken 
kannst du einen Timer nehmen und noch ins Sleep gehen. Und noch paar 
Takte kannst du sparen wenn du die Register direkt beschreibst anstatt 
mit OR / UND-NICHT.

Sascha

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Hi,
wo stehst Du denn im Stromverbrauch?
Hast Du alle Tipps aus den einschlägigen Low-power-Appnotes umgesetzt?

Zu einer LP-Anwendung gehört natürlich auch der passende 
Schaltungsaufbau.
MCU Eingangsstufen brauchen mehr Strom, wenn sie nicht an den 
Power-Rails hängen.
Das kannst Du entweder durch Zuschalten der PU/PD-Widerstände oder, man 
vergisst das gerne mal, durch Schalten von ungenutzten IOs als Ausgang 
erreichen.

Wo kommt der Takt her? Sind 8MHz notwendig? Kannst Du den internen 
128kHz Oszillator nehmen?
Ein Tiny kommt bei Zimmertemperatur relativ einfach in den Bereich 200nA 
- siehe diese Spielerei:
http://www.harerod.de/applications_ger.html#TQ10_melody
Es gibt einen optimalen, anwendungsabhängigen Punkt aus MCU-/ADC-Takt 
und Stromverbrauch.

Wenn Dir der WDT zuviel Saft zieht, dann könntest Du ggf. eine externe 
Reset-Schaltung anschrauben: seeeehr hochohmiges RC-Glied, welches einen 
Interrupt auslöst. Hat aber die o.g. genannten Nachteile, daher ggf. was 
zum ausprobieren. Evtl, hilft ein Einzelgatter-Schmitt-Trigger.

Der ADC kann, wie bereits erwähnt wurde, als Wake-Up-Quelle dienen. Das 
würde den WDT sparen. Allerdings ist das bei Deinem 
Schlaf/Aktiv-Verhältnis nicht wirksam.

Die stromsparendsten AVRs heißen übrigens PIC. Da ist nochmal ein Faktor 
10 in der Stromaufnahme drin. Witzig ist, dass bei den ganz kleinen MCUs 
die Dinger manchmal pinkompatibel sind.
Oder, falls eine bayerische Lösung zulässig ist: MSP430

Cheerio,
 marcus

von Kibon (Gast)


Lesenswert?

> Ein Tiny kommt bei Zimmertemperatur relativ einfach in den Bereich 200nA

Wie geht das z. B. beim ATiny13a?

> Die stromsparendsten AVRs heißen übrigens PIC. Da ist nochmal ein Faktor
> 10 in der Stromaufnahme drin

20 nA? Da ist ja der helle Wahnsinn. Welcher PIC wären das?

von stromtuner (Gast)


Lesenswert?

PowerReductionRegister (PRR)wirklich ALLES aus machen.
Den ADC nur einmal initialisieren reicht, nach oben vor die While1 
legen.
ADC Noise reduction slepp mode wurde schon genannt. Takt deutlich 
senken.
float raus, wurde acuh schon gesagt. Hannes Lux fragen, bei ihm 
nachsehen und in asm programmieren? könnte ja auch was bringen, obwohl 
die C Compiler heuzutage schon echt gut sind. Immer zweierpotenzen zum 
rechnen verwenden und beim 8Bit Wertebereich bleiben.

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Bitte nicht wieder "Schleichwerbung" schreien, aber auf Deine Fragen 
sind zwei Antworten auf meiner Website, eine hatte ich schon genannt:

Kibon schrieb:
MAH>> Ein Tiny kommt bei Zimmertemperatur relativ einfach in den Bereich 
200nA
Kibon> Wie geht das z. B. beim ATiny13a?
http://www.harerod.de/applications_ger.html#TQ10_melody
Gemäß der o.g. Checkliste. Man beachte die Einschränkung 
"Zimmertemperatur". Die Leckströme gehen üblicherweise  exponentiell mit 
der Temperatur hoch.
Assembler ist in dem Fall nicht schädlich, aber kein Muss.

Ah, vielleicht war meine Aussage zu salopp formuliert und wir haben 
Betrieb und Sleep vermischt.
MAH>> Die stromsparendsten AVRs heißen übrigens PIC. Da ist nochmal ein 
Faktor
MAH>> 10 in der Stromaufnahme drin
Kibon> 20 nA? Da ist ja der helle Wahnsinn. Welcher PIC wären das?
Das geht mit so ziemlich jedem alten PIC.
http://www.harerod.de/applications_ger.html#allTimer
Diese Baugruppe braucht üblicherweise keine 20µA im Betrieb (inkl. 
LCD-Ansteuerung), die MCU ist im Sleepmode mit 500nA spezifiziert.

: Bearbeitet durch User
von Kibon (Gast)


Lesenswert?

Marcus H. schrieb:
> Bitte nicht wieder "Schleichwerbung" schreien, aber auf Deine Fragen
> sind zwei Antworten auf meiner Website, eine hatte ich schon genannt:
>
> Kibon schrieb:
> MAH>> Ein Tiny kommt bei Zimmertemperatur relativ einfach in den Bereich
> 200nA
> Kibon> Wie geht das z. B. beim ATiny13a?
> http://www.harerod.de/applications_ger.html#TQ10_melody

Wie geht das? Da stehen nur Texte die das Projekt beschreiben.

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Kibon schrieb:
>> Kibon schrieb:
>> MAH>> Ein Tiny kommt bei Zimmertemperatur relativ einfach in den Bereich
>> 200nA
>> Kibon> Wie geht das z. B. beim ATiny13a?
>> http://www.harerod.de/applications_ger.html#TQ10_melody
>
> Wie geht das? Da stehen nur Texte die das Projekt beschreiben.
goto Beitrag "Re: Tiny85 Low Power Code Optimieren"

von Stefan A. (ripper121)


Lesenswert?

Hab da noch was gefunden :)
muss ich nur noch bisschen umbauen für mich.

Hier wird der ADC im Sleep modus gemessen.
http://gammon.com.au/forum/?id=12769
1
// ATtiny85 torch detector
2
// Author: Nick Gammon
3
// Date: 25 February 2015
4
5
// ATMEL ATTINY 25/45/85 / ARDUINO
6
// Pin 1 is /RESET
7
//
8
//                  +-\/-+
9
// Ain0 (D 5) PB5  1|    |8  Vcc
10
// Ain3 (D 3) PB3  2|    |7  PB2 (D 2) Ain1 
11
// Ain2 (D 4) PB4  3|    |6  PB1 (D 1) pwm1
12
//            GND  4|    |5  PB0 (D 0) pwm0
13
//                  +----+
14
15
/*
16
17
  Pin 2 (PB3) <-- LDR (GL5539) --> Pin 7 (PB2) <----> 56 k <----> Gnd
18
19
  Pin 5 (PB0) <---- LED ---> 100 R <-----> Gnd
20
  
21
*/
22
23
24
#include <avr/sleep.h>    // Sleep Modes
25
#include <avr/power.h>    // Power management
26
#include <avr/wdt.h>      // Watchdog timer
27
28
const byte LED = 0;          // pin 5 
29
const byte LDR_ENABLE = 3;   // pin 2
30
const byte LDR_READ = 1;     // Ain1 (PB2) pin 7
31
const int LIGHT_THRESHOLD = 200;  // Flash LED when darker than this
32
33
 // when ADC completed, take an interrupt 
34
EMPTY_INTERRUPT (ADC_vect);
35
  
36
// Take an ADC reading in sleep mode (ADC)
37
float getReading (byte port)
38
  {
39
  power_adc_enable() ;
40
  ADCSRA = bit (ADEN) | bit (ADIF);  // enable ADC, turn off any pending interrupt
41
  
42
  // set a2d prescale factor to 128
43
  // 8 MHz / 128 = 62.5 KHz, inside the desired 50-200 KHz range.
44
45
  ADCSRA |= bit (ADPS0) | bit (ADPS1) | bit (ADPS2); 
46
  
47
  if (port >= A0)
48
    port -= A0;
49
    
50
#if defined(__AVR_ATtiny85__)  
51
  ADMUX = (port & 0x07);  // AVcc   
52
#else   
53
  ADMUX = bit (REFS0) | (port & 0x07);  // AVcc   
54
#endif
55
56
  noInterrupts ();
57
  set_sleep_mode (SLEEP_MODE_ADC);    // sleep during sample
58
  sleep_enable();  
59
  
60
  // start the conversion
61
  ADCSRA |= bit (ADSC) | bit (ADIE);
62
  interrupts ();
63
  sleep_cpu ();     
64
  sleep_disable ();
65
66
  // reading should be done, but better make sure
67
  // maybe the timer interrupt fired 
68
69
  // ADSC is cleared when the conversion finishes
70
  while (bit_is_set (ADCSRA, ADSC))
71
    { }
72
73
  byte low  = ADCL;
74
  byte high = ADCH;
75
76
  ADCSRA = 0;  // disable ADC
77
  power_adc_disable();
78
  
79
  return (high << 8) | low;
80
  
81
  }  // end of getReading
82
  
83
// watchdog interrupt
84
ISR (WDT_vect) 
85
{
86
   wdt_disable();  // disable watchdog
87
}  // end of WDT_vect
88
89
#if defined(__AVR_ATtiny85__)  
90
  #define watchdogRegister WDTCR
91
#else
92
  #define watchdogRegister WDTCSR
93
#endif
94
  
95
void setup ()
96
  {
97
  wdt_reset();  
98
  pinMode (LED, OUTPUT);
99
  pinMode (LDR_ENABLE, OUTPUT);
100
  ADCSRA = 0;            // turn off ADC
101
  power_all_disable ();  // power off ADC, Timer 0 and 1, serial interface
102
  }  // end of setup
103
104
void loop ()
105
  {
106
  // power up the LDR, take a reading
107
  digitalWrite (LDR_ENABLE, HIGH);
108
  int value = getReading (LDR_READ);
109
  // power off the LDR
110
  digitalWrite (LDR_ENABLE, LOW);
111
  
112
  // if it's dark, flash the LED for 2 mS
113
  if (value < LIGHT_THRESHOLD)
114
    {
115
    power_timer0_enable ();
116
    delay (1);  // let timer reach a known point
117
    digitalWrite (LED, HIGH);
118
    delay (2); 
119
    digitalWrite (LED, LOW);
120
    power_timer0_disable ();
121
    }
122
  
123
  goToSleep ();
124
  }  // end of loop
125
  
126
void goToSleep ()
127
  {
128
  set_sleep_mode (SLEEP_MODE_PWR_DOWN);
129
  noInterrupts ();       // timed sequence coming up
130
131
  // pat the dog
132
  wdt_reset();  
133
  
134
  // clear various "reset" flags
135
  MCUSR = 0;     
136
  // allow changes, disable reset, clear existing interrupt
137
  watchdogRegister = bit (WDCE) | bit (WDE) | bit (WDIF);
138
  // set interrupt mode and an interval (WDE must be changed from 1 to 0 here)
139
  watchdogRegister = bit (WDIE) | bit (WDP2) | bit (WDP1) | bit (WDP0);    // set WDIE, and 2 seconds delay
140
  
141
  sleep_enable ();       // ready to sleep
142
  interrupts ();         // interrupts are required now
143
  sleep_cpu ();          // sleep                
144
  sleep_disable ();      // precaution
145
  }  // end of goToSleep

von Basti (Gast)


Lesenswert?

Du könntest auch zwei großflächigere  Lichtsensoren, also Fotodioden 
kaufen. Habe ich z.B aus dem Conrad.
Die könntest du beide gegen 50 MOhm an den INT Pin hängen. Die Spannung 
reicht dann, um den PIN "ordentlich" zu setzen. Da der Int-Pin nur mit 
Low den uC aus dem Power-Down holen kann, musst du Tags und Nachts den 
entsprechend gepolte Fotodiode zuschalten. So bekommst du immer deine 
Flanken. Ganz ohne Timer... okay, in der Übergangszeit muss man 
irgendwie entprellen...

von Basti (Gast)


Lesenswert?

Hm, mit zwei Fotodioden braucht man auch gar keinen Kontroller mehr, nur 
noch einen Schmidt Trigger...
Beide Sensoren schauen leicht versetzt aus dem Gehäuse...
Logik:
Helligkeit annähernd gleich: hell, dämmert oder dunkel. Tu nichts
Helligkeit stark abweichend: Taschenlampe, NE555 Schaltung aktivieren = 
LED blinken....

Aber war nicht die Frage.... ich weiß :D

von Edi R. (edi_r)


Angehängte Dateien:

Lesenswert?

Edi_r schrieb:
> Ich kann heute abend mal meinen Sourcecode rauskramen und hier
> reinstellen

Stefan A. schrieb:
> Ja kannst du gern machen :)

Gestern hat es nicht mehr geklappt, aber jetzt.

Schaltplan und Sourcecode sind angehängt. Als LDR habe ich einen A 
905014 genommen (gibt's unter dieser Bezeichnung z. B. bei Reichelt).

Meine Schaltung hängt im Wald und wird nachts von Geocachern gesucht. 
Wenn sie angeleuchtet wird, dann blinkt sie. Es gibt zwei Ausführungen: 
eine mit einer roten und eine mit einer grünen LED. Eine weiße Version 
war mal geplant, aber nicht umgesetzt. Die verschiedenen Versionen 
blinken unterschiedlich oft.

von Stephan H. (stephan-)


Lesenswert?

Stefan A. schrieb:
> Ich will das mit einer CR2032 betreiben und soll eine Boje / Marker für
> Angler sein die nachts kurz mit der Taschenlampe über den See leuchten
> und so erkenne könne wo ihre Marker liegen.
> Das ganze hat in einem kleine PETling platz.

was spricht dagegen sie einfach alle 5 oder 10 Sekunden einmal blinken 
zu lassen ? Du weist doch das wir nachts nicht auf das Wasser leuchten 
sollen :-). ICh habe sowas mal mit Ü-Eiern gemacht, die konnte man auch 
gleich als Swinger/ Hanger benutzen. Dann natürlich mit Dauerlicht.

: Bearbeitet durch User
von Stefan A. (ripper121)


Lesenswert?

Stephan H. schrieb:
> Stefan A. schrieb:
>> Ich will das mit einer CR2032 betreiben und soll eine Boje / Marker für
>> Angler sein die nachts kurz mit der Taschenlampe über den See leuchten
>> und so erkenne könne wo ihre Marker liegen.
>> Das ganze hat in einem kleine PETling platz.
>
> was spricht dagegen sie einfach alle 5 oder 10 Sekunden einmal blinken
> zu lassen ? Du weist doch das wir nachts nicht auf das Wasser leuchten
> sollen :-). ICh habe sowas mal mit Ü-Eiern gemacht, die konnte man auch
> gleich als Swinger/ Hanger benutzen. Dann natürlich mit Dauerlicht.

Weil ich gern so lange Laufzeit wie möglich haben will :).
Die Batterien sind zwar billig aber trotzdem nicht gut für die Umwelt.

von Andi (Gast)


Lesenswert?

Ich würde fast erwarten, dass mit einer Taschenlampe ableuchten eine 
ganze Menge Strom verbraucht. Die haben ja einige Watt. Das musst du für 
eine Umweltbilanz eigentlich gegenrechnen.
Soll wirklich kein Genöle sein, aber manchmal verrennt man sich ja auch.

von Jan H. (jan_m_h)


Lesenswert?

Stefan A. schrieb:
> Weil ich gern so lange Laufzeit wie möglich haben will :).
> Die Batterien sind zwar billig aber trotzdem nicht gut für die Umwelt.

Es gibt auch ziemlich winzige Lithiumakkus, die könntest du auch nehmen 
an sich?

von Pic T. (pic)


Lesenswert?

Bei led on könnte man auch 10-15uS die Led Pulsen, und dann in wdt slepp 
mit 15ms Timeout gehen.

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Edi R. schrieb:
> Meine Schaltung hängt im Wald und wird nachts von Geocachern gesucht.
grins
Meine hier
Beitrag "Re: Tiny85 Low Power Code Optimieren"
beschriebene Schaltung liegt u.a. auch im Wald und nuckelt seid über 
einem Jahr an einer CR2032.
Wenn Licht drauffällt wird eine kleine Melodie gespielt.
Da der WDT für den Knopfzellenbetrieb zuviel Strom braucht, erzeugt der 
LDR einen asynchronen Pin-Change-Interrupt. So werden bei 
Baumstumpf-im-Wald-Temperatur aus 5µA nur 0,2µA.

Ein dauerhaft beleuchteter LDR-Spannungsteiler ist wieder ein 
1µA-Stromfresser { <- ;) }, deswegen kann man in dem Fall ein paar 
Photodioden verwenden- falls es das Budget erlaubt.

von Edi R. (edi_r)


Lesenswert?

Marcus H. schrieb:
> Meine hier
> Beitrag "Re: Tiny85 Low Power Code Optimieren"
> beschriebene Schaltung liegt u.a. auch im Wald

:-)

Marcus H. schrieb:
> Ein dauerhaft beleuchteter LDR-Spannungsteiler ist wieder ein
> 1µA-Stromfresser { <- ;) }

Nicht wenn man es so macht wie ich und den LDR über einen Portpin nur 
dann versorgt, wenn man messen will. Aber abgesehen davon hätte ich mit 
meinen 2xAA genügend Kapazität übrig.

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Edi R. schrieb:
> Marcus H. schrieb:
>> Ein dauerhaft beleuchteter LDR-Spannungsteiler ist wieder ein
>> 1µA-Stromfresser { <- ;) }
> Nicht wenn man es so macht wie ich und den LDR über einen Portpin nur
> dann versorgt, wenn man messen will. Aber abgesehen davon hätte ich mit
> meinen 2xAA genügend Kapazität übrig.

Das mit dem geschalteten Pin hast Du auch fein gemacht. ;)

Jedoch ist in Deiner Anwendung der WDT mit 5µA der größte Stromfresser.

Mir ging es darum einen Vorschlag zu machen, falls man den 
Pin-Change-Interrupt verwenden möchte. Um eben mit einem AVR unter die 
1µA zu kommen.

Dein Doppel-AA ist zehnmal größer als meine CR2032 (2000mAh zu 210mAh) - 
Dir rosten im Wald eher die Zellen weg, als dass die entladen werden. ;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.