Reaktivlicht, Stromsparen

Hallo,

ich mache zwar kein Geocaching aber ich wollte mal ein wenig mit den Stromsparmodi der
ATMEGAS spielen.
Dabei bin ich dann auf Software und Schaltungen für Reaktivlichter gestossen.
Das sind einfach kleine Schaltungen die im Hellen passiv sind und in der Dunkelheit auf
Lichtblitze (Taschenlampe) reagieren und mit einer LED Lichtzeichen zurückblinken.
Ziel einer solchen Schaltung ist das sie mit ihren Batterien sehr lange auskommen.

Ich war ein wenig verwundert wie kompliziert manche Leute ihre Software machen um
den Tagmodus zu erkennen und dann Energie zu sparen.

Ist doch ganze einfach : Prozessor schlafen legen und mit PinChangeinterrupt (bei Licht)
wecken. Den Tag erkennen muss man nicht, weil es nur einmal Morgens in der Dämmerung
einen “Fehlalarm” gibt und dann ist den ganzen Tag Ruhe.
Dabei entstand mit einem ATTINY85 die folgenden simple Schaltung :

mit folgendem einfachen Code :

#include <avr/sleep.h>
#include <avr/wdt.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

// Macros zum Setzen und Löschen von Steuer-Bits
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

volatile boolean f_wdt=1;
volatile boolean comeFromPin = false;
uint8_t mcucr1, mcucr2;


//****************************************************************  
// set system into the sleep state 
// system wakes up when wtchdog is timed out
void system_sleep()
{   
  cbi(ADCSRA,ADEN);                         // switch Analog to Digitalconverter OFF

  set_sleep_mode(SLEEP_MODE_PWR_DOWN);      // sleep mode is set here
  mcucr1 = MCUCR | _BV(BODS) | _BV(BODSE);  //turn off the brown-out detector
  mcucr2 = mcucr1 & ~_BV(BODSE);
  MCUCR = mcucr1;
  MCUCR = mcucr2;

  sleep_enable();

  sleep_mode();                        // System sleeps here

  sleep_disable();                     // System continues execution here when watchdog timed out or
                                       // or another interrupt occurs
  sbi(ADCSRA,ADEN);                    // switch Analog to Digitalconverter ON
}

//****************************************************************
// 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)
{
  uint8_t bb;
  //int ww;
  if (ii > 9 ) ii=9;
  bb=ii & 7;
  if (ii > 7) bb|= (1<<5);
  bb|= (1<<WDCE);
  //ww=bb;
  //Serial.println(ww);


  MCUSR &= ~(1<<WDRF);
  // start timed sequence
  WDTCR |= (1<<WDCE) | (1<<WDE); // CR für attiny sonst CSR
  // set new watchdog timeout value
  WDTCR = bb;
  WDTCR |= _BV(WDIE);
}
*/
//****************************************************************  

void makeShow(int duration)
{
  int i;
  pinMode(3,OUTPUT);
  for (i = 0;i < 3;i++)
  {
    digitalWrite(3,HIGH);
    delay(duration);
    digitalWrite(3,LOW);
    delay(duration/2);
  }
  delay(100);
  pinMode(3,INPUT);
}

//****************************************************************

void pciSetup(byte pin)
{
  GIMSK = 0b00100000;    // turns on pin change interrupts
  PCMSK = 0b00010000;    // turn on interrupts on pins PB0, PB1, &amp;amp; PB4
  sei();                 // enables interrupts
}

//****************************************************************

ISR (PCINT0_vect) // handle pin change interrupt for D8 to D13 here
{    
  if (! comeFromPin)
  {
    comeFromPin = true;
  }
}

//****************************************************************  

void setup()
{
  pinMode(4,INPUT);

  //digitalWrite(4,HIGH); // Pullup hoch

  makeShow(1000);

 /* cbi( SMCR,SE );      // sleep enable, power down mode
  cbi( SMCR,SM0 );     // power down mode
  sbi( SMCR,SM1 );     // power down mode
  cbi( SMCR,SM2 );*/     // power down mode
  
  pciSetup(4);
  // setup_watchdog(9);
}

//****************************************************************  
/*
ISR(WDT_vect)
{
  if (! f_wdt)
  {
    f_wdt=1;  // set global flag
  }
}
*/
//****************************************************************  


void loop()
{
  system_sleep();
  /*
  if (f_wdt)
  {
    pinMode(3,OUTPUT);
    digitalWrite(3,HIGH);
    delay(100);
    digitalWrite(3,LOW);
    pinMode(3,INPUT);
    f_wdt=0;
  }
  */
  if (comeFromPin)
  {
    // Only for rising !
    if (digitalRead(4))
    {
      delay(400);
      makeShow(300);
      makeShow(600);
      makeShow(300);
    }
    comeFromPin=0;
  }
}

Der Spannungsteiler bestehend aus Photowiderstand und einem 170KOhm Widerstand wurde
durch ausprobieren so ausgelegt das er sicher Dunkelheit detektiert. Da ist mit
anderen Widerständen ausprobieren angesagt. (Daher auch vor Kurzem meine Frage
nach Schmidttrigger).
So, nun die Frage : Der Attiny braucht in diesem Stromsparmodus nur einige µA das ist gut,
aber der Spannungsteiler zieht mehr als der Atmega. Das ist zwar immer noch nicht viel, grob
gerechnet wird die Schaltung an 2x 1,5 AAA Zellen fast 2 Jahre laufen.
Aber das muss besser gehen. Was könnte man alternativ zum Licht erkennen an einem
Digitalpin benutzen das noch weniger schluckt. Also den 170KOhm kann man noch etwas erhöhen
und noch einige Monate rauskitzeln. Das bischen das der Attiny läuft macht er mit 1MHz also
auch das geknausert.
Das der wenn er Licht kriegt mit etwas Verzögerung SOS morst hat keine tiefere Bedeutung.
Den Code für Hallo wollte ich nicht raussuchen (faul) ;D .
Mann verzeie mir die Delay’s, aber der Prozessor hat nix anderes zu tun.

Ulli

Wie wäre es mit Fotodiode, die selbst Strom erzeugt bei Lichteinfall?

Hmmm,

in was für einem Spannungbereich arbeite ich denn da ? Reicht das ?

Ulli

es ist eine Diode in Sperrrichtung, ohne Licht ist sie extrem hochohmig. Mit Licht wird sie niederohmig. Das wechselt nicht wie beim LDR zwischen einigen Kiloohm hin und her, sondern zwischen vielen megaohm zu quasi Null Ohm. Die Diode hat eine Sperrspannung, die sollte über den üblichen Spannungen liegen. Im Durchlass sind es dann 0,7V diodentypisch eben bei vollem Licht.

Man müsste nun experimentieren, wie sie reagiert und wann ein passendes Signal erzeugt wird.

Sie reduziert halt bei Dunkelheit den Stromverbrauch am Sensor praktisch auf Null und nur bei Licht fliest Strom.

Den rest müsste man über Datenblatt von Fotodioden abklären, oder Fototransistor nehmen, der ist zusätzlich verstärkend und schaltet sauberer.

Bei Tageslicht wäre Solarzelle auch eine Option. Es gibt solche Minizellen aus 4 Segmenten die dann 1-2V Arbeitsspannung haben und eine Upregler benötigen der 5V draus zaubert. Masse-Kopplung und man verbraucht keinen Strom für den Sensor, er liefert sogar eigenen Strom wenn er tagsüber arbeitet. Diese Minizellen wird man sich aber aus irgendwelchen Billigsolartaschenrechner rausschneiden müssen.

Oder hier

http://www.ebay.de/itm/Solar-Panel-5-5V-90mA-0-6W-Mini-Small-Solar-Cell-PV-Solar-Power-PCB-Panels-LED-/291571552967?hash=item43e304d2c7:g:KEUAAOSwM4xXY3PR

oder größer

Wollte nur mal kurz einen Status hierhin schreiben.

Das Thema hat sich weitestgehend erledigt. Ich habe jetzt mit der Schaltung
einige Feldtests nachts gemacht und musste durch Vergrößerung des Vorwiderstandes
an dem Fotowiderstand die Empfindlichkeit erhöhen damit auch eine Taschenlampe auf 40m
Entfernung das Dingen triggern kann. Jetzt ist der Gesammtwiderstand des
Spannungsteilers so hoch das ich im Sleep so bei 20 - 30 µA liege.
Ich muss ihn noch ein wenig Erhöhen so das ich letztendlich bei ca. 400KOhm landen
werde.
Damit kann ich wunderbar leben.

Ulli