Running out of Ram ?

The answer to the original question is "yes, you probably do".

If you call freeRam() at setup() or loop() it will only report static memory used.

When you (or an interrupt) calls a function a few bytes are put on the stack (the retirn address) and thats 4 or 8 bytes gone. If you have arguments (C calls by value) or local non-static variables (f.ex. bat_mom in your code) , then that consumes memory, too. Likewise when you call library functions.

Of course only as you nest calls do these add up, rather than just the max of the biggest. Put a freeRam() call somewhere deep inside your functions and see the difference.