Langdurig op batterij draaien. [ATMEGA328]


Dank! Ik heb de L7805 verwijderd, ik draai nu direct op 3V.
Als ik meet dan gebruik ik constant 15-18mA, wanneer de sensor actief is zit ik op 28mA tot 30mA. Bij constant aan zit ik dan op 66u. Dat is best aardig, maar meer is beter :)

De lowPower library heb ik ook toegevoegd, echter, ik merk niet heel veel verschil. Dat komt hoogstwaarschijnlijk omdat ik dat (ook) niet goed doe.

Het liefst zou ik willen dat de setup gaat slapen als er niemand is in de ruimte.

Echter, doordat de sensor constant wisselt in waarde is het lastig om een trigger te maken waar mee hij wakker wordt, evenals dat het lastig is om de setup te laten lopen

Dit is mijn code momenteel

code:


/* THEBULB. THE SO-LOO-TION SENSOR */
#include <Wire.h>
#include <LowPower.h>
#include <VL53L1X.h>

VL53L1X sensor;


void setup()
{
  Serial.begin(115200);
  Wire.begin();
  Wire.setClock(400000); // use 400 kHz I2C

  pinMode(LED_BUILTIN,OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(12, OUTPUT); 
 
  sensor.setTimeout(500);
  if (!sensor.init())
  {
    Serial.println("Let op: de sensor wordt momenteel niet gedetecteerd. Controleer aansluitingen. ");
    while (1);
  }
  
  sensor.setDistanceMode(VL53L1X::Long);
  sensor.setMeasurementTimingBudget(50000);
  sensor.startContinuous(100);

}

void loop()
{  
  LowPower.idle(SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, 
                SPI_OFF, USART0_OFF, TWI_OFF);
  Serial.print(sensor.read()); 

  if (sensor.readRangeContinuousMillimeters () <=1000 ) {  //schakelafstand wordt hier ingevoerd. Onder deze waarde is de schakeling actief. 
    digitalWrite (LED_BUILTIN, HIGH);
    digitalWrite (8, HIGH);
    digitalWrite (12, HIGH); 
    }else {                                              //hoger dan de schakelafstand.      
    digitalWrite (LED_BUILTIN, LOW);
    digitalWrite (8, LOW);
    digitalWrite(12, LOW);
 
    }

  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT");}
  Serial.println();
}

Op 17 juni 2020 13:17:06 schreef wvdakker:
Kijk eens naar de LowPower library.

Ik maak zelf gebruik van die library, 328p en sensor. Daarmee haal ik tijden van ongeveer een jaar op 1 3.7V batterij.

Je kunt je sensor in sleep mode zetten en op interrupt wakker later worden, dan je ding doen en weer gaan slapen.
Mijn IR sensor werkt op die wijze.

Zou je mijn code eens willen checken?

hennep

Golden Member

15 tot 18 mA is teveel voor alleen de atmega op 3V
Zou je het schema eens willen posten, waarschijnlijk zit er iets anders in dat die hoge stroom verklaart.

Hensz

Golden Member

Processor en zender kun je met veel slapen wel temmen tot een paar µA. Probleem zit 'm vooral in de sensor. Kennelijk gebruikt ie 20mW bij 10 Hz. Als je elke 50ms een meting doet, zal dat pakweg 40mW zijn. Een 9V blokbatterijtje houdt dat 2-3 dagen vol. Samen met de processor en de zendmodule kan het dus goed kloppen dat ie na een dag leeg was. Zou je de updatefrequentie verlagen tot 1Hz, dan nog gaat zo'n batterijtje maar 2 maanden mee. Ook een grote batterij gaan mensen vergeten op tijd te vervangen, dus ik zeg koperdraadjes erheen. Kun je hem daar ook aan ophangen. :)

Don't Panic!

Je kunt de voeding van alle randapparatuur (ook de sensor) toch uitzetten tijdens de sleep?

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Op 17 juni 2020 14:19:57 schreef hennep:
15 tot 18 mA is teveel voor alleen de atmega op 3V
Zou je het schema eens willen posten, waarschijnlijk zit er iets anders in dat die hoge stroom verklaart.

Aangepast schema: https://imgur.com/a/n0icMXb

Betreft de RF transmitter, dat is gewoon een afstandsbediening, uit elkaar gesloopt. heeft zijn eigen voeding.

Ik heb wel nu de reset een pullup gegeven, is ook niet per se nodig. Trek ik er ook uit.

hennep

Golden Member

Wat doet die 220 ohm weerstand?
Als dat een pullup is dan verlies je daar 14mA
Ik kan niet zien wat die aparte modules doen. Heb je die al afzonderlijk aan de voeding aangesloten om te zien wat het verbruik is?

Op 17 juni 2020 14:36:48 schreef hennep:
Wat doet die 220 ohm weerstand?
Als dat een pullup is dan verlies je daar 14mA
Ik kan niet zien wat die aparte modules doen. Heb je die al afzonderlijk aan de voeding aangesloten om te zien wat het verbruik is?

Ah sorry, die 220 ohm is een 10K, de VL53L1X heeft een XSHUT aansluiting.
In de datasheet heb ik gelezen wanneer deze een pullup krijgt dat hij automatisch in standby gaat. Echter, dat heb ik nog niet teruggezien.

Er is geen andere apparaten. De RF transmitter heeft een eigen 12v batterij'tje.

Zoals gezegd, alles uitzetten als de prcessor 'slaapt', dan spaar je enorm.
(een PIR sensor gebruiken voor bewegingsdetectie is ook veel zuiniger: die doet 't jaren op een 9v batterijtje)

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Op 17 juni 2020 14:47:24 schreef Arco:
Zoals gezegd, alles uitzetten als de prcessor 'slaapt', dan spaar je enorm.
(een PIR sensor gebruiken voor bewegingsdetectie is ook veel zuiniger: die doet 't jaren op een 9v batterijtje)

Ik weet alleen niet hoe ik alles weer wakker krijg wanneer nodig..

Echter, doordat de sensor constant wisselt in waarde is het lastig om een trigger te maken waar mee hij wakker wordt,

Zou niet zo moeilijk moeten zijn je moet niet op een waarde focussen maar op een gemiddelde waarde. Als er geen beweging is zal de sensor toch een andere gemiddelde waarde afgeven dan als er beweging is. Dan ga je daar met je trigger net onder de laagste waarde zitten van een beweging maar boven de geen beweging.

Op 17 juni 2020 14:16:05 schreef DarthVader072:
[...]

Zou je mijn code eens willen checken?

Onderstaand is code voor mijn sensor incl sleep.

c code:



void setup() {
	transmit_init ();

	transmit_sleep();
  
	// delay execution of sketch for a min, to allow PIR sensor get stabilized
	delay(60000);
  
	reboot_message (IR_SENSOR, GIT_VERSION);
}

void loop() {
	if (PIRsensorState != lastPIRsensorState){
		ir_Alert (PIRsensorState);

		lastPIRsensorState = PIRsensorState;    // reset last interrupt state
	}

	intr_sleep(PINsensor, wakeUpNow);  // go to sleep - calling sleeping function
}

// Interrupt service routine or ISR
void wakeUpNow(){
  PIRsensorState = digitalRead (PINsensor);
}

void ir_Alert (bool bAct) {
    transmit_sensordata( 'i', (char *)(bAct ? "Act" : "Inact"));
}

en voor de sleepcode

c code:


// http://playground.arduino.cc/Learning/ArduinoSleepCode
void intr_sleep (int intPort, void (*userInter)(void)) {

	transmit_sleep(); // radio in sleep mode

	attachInterrupt(digitalPinToInterrupt(intPort), userInter, CHANGE);

	LowPower.powerDown (SLEEP_FOREVER, ADC_OFF, BOD_OFF);

	detachInterrupt(digitalPinToInterrupt(intPort));
}

het verschil met jou code is dat het in idle mode voor 8 seconden in sleep mode gaat (zie https://www.rocketscream.com/blog/2011/07/04/lightweight-low-power-ard…).

Verder kan het zo zijn dat je sensor gewoon vol stroom trekt ondanks dat je ATMEGA in sleep is. Een vorige module van mij kon niet in sleep mode en heb daar dus een transistor tussen gezet die uit en aan schakelt bij het in sleep mode gaan van de atmega. Voor een interrupt sensor is dat lastiger.

Mijn sensor pakt in sleep mode ongeveer 45uA. Radio, IR en AT staan dan in sleep. de IR sensor detecteert in sleep mode nog wel beweging dus na detectie wordt de zaak wakker, zend een bericht en gaat weer in coma.

Hoe ik het heb aangepakt:
- begin met een minimaal systeem (dus zonder sensoren en leds), voor 328p zit die op ongeveer 4-5uA. Als je een 328 (zonder p) hebt is het stroomverbruik ook hoger. Verwis je dat je een 328p hebt.
- minimaliseer je stroomverbruik mbv lowpower library
- schakel element voor element bij, zo weet je waar de stroomverbruikers zitten.

Hensz

Golden Member

Op 17 juni 2020 14:54:15 schreef DarthVader072:
Ik weet alleen niet hoe ik alles weer wakker krijg wanneer nodig..

Ik heb niet de hele datasheet gelezen, c.q. ik krijg het niet gevonden, maar als je sensor in Software-standby staat, wordt ie dan niet vanzelf wakker?
Tis waarschijnlijk te mooi om waar te zijn dat 't ding met 9µA zinvolle metingen kan doen, dus dat zal het ook wel niet zijn.

Don't Panic!

Ik zou eerst meten of de sensor nu de grote verbruiker is (klinkt waarschijnlijk), en die dan met een P-channel MOSFET in zijn voeding uitzetten zolang je controller in sleep mode staat. Elke paar seconde heel even die sensor aan, meting doen, en direct die sensor weer uit.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken

Dat kan ook wel zonder Mosfet. Een pootje van de AtMega is sterk genoeg om zo een sensor te voeden.

Hensz

Golden Member

Pootje kan ook die sensor in diepe slaap zetten, dan gebruikt ie nog maar 5µA. Daar zit 't 'm niet in.
Vraag is vooral hoe vaak ie aan moet om gegevens te produceren waar je wat aan hebt. En hoeveel stroom vervolgens daarmee heen gaat.

Als ik dit tabelletje goed interpreteer én als 1x/sec meten voldoende is, dan zou je aan ong. 1,2mW gemiddeld verbruik kunnen komen.

Don't Panic!

Er staat helaas nergens hoelang de sensor nodig heeft van 'off' resp 'standby' naar 'running'...

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Schakelen van de voeding is niet nodig.
De sensor gaat naar standby door een I2C 'Stop ranging" commando.
En ook door pin 5 (xshut) laag te trekken.
Dat moet toch voldoende zijn.

Startup tijd is 1.2 milli-seconden.

Hensz

Golden Member

Omdat het exacte gebruik alles uitmaakt voor het stroomgebruik, is het nu wel fijn om te weten waar TS heen wil met zijn toepassing.
Is 1Hz bij 20ms genoeg, of moet het vaker en/of nauwkeuriger?

Don't Panic!

Hi allen,

Dank voor jullie reacties, heeft me echt verder geholpen!!

Ik ben even een paar dagen wezen friemelen.
Allereerst draait de AtMega veel zuiniger momenteel.
De klok heb ik weggehaald waardoor er eigenlijk alleen een IC is

Door het gebruiken van de sleep mode gebruik ik nu nog 40uA.
Als ik de blink sketch gebruik zit ik op 2-6,5 mA (LED uit - LED aan).

Nu ik eenmaal weer mijn sensor heb aangesloten gebruikt de hele set 12mA.
Bovenal dus wel vooruit gegaan, maaaar, het kan nog beter.

Ik wil namelijk nog dat de sensor gaat slapen en zelf weer wakker wordt. Daar heb ik inmiddels al heel wat youtube, google voor afgestruind evenals dat ik er pittig wat uren in heb zitten, het wilt niet lukken.

De datasheet blijft mij wat onduidelijk: https://www.st.com/resource/en/data_brief/vl53l1x-satel.pdf

Wanneer ik een verbinding maken tussen XSHUT en NC1 dan gaat de sensor uit (denk ik, want de mA gaat terug naar 0.04 op de meter).
Echter, ik weet niet hoe ik hem weer wakker krijg, ook in de programmering loop ik te stoeien hoe ik een verbinding tussen XSHUT en NC1 ga maken met dus enkel het IC, daarnaast moet ik hem wakker krijgen.
Er is een INT aansluiting wat interrupt zou kunnen zijn, deze heb ik wel getest maar geen resultaat

Ik probeer het daarom nogmaals hier, hebben jullie misschien een idee hoe dit voor elkaar te krijgen is?

code:


/* THEBULB. THE SO-LOO-TION SENSOR */
#include <Wire.h>
#include <LowPower.h>
#include <VL53L1X.h>

VL53L1X sensor;


void setup()
{
  Serial.begin(115200);
  Wire.begin();
  Wire.setClock(100000); // use 400 kHz I2C //

 /* for (int i = 0; i < 20; i++){
    pinMode(i, OUTPUT);
  }
  */
  pinMode(7, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(3, OUTPUT);

  sensor.setTimeout(500);
  if (!sensor.init())
  {
    Serial.println("Let op: de sensor wordt momenteel niet gedetecteerd. Controleer aansluitingen. ");
    while (1);
  }
  
  sensor.setDistanceMode(VL53L1X::Long);
  sensor.setMeasurementTimingBudget(50000); //50000
  sensor.startContinuous(100);

}

void loop()
{  


  Serial.print(sensor.read()); 

  digitalWrite(3, HIGH); 
  digitalWrite(12, HIGH); 

  if (sensor.readRangeContinuousMillimeters () <=1000 ) {  //schakelafstand wordt hier ingevoerd. Onder deze waarde is de schakeling actief. 
    digitalWrite (7, HIGH);
    digitalWrite (13, HIGH); 
    }else {                                              //hoger dan de schakelafstand.   
    digitalWrite (7, LOW);
    digitalWrite(13, LOW);
    LowPower.powerDown(SLEEP_FOREVER , ADC_OFF, BOD_OFF);
    }

  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT");}
  Serial.println();

}

NC staat voor "Not Connected". Dus die doet niks (meestal toch).

XShut kun je aan een pin van de Arduino koppelen zodat je die hoog en laag kunt trekken.

Een PIR detector gebruikt maar iets van 40uA. (350mA per jaar in vol gebruik)
De rest kan gewoon altijd in slaap blijven tot de PIR iets ziet...
Lijkt me toch een veel economischer oplossing... ;)

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com
Hensz

Golden Member

Die sensor is een sensor en die willen graag dat ze iets opgedragen wordt. Hij heeft, met die paar µA's, ook niet de energie om iets van betekenis te doen. Je hebt een processor, die kun je makkelijk op gezette tijden wakker laten worden, die sensor aan laten zetten, zijn werk laten doen en allebei weer terug laten slapen.

Dan nog zal de oplossing van Arco stukken zuiniger blijken.

Don't Panic!

Op 19 juni 2020 12:27:02 schreef DarthVader072:

Nu ik eenmaal weer mijn sensor heb aangesloten gebruikt de hele set 12mA.
Bovenal dus wel vooruit gegaan, maaaar, het kan nog beter.

Weet je zeker dat de sensor wel in sleep mode kan?
Wellicht dat ik er overheen gekeken heb, maar ik zie dat nergens.

Hensz

Golden Member

Je hebt er idd overheen gekeken, ditis het relevante gedeelte uit de datasheet, dat ik al eerder plaatste:

Don't Panic!