This is not a full project in itself, but it could be used to power others. Plus, it was enough of a project getting it worked out that I'm posting it here -
Latching power circuits allow your Oak to turn on with a button press, then power down with a second button press or button release - but only *after* it has finished running its code, including any shut-down procedures. It requires a power supply of at least 5V so if you've been cheating and running your Oak off 3.3 or 3.7V, don't expect it to do so reliably.
Advantage of using a soft latching circuit versus the Oak/ESP8266’s sleep/wake functionality: power savings. The Oak draws 1 mA in sleep and 50-70 μA in deep sleep,
if you've cut the trace for the on-board power LED. In contrast, when powered down this circuit sips about 1 μA, and you haven't mutilated your Oak.
This circuit can be used for either a push-on/push-off or latching type switch, or a momentary button:
Circuit schematic:

Here I’m using pin 8 to latch the circuit on, or keep it active until activity is detected on pin 9 - i.e. it goes low when a push-on/push-off switch is released, or high when a momentary contact switch is depressed a second time. The Oak then finishes running its code, then writes low to pin 8 to turn itself off. A more detailed explanation of this circuit at
http://www.ars-informatica.ca/eclectic/latching-power-circuit-for-digistump-oak/Code showing how this works for a latching, push-on, push-off switch:
/* Power-latching circuit control code
Basic code for a power latching circuit. Pin 8 "latches" the power on, i.e. keeps the system powered
even after the switch has been released. In this version, pin 9 senses when the switch has been
released and executes the power-down code, which here is a simple 2-second delay before the
microprocessor powers itself off. */
const char *version = "power latch circuit";
uint16_t delayInterval = 500; //timing delay between code loops
#define PWR_LATCH P8
#define PWR_CHK P9
void setup() {
Serial.begin(115200);
Serial.print(version);
pinMode(PWR_LATCH, OUTPUT); //initialize pin for output
digitalWrite(PWR_LATCH, HIGH); //write HIGH to latch circuit "on"
pinMode(PWR_CHK, INPUT); //initialize pin for sensing power switch state
}
// MAIN LOOP
void loop() {
if (digitalRead(PWR_CHK) == 1) delay(delayInterval); //high reading - switch is closed or "on"
else { //low: execute power-down code
delay(2000);
pinMode(PWR_LATCH, LOW);
}
}
Functioning breadboard version:
