aboutsummaryrefslogtreecommitdiff
path: root/battery.h
blob: d86fbecb91a54512ee02e536ef52a7ef8f689adb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#pragma once
#include <Arduino.h>
 
#include "data.h"
 
/*
  code inspired by https://gist.github.com/jenschr/dfc765cb9404beb6333a8ea30d2e78a1
 */
 
class Battery {
private:
  uint8_t pin;
  
  float voltage() {
    /*
      Comment from the gist:
 
      The ADC value is a 12-bit number, so the maximum value is 4095
      (counting from 0).
 
      To convert the ADC integer value to a real voltage you’ll need
      to divide it by the maximum value of 4095, then double it (note
      above that Adafruit halves the voltage), then multiply that by
      the reference voltage of the ESP32 which is 3.3V and then
      finally, multiply that again by the ADC Reference Voltage of
      1100mV.
 
      Comment from me: that assumes that ADC is linear, which it
      probably isn't
 
      Also, the battery voltage is not a decent indicator of charge
      level, but that's what I've got
    */
    return (float)(analogRead(pin)) / 4095*2*3.3*1.1;
  }
public:
  /*
    the schematics at
    https://github.com/Xinyuan-LilyGO/LilyGo-T5-Epaper-Series/tree/master/schematic
    show a voltage divider connected to pin 35
  */
  Battery(uint8_t _pin=35) : pin(_pin) {};
 
  void start() {}
  bool dataReady() { return true}
  void read(SensorData *data) {
    data->batteryVoltage = voltage();
  }
 
  bool serialCommand(const String &tag, const String &command) {
    return false;
  }
};