15 dec


Quick and dirty Lithium battery-powered Wemos D1 Mini


The Wemos D1 Mini is an ESP8266 based prototyping board with WiFi connectivity and countless applications. It becomes even more useful in battery-powered applications, where with the proper setup, it can run low-powered for months at a time — or only hours if done incorrectly.

This is the quick and dirty guide to running a Wemos D1 Mini powered by Lithium-Ion batteries: We will be blatantly ignoring several design specifications, so double check everything before using in a critical project. Several things will vary, and since there is plenty of clones of the board some boards will work better than others.

Warning: Lithium-Ion batteries always command healthy respect, due to the energy they store! Do not use bad cells, and do not leave batteries unattended in places where a fire can develop, especially while charging. That being said, the setup given here should be as safe as most other Lithium-Ion battery projects.

Why run off a battery?

You chose a Wemos D1 because you want to do some WiFi connectivity. This narrows down the useful modes from the overwhelming large table of possibilities. The approach will be slightly different depending on why you want to run off a battery. There are 3 main usecases:

  • Periodically wake up on a timer, do some work, connect to WiFi, and go back to sleep. Here we can utilize the deep sleep mode of the ESP8266, and get lifetimes in months.
  • Wake up based on an external pin trigger, do some work, connect to WiFi, and go back to sleep. Here we can also utilize deep sleep, and get lifetimes in weeks/months.
  • React with low latency to an external pin, do some work, and go to sleep while still connected to WiFi. Here we can utilize light sleep, but only get lifetimes in hours/days.

Hardware setup

The hardware needed is:

  • Wemos D1 Mini
  • TP4056 module with “discharge protection”, most modules with more than one chip has this, but be careful!
  • Lithium-Ion battery, e.g. a 18650 cell, and probably a holder for the battery

What you don’t want is anything resembling a power bank or battery shield with a regulated output (5V or 3V). These are practically useless, simply a more expensive battery holder! Two reasons: poorly built (I have several where standby is prevented by pulling 100 mA through a resistor!), and you don’t want a switching mode power supply. The keyword here is “quiescent current”: an SMPS can easily consume 5-10 mA continuously, which could very likely be the majority of the current draw.

Wiring diagram.

Waking on a timer – deep sleep

Full code example for deep sleeping on a timer.

To start deep sleep for a specified period of time:

//Sleep for some time; when waking everything will be reset and setup() will run again

Note that you can’t safely sleep for more than approximately 3 hours. Power usage is approx 0.3–0.4mA when deep sleeping.

Keep in mind that after waking from the timer the chip will be reset, meaning no state is available, and WiFi will have to reconnect. Reconnecting to WiFi can be anything from 3–10 seconds or even longer, meaning that will be a delay before the program can resume.

Waking on an pin trigger (reset)

Full code example for deep sleeping waiting for a pin trigger.

The code is exactly the same as waking on a timer, with one exception:

//Sleep until RESET pin is triggered

The chip will be effectively Cinderella’ed, sleeping until a RESET is triggered. Same caveats apply: waking up the program is restarted, and reconnecting to WiFi will be a delay.

Stay connected – low latency

Full code example for light sleeping connected to WiFi waiting for a pin trigger. Note that the button should be connected to D3 for this example, not RST.

The key parts are:

void setup() {
  WiFi.setSleepMode(WIFI_LIGHT_SLEEP, 3);  // Automatic Light Sleep

void loop() {
  delay(350); // Any value between 100--500 will work, higher value more power savings
    // but also slower wakeup!

Simply delaying will bring power savings — simple and easy!

When awake power consumption is around 75mA. Average power consumption when light sleeping with delay(200) is around 45 mA, with delay(350) and larger is around 30–40mA.

Measuring battery depletion

The ESP can measure it’s internal VCC supply voltage, and because the battery will start dropping below the rated 3.3V before it is depleted, this allows to get an warning when the battery starts to deplete.


void loop() {
  if (ESP.getVcc() < 2800) {
    //Do something to warn of low battery

In my experience the Vcc reading will drop below 2800 when the battery starts to be depleted.

ADC readings vs. battery voltage

Note that measuring the VCC while connected with USB is not possible, as the USB connection will pull up the battery and the 5V rail to 5V!

Calculating battery life

Here is a quick calculator for how long your Wemos D1 Mini can stay powered

Deep sleep

(conservatively assumes base load 1mA, 10 secs burst of 100mA for every wakeup), resulting in


Light sleep


Of course the consumption can be brought even lower: some chips are unused but partly connected and will have some leakage (LEDs, USB chip on the Wemos). Making it even leaner is outside the scope of quick and dirty.

Gemt under: Extern, HAL9k

04 okt


Olimex A20-OLinuXino-LIME2 – 8 years in service, 2 PSUs and 1 SD-card down


4 years ago I posted a 4 year review of the Olimex LIME2. It seems that the lifetime of power supplies is approximately 4 years as now another power supply died, and this time also the SD-card was expiring. The LIME2 lives on however!

It was a bit hard to notice, because the battery pack of the LIME2 kept it running pretty well even with the poor power supply. So, better monitoring of the battery pack is also on the todo list.

Recovering the bad SD-card

Recovering the SD-card was relatively easy with minimal dataloss, when out of the LIME2:

$ sudo ddrescue /dev/mmcblk0 backup.img
# Put in a new SD-card
$ sudo dd if=backup.img of=/dev/mmcblk0 bs=16M

I have done this a couple of times with other SD-cards from Raspberry PIs, and though there is the potential for dataloss it is usually minimal. This time a few blocks were lost.

Upgrading Debian from Stretch to Bullseye

I took the opportunity to upgrade the Debian install while the system was offline anyway. Upgrading was generally painless, following the usual Debian method. I went through the Buster release just to be sure:

$ vim /etc/apt/sources.list
# replace all "stretch" with "buster" :%s/stretch/buster
$ apt update && apt upgrade && apt full-upgrade
$ reboot

$ vim /etc/apt/sources.list
# replace all "buster" with "bullseye" :%s/buster/bullseye
$ apt update && apt upgrade && apt full-upgrade
$ reboot

The only tricky part is booting the new kernel. Since that always fails for me on the first try, I always hookup the serial console. For future reference, this is how to hookup the serial console:

Pinout from left as labelled on the LIME2: TX, RX, GND

Now, of course the boot failed. I tried getting the flash-kernel package to work for my setup, but for historical reasons I have a separate boot partition. In the end I derived a simple bootscript from that package, that boots from p1 but loads the kernel, fdt and initrd from p2:

setenv bootargs  ${bootargs} console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait panic=10

#setenv fk_kvers '4.19.0-21-armmp-lpae'
setenv fk_kvers '5.10.0-18-armmp-lpae'
setenv fdtpath dtb-${fk_kvers}

load mmc 0:2 ${kernel_addr_r} /boot/vmlinuz-${fk_kvers}
load mmc 0:2 ${fdt_addr_r} /boot/${fdtpath}
load mmc 0:2 ${ramdisk_addr_r} /boot/initrd.img-${fk_kvers}
bootz ${kernel_addr_r} ${ramdisk_addr_r}:${filesize} ${fdt_addr_r}

The script can be manually input over the serial terminal, and thereby tested out.

The only downside is it needs to be manually updated after each kernel upgrade. To activate the uboot bootscript:

$ mount /dev/mmcblk0p1 /mnt/
$ cd /mnt
# ensure boot.cmd is as above
$ mkimage -C none -A arm -T script -d boot.cmd boot.scr

Monitoring the LIME2 battery pack

After upgrading to a recent 5.X mainline Linux kernel the battery pack is exposed in the sysfs filesystem:

$ cat /sys/class/power_supply/axp20x-battery/voltage_now 
4070000 # 4.07 V
$ cat /sys/class/power_supply/axp20x-ac/voltage_now 
4933000 # 4.93 V

I setup a couple of alerting rules for these in my home monitoring setup, so hopefully the next time the LIME2 defeats a power supply I’ll get notified.


I can still warmly recommend the LIME2. It is still available, and even a bit cheaper nowadays at 40 EUR + VAT, and still a little workhorse that just keeps on going.

Gemt under: Extern, HAL9k

Tags: ,

29 aug


Grundfos Alpha 2 pumpe går i stykker og flimrer: reparer den med en kondensator til nogle få kr


Som med så mange andre huse fulgte der en Grundfos Alpha 2 cirkulationspumpe med da vi købte et hus. Den pumpede og pumpede, indtil den var blevet 13 år gammel: så begyndte den at flimre når den skulle starte op. Det er jo som sådan en rimelig hæderlig levetid, men også lidt mistænkeligt at det ikke virkede til at være et mekanisk problem.

Flimmer, men ingen pumpning.

Symptomerne er:

  • Pumpen kan køre fint i længere tid
  • Ved længere tids stop kan den ikke starte; nogen gange starter den efter noget tid
  • Ved opvarmning starter pumpen, f.x. med en varmepistol

Det sidste punkt har gjort at der flere steder bliver spekuleret i at der er “kondens” i pumpen.

Det er dog ikke problemet. Problemet er en lille kondensator der holder strøm til lavspændingselektronikken:

47 uF 16 V kondensatoren er problemet.

I Hal9k eksperimenterede vi en smule for at verificere: hvis man køler den ned med f.x. sprit opstår problemet med det samme. Hvis man varmer den op starter pumpen med det samme.

For en udførlig vejledning i hvordan pumpen skilles ad og kondensatoren skiftes har Simon lavet en video:

Men hvad er kilden til problemet så? Kondensatoren får over tid en alt for stor indre modstand, og spændingstabet bliver for stort. Her et par målinger uden og med lidt sprit til ekstra afkøling:

En helt ny kondensator måler under 1 ohms modstand, altså 100 gange så lille indre modstand:

En ny kondensator kan findes ved at søge på “47 uf 16 v smd electrolytic capacitor”, f.x. TME.eu, eller endnu mere lokalt fra el-supply.dk.

Efter erstatning pumper pumpen lystigt.

Så hvad kan man lære af hele denne historie?
Grundfos laver mekanisk gode pumper, men sparer på deres elektronik. Det er trist at tænke på hvor mange pumper der mon er smidt ud lang tid før tid. Man kan nok ikke beskylde Grundfos for “planned obsolence” efter 13 år, men man kunne dog ønske at produktet fejlede i en mere brugbar konfiguration: f.x. at pumpen kører ved et minimum hvis elektronikken fejler.

Gemt under: Extern, HAL9k

Tags: ,

21 aug

Kommentarer lukket til Carlsvognen – renovering af ladcykel fra 1944

Carlsvognen – renovering af ladcykel fra 1944


Til tider bliver jeg kaldt klimatosse og nærrig sparsommelig, så da behovet for at kunne transportere mere meldte sig, var en bil ikke løsningen. I stedet blev jeg opslugt af den store verden af ladcykler; alt fra Christiania-bikes som vi kender dem, til mere eksotiske Trikes med anhænger på.
Skæbnen vil have at jeg har arbejdet som postbud på de trehjulede Nihola med ‘container’-lad foran. De er fine, men følelsen af at køre på to hjul, på en tre-hjulet cykel er ikke noget for mig – jeg er klart mere tilhænger af den klassiske to-hjulet cykeloplevelse.

Jagten gik videre, specielt fangede mit øje Harry vs Larrys moderne take på SCOs Long John; Bullitt. De er lækre, moderne, har nymodens udstyr som skivebremser, el-motor, bælte-drivlinje, og meget mere. Desværre koster sådan en high-spec konfiguration som jeg ønsker mig op i nærheden af DKK 45.000 – det kan være svært at finde luft til sådan et køb på en SU og derfor skulle der ledes efter andre løsninger.

Youtube-algoritmen hørte mine bønner og præsenterede mig for Phil Vandelays, stærkt Long John- og Bullitt-inspireret, ladcykel bygge-video. Det så egentlig temmelig overkommeligt ud, men problemerne meldte sig hurtigt da McMaster-Carr ikke findes i Europa og jeg ikke havde erfaring med at indkøbe stål til dødelige priser.

Sagnet siger at et medlem af Hal9k tilbage i 2016 kørte på en ‘original’ SCO Long John af årgang 1944, produceret kun fem år efter opfindelsen af denne danske sag. Efter et trafikuheld blev cyklen ikke brugt længere og skiftede hænder til et andet medlem, hvor den mest stod og samlede patina i et skur det næste halve årti. Men det skulle være slut, for jeg fik allernådigst overleveret cyklen i start juli – så er vi igang! Jeg kom endda til at love min bedre halvdel at den skulle være pak-æsel på vores cykelferie kun to måneder senere, så har man i alt fald en deadline.

Det skulle kræve noget arbejde – så meget var klart. Stellet stod nøgent og savnede både krank, pedaler, og vigtigst; styrstamme.
På en Long John styrer man ca. en meter fra forhjulet, hvilket kræver at styrstammen har en arm i bunden, som skubber og trækker i endnu en arm, på siden af forgaflen. Men den eksisterende styrstamme var hårdt medtaget af dens 78 års levealder og et utal af reparationer – det er jo også nærmest pensionsalder i dagens Danmark.
Så må man jo fabrikere en ny styrstamme og her kommer Phil Vandelays egne tegninger til gode som jeg købte for DKK ~250 på hans Etsy-butik. Hans bygge-video er perfekt som slow-tv, en stille aften.

Enten kan man gøre som i gamle dage og dreje et gevind i toppen af styrstammen for herefter at stramme den sammen omkring styr-fittings og -lejer. Alternativt kunne man gøre som Phil og benytte sig af de moderne A-head frempinde som klemmer fast omkring styrstammen og ved hjælp af afstands-skiver sætter højden på frempinden. Det er altså frempinden som holder hele lasten.
Løsningen med A-head stem er nemmere at fabrikere, da det ikke kræver at man drejer gevind på vores gamle, imperialistiske drejebænk eller køber en gevindbakke til formålet. Desuden tillader det praktisk nok mere fleksibilitet mht. højden af styret, hvilket nok er en god idé da vi som mennesker nok ikke er blevet lavere siden stellets fødsel.

Styretøjet er fremstillet for det meste i aluminium, bortset fra selve styrstammen der har fået nyt liv efter brug som vandrør i Dokkedal. Først gik jeg i krig med at tegne armen; den originale er 5mm stål og med en arm-distance på 115mm. Den tegnede er bumpet op til ~18mm, dikteret af den passende stump der lå i metal-skrotbunken, tegningen er med M6 og tyndere end færdige udgave.
Jeg tegnede yderligere huller i en afstand af 20mm for mere eller mindre aggressiv styring – en beslutning der skulle vise sig at være fornuftig.

Det gamle stålrør jeg havde erhvervet er måske ved første øjekast nogenlunde lige, men også kun ganske kort tid. En del møffen rundt på den store drejebænk fik reduceret dens diameter fra 27mm til de ønskede 25.4mm, altså en tomme. Helt lige blev det aldrig, men man drejer heller ikke styret helt rundt, så det går nok – sagde jeg til mig selv. Desværre fik jeg ikke taget nogle billeder af min tvivlsomme fastspænding og drejning af røret.

Styrstammen går nærmest vinkelret på stellet, hvilket betyder at en lang frempind ville kunne kollidere med høj last – f.eks. et vaskeægte menneske. Så efter lidt søgning på diverse cykeludstyrbutikker og overraskelse på hvor meget de tør at sætte sådan et lille stykke aluminium til salg for, besluttede jeg mig for også at lave den selv – nu var jeg jo alligevel så godt i gang-

En helt simpel klods (45x40x80mm) med to 1″ huller, 90 grader forskudt, og med mulighed for at spænde dem grundigt ind blev designet. Fastspænding omkring styrstammen er kritisk, da den ser mest belastning og skal holde det hele oppe – især de dynamiske belastninger når jeg tager cyklen med på BMX-banen og laver tricks. Derfor tænkte jeg at gennemgående huller med to M8 bolte måtte være rigeligt, og så en lille slidse så frempinden kan spændes tæt omkring styrstammen. Ved styret havde jeg desværre ikke denne lette mulighed, så da måtte det blive til 4x M5 tappede huller hvori der kunne sættes nogle bolte ind til at spænde denne fast. Lidt clunky frempind, men holder ganske fint – aerodynamik må tages med i designet af version 2.

Styretøjet er derved færdigt og funktionsdygtigt – i alt fald alt hvad der sker bag laddet. Næste skridt var så at gå i krig med selve stellet.

Et go-kart stel donerede et ~1″ stålrør i passende bukning der efter nedslibning og udskæring passer fint mellem styrstammerør og på stel et stykke før krankboks, således at jeg stadig kan montere en krankmotor. Vi havde i hackerspacet lige erhvervet en Automig 183, og da jeg aldrig har prøvet at svejse før, var det nærmest optimalt at starte på. Med kun CO2 som beskyttelsesgas er det MAG-svejsning jeg begav mig ud på. Lidt øvelse på reststål gav mig forståelse for hvor fine justeringer svejseværket kræver – ikke noget jeg er just en haj til.
Med lidt nervøsitet om jeg brændte stellet lige så hullet som månen, gav jeg mig i gang med at lappe de huller som rusten havde gnavet i stellet, de første svejsninger så lidt koksede og kolde ud – men da jeg fik tændt for gassen begyndte svejsningerne at se holdbare ud, og nærmest pæne efter flapdisken havde fjernet mit sjusk.
Til sidst affedtes stellet i alkohol og males ligesom smådelene og så er skelettet fint renoveret!

Der var temmelig få komponenter tilbage fra tidligere ejere, to forhjulsfælge, et baghjul med dæk med kun ét gear – dog havde seneste ejer indkøbt lidt associerede dele som jeg ærbødigt fik lov til at arve heriblandt en lækker Brooks lædersaddel. Efter lidt moslen rundt og research på cykeldele, samt en god times snak og mange gode råd med Per fra dinlongjohn.dk, fik jeg stykket en order på DKK 2500 sammen hvori alt™ jeg manglede udover det fabrikerede styrtøj blev bestilt:

  • Nyt 26″ baghjul med Nexus 7 indvendige gear og rullebremse, samt passende dæk
  • Krankboks 127,5/73mm
  • Pedaler som passer til den originale krank, dog så moderne at de opfylder de lovpligtige krav
  • En god mængde assorterede møtrikker og andre dele

Monteringen af bagfælg var modsat resten af arbejdet mere præget af præcision – vidden af det nye nav var næsten 130mm, så frem med dunkraften for at udvidde baggaflerne. Lidt test-fitting senere gik det op for mig at de fiksér-skiver jeg havde fået ikke passede i baggaflerne. Modsat moderne cykler har stellet ‘baneracer’ dropouts – altså horisontale og omvendte. De er strengt nødvendige ved indvendige gear, da selve akslen drejer modsat og der derved bliver sat et stort moment i stellet. Per fik på kort tid fremskaffet de rigtige skiver og jeg skyndte mig til Hals efter dem – i takke for den gode service, lavede jeg et Long-John reklameskilt med butikkens navn til dem.

Hastig montering af baghjul, gear og bremse, samt kabler og nu lignede det dælme også snart en komplet cykel – endda næsten 12 timer før cykelferien startede! Jomfrurejsen skulle gå til Burger Kings drive-in for noget velfortjent, åreforkalkene fast-food. På trods af den silende regn var cyklen øjensyneligt funktionsdygtig og lidt forsigtigt kunne jeg anse projektet som færdigt.

Imens min partner arbejdede om formiddagen, syede jeg et dækken til laddet i vandtæt presenning så vores baggage ikke vil blive vådt af hverken dug eller skybrud. Forberedende pakkede jeg også en stor pose værktøj hvis nu uheldet skulle være ude – stregen trak jeg ved svejseværket, selvom det sikkert godt kunne møves op på laddet. Forbløffende var det kun bagskærmen som behøvede at blive strammet i monteringen, cyklen kørte upåklageligt omend tung som et ondt år, men det kan den jo ikke gøre for – så sparer jeg det abonnement til fitness!

Gemt under: Projekter

01 feb

Kommentarer lukket til Hack en lås

Hack en lås


I Hal9k har alle medlemmer (normalt) fri adgang til spacet 24 timer i døgnet. Da det er ret upraktisk at holde styr på 50 nøgler, har medlemmerne i stedet adgangskort (som tidligere beskrevet her).

En lille, men væsentlig, del af adgangskontrolsystemet er selvfølgelig selve dørlåsen. Det har hidtil været en forholdsvis billig magnetlås, men da kommunen for nyligt valgte at udskifte alle døre og vinduer i bygningen, er der også kommet en ny hoveddør, og det er naturligvis en dør med trepunktslukning, som det er standard for moderne døre. Det betyder at den gamle magnetlås ikke kan bruges længere, og vi måtte derfor finde en anden løsning.

Det letteste er selvfølgelig at montere en ny magnetlås, og det findes da også – men prisen er omkring 10.000 kr, og formodentlig ville vi også skulle have noget hjælp fra en låsesmed, så det ville blive en dyr løsning. Heldigvis findes der forskellige IoT-dimser, som er beregnet til at montere på en eksisterende lås, og som typisk betjenes via Bluetooth med en app på telefonen. Den der er nemmest at få fat på i Danmark er den danskproducerede Danalock, som kan fås til omkring en tusse.

Jeg bestilte en Danalock til afhentning i et lokalt varehus og prøvede den på min egen yderdør, og det fungerede fint med den tilhørende app. Men til brug i spacet dur det selvfølgelig ikke, der skal den kunne kontrolleres fra adgangskontrolsystemet. Den oplagte løsning var at erstatte elektronikken med noget andet, og kun bruge selve mekanikken.

Det første trin var derfor at skille låsen ad og se hvordan den var konstrueret.

Danalock set oppefra

Her ses motoren til venstre, den centrale akse i midten, og printet nederst.

Mekanikken er forholdsvis simpel og består af tre dele:

En central akse, som er fast sammenkoblet med låsecylinderen. På forsiden af låsen sidder et håndtag som bruges til at dreje aksen og dermed låsecylinderen manuelt.

En “rotary encoder” som aflæser positionen af den centrale ekse. Det er en standard kvadraturencoder med to optiske sensorer, dvs. der er ikke nogen decideret nulposition.

Pulser fra encoder

Her ses hvordan de to udgange fra encoderen reagerer når aksen drejes rundt.

Motoren og tilhørende gearing. De fleste af tandhjulene er stationære, men et par stykker af dem sidder på en arm der kan rotere. Det betyder at når motoren tændes, vil de bevægelige tandhjul efter kort tid gribe ind i det tandhjul der sidder på den centrale akse, som herved bringes til at rotere. På grund af de bevægelige tandhjul kan låsen stadig betjenes manuelt uden at motoren drejer med.

Motor og gearing

Her ses motoren og nogle af tandhjulene.

Elektronikken består af et lille print hvor de primære komponenter er en microcontroller og en motordriver.

Jeg fjernede printet og metalstrimlerne i batteriboksen, hvilket gav rigelig plads til den nye elektronik. Designet af denne blev drevet af hvad jeg havde på lager, og blev

  • et modul med en TB6612 motordriver
  • en Wemos D1 mini (ESP8266)
  • et stepdown modul til at konvertere 12V til 5V

Motordriveren passede fint der hvor det originale print sad:

Ny motordriver

Et par klatter klar silicone sørger for at ledningerne ikke kommer i karambolage med de bevægelige dele.

Jeg designede en erstatning for batteridækslet i OpenSCAD, og efter et par iterationer havde jeg noget der kunne bruges. Det originale batteridæksel er blot klipset fast til en skrue, men jeg valgte at lade den same skrue gå igennem et hul i det nye “batteridæksel”.

Ny side

Den 3D-printede del der erstatter batteridækslet. Der er udskæring til det USB-micro-stik der sidder på ESP8266, et hul til et JST PH-stil til 12V, og naturligvis en LED.

Og så kunne det hele samles:


ESP8266, stepdown og LED monteret på den nye side.



Monteret og lukket. Som det ses passer den nye side ikke perfekt, men det ser man ikke når klaveret spiller.

Herefter var der kun tilbage at lave noget software, og status i skrivende stund er at låsen fungerer fint på min egen dør. Så nu venter jeg kun på at kunne sætte den op i spacet.


Se kode osv. på https://github.com/bullestock/danalock-wired.

Gemt under: Projekter