Bateriově napájené projekty mají jednu společnou věc: dřív nebo později začne člověka zajímat, kolik energie v baterii ještě zbývá. U jednoduchých projektů to někdy vůbec neřešíme. Zařízení prostě běží, dokud se baterie nevybije. Jenže u venkovních čidel, meteostanic, solárních projektů nebo různých přenosných zařízení už je dobré mít alespoň základní přehled o stavu baterie.
Nejjednodušší možností je měřit napětí baterie přes analogový vstup. To ale není vždy ideální. U Li-Ion a Li-Pol článků napětí neklesá úplně pěkně lineárně, takže z něj nejde jednoduše říct, kolik procent baterie ještě zbývá. Hodnota 3,7 V neznamená automaticky 50 % a 3,9 V nemusí znamenat přesně tolik, kolik bychom čekali.
Právě k tomu slouží modul DFRobot Gravity I2C 3.7V Li Battery Fuel Gauge s čipem MAX17043. Je to malý modul, který umí měřit napětí jednočlánkové Li-Ion nebo Li-Pol baterie a zároveň odhadovat její zbývající kapacitu v procentech. S Arduinem, ESP nebo Raspberry Pi komunikuje přes sběrnici I2C, takže zapojení i program jsou poměrně jednoduché. Modul má pevnou I2C adresu 0x36 a je určený pro baterii s napětím 2,5 až 4,2 V.

Co je MAX17043
MAX17043 je takzvaný fuel gauge, tedy „palivoměr“ pro baterii. Název je docela výstižný. Podobně jako palivoměr v autě neukazuje jen samotné napětí, ale snaží se odhadnout, kolik energie v baterii ještě zbývá.
Modul nevrací jen hodnotu napětí, ale rovnou i stav baterie v procentech. To je pro běžné projekty velmi pohodlné, protože se nemusíme sami zabývat převodní tabulkou napětí na procenta.
Je ale důležité říct, že to pořád není laboratorní měřicí přístroj. Procenta jsou odhad. Výsledek může ovlivnit typ článku, jeho stáří, teplota, zatížení i to, jestli se baterie zrovna nabíjí nebo vybíjí. Pro běžné sledování baterie v Arduino projektu je to ale velmi praktické.
Co modul umí
Modul umí hlavně tři věci:
- měřit napětí Li-Ion nebo Li-Pol baterie,
- odhadovat zbývající kapacitu v procentech,
- upozornit na nízký stav baterie pomocí pinu ALR.
DFRobot u modulu uvádí napájení logiky 3,3 až 6 V, vstup pro baterii 2,5 až 4,2 V, proudový odběr okolo 50 µA a rozhraní Gravity I2C s logickou úrovní 0 až 3,3 V.
To je důležité hlavně u zapojení s různými deskami. Modul je možné napájet z 3,3 V i 5 V, ale samotná I2C logika je podle dokumentace 3,3V. U běžných DFRobot Gravity zapojení to obvykle není problém, ale u vlastního zapojování je dobré na to myslet.
Co modul neumí
Tady je potřeba dát pozor na časté nedorozumění. Tenhle modul není nabíječka baterie.
Neumí:
- nabíjet baterii,
- chránit baterii proti přebití,
- chránit baterii proti hlubokému vybití,
- měřit proud,
- měřit spotřebu zařízení ve watthodinách,
- sledovat každý článek zvlášť.
I když bývá v obchodech někdy zařazený mezi proudová čidla nebo napájecí moduly, ve skutečnosti proud neměří. Měří napětí baterie a z něj společně s vlastním algoritmem odhaduje stav nabití.
Pokud potřebujeme měřit proud a výkon, je lepší použít například INA219. Pokud potřebujeme nabíjet Li-Ion článek, potřebujeme k tomu samostatný nabíjecí modul. MAX17043 řeší jen informaci o tom, v jakém stavu baterie přibližně je.
Pro jakou baterii je modul určený
Modul je určený pro jednočlánkovou Li-Ion nebo Li-Pol baterii. To znamená baterii s běžným jmenovitým napětím 3,7 V a maximálním napětím po nabití okolo 4,2 V.
Typické použití:
1× Li-Ion 18650
1× Li-Pol článek
1S Li-Ion pack
1S Li-Pol pack
Co už použít nejde:
2S Li-Ion / Li-Pol baterie
3S baterie
12V olověný akumulátor
vyšší napětí než 4,2 V na vstupu BAT
Dvě Li-Ion baterie zapojené do série mají při plném nabití až 8,4 V. To je pro tenhle modul příliš mnoho a na vstup baterie se to připojovat nesmí.
A co více článků paralelně?
Tady je dobré rozlišovat dvě věci: sériové a paralelní zapojení.
Modul není určený pro více článků v sérii, ale více článků paralelně použít lze. Důležité je, že celé zapojení musí pořád zůstat jako jedna Li-Ion baterie, tedy 1S.
Například dva paralelně zapojené články se označují jako 1S2P.
1× článek: 3,7 V nominálně / 4,2 V plně nabito
2× paralelně: 3,7 V nominálně / 4,2 V plně nabito
Napětí zůstane stejné jako u jednoho článku, jen se zvýší kapacita. Pokud tedy použijeme dva články 2500 mAh paralelně, dostaneme přibližně baterii 3,7 V / 5000 mAh.
1× 18650 2500 mAh = 3,7 V / 2500 mAh
2× 18650 2500 mAh = 3,7 V / 5000 mAh
V mém případě používám právě zapojení se dvěma paralelně připojenými Li-Ion články. Modul MAX17043 je potom vidí jako jednu větší baterii. Neměří každý článek zvlášť, ale celý paralelní pack jako celek.
U paralelního spojování článků je ale potřeba být opatrný. Články by měly být stejného typu, kapacity, stáří a hlavně by měly mít před propojením stejné nebo velmi podobné napětí. Pokud by se paralelně spojily dva články s výrazně rozdílným napětím, mohl by mezi nimi téct velký vyrovnávací proud.
Shrnul bych to jednoduše: Paralelně ANO / Sériově NE
Piny modulu
Na modulu najdeme několik vývodů. Pro základní použití stačí připojit napájení, zem a I2C sběrnici.
| Pin | Význam |
|---|---|
| VCC | napájení modulu |
| GND | zem |
| SCL | hodinový signál I2C |
| SDA | datový signál I2C |
| ALR | výstup upozornění na nízký stav baterie |
| BAT IN | připojení měřené baterie |
| REV BAT | indikace obráceně připojené baterie |
Baterie se může připojit buď přes svorkovnici, nebo přes JST konektor. Tyto dva vstupy jsou propojené paralelně.
Pozor na napěťové úrovně I2C
Modul má sice napájení VCC v rozsahu 3,3 až 6 V, ale I2C logika je podle dokumentace 3,3V. To znamená, že linky SDA a SCL by neměly být tažené na 5 V.
U I2C sběrnice se logická jednička vytváří pomocí pull-up odporů. Pokud je na sběrnici jen tento modul a žádné další pull-up odpory na 5 V, bývá zapojení s Arduino UNO většinou bez problémů, protože linky jsou tažené pouze na 3,3 V a Arduino tuto úroveň přečte jako HIGH.
Problém ale nastává ve chvíli, kdy je na stejné I2C sběrnici připojený další modul nebo shield, který má pull-up odpory na 5 V. V takovém případě se na SDA a SCL může objevit 5 V, což už pro tento modul není vhodné. Pokud tedy používáme více I2C modulů najednou a některý z nich pracuje s 5V logikou, je bezpečnější použít převodník logických úrovní nebo zajistit, aby byly pull-up odpory připojené pouze na 3,3 V.
Zapojení k Arduinu
Základní zapojení je jednoduché. Modul připojíme ke sběrnici I2C Arduina a na vstup BAT připojíme měřenou baterii. V ukázce použiji Arduino MEGA 2560.
| Modul | Arduino UNO | Arduino MEGA 2560 |
|---|---|---|
| VCC | 5V | 5V |
| GND | GND | GND |
| SDA | A4 | 20 |
| SCL | A5 | 21 |
| BAT + | plus baterie | plus baterie |
| BAT – | minus baterie | minus baterie |

Instalace knihovny
V Arduino IDE otevřeme Manažera knihoven, do vyhledávání zadáme DFRobot_MAX17043 a nalezenou knihovnu nainstalujeme.
První testovací program
Na první vyzkoušení stačí jednoduchý program, který každé dvě sekundy vypíše napětí baterie a odhadovaný stav nabití v procentech.
#include <Wire.h>
#include "DFRobot_MAX17043.h"
DFRobot_MAX17043 baterie;
void setup()
{
Serial.begin(115200);
delay(1000);
Serial.println();
Serial.println("Test modulu MAX17043");
Wire.begin();
while (baterie.begin() != 0)
{
Serial.println("Modul MAX17043 se nepodarilo najit.");
Serial.println("Zkontroluj zapojeni SDA, SCL, VCC a GND.");
delay(2000);
}
Serial.println("Modul MAX17043 nalezen.");
}
void loop()
{
float napeti_mV = baterie.readVoltage();
float procenta = baterie.readPercentage();
Serial.print("Napeti baterie: ");
Serial.print(napeti_mV / 1000.0, 3);
Serial.println(" V");
Serial.print("Stav baterie: ");
Serial.print(procenta, 1);
Serial.println(" %");
Serial.println();
delay(2000);
}
Po nahrání programu otevřeme sériový monitor a nastavíme rychlost na 115200 baudů. Pokud je všechno správně zapojené, měly by se začít vypisovat hodnoty napětí a procent.
Příklad výstupu může vypadat třeba takto:

Co znamenají naměřené hodnoty
Napětí baterie je jasné. Modul ho vrací v milivoltech, takže hodnota například 4087 znamená přibližně 4,087 V.
Procenta jsou už zajímavější. Modul se snaží odhadnout, kolik energie v baterii ještě zbývá. Není to ale totéž jako přesné měření kapacity. Když modul ukáže například 70 %, znamená to přibližný stav nabití baterie podle algoritmu čipu MAX17043.
U Li-Ion článků se napětí během vybíjení nechová úplně lineárně. Poměrně dlouho se může držet v určitém rozsahu a potom začne klesat rychleji. Proto je procentuální odhad pohodlnější než jen samotné sledování napětí.
Pro běžný projekt je praktické sledovat obě hodnoty:
napětí baterie ve voltech
stav baterie v procentech
Napětí nám dá technickou představu o skutečném stavu článku a procenta se dobře zobrazují uživateli.
Upozornění na nízký stav baterie
Modul má také pin ALR, který slouží jako upozornění na nízký stav baterie. Výchozí práh alarmu je 32 %. Pomocí funkce setInterrupt() jde nastavit práh v rozsahu 1 až 32 %. Při poklesu pod nastavenou hodnotu se pin ALR aktivuje.
Pro běžný projekt není nutné ALR pin používat. Stav baterie můžeme klidně jen pravidelně číst v programu. Pokud ale chceme šetřit energii nebo při nízké baterii vypnout nějakou část zařízení, může se ALR hodit.
Jednoduchý příklad s upozorněním na 20 % může vypadat takto:
#include <Wire.h>
#include "DFRobot_MAX17043.h"
#define ALR_PIN 2
DFRobot_MAX17043 baterie;
volatile bool nizkaBaterie = false;
void upozorneniNaBaterii()
{
nizkaBaterie = true;
}
void setup()
{
Serial.begin(115200);
delay(1000);
Wire.begin();
pinMode(ALR_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(ALR_PIN), upozorneniNaBaterii, FALLING);
while (baterie.begin() != 0)
{
Serial.println("Modul MAX17043 se nepodarilo najit.");
delay(2000);
}
// Nastavení alarmu na 20 %
baterie.setInterrupt(20);
Serial.println("MAX17043 pripraven.");
}
void loop()
{
float napeti_mV = baterie.readVoltage();
float procenta = baterie.readPercentage();
Serial.print("Napeti: ");
Serial.print(napeti_mV / 1000.0, 3);
Serial.print(" V, ");
Serial.print("Baterie: ");
Serial.print(procenta, 1);
Serial.println(" %");
if (nizkaBaterie)
{
nizkaBaterie = false;
Serial.println("Pozor, nizky stav baterie!");
// Vyčištění příznaku přerušení v modulu
baterie.clearInterrupt();
// Sem by šlo doplnit třeba uspání zařízení,
// vypnutí displeje nebo odeslání varování.
}
delay(2000);
}
U tohoto příkladu je potřeba myslet na to, že pin ALR musí být fyzicky připojený k pinu 2 na Arduinu. U jiné desky je možné zvolit jiný pin, který podporuje přerušení.
U 5V Arduina je vhodné ALR pin také řešit s ohledem na 3,3V logiku. Bezpečnější je použít externí pull-up na 3,3 V nebo převodník úrovní.
Použití v praxi
Tenhle modul se hodí všude tam, kde projekt běží z Li-Ion nebo Li-Pol baterie a chceme mít přehled o jejím stavu.
Typické příklady:
- přenosná Arduino zařízení,
- meteostanice,
- venkovní čidla,
- solární projekty,
- malé roboty,
- bateriově napájené displeje,
- e-ink zobrazovače,
- zařízení s ESP8266 nebo ESP32.
Já ho chci použít hlavně tam, kde potřebuji sledovat, jak se baterie chová v reálném provozu. U solárních projektů je zajímavé vidět, jak rychle se baterie přes den dobíjí a jak moc se přes noc vybíjí.

Na co si dát pozor
I když je modul jednoduchý, pár věcí se vyplatí nepodcenit.
První věc je správný typ baterie. Modul patří na jednu Li-Ion nebo Li-Pol baterii, případně na paralelní pack typu 1S2P. Nepatří na 2S baterii ani na žádné vyšší napětí.
Druhá věc je polarita. Baterii je potřeba připojit správně. Modul má sice indikaci obráceného připojení baterie pomocí REV BAT, ale lepší je na to nespoléhat a před zapnutím si polaritu zkontrolovat.
Třetí věc je společná zem. Pokud je mikrokontrolér napájený jinak než baterie, kterou měříme, musí být země propojené.
Čtvrtá věc jsou samotná procenta. Je dobré je brát jako odhad. Pro běžný přehled o baterii jsou velmi užitečná, ale není dobré podle nich dělat přesné laboratorní závěry.
A poslední věc se týká paralelních článků. Pokud používáme více článků paralelně, musí být ve stejném stavu a před propojením mít velmi podobné napětí. Náhodné spojování různých starých článků z šuplíku není dobrý nápad.
Závěr
DFRobot Gravity modul s čipem MAX17043 je jednoduchý a praktický způsob, jak do Arduino projektu přidat sledování Li-Ion nebo Li-Pol baterie. Oproti obyčejnému měření napětí přes analogový vstup má velkou výhodu v tom, že rovnou vrací i odhadovaný stav nabití v procentech.
Tento modul však není vhodný pro aplikace typu „tester akumulátorů“, ke kterému se na krátkou dobu připojují různé články. Obvod potřebuje určitý čas, aby si konkrétní akumulátor „osahal“ a naučil se jeho charakteristiku. Sleduje historii napětí a podle ní průběžně zpřesňuje odhad zbývající kapacity. Hodí se proto spíše do zařízení, ve kterých zůstává dlouhodobě připojený ke stejnému akumulátoru.
Zapojení je jednoduché, komunikace probíhá přes I2C a knihovna pro Arduino ušetří většinu práce. Pro začátečníka je to tedy příjemný modul, na kterém se dá vyzkoušet práce s bateriově napájeným projektem bez složitého počítání.
Je jen potřeba pamatovat na jeho omezení. Modul není nabíječka, není ochrana baterie a není určený pro baterie s vyšším napětím. Hodí se pro jednu Li-Ion nebo Li-Pol baterii, případně pro více článků zapojených paralelně jako 1S pack.
Pro různé venkovní, přenosné a solární projekty je to ale hodně užitečná součástka. Díky ní se dá snadno zjistit, jestli má baterie dostatečnou rezervu, jak rychle se vybíjí a jestli celý projekt zvládne běžet tak dlouho, jak potřebujeme.
Další díly ze začátečnické série o modulech najdete ZDE.

Možná bych do článku doplnil ještě informaci, že tento modul není vhodný pro aplikace typu „Tester akumulátorů“, ke kterému se na krátkou dobu připojují různé články.
Obvod potřebuje čas, aby si konkrétní článek osahal a „naučil“ se jeho charakteristiku.
Pamatuje si historii napětí a výpočet kapacity si pak průběžně upravuje.
Takže je vhodný na zařízení, která jsou trvale zapnutá.
Dobrá připomínka