Using the TPL5110 isn't too hard but there's a few things to watch out for. First up, do not give it 9V power, use 3-5V only!
Make sure to provide the power to the VDD and GND pins. Then connect your project to the DRV and GND pin. Use a DONE pin from your microcontroller to signal when the TPL can disable power: when the DONE pin goes from low to high, that will turn off the TPL's power transistor.
In this project I'm using A3 as the DONE signal pin. You can use any pin you like as long as the wiring matches your sketch. The pin is lightly pulled down so just set to an Output and High when you're done!
If the TPL doesn't get a DONE signal, it will reset the board with a short ENABLE toggle when the timeout is reached (e.g. before the next cycle)
Notes on the Delay Pin
The delay pin is a little more complicated than you may first think!
- First, do not connect a voltage here, instead it uses a resistor to determine the delay timing.
- Second, it does not continuously sample the resistor, it only does it once when power is applied. So set the delay you want, then power up the breakout.
- Third, you can instantly turn on the project by connecting Delay to VDD. By default we have a pushbutton on board, you can connect your own button if you like
- Fourth, the resistance is not linear with the time delay, rather there is a complex algorithm to set the time based on resistance. You can check the datasheet for the precise calculation, or use this rough table:
1 Seconds |
5.2 KΩ |
2 Seconds |
6.79 kΩ |
3 Seconds |
7.64 kΩ |
4 Seconds |
8.3 kΩ |
5 Seconds |
8.85 kΩ |
6 Seconds |
9.26 kΩ |
7 Seconds |
9.71 kΩ |
8 Seconds |
10.18 kΩ |
9 Seconds |
10.68 kΩ |
10 Seconds |
11.2 kΩ |
20 Seconds |
14.41 kΩ |
30 Seconds |
16.78 kΩ |
40 Seconds |
18.75 kΩ |
50 Seconds |
20.047 kΩ |
1 Minute |
22.02 kΩ |
2 Minutes |
29.35 kΩ |
3 Minutes |
34.73 kΩ |
4 Minutes |
39.11 kΩ |
5 Minutes |
42.90 kΩ |
6 Minutes |
46.29 kΩ |
7 Minutes |
49.38 kΩ |
8 Minutes |
52.24 kΩ |
9 Minutes |
54.92 kΩ |
10 Minutes |
57.44 kΩ |
20 Minutes |
77.57 kΩ |
30 Minutes |
92.43 kΩ |
40 Minutes |
104.67 kΩ |
50 Minutes |
115.33 kΩ |
1 Hour |
124.91 kΩ |
1 Hour 30 Minutes |
149.39 kΩ |
2 Hours |
170 kΩ |
Given that we put a 200 kΩ trimpot on the board, you may find it difficult to get precise timing if you need short delays. In that case, you can use any resistor you want. First, cut the trace on the back of the PCB
Then install your desired resistor:
Don't forget to hard-reset the full setup!
ESP8266 Feather Example
ESP8266's are a little finicky and may need some tweaks to get working. Note that some pins have special purpose so are not suitable for a DONE pin. Here's a demo of an ESP8266 Feather with a NeoPixel ring. We power from a microUSB cable through a breakout adapter. The USB power goes through the TPL5110 to the power rail. We added a 47uF capacitor to stabilize the power rail.
For the code, we toggle the DONE pin high and low forever to make sure it gets 'caught' by the TPL (it may not be necessary but it doesn't hurt!)
// SPDX-FileCopyrightText: 2017 Limor Fried for Adafruit Industries // // SPDX-License-Identifier: MIT #include <Adafruit_NeoPixel.h> #if defined(ESP8266) #define NEOPIX 4 #define DONEPIN 5 #else #include <Adafruit_SleepyDog.h> #define NEOPIX 13 #define DONEPIN 12 #endif Adafruit_NeoPixel strip = Adafruit_NeoPixel(12, NEOPIX, NEO_GRB + NEO_KHZ800); void setup() { pinMode(DONEPIN, OUTPUT); digitalWrite(DONEPIN, LOW); Serial.begin(115200); Serial.println("Light up NeoPixels!"); strip.begin(); strip.show(); // Initialize all pixels to 'off' strip.setBrightness(20); } void loop() { rainbowCycle(5); Serial.println("NeoPixels done, sleeping"); // toggle DONE so TPL knows to cut power! while (1) { digitalWrite(DONEPIN, HIGH); delay(1); digitalWrite(DONEPIN, LOW); delay(1); } Serial.println("Awake!"); } // Slightly different, this makes the rainbow equally distributed throughout void rainbowCycle(uint8_t wait) { uint16_t i, j; for(j=0; j<256*1; j++) { // 5 cycles of all colors on wheel for(i=0; i< strip.numPixels(); i++) { strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255)); } strip.show(); delay(wait); } } // Input a value 0 to 255 to get a color value. // The colours are a transition r - g - b - back to r. uint32_t Wheel(byte WheelPos) { WheelPos = 255 - WheelPos; if(WheelPos < 85) { return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3); } if(WheelPos < 170) { WheelPos -= 85; return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -= 170; return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0); }
Video Example
You can also watch me put together a project using a prototype of this board (the shipping version has a pulldown resistor on DONE which i had to manually install in the video)
Page last edited January 22, 2025
Text editor powered by tinymce.