čtvrtek 1. prosince 2016

ESP8266 od WeMos a měření napětí akumulátoru

Jak jsem v předchozím článku anoncoval, pořídil jsem si pár WeMosů. Aktuálně dva kousky monitorují teplotu a vlhkost v domě (popíšu později), třetí kousek je vývojový a ve volném čase také monitoruje.

Zkušenosti z praktického nasazení mě přimělo realizovat monitor stavu napájecích LiPol akumulátorů. A o tom je tento článek.




Teorie

ESP8266 má pouze jeden AD převodník, na který přivedeme napětí z monitorovaného článku přes napěťový dělič. Parametry děliče vypočítáme pro maximální měřené napětí (5V) a maximální povolené napětí na AD převodníku (1V). Pak vybereme z odporů nejbližší hodnoty a pro jistotu přepočítáme, abychom se nedostali nad povolenou mez.

Více na Wikipedii

Mechanická konstrukce

Pro napájení používám WeMos Battery Shield, který:
  • Pro napájená zařízení zajistí napětí 5V a 3.3V bez ohledu na to, jestli je připojen akumulátor a/nebo USB
  • Pokud je na připojeném USB napětí 5-10V, zajistí správné nabíjení připojené lithiové baterie
Takže po mechanické stránce musíme propojit napěťový dělič s pinem A0, což ilustrují následují fotografie.

Potřebné součástky
LiIon (ze starého notebooku), bužírky, lépe smršťovačky, rezistory o hodnotách 100k a 22k
Rezistory jsou po dvou kusech, protože vyrábím pro dva kusy.

Rezistory spojíme, společný vývod povede k A0,
horní vývod povede k GND (nula) a dolní vývod k Vcc [+]


Vývody zatáhneme do smršťovaček.


Naohýbáme vývody tak, abychom je pak mohli pouze připájet.


Připájíme vývody, spodní (rezistor 100k) k Vcc [+] (vpravo),
horní (rezistor 22k) k GND [-] (vlevo, víc ke středu).


Společný vývod připájíme ze spodní strany k vývodu A0


Hotovo!

Program

Používám kombinaci NodeMCU a Lua, takže do firmware musíme přikompilovat modul ADC. Hodnoty měřím několikrát, minima a maxima odstraním a ze zbytku vypočítám průměr. K tomu mi slouží modul s funkcí getVoltage(...).

Jinak lze samozřejmě použít pouhé zavolání inicializace, následně čtení dat z převodníku a vynásobení koeficientem:

adc.force_init_mode(adc.INIT_ADC) -- inicializace AD prevodniku
voltage = 0.0183 * adc.read(0) -- ctení a vypocet napeti

Použití:

-- merime napeti
power = require("power")
voltage = power.getVoltage(10,2)
--

Tady je funkce getVoltage(...)

-- Funkce pro mereni napeti z AD prevodniku
-- Potrebuje mit ve FW modul ADC
-- Koeficient je vypocten pro rezistory delice napeti o hodnotach 
-- 100k (k V+) a 22k (ke GND)
-- Vraci napeti z AD prevodniku.
-- 'measuringCount' je celkovy pocet mereni
-- 'measuringCut' je pocet 'odstranenych' minim a maxim

local moduleName = ...
local M = {}

function M.getVoltage(measuringCount, measuringCut)

  -- inicializace AD prevodniku  
  adc.force_init_mode(adc.INIT_ADC)
  local voltageTable = {}

  for i=1, measuringCount, 1 do
    -- prodleva je nutna pro spravne nabiti kondenzatoru v prevodniku
    tmr.delay(100000) 
    voltageTable[i] = adc.read(0)
  end

  table.sort(voltageTable)

  local voltageSum = 0

  for i=measuringCut + 1, measuringCount - 2*measuringCut + 2, 1 do
    voltageSum = voltageSum + voltageTable[i]
  end

  --0.0183 (vypocitany koeficient)
  voltage = 0.0183*(voltageSum / (measuringCount - 2*measuringCut))

  return voltage

end  

print(M.getVoltage(10,2)) -- je pro testy

return M

Výsledky měření

Takto vypadají výsledky měření v grafu na ThikSpeak. Lze z nich vysledovat trend a následně i odhadnout výdrž zařízení.



Odkazy



2 komentáře:

  1. Tomu říkám čistá práce. V podstatě nechápu jak je to možné, protože se výrobou teprve učím, ale mít takovouhle schopnost tak si dělám li-pol baterie úplně sám :)

    OdpovědětVymazat