Arduino - dokonaly SLEEP mode - Re: trubka jako zvukovod

Jaroslav Lukesh (seznam IMAP) lukesh na seznam.cz
Pátek Leden 6 14:23:37 CET 2017


Takže to probouzí něco jako tlačítko.

To fakt musí 200ms čekat, aby se to spolehlivě probralo? Já s tou lowpower 
knihovnou to nechávám usínat i na zlomky ms (často se opakujících - třeba 
čekání 250us na nrf24) a probuzené je to hned, hned jedu dál po SPI, žádné 
tuhnutí. Ale používám 100n a 10uF (i 47uF) keramiku v 0805 všude kam jde 
napájení, někdy i elyt. Případně ho přilepím na poschodí k už existujícímu 
kondíku na desce.

Zapamatujte si jednoduše tohle C=I * t  [uF, mA, ms] pro pokles o 1V
Hned budete odhadem vědět, jak velký blokovací kond budete potřebovat.

Dobrá fligna je i schottky dioda v propustném směru - její dynamický odpor s 
kondem funguje na rušení z napájecí sběrnice nesrovnatelně líp, než samotný 
kond. Chtělo by se mi říct, že i líp, než tlumivka s kondem.


----- Původní zpráva ----- 
Od: Halen na seznam.cz


Všechny piny, které nepoužívám jsou po startu nastavené jako input, aby byl 
zaručen jejich stav a nezvyšovaly odběr arduina.

v cyklu projedu všechny nepoužívané piny a provedu:
pinMode(i, INPUT_PULLUP);

používané piny si potom nastavím extra, dle potřeby.


poté v loop pracuji s arduinem a v době kdy jej chci uspat a snížit odběr:

zavolám: sleepNow();

pozn. Je třeba mít definovanou globální proměnnou: bool usnulo = false;


void sleepNow() {
  usnulo = false;
  myDelay(200);

  attachInterrupt(0, my_interrupt_handler, LOW);
  sleep_enable();          // enables the sleep bit in the mcucr register
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);   // sleep mode is set here
  cli();
  sleep_bod_disable();
  usnulo = true;
  sei();
  sleep_cpu();
  // THE PROGRAM CONTINUES FROM HERE AFTER WAKING UP
  sleep_disable();
  power_all_enable();
}


potom už jenom definice procedur:

void my_interrupt_handler()
{
  if (usnulo) {
    detachInterrupt(0);
  }
}

void myDelay(unsigned long ms) {

  unsigned long plannedMillis = millis();
  plannedMillis = plannedMillis + ms;

  while (plannedMillis > millis())
  {

  }
}


Tímto způsobem mě arduino mini usíná a probouzí zcela bez problémů. To 
usínání jsem ladil možná týden, než to začalo korektně fungovat. Postupy co 
jsou na netu jakoby fungují, ale po několika probuzeních se cpu zasekne v 
nedefinovatelném stavu.

Honza



Další informace o konferenci Hw-list