Added min/max LCD, add NVS storage, add button3 Longpress
This commit is contained in:
parent
222feef353
commit
69b5cfebc1
6 changed files with 204 additions and 107 deletions
Binary file not shown.
42
data/about.html
Normal file
42
data/about.html
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
|
||||||
|
<title>Carstens Battery Analyzer</title>
|
||||||
|
|
||||||
|
<link href="css/bootstrap.min.css" rel="stylesheet">
|
||||||
|
<link href="css/style.css" rel="stylesheet">
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<h3>
|
||||||
|
Power Analyzer - V0.29 Beta
|
||||||
|
</h3>
|
||||||
|
<ul class="nav">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link active" href="index.html">Messwerte</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="graph.html">Graph</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link disabled" href="about.html">About</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
Power Analyzer on ESP32, libraries used ArduinoINA219, Wire, TaskScheduler, <br>LiquidCrystal_I2C, ESPAsyncWifiManager, ESP Async WebServer, FS, ESP8266FtpServer, NVS, SPIFFS
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div><center>Build by Carsten Schmiemann (2018), Akku <span id="battery"></span> V, Status: <span id="run"></span></center></div>
|
||||||
|
<script src="js/jquery.min.js"></script>
|
||||||
|
<script src="js/bootstrap.min.js"></script>
|
||||||
|
<script src="js/scripts.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
81
data/graph.html
Normal file
81
data/graph.html
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
|
||||||
|
<title>Carstens Battery Analyzer</title>
|
||||||
|
|
||||||
|
<link href="css/bootstrap.min.css" rel="stylesheet">
|
||||||
|
<link href="css/style.css" rel="stylesheet">
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<h3>
|
||||||
|
Power Analyzer - V0.29 Beta
|
||||||
|
</h3>
|
||||||
|
<ul class="nav">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link active" href="index.html">Messwerte</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="graph.html">Graph</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link disabled" href="about.html">About</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="chartContainer" style="width:100%; height:300px;"></div>
|
||||||
|
<div><center>Build by Carsten Schmiemann (2018), Akku <span id="battery"></span> V, Status: <span id="run"></span></center></div>
|
||||||
|
|
||||||
|
|
||||||
|
<script type="text/javascript" src="https://canvasjs.com/assets/script/jquery-1.11.1.min.js"></script>
|
||||||
|
<script type="text/javascript" src="https://canvasjs.com/assets/script/canvasjs.min.js"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
window.onload = function() {
|
||||||
|
var dataPoints = [];
|
||||||
|
|
||||||
|
function getDataPointsFromCSV(csv) {
|
||||||
|
var dataPoints = csvLines = points = [];
|
||||||
|
csvLines = csv.split(/[\r?\n|\r|\n]+/);
|
||||||
|
|
||||||
|
for (var i = 0; i < csvLines.length; i++)
|
||||||
|
if (csvLines[i].length > 0) {
|
||||||
|
points = csvLines[i].split(",");
|
||||||
|
dataPoints.push({
|
||||||
|
x: parseFloat(points[0]),
|
||||||
|
y: parseFloat(points[1])
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return dataPoints;
|
||||||
|
}
|
||||||
|
|
||||||
|
$.get("/datalog.csv", function(data) {
|
||||||
|
var chart = new CanvasJS.Chart("chartContainer", {
|
||||||
|
title: {
|
||||||
|
text: "Power Analyzer Graphics",
|
||||||
|
},
|
||||||
|
data: [{
|
||||||
|
type: "line",
|
||||||
|
dataPoints: getDataPointsFromCSV(data)
|
||||||
|
}]
|
||||||
|
});
|
||||||
|
|
||||||
|
chart.render();
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<script src="js/jquery.min.js"></script>
|
||||||
|
<script src="js/bootstrap.min.js"></script>
|
||||||
|
<script src="js/scripts.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -59,7 +59,7 @@
|
||||||
<span id="voltage"></span> V
|
<span id="voltage"></span> V
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<span id="shuntvoltage_V_min"></span> / <span id="shuntvoltage_V_max"></span>
|
<span id="busvoltage_V_min"></span> / <span id="busvoltage_V_max"></span>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="table-active">
|
<tr class="table-active">
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
platform = espressif32
|
platform = espressif32
|
||||||
board = nodemcu-32s
|
board = nodemcu-32s
|
||||||
framework = arduino
|
framework = arduino
|
||||||
lib_deps = ArduinoINA219, Wire, EEPROM, TaskScheduler, LiquidCrystal_I2C, ESPAsyncWifiManager, ESP Async WebServer, FS, ESP8266FtpServer
|
lib_deps = ArduinoINA219, Wire, TaskScheduler, LiquidCrystal_I2C, ESPAsyncWifiManager, ESP Async WebServer, FS, ESP8266FtpServer
|
||||||
board_build.partitions = partitions.csv
|
board_build.partitions = partitions.csv
|
||||||
monitor_port = COM6
|
monitor_port = COM6
|
||||||
monitor_speed = 115200
|
monitor_speed = 115200
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
#include <TaskScheduler.h>
|
#include <TaskScheduler.h>
|
||||||
#include <LiquidCrystal_I2C.h>
|
#include <LiquidCrystal_I2C.h>
|
||||||
#include <INA219.h>
|
#include <INA219.h>
|
||||||
#include <EEPROM.h>
|
#include <Preferences.h>
|
||||||
#include <ESPAsyncWebServer.h>
|
#include <ESPAsyncWebServer.h>
|
||||||
#include <ESPAsyncWiFiManager.h>
|
#include <ESPAsyncWiFiManager.h>
|
||||||
#include <SPIFFS.h>
|
#include <SPIFFS.h>
|
||||||
|
@ -21,6 +21,7 @@ AsyncWebServer server(80);
|
||||||
DNSServer dns;
|
DNSServer dns;
|
||||||
FtpServer ftpSrv;
|
FtpServer ftpSrv;
|
||||||
Scheduler task;
|
Scheduler task;
|
||||||
|
Preferences nvs;
|
||||||
|
|
||||||
//Konstanten
|
//Konstanten
|
||||||
#define R_SHUNT 0.001
|
#define R_SHUNT 0.001
|
||||||
|
@ -28,7 +29,7 @@ Scheduler task;
|
||||||
#define V_BUS_MAX 26
|
#define V_BUS_MAX 26
|
||||||
#define I_MAX_EXPECTED 60
|
#define I_MAX_EXPECTED 60
|
||||||
#define i2c_address 1
|
#define i2c_address 1
|
||||||
#define led_lowbat_pin 25
|
#define led_error_pin 25
|
||||||
#define led_run_pin 26
|
#define led_run_pin 26
|
||||||
#define button1_pin 14
|
#define button1_pin 14
|
||||||
#define button2_pin 17
|
#define button2_pin 17
|
||||||
|
@ -57,23 +58,17 @@ Task t2(1750, TASK_FOREVER, &lcd_header);
|
||||||
Task t3(10000, TASK_FOREVER, &read_bat);
|
Task t3(10000, TASK_FOREVER, &read_bat);
|
||||||
Task t4(300, TASK_FOREVER, &read_button);
|
Task t4(300, TASK_FOREVER, &read_button);
|
||||||
Task t5(30000, TASK_FOREVER, &data_logging);
|
Task t5(30000, TASK_FOREVER, &data_logging);
|
||||||
//Task t3(60000, TASK_FOREVER, &eeprom_save);
|
|
||||||
|
|
||||||
//Globale Variablen
|
//Globale Variablen
|
||||||
float shuntvoltage_V = 0, shuntvoltage_mV = 0, busvoltage_V = 0, busvoltage_mV = 0, current_A = 0, current_mA = 0, power_W = 0, power_mW = 0;
|
float shuntvoltage_V = 0, shuntvoltage_mV = 0, busvoltage_V = 0, busvoltage_mV = 0, current_A = 0, current_mA = 0, power_W = 0, power_mW = 0;
|
||||||
float shuntvoltage_V_max = 0, current_A_max = 0, power_W_max = 0, shuntvoltage_V_min = 0, current_A_min = 0, power_W_min = 0;
|
float busvoltage_V_max = 0, current_A_max = 0, power_W_max = 0, busvoltage_V_min = 0, current_A_min = 0, power_W_min = 0;
|
||||||
float Ah = 0, mAh = 0, Wh = 0, mWh = 0;
|
float Ah = 0, mAh = 0, Wh = 0, mWh = 0;
|
||||||
float battery_voltage, battery_average;
|
float battery_voltage, battery_average;
|
||||||
int i_header = 0;
|
int i_header = 0;
|
||||||
bool button1, button2, button3;
|
bool button1, button2, button3, button3long;
|
||||||
bool lcd_light = true, wifi_enabled = true, test_mode = false;
|
bool lcd_light = true, lcd_minmax = false, wifi_enabled = true, test_mode = false;
|
||||||
bool measuring_run = false, measuring_init = false, reset_actual = false, reset_minmax = false, battery_low = false;
|
bool measuring_run = false, measuring_init = false, reset_actual = false, reset_minmax = false, battery_low = false;
|
||||||
unsigned long lastread = 0;
|
unsigned long lastread = 0, tick, previousMillisReadData = 0, previousMillisDisplay = 0, data_timestamp = 0, button3timer = 0;
|
||||||
unsigned long tick;
|
|
||||||
unsigned long previousMillisReadData = 0;
|
|
||||||
unsigned long previousMillisDisplay = 0;
|
|
||||||
unsigned long data_timestamp = 0;
|
|
||||||
byte i2c_MasterCommand = 0;
|
|
||||||
|
|
||||||
//Custom LCD Characters
|
//Custom LCD Characters
|
||||||
byte grad[8] = {
|
byte grad[8] = {
|
||||||
|
@ -111,7 +106,7 @@ byte batterie[8] = {
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
//Setup GPIO
|
//Setup GPIO
|
||||||
pinMode(led_lowbat_pin, OUTPUT);
|
pinMode(led_error_pin, OUTPUT);
|
||||||
pinMode(led_run_pin, OUTPUT);
|
pinMode(led_run_pin, OUTPUT);
|
||||||
pinMode(button1_pin, INPUT_PULLUP);
|
pinMode(button1_pin, INPUT_PULLUP);
|
||||||
pinMode(button2_pin, INPUT_PULLUP);
|
pinMode(button2_pin, INPUT_PULLUP);
|
||||||
|
@ -151,7 +146,7 @@ void setup() {
|
||||||
})
|
})
|
||||||
.onError([](ota_error_t error) {
|
.onError([](ota_error_t error) {
|
||||||
lcd.setCursor(3,3);
|
lcd.setCursor(3,3);
|
||||||
lcd.print("Done.");
|
digitalWrite(led_error_pin, HIGH);
|
||||||
if (error == OTA_AUTH_ERROR) lcd.print("Auth Failed");
|
if (error == OTA_AUTH_ERROR) lcd.print("Auth Failed");
|
||||||
else if (error == OTA_BEGIN_ERROR) lcd.print("Begin Failed");
|
else if (error == OTA_BEGIN_ERROR) lcd.print("Begin Failed");
|
||||||
else if (error == OTA_CONNECT_ERROR) lcd.print("Connect Failed");
|
else if (error == OTA_CONNECT_ERROR) lcd.print("Connect Failed");
|
||||||
|
@ -162,48 +157,32 @@ void setup() {
|
||||||
ArduinoOTA.setPassword("powerlyzer");
|
ArduinoOTA.setPassword("powerlyzer");
|
||||||
ArduinoOTA.begin();
|
ArduinoOTA.begin();
|
||||||
|
|
||||||
//Init LCD and Custom Chars
|
//Init LCD, Custom Chars and test LEDs
|
||||||
lcd.init();
|
lcd.init();
|
||||||
lcd.backlight();
|
lcd.backlight();
|
||||||
lcd.createChar(0, grad);
|
lcd.createChar(0, grad);
|
||||||
lcd.createChar(1, sollwert);
|
lcd.createChar(1, sollwert);
|
||||||
lcd.createChar(2, batterie);
|
lcd.createChar(2, batterie);
|
||||||
digitalWrite(led_lowbat_pin, 255);
|
digitalWrite(led_error_pin, HIGH);
|
||||||
digitalWrite(led_run_pin, 255);
|
digitalWrite(led_run_pin, HIGH);
|
||||||
delay(1000);
|
delay(1000);
|
||||||
|
|
||||||
//Bootscreen
|
//Bootscreen
|
||||||
lcd.clear();
|
lcd.clear();
|
||||||
lcd.setCursor(4,0);
|
lcd.setCursor(4,0);
|
||||||
lcd.print("Power Analyzer");
|
lcd.print("Power Analyzer");
|
||||||
lcd.setCursor(7,1);
|
|
||||||
//lcd.print("Tracker");
|
|
||||||
lcd.setCursor(6,2);
|
lcd.setCursor(6,2);
|
||||||
lcd.print("V0.29 Beta");
|
lcd.print("V0.31 Beta");
|
||||||
lcd.setCursor(7,3);
|
lcd.setCursor(7,3);
|
||||||
lcd.print("CS,2018");
|
lcd.print("CS,2018");
|
||||||
lcd.write(1);
|
lcd.write(1);
|
||||||
|
|
||||||
//End Test Output PWM
|
//End Test LEDs
|
||||||
digitalWrite(led_lowbat_pin, 0);
|
|
||||||
digitalWrite(led_run_pin, 0);
|
|
||||||
delay(5000);
|
delay(5000);
|
||||||
|
digitalWrite(led_error_pin, LOW);
|
||||||
|
digitalWrite(led_run_pin, LOW);
|
||||||
lcd.clear();
|
lcd.clear();
|
||||||
|
|
||||||
/*
|
|
||||||
//Load Setpoint from EEPROM
|
|
||||||
lcd.setCursor(0,0);
|
|
||||||
lcd.print("Loading Setup from");
|
|
||||||
lcd.setCursor(0,1);
|
|
||||||
lcd.print("EEPROM...");
|
|
||||||
EEPROM.get(0, ee_setpoint);
|
|
||||||
setpoint = ee_setpoint;
|
|
||||||
delay(800);
|
|
||||||
lcd.setCursor(16,1);
|
|
||||||
lcd.print("Done");
|
|
||||||
delay(200);
|
|
||||||
*/
|
|
||||||
|
|
||||||
//Init Wi-Fi
|
//Init Wi-Fi
|
||||||
lcd.setCursor(0,0);
|
lcd.setCursor(0,0);
|
||||||
if (digitalRead(button3_pin)) {
|
if (digitalRead(button3_pin)) {
|
||||||
|
@ -247,7 +226,7 @@ void setup() {
|
||||||
})
|
})
|
||||||
.onError([](ota_error_t error) {
|
.onError([](ota_error_t error) {
|
||||||
lcd.setCursor(3,3);
|
lcd.setCursor(3,3);
|
||||||
lcd.print("Done.");
|
digitalWrite(led_error_pin, HIGH);
|
||||||
if (error == OTA_AUTH_ERROR) lcd.print("Auth Failed");
|
if (error == OTA_AUTH_ERROR) lcd.print("Auth Failed");
|
||||||
else if (error == OTA_BEGIN_ERROR) lcd.print("Begin Failed");
|
else if (error == OTA_BEGIN_ERROR) lcd.print("Begin Failed");
|
||||||
else if (error == OTA_CONNECT_ERROR) lcd.print("Connect Failed");
|
else if (error == OTA_CONNECT_ERROR) lcd.print("Connect Failed");
|
||||||
|
@ -276,7 +255,7 @@ void setup() {
|
||||||
lcd.setCursor(16,1);
|
lcd.setCursor(16,1);
|
||||||
lcd.print("Test");
|
lcd.print("Test");
|
||||||
test_mode = true;
|
test_mode = true;
|
||||||
delay(500);
|
delay(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Init Task Scheduler
|
//Init Task Scheduler
|
||||||
|
@ -288,6 +267,7 @@ void setup() {
|
||||||
task.addTask(t3);
|
task.addTask(t3);
|
||||||
task.addTask(t4);
|
task.addTask(t4);
|
||||||
task.addTask(t5);
|
task.addTask(t5);
|
||||||
|
|
||||||
//Init Filesystem and Webserver
|
//Init Filesystem and Webserver
|
||||||
SPIFFS.begin();
|
SPIFFS.begin();
|
||||||
server.on("/meas/run", HTTP_GET, web_measuring_run);
|
server.on("/meas/run", HTTP_GET, web_measuring_run);
|
||||||
|
@ -300,27 +280,35 @@ void setup() {
|
||||||
server.serveStatic("/img", SPIFFS, "/img");
|
server.serveStatic("/img", SPIFFS, "/img");
|
||||||
server.serveStatic("/", SPIFFS, "/").setDefaultFile("index.html");
|
server.serveStatic("/", SPIFFS, "/").setDefaultFile("index.html");
|
||||||
server.begin();
|
server.begin();
|
||||||
|
//Init FTP Server
|
||||||
ftpSrv.begin("power","analyzer");
|
ftpSrv.begin("power","analyzer");
|
||||||
delay(500);
|
delay(500);
|
||||||
lcd.setCursor(16,2);
|
lcd.setCursor(16,2);
|
||||||
lcd.print("Done");
|
lcd.print("Done");
|
||||||
delay(500);
|
delay(500);
|
||||||
|
|
||||||
|
//Finished initilization
|
||||||
lcd.setCursor(0,3);
|
lcd.setCursor(0,3);
|
||||||
lcd.print("Done. Starting up...");
|
lcd.print("Done. Starting up...");
|
||||||
delay(1500);
|
delay(1500);
|
||||||
|
|
||||||
//Display IP address
|
//Display IP address
|
||||||
if (wifi_enabled) {
|
if (wifi_enabled) {
|
||||||
lcd.clear();
|
lcd.clear();
|
||||||
lcd.setCursor(6,1);
|
lcd.setCursor(4,1);
|
||||||
lcd.print("IP address");
|
lcd.print("IP address");
|
||||||
lcd.setCursor(6,2);
|
lcd.setCursor(4,2);
|
||||||
lcd.print(WiFi.localIP());
|
lcd.print(WiFi.localIP());
|
||||||
delay(1500);
|
delay(1500);
|
||||||
}
|
}
|
||||||
//Load Default Screen
|
//Load Default Screen
|
||||||
lcd_init();
|
lcd_init();
|
||||||
|
|
||||||
|
//Fetch stored values
|
||||||
|
nvs.begin("usage", true);
|
||||||
|
Ah = nvs.getFloat("Ah");
|
||||||
|
Wh = nvs.getFloat("Wh");
|
||||||
|
nvs.end();
|
||||||
//Enable Tasks
|
//Enable Tasks
|
||||||
t1.enable();
|
t1.enable();
|
||||||
t2.enable();
|
t2.enable();
|
||||||
|
@ -332,23 +320,25 @@ void setup() {
|
||||||
void loop() {
|
void loop() {
|
||||||
//Exec TaskScheduler
|
//Exec TaskScheduler
|
||||||
task.execute();
|
task.execute();
|
||||||
|
|
||||||
|
//Service Handler
|
||||||
ftpSrv.handleFTP();
|
ftpSrv.handleFTP();
|
||||||
ArduinoOTA.handle();
|
ArduinoOTA.handle();
|
||||||
|
|
||||||
|
//High Precision Measuring
|
||||||
unsigned long currentMillis = millis();
|
unsigned long currentMillis = millis();
|
||||||
|
|
||||||
if ((unsigned long)(currentMillis - previousMillisReadData) >= 250) {
|
if ((unsigned long)(currentMillis - previousMillisReadData) >= 250) {
|
||||||
previousMillisReadData = millis();
|
previousMillisReadData = millis();
|
||||||
if (test_mode) {
|
if (test_mode) {
|
||||||
if (digitalRead(button1_pin)) {
|
if (digitalRead(button1_pin)) {
|
||||||
shuntvoltage_V += 1;
|
busvoltage_V += 1;
|
||||||
power_W += 1;
|
power_W += 1;
|
||||||
current_A += 1;
|
current_A += 1;
|
||||||
Ah += 1;
|
Ah += 1;
|
||||||
Wh += 1;
|
Wh += 1;
|
||||||
}
|
}
|
||||||
if (digitalRead(button2_pin)) {
|
if (digitalRead(button2_pin)) {
|
||||||
shuntvoltage_V -= 1;
|
busvoltage_V -= 1;
|
||||||
power_W -= 1;
|
power_W -= 1;
|
||||||
current_A -= 1;
|
current_A -= 1;
|
||||||
Ah -= 1;
|
Ah -= 1;
|
||||||
|
@ -361,6 +351,14 @@ void loop() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcd_print() {
|
void lcd_print() {
|
||||||
|
if (lcd_minmax) {
|
||||||
|
lcd.setCursor(1,1);
|
||||||
|
lcd.print(String(current_A_min) + String(" / ") + String(current_A_max) + String(" A"));
|
||||||
|
lcd.setCursor(1,2);
|
||||||
|
lcd.print(String(power_W_min) + String(" / ") + String(power_W_max) + String(" A"));
|
||||||
|
lcd.setCursor(1,3);
|
||||||
|
lcd.print(String(busvoltage_V_min) + String(" / ") + String(busvoltage_V_max) + String(" A"));
|
||||||
|
} else {
|
||||||
lcd.setCursor(0,1);
|
lcd.setCursor(0,1);
|
||||||
if (current_A < 100 && current_A >= 10) {lcd.print(" ");} else if (current_A < 10 && current_A >= 0) {lcd.print(" ");};
|
if (current_A < 100 && current_A >= 10) {lcd.print(" ");} else if (current_A < 10 && current_A >= 0) {lcd.print(" ");};
|
||||||
if (current_A > -100 && current_A <= -10) {lcd.print(" ");} else if (current_A > -10 && current_A < 0) {lcd.print(" ");};
|
if (current_A > -100 && current_A <= -10) {lcd.print(" ");} else if (current_A > -10 && current_A < 0) {lcd.print(" ");};
|
||||||
|
@ -376,6 +374,7 @@ void lcd_print() {
|
||||||
|
|
||||||
lcd.setCursor(11,1);
|
lcd.setCursor(11,1);
|
||||||
if (Ah < 1000 && Ah > 100) {lcd.print(" ");} else if (Ah < 100 && Ah >= 10) {lcd.print(" ");} else if (Ah < 10) {lcd.print(" ");};
|
if (Ah < 1000 && Ah > 100) {lcd.print(" ");} else if (Ah < 100 && Ah >= 10) {lcd.print(" ");} else if (Ah < 10) {lcd.print(" ");};
|
||||||
|
if (Ah > -100 && Ah <= -10) {lcd.print(" ");} else if (Ah > -10 && Ah < 0) {lcd.print(" ");};
|
||||||
lcd.print(Ah);
|
lcd.print(Ah);
|
||||||
|
|
||||||
lcd.setCursor(11,2);
|
lcd.setCursor(11,2);
|
||||||
|
@ -385,6 +384,7 @@ void lcd_print() {
|
||||||
lcd.setCursor(14,3);
|
lcd.setCursor(14,3);
|
||||||
if (battery_voltage > 3.4) {lcd.print(battery_voltage);} else {lcd.print("LOW ");}
|
if (battery_voltage > 3.4) {lcd.print(battery_voltage);} else {lcd.print("LOW ");}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void lcd_init() {
|
void lcd_init() {
|
||||||
lcd.clear();
|
lcd.clear();
|
||||||
|
@ -437,53 +437,9 @@ void lcd_header() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//Flash Battery Low LED
|
//Flash Battery Low LED
|
||||||
if (battery_low && digitalRead(led_lowbat_pin)) {
|
if (battery_low && digitalRead(led_error_pin)) {
|
||||||
digitalWrite(led_lowbat_pin,LOW);
|
digitalWrite(led_error_pin, LOW);
|
||||||
} else if (battery_low && digitalRead(led_lowbat_pin) == false) { digitalWrite(led_lowbat_pin,HIGH); }
|
} else if (battery_low && digitalRead(led_error_pin) == false) { digitalWrite(led_error_pin, HIGH); }
|
||||||
}
|
|
||||||
|
|
||||||
/*void eeprom_save() {
|
|
||||||
if (ee_setpoint != setpoint) {
|
|
||||||
EEPROM.put(0, setpoint);
|
|
||||||
ee_setpoint = setpoint;
|
|
||||||
lcd.setCursor(0,2);
|
|
||||||
lcd.print(" ");
|
|
||||||
lcd.setCursor(2,2);
|
|
||||||
lcd.print("EEProm written.");
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
void i2c_receive(int howMany){
|
|
||||||
i2c_MasterCommand = Wire.read();
|
|
||||||
}
|
|
||||||
|
|
||||||
void i2c_respond(){
|
|
||||||
|
|
||||||
int returnValue = 0;
|
|
||||||
|
|
||||||
switch(i2c_MasterCommand){
|
|
||||||
case 0: // No new command was received
|
|
||||||
Wire.write("Invalid Request");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 10:
|
|
||||||
returnValue = busvoltage_V;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 20:
|
|
||||||
returnValue = current_A;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 30:
|
|
||||||
returnValue = power_W;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
byte buffer[2];
|
|
||||||
buffer[0] = returnValue >> 8;
|
|
||||||
buffer[1] = returnValue & 255;
|
|
||||||
Wire.write(buffer, 2);
|
|
||||||
i2c_MasterCommand = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void readCurrent() {
|
void readCurrent() {
|
||||||
|
@ -510,8 +466,8 @@ void readCurrent() {
|
||||||
Wh += (power_W * tick)/3600000.0;
|
Wh += (power_W * tick)/3600000.0;
|
||||||
mWh = Wh * 1000;
|
mWh = Wh * 1000;
|
||||||
|
|
||||||
if (shuntvoltage_V_max < shuntvoltage_V) {
|
if (busvoltage_V_max < busvoltage_V) {
|
||||||
shuntvoltage_V_max = shuntvoltage_V;
|
busvoltage_V_max = busvoltage_V;
|
||||||
}
|
}
|
||||||
if (current_A_max < current_A) {
|
if (current_A_max < current_A) {
|
||||||
current_A_max = current_A;
|
current_A_max = current_A;
|
||||||
|
@ -519,8 +475,8 @@ void readCurrent() {
|
||||||
if (power_W_max < power_W) {
|
if (power_W_max < power_W) {
|
||||||
power_W_max = power_W;
|
power_W_max = power_W;
|
||||||
}
|
}
|
||||||
if (shuntvoltage_V_min > shuntvoltage_V) {
|
if (busvoltage_V_min > busvoltage_V) {
|
||||||
shuntvoltage_V_min = shuntvoltage_V;
|
busvoltage_V_min = busvoltage_V;
|
||||||
}
|
}
|
||||||
if (current_A_min > current_A) {
|
if (current_A_min > current_A) {
|
||||||
current_A_min = current_A;
|
current_A_min = current_A;
|
||||||
|
@ -534,22 +490,29 @@ void readCurrent() {
|
||||||
Wh = 0;
|
Wh = 0;
|
||||||
data_timestamp = 0;
|
data_timestamp = 0;
|
||||||
reset_actual = false;
|
reset_actual = false;
|
||||||
shuntvoltage_V_max = 0;
|
busvoltage_V_max = 0;
|
||||||
current_A_max = 0;
|
current_A_max = 0;
|
||||||
power_W_max = 0;
|
power_W_max = 0;
|
||||||
shuntvoltage_V_min = 0;
|
busvoltage_V_min = 0;
|
||||||
current_A_min = 0;
|
current_A_min = 0;
|
||||||
power_W_min = 0;
|
power_W_min = 0;
|
||||||
}
|
}
|
||||||
if (measuring_run && measuring_init == false) {
|
if (measuring_run && measuring_init == false) {
|
||||||
shuntvoltage_V_max = 0;
|
busvoltage_V_max = 0;
|
||||||
current_A_max = 0;
|
current_A_max = 0;
|
||||||
power_W_max = 0;
|
power_W_max = 0;
|
||||||
shuntvoltage_V_min = shuntvoltage_V;
|
busvoltage_V_min = busvoltage_V;
|
||||||
current_A_min = current_A;
|
current_A_min = current_A;
|
||||||
power_W_min = power_W;
|
power_W_min = power_W;
|
||||||
measuring_init = true;
|
measuring_init = true;
|
||||||
}
|
}
|
||||||
|
if (measuring_run == false && measuring_init) {
|
||||||
|
nvs.begin("usage", false);
|
||||||
|
nvs.putFloat("Ah", Ah);
|
||||||
|
nvs.putFloat("Wh", Wh);
|
||||||
|
nvs.end();
|
||||||
|
measuring_init = false;
|
||||||
|
}
|
||||||
lastread = newtime;
|
lastread = newtime;
|
||||||
ina219.recalibrate();
|
ina219.recalibrate();
|
||||||
ina219.reconfig();
|
ina219.reconfig();
|
||||||
|
@ -564,7 +527,7 @@ void read_bat() {
|
||||||
}
|
}
|
||||||
if (battery_voltage > 3.6 && battery_low) {
|
if (battery_voltage > 3.6 && battery_low) {
|
||||||
battery_low = false;
|
battery_low = false;
|
||||||
digitalWrite(led_lowbat_pin,LOW);
|
digitalWrite(led_error_pin,LOW);
|
||||||
lcd.backlight();
|
lcd.backlight();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -584,10 +547,16 @@ void read_button() {
|
||||||
}
|
}
|
||||||
if (digitalRead(button3_pin)) {
|
if (digitalRead(button3_pin)) {
|
||||||
button3 = false;
|
button3 = false;
|
||||||
|
button3long = false;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
button3 = true;
|
button3 = true;
|
||||||
|
button3timer = millis();
|
||||||
|
if (millis() - button3timer > 900) {
|
||||||
|
button3long = true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (button1 && test_mode == false) {
|
if (button1 && test_mode == false) {
|
||||||
reset_actual = true;
|
reset_actual = true;
|
||||||
}
|
}
|
||||||
|
@ -601,13 +570,18 @@ void read_button() {
|
||||||
} else {
|
} else {
|
||||||
digitalWrite(led_run_pin,false);
|
digitalWrite(led_run_pin,false);
|
||||||
}
|
}
|
||||||
if (button3 && lcd_light) {
|
if (button3 && button3long && lcd_light) {
|
||||||
lcd_light = false;
|
lcd_light = false;
|
||||||
lcd.noBacklight();
|
lcd.noBacklight();
|
||||||
} else if (button3 && lcd_light == false) {
|
} else if (button3 && button3long && lcd_light == false) {
|
||||||
lcd_light = true;
|
lcd_light = true;
|
||||||
lcd.backlight();
|
lcd.backlight();
|
||||||
}
|
}
|
||||||
|
if (button3 && lcd_minmax == false) {
|
||||||
|
lcd_minmax = true;
|
||||||
|
} else if (button3 && lcd_minmax) {
|
||||||
|
lcd_minmax = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void web_measuring_stop(AsyncWebServerRequest *request) {
|
void web_measuring_stop(AsyncWebServerRequest *request) {
|
||||||
|
@ -633,7 +607,7 @@ void web_get_values(AsyncWebServerRequest *request) {
|
||||||
else {
|
else {
|
||||||
web_status = "Stopped";
|
web_status = "Stopped";
|
||||||
}
|
}
|
||||||
request->send( 200, "application/json", "{\"voltage\":" + String(busvoltage_V) + ", \"current\":" + String(current_A) + ", \"power\":" + String(power_W) + ", \"Ah\":" + String(Ah) + ", \"Wh\":" + String(Wh) + ", \"battery\": " + String(battery_voltage) + ", \"run\":\"" + String(web_status) + "\", \"shuntvoltage_V_max\":" + String(shuntvoltage_V_max) + ", \"shuntvoltage_V_min\":" + String(shuntvoltage_V_min) + ", \"current_A_max\":" + String(current_A_max) + ", \"current_A_min\":" + String(current_A_min) + ", \"power_W_max\":" + String(power_W_max) + ", \"power_W_min\":" + String(power_W_min) + "}");
|
request->send( 200, "application/json", "{\"voltage\":" + String(busvoltage_V) + ", \"current\":" + String(current_A) + ", \"power\":" + String(power_W) + ", \"Ah\":" + String(Ah) + ", \"Wh\":" + String(Wh) + ", \"battery\": " + String(battery_voltage) + ", \"run\":\"" + String(web_status) + "\", \"busvoltage_V_max\":" + String(busvoltage_V_max) + ", \"busvoltage_V_min\":" + String(busvoltage_V_min) + ", \"current_A_max\":" + String(current_A_max) + ", \"current_A_min\":" + String(current_A_min) + ", \"power_W_max\":" + String(power_W_max) + ", \"power_W_min\":" + String(power_W_min) + "}");
|
||||||
}
|
}
|
||||||
|
|
||||||
void data_logging() {
|
void data_logging() {
|
||||||
|
|
Loading…
Reference in a new issue