-
Notifications
You must be signed in to change notification settings - Fork 20
/
Copy pathMAX17043.cpp
119 lines (81 loc) · 2.01 KB
/
MAX17043.cpp
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
// MAX17043/44 library for Arduino
//
// Luca Dentella (http://www.lucadentella.it)
#include "MAX17043.h"
#include "Wire.h"
float MAX17043::getVCell() {
byte MSB = 0;
byte LSB = 0;
readRegister(VCELL_REGISTER, MSB, LSB);
int value = (MSB << 4) | (LSB >> 4);
return map(value, 0x000, 0xFFF, 0, 50000) / 10000.0;
//return value * 0.00125;
}
float MAX17043::getSoC() {
byte MSB = 0;
byte LSB = 0;
readRegister(SOC_REGISTER, MSB, LSB);
float decimal = LSB / 256.0;
return MSB + decimal;
}
int MAX17043::getVersion() {
byte MSB = 0;
byte LSB = 0;
readRegister(VERSION_REGISTER, MSB, LSB);
return (MSB << 8) | LSB;
}
byte MAX17043::getCompensateValue() {
byte MSB = 0;
byte LSB = 0;
readConfigRegister(MSB, LSB);
return MSB;
}
byte MAX17043::getAlertThreshold() {
byte MSB = 0;
byte LSB = 0;
readConfigRegister(MSB, LSB);
return 32 - (LSB & 0x1F);
}
void MAX17043::setAlertThreshold(byte threshold) {
byte MSB = 0;
byte LSB = 0;
readConfigRegister(MSB, LSB);
if(threshold > 32) threshold = 32;
threshold = 32 - threshold;
writeRegister(CONFIG_REGISTER, MSB, (LSB & 0xE0) | threshold);
}
boolean MAX17043::inAlert() {
byte MSB = 0;
byte LSB = 0;
readConfigRegister(MSB, LSB);
return LSB & 0x20;
}
void MAX17043::clearAlert() {
byte MSB = 0;
byte LSB = 0;
readConfigRegister(MSB, LSB);
}
void MAX17043::reset() {
writeRegister(COMMAND_REGISTER, 0x00, 0x54);
}
void MAX17043::quickStart() {
writeRegister(MODE_REGISTER, 0x40, 0x00);
}
void MAX17043::readConfigRegister(byte &MSB, byte &LSB) {
readRegister(CONFIG_REGISTER, MSB, LSB);
}
void MAX17043::readRegister(byte startAddress, byte &MSB, byte &LSB) {
Wire.beginTransmission(MAX17043_ADDRESS);
Wire.write(startAddress);
Wire.endTransmission();
Wire.requestFrom(MAX17043_ADDRESS, 2);
MSB = Wire.read();
LSB = Wire.read();
}
void MAX17043::writeRegister(byte address, byte MSB, byte LSB) {
Wire.beginTransmission(MAX17043_ADDRESS);
Wire.write(address);
Wire.write(MSB);
Wire.write(LSB);
Wire.endTransmission();
}