diff --git a/airrohr-firmware/airrohr-cfg.h b/airrohr-firmware/airrohr-cfg.h
index b72d6383..49aee7e7 100644
--- a/airrohr-firmware/airrohr-cfg.h
+++ b/airrohr-firmware/airrohr-cfg.h
@@ -93,6 +93,10 @@ enum ConfigShapeId {
Config_pwd_influx,
Config_measurement_name_influx,
Config_ssl_influx,
+ Config_enable_battery_monitor,
+ Config_battery_u_min,
+ Config_battery_u_max,
+ Config_adc_divider_u_max,
};
static constexpr char CFG_KEY_CURRENT_LANG[] PROGMEM = "current_lang";
static constexpr char CFG_KEY_WLANSSID[] PROGMEM = "wlanssid";
@@ -162,6 +166,10 @@ static constexpr char CFG_KEY_USER_INFLUX[] PROGMEM = "user_influx";
static constexpr char CFG_KEY_PWD_INFLUX[] PROGMEM = "pwd_influx";
static constexpr char CFG_KEY_MEASUREMENT_NAME_INFLUX[] PROGMEM = "measurement_name_influx";
static constexpr char CFG_KEY_SSL_INFLUX[] PROGMEM = "ssl_influx";
+static constexpr char CFG_KEY_ENABLE_BATTERY_MONITOR[] PROGMEM = "enable_battery_monitor";
+static constexpr char CFG_KEY_BATTERY_U_MIN[] PROGMEM = "battery_u_min";
+static constexpr char CFG_KEY_BATTERY_U_MAX[] PROGMEM = "battery_u_max";
+static constexpr char CFG_KEY_ADC_DIVIDER_U_MAX[] PROGMEM = "adc_divider_u_max";
static constexpr ConfigShapeEntry configShape[] PROGMEM = {
{ Config_Type_String, sizeof(cfg::current_lang)-1, CFG_KEY_CURRENT_LANG, cfg::current_lang },
{ Config_Type_String, sizeof(cfg::wlanssid)-1, CFG_KEY_WLANSSID, cfg::wlanssid },
@@ -231,4 +239,8 @@ static constexpr ConfigShapeEntry configShape[] PROGMEM = {
{ Config_Type_Password, sizeof(cfg::pwd_influx)-1, CFG_KEY_PWD_INFLUX, cfg::pwd_influx },
{ Config_Type_String, sizeof(cfg::measurement_name_influx)-1, CFG_KEY_MEASUREMENT_NAME_INFLUX, cfg::measurement_name_influx },
{ Config_Type_Bool, 0, CFG_KEY_SSL_INFLUX, &cfg::ssl_influx },
+ { Config_Type_Bool, 0, CFG_KEY_ENABLE_BATTERY_MONITOR, &cfg::enable_battery_monitor },
+ { Config_Type_UInt, 0, CFG_KEY_BATTERY_U_MIN, &cfg::battery_u_min },
+ { Config_Type_UInt, 0, CFG_KEY_BATTERY_U_MAX, &cfg::battery_u_max },
+ { Config_Type_UInt, 0, CFG_KEY_ADC_DIVIDER_U_MAX, &cfg::adc_divider_u_max },
};
diff --git a/airrohr-firmware/airrohr-cfg.h.py b/airrohr-firmware/airrohr-cfg.h.py
index dcc603cf..e3d2b339 100755
--- a/airrohr-firmware/airrohr-cfg.h.py
+++ b/airrohr-firmware/airrohr-cfg.h.py
@@ -69,6 +69,10 @@
Password pwd_influx
String measurement_name_influx
Bool ssl_influx
+Bool enable_battery_monitor
+UInt battery_u_min
+UInt battery_u_max
+UInt adc_divider_u_max
"""
with open("airrohr-cfg.h", "w") as h:
diff --git a/airrohr-firmware/airrohr-firmware.ino b/airrohr-firmware/airrohr-firmware.ino
index a351885b..8e5a8994 100644
--- a/airrohr-firmware/airrohr-firmware.ino
+++ b/airrohr-firmware/airrohr-firmware.ino
@@ -201,6 +201,14 @@ namespace cfg {
bool display_wifi_info = DISPLAY_WIFI_INFO;
bool display_device_info = DISPLAY_DEVICE_INFO;
+ // ADC settings
+ unsigned adc_divider_u_max = ADC_DIVIDER_U_MAX;
+
+ // battery monitor measurement settings
+ bool enable_battery_monitor = ENABLE_BATTERY_MONITOR;
+ unsigned battery_u_max = BATTERY_U_MAX;
+ unsigned battery_u_min = BATTERY_U_MIN;
+
// API settings
bool ssl_madavi = SSL_MADAVI;
bool ssl_dusti = SSL_SENSORCOMMUNITY;
@@ -362,6 +370,8 @@ unsigned long act_milli;
unsigned long last_micro = 0;
unsigned long min_micro = 1000000000;
unsigned long max_micro = 0;
+unsigned long battery_start_time;
+unsigned long battery_monitor_period;
bool is_SDS_running = true;
enum {
@@ -377,7 +387,6 @@ unsigned long last_update_attempt;
int last_update_returncode;
int last_sendData_returncode;
-
float last_value_BMP_T = -128.0;
float last_value_BMP_P = -1.0;
float last_value_BMX280_T = -128.0;
@@ -493,6 +502,11 @@ String last_data_string;
int last_signal_strength;
int last_disconnect_reason;
+uint32_t battery_analog_value = 0;
+uint32_t battery_charge = 0;
+uint32_t battery_sum = 0;
+uint32_t battery_val_count = 0;
+
String esp_chipid;
String esp_mac_id;
String last_value_SDS_version;
@@ -1161,6 +1175,33 @@ static void webserver_config_send_body_get(String& page_content) {
add_form_input(page_content, Config_static_dns, FPSTR(INTL_STATIC_DNS), 15);
page_content += FPSTR(BR_TAG);
+ server.sendContent(page_content);
+ page_content = emptyString;
+
+ page_content += FPSTR(BR_TAG);
+ add_form_checkbox(Config_enable_battery_monitor, FPSTR(INTL_ENABLE_BATTERY_MONITOR));
+ page_content += F("
");
+ add_form_input(page_content, Config_battery_u_min, FPSTR(INTL_BATTERY_U_MIN), 5);
+ add_form_input(page_content, Config_battery_u_max, FPSTR(INTL_BATTERY_U_MAX), 5);
+ add_form_input(page_content, Config_adc_divider_u_max, FPSTR(INTL_ADC_DIVIDER_U_MAX), 5);
+ page_content += FPSTR(TABLE_TAG_CLOSE_BR);
+
+ page_content += F("");
+
server.sendContent(page_content);
page_content = FPSTR(WEB_BR_LF_B);
page_content += F(INTL_FIRMWARE " ");
@@ -1680,6 +1721,11 @@ static void webserver_status() {
page_content += FPSTR(EMPTY_ROW);
add_table_row_from_value(page_content, FPSTR(SENSORS_SDS011), last_value_SDS_version);
}
+ if (cfg::enable_battery_monitor){
+ // String battery_state = F(String(battery_charge) + " % (" + String(battery_analog_value / 1000.0) + "V)");
+ String battery_state = String(battery_charge) + " % (" + String(battery_analog_value / 1000.0) + "V)";
+ add_table_row_from_value(page_content, FPSTR(INTL_BATTERY_CHARGE), battery_state);
+ }
if (cfg::scd30_read) {
if (scd30.getAutoSelfCalibration() == true)
add_table_row_from_value(page_content, F("SCD30 Auto Calibration"), "enabled");
@@ -1692,7 +1738,6 @@ static void webserver_status() {
add_table_row_from_value(page_content, F("SCD30 temperature offset"), String(settingVal));
}
-
page_content += FPSTR(EMPTY_ROW);
page_content += F("" INTL_ERROR " |
");
String wifiStatus(WiFi_error_count);
@@ -3393,6 +3438,55 @@ static void fetchSensorSPS30(String& s) {
debug_outln_verbose(FPSTR(DBG_TXT_END_READING), FPSTR(SENSORS_SPS30));
}
+/*****************************************************************
+ read Battery voltage
+ *****************************************************************/
+static void readBatteryVoltage() {
+ battery_val_count++;
+ if(battery_val_count > 3){
+ battery_sum = 0;
+ if(msSince(battery_monitor_period) <= READINGTIME_ADC_MS)
+ return;
+
+ battery_monitor_period = act_milli;
+ battery_val_count = 0;
+ return;
+ }
+
+ String dbg_reading = "Battery voltage #" + String(battery_val_count);
+ debug_outln_verbose(FPSTR(DBG_TXT_START_READING), dbg_reading);
+ battery_sum += analogRead(ADC_PIN);
+
+ float battery_avg_value = battery_sum / static_cast(battery_val_count);
+ float ratio = cfg::adc_divider_u_max / static_cast(ADC_RANGE_MAX);
+ battery_analog_value = round(battery_avg_value * ratio);
+ debug_outln_verbose(F("Battery analog value (mV): "), String(battery_analog_value));
+ String bat_min_max = String(cfg::battery_u_min) + " / " + String(cfg::battery_u_max);
+
+ // This will fix issues with the map() function when the value of the 'battery_analog_value' is outside of the predefined range by any circumstances.
+ uint32_t battery_voltage = (battery_analog_value < (uint32_t)cfg::battery_u_min) ? (uint32_t)cfg::battery_u_min : battery_analog_value;
+ battery_voltage = (battery_voltage > (uint32_t)cfg::battery_u_max) ? (uint32_t)cfg::battery_u_max : battery_voltage;
+
+ battery_charge = map(battery_voltage, cfg::battery_u_min, cfg::battery_u_max, 0, 100);
+
+ debug_outln_verbose(F("Battery capacity (%): "), String(battery_charge));
+ debug_outln_verbose(FPSTR(DBG_TXT_END_READING), F("Battery voltage"));
+
+ battery_monitor_period = act_milli;
+}
+
+/*****************************************************************
+ send Battery status
+ *****************************************************************/
+static void sendBatteryStatus(String& s) {
+ float battery_voltage = battery_analog_value / 1000.0;
+ add_Value2Json(s, F("Battery_voltage"), String(battery_voltage));
+ add_Value2Json(s, F("battery_charge"), String(battery_charge));
+ debug_outln_info(F("Battery (V): "), String(battery_voltage));
+ debug_outln_info(F("Battery (%): "), String(battery_charge));
+ debug_outln_info(FPSTR(DBG_TXT_SEP));
+}
+
/*****************************************************************
read DNMS values
*****************************************************************/
@@ -4442,6 +4536,7 @@ void setup(void) {
esp_mac_id.replace(":", "");
esp_mac_id.toLowerCase();
#endif
+ pinMode(A0, INPUT);
#if defined(ESP32)
uint64_t chipid_num;
chipid_num = ESP.getEfuseMac();
@@ -4488,6 +4583,7 @@ void setup(void) {
starttime = millis(); // store the start time
last_update_attempt = time_point_device_start_ms = starttime;
last_display_millis = starttime_SDS = starttime;
+ battery_start_time = starttime;
}
/*****************************************************************
@@ -4496,7 +4592,7 @@ void setup(void) {
void loop(void) {
String result_PPD, result_SDS, result_PMS, result_HPM;
String result_GPS, result_DNMS;
-
+ String result_BAT;
unsigned sum_send_time = 0;
@@ -4551,6 +4647,13 @@ void loop(void) {
}
}
+ if(cfg::enable_battery_monitor && !send_now){
+ if (msSince(battery_start_time) > SAMPLETIME_BAT_MS){
+ battery_start_time = act_milli;
+ readBatteryVoltage();
+ }
+ }
+
if (cfg::ppd_read) {
fetchSensorPPD(result_PPD);
}
@@ -4685,12 +4788,18 @@ void loop(void) {
sum_send_time += sendSensorCommunity(result_GPS, GPS_API_PIN, F("GPS"), "GPS_");
result = emptyString;
}
+
add_Value2Json(data, F("samples"), String(sample_count));
add_Value2Json(data, F("min_micro"), String(min_micro));
add_Value2Json(data, F("max_micro"), String(max_micro));
add_Value2Json(data, F("interval"), String(cfg::sending_intervall_ms));
add_Value2Json(data, F("signal"), String(last_signal_strength));
+ if(cfg::enable_battery_monitor){
+ sendBatteryStatus(result_BAT);
+ data += result_BAT;
+ }
+
if ((unsigned)(data.lastIndexOf(',') + 1) == data.length()) {
data.remove(data.length() - 1);
}
diff --git a/airrohr-firmware/defines.h b/airrohr-firmware/defines.h
index e1ce0978..e6b33aa9 100644
--- a/airrohr-firmware/defines.h
+++ b/airrohr-firmware/defines.h
@@ -58,6 +58,8 @@ constexpr const unsigned long DISPLAY_UPDATE_INTERVAL_MS = 5000; // time be
constexpr const unsigned long ONE_DAY_IN_MS = 24 * 60 * 60 * 1000;
constexpr const unsigned long PAUSE_BETWEEN_UPDATE_ATTEMPTS_MS = ONE_DAY_IN_MS; // check for firmware updates once a day
constexpr const unsigned long DURATION_BEFORE_FORCED_RESTART_MS = ONE_DAY_IN_MS * 28; // force a reboot every ~4 weeks
+constexpr const unsigned long READINGTIME_ADC_MS = 10000;
+constexpr const unsigned long SAMPLETIME_BAT_MS = 1000;
// Definition GPIOs for Zero based Arduino Feather M0 LoRaWAN
#if defined(ARDUINO_SAMD_ZERO) && defined(SERIAL_PORT_USBVIRTUAL)
diff --git a/airrohr-firmware/ext_def.h b/airrohr-firmware/ext_def.h
index e776e4cb..210969e4 100644
--- a/airrohr-firmware/ext_def.h
+++ b/airrohr-firmware/ext_def.h
@@ -125,6 +125,9 @@ static const char MEASUREMENT_NAME_INFLUX[] PROGMEM = "feinstaub";
// PPD42NS, the cheaper version of the particle sensor
#define PPD_PIN_PM1 GPS_SERIAL_TX
#define PPD_PIN_PM2 GPS_SERIAL_RX
+
+#define ADC_PIN A0
+#define ADC_RANGE_MAX 1023
#endif
@@ -163,6 +166,9 @@ static const char MEASUREMENT_NAME_INFLUX[] PROGMEM = "feinstaub";
//#define RFM69_CS D0
//#define RFM69_RST D2
//#define RFM69_INT D4
+
+#define ADC_PIN 36
+#define ADC_RANGE_MAX 4095
#endif
// === pin assignments for lolin_d32_pro board ===================================
@@ -287,7 +293,7 @@ static const char MEASUREMENT_NAME_INFLUX[] PROGMEM = "feinstaub";
#define MHZ19_READ 0
// automatic firmware updates
-#define AUTO_UPDATE 1
+#define AUTO_UPDATE 0
// use beta firmware
#define USE_BETA 0
@@ -319,5 +325,14 @@ static const char MEASUREMENT_NAME_INFLUX[] PROGMEM = "feinstaub";
// Show device info on displays
#define DISPLAY_DEVICE_INFO 1
+#define ENABLE_BATTERY_MONITOR 0
+
+// Adc preset maximum input voltage applied to the voltage devider's input
+#define ADC_DIVIDER_U_MAX 5120
+
+// Battery preset fully charged and discharged states voltages
+#define BATTERY_U_MAX 4200
+#define BATTERY_U_MIN 2800
+
// Set debug level for serial output?
#define DEBUG 3
diff --git a/airrohr-firmware/html-content.h b/airrohr-firmware/html-content.h
index bc820f33..3afe0bc8 100644
--- a/airrohr-firmware/html-content.h
+++ b/airrohr-firmware/html-content.h
@@ -23,6 +23,8 @@ const char DBG_TXT_CONNECTING_TO[] PROGMEM = "Connecting to ";
const char DBG_TXT_FOUND[] PROGMEM = " ... found";
const char DBG_TXT_NOT_FOUND[] PROGMEM = " ... not found";
const char DBG_TXT_SEP[] PROGMEM = "----";
+const char DBG_TXT_VOLTAGE[] PROGMEM = "Voltage (V): ";
+const char DBG_TXT_CAPACITY[] PROGMEM = "Capacity (%): ";
const char SENSORS_SDS011[] PROGMEM = "SDS011";
const char SENSORS_PPD42NS[] PROGMEM = "PPD42NS";
diff --git a/airrohr-firmware/intl_bg.h b/airrohr-firmware/intl_bg.h
index 4cdb7734..9c5cf892 100644
--- a/airrohr-firmware/intl_bg.h
+++ b/airrohr-firmware/intl_bg.h
@@ -124,6 +124,11 @@ const char INTL_SIGNAL_QUALITY[] PROGMEM = "Качество на сигнала
#define INTL_SENSOR "Сензор"
#define INTL_PARAMETER "Параметър"
#define INTL_VALUE "Стойност"
+const char INTL_ENABLE_BATTERY_MONITOR[] PROGMEM = "Активиране на монитора на батерията";
+const char INTL_BATTERY_CHARGE[] PROGMEM = "Заряд на батерията";
+const char INTL_BATTERY_U_MIN[] PROGMEM = "U min на батерията (mV):";
+const char INTL_BATTERY_U_MAX[] PROGMEM = "U max на батерията (mV):";
+const char INTL_ADC_DIVIDER_U_MAX[] PROGMEM = "U max при делителя на АЦП (mV):";
//const char LUFTDATEN_INFO_LOGO_SVG[] PROGMEM = "";
diff --git a/airrohr-firmware/intl_cn.h b/airrohr-firmware/intl_cn.h
index a0c9a839..3fff5c0d 100644
--- a/airrohr-firmware/intl_cn.h
+++ b/airrohr-firmware/intl_cn.h
@@ -125,5 +125,11 @@ const char INTL_SIGNAL_QUALITY[] PROGMEM = "信号质量";
#define INTL_SENSOR "传感器"
#define INTL_PARAMETER "参数"
#define INTL_VALUE "价值"
+const char INTL_ENABLE_BATTERY_MONITOR[] PROGMEM = "启用电池监控器";
+const char INTL_BATTERY_CHARGE[] PROGMEM = "电池充电";
+const char INTL_BATTERY_U_MIN[] PROGMEM = "电池 U min (mV)";
+const char INTL_BATTERY_U_MAX[] PROGMEM = "电池 U max (mV)";
+const char INTL_ADC_DIVIDER_U_MAX[] PROGMEM = "ADC分频器 U max (mV)";
+
#include "./airrohr-logo-common.h"
diff --git a/airrohr-firmware/intl_cz.h b/airrohr-firmware/intl_cz.h
index cdd26d79..a5b0ca99 100644
--- a/airrohr-firmware/intl_cz.h
+++ b/airrohr-firmware/intl_cz.h
@@ -125,5 +125,10 @@ const char INTL_SIGNAL_QUALITY[] PROGMEM = "Kvalita signálu";
#define INTL_SENSOR "Modul"
#define INTL_PARAMETER "Parametr"
#define INTL_VALUE "Hodnota"
+const char INTL_ENABLE_BATTERY_MONITOR[] PROGMEM = "Povolit sledování baterie";
+const char INTL_BATTERY_CHARGE[] PROGMEM = "Nabíjení baterie";
+const char INTL_BATTERY_U_MIN[] PROGMEM = "Baterie U min (mV):";
+const char INTL_BATTERY_U_MAX[] PROGMEM = "Baterie U max (mV):";
+const char INTL_ADC_DIVIDER_U_MAX[] PROGMEM = "Dělič ADP U max (mV):";
#include "./airrohr-logo-common.h"
diff --git a/airrohr-firmware/intl_de.h b/airrohr-firmware/intl_de.h
index 52860420..7c86501c 100644
--- a/airrohr-firmware/intl_de.h
+++ b/airrohr-firmware/intl_de.h
@@ -125,5 +125,10 @@ const char INTL_SIGNAL_QUALITY[] PROGMEM = "Qualität";
#define INTL_SENSOR "Sensor"
#define INTL_PARAMETER "Parameter"
#define INTL_VALUE "Wert"
+const char INTL_ENABLE_BATTERY_MONITOR[] PROGMEM = "Batteriemonitor aktivieren";
+const char INTL_BATTERY_CHARGE[] PROGMEM = "Batterieladung";
+const char INTL_BATTERY_U_MIN[] PROGMEM = "Batterie U min (mV):";
+const char INTL_BATTERY_U_MAX[] PROGMEM = "Batterie U max (mV):";
+const char INTL_ADC_DIVIDER_U_MAX[] PROGMEM = "ADW teiler U max (mV)";
#include "./airrohr-logo-common.h"
diff --git a/airrohr-firmware/intl_dk.h b/airrohr-firmware/intl_dk.h
index b29c9248..c74474a6 100644
--- a/airrohr-firmware/intl_dk.h
+++ b/airrohr-firmware/intl_dk.h
@@ -125,5 +125,10 @@ const char INTL_SIGNAL_QUALITY[] PROGMEM = "Kvalitet";
#define INTL_SENSOR "Sensor"
#define INTL_PARAMETER "Parameter"
#define INTL_VALUE "Værdi"
+const char INTL_ENABLE_BATTERY_MONITOR[] PROGMEM = "Aktivér batteriskærm";
+const char INTL_BATTERY_CHARGE[] PROGMEM = "Batteriopladning";
+const char INTL_BATTERY_U_MIN[] PROGMEM = "Batteri U min (mV):";
+const char INTL_BATTERY_U_MAX[] PROGMEM = "Batteri U max (mV):";
+const char INTL_ADC_DIVIDER_U_MAX[] PROGMEM = "ADK divider U max (mV):";
#include "./airrohr-logo-common.h"
diff --git a/airrohr-firmware/intl_ee.h b/airrohr-firmware/intl_ee.h
index da806af8..57a1ff5b 100644
--- a/airrohr-firmware/intl_ee.h
+++ b/airrohr-firmware/intl_ee.h
@@ -125,5 +125,10 @@ const char INTL_SIGNAL_QUALITY[] PROGMEM = "signaali kvaliteet";
#define INTL_SENSOR "Andur"
#define INTL_PARAMETER "Parameeter"
#define INTL_VALUE "Väärtus"
+const char INTL_ENABLE_BATTERY_MONITOR[] PROGMEM = "Luba aku monitor";
+const char INTL_BATTERY_CHARGE[] PROGMEM = "Aku laadimine";
+const char INTL_BATTERY_U_MIN[] PROGMEM = "Aku U min (mV)";
+const char INTL_BATTERY_U_MAX[] PROGMEM = "Aku U max (mV)";
+const char INTL_ADC_DIVIDER_U_MAX[] PROGMEM = "ADC eraldaja U max (mV)";
#include "./airrohr-logo-common.h"
diff --git a/airrohr-firmware/intl_en.h b/airrohr-firmware/intl_en.h
index 90899e9b..72706f45 100644
--- a/airrohr-firmware/intl_en.h
+++ b/airrohr-firmware/intl_en.h
@@ -125,5 +125,10 @@ const char INTL_SIGNAL_QUALITY[] PROGMEM = "signal quality";
#define INTL_SENSOR "Sensor"
#define INTL_PARAMETER "Parameter"
#define INTL_VALUE "Value"
+const char INTL_ENABLE_BATTERY_MONITOR[] PROGMEM = "Enable battery monitor";
+const char INTL_BATTERY_CHARGE[] PROGMEM = "Battery charge";
+const char INTL_BATTERY_U_MIN[] PROGMEM = "Battery U min (mV)";
+const char INTL_BATTERY_U_MAX[] PROGMEM = "Battery U max (mV)";
+const char INTL_ADC_DIVIDER_U_MAX[] PROGMEM = "ADC divider U max (mV)";
#include "./airrohr-logo-common.h"
diff --git a/airrohr-firmware/intl_es.h b/airrohr-firmware/intl_es.h
index d0fe0f27..dbb14017 100644
--- a/airrohr-firmware/intl_es.h
+++ b/airrohr-firmware/intl_es.h
@@ -124,5 +124,10 @@ const char INTL_SIGNAL_QUALITY[] PROGMEM = "Calidad de Señal";
#define INTL_SENSOR "Sensor"
#define INTL_PARAMETER "Parámetro"
#define INTL_VALUE "Valor"
+const char INTL_ENABLE_BATTERY_MONITOR[] PROGMEM = "Habilitar monitor de batería";
+const char INTL_BATTERY_CHARGE[] PROGMEM = "Bateria cargada";
+const char INTL_BATTERY_U_MIN[] PROGMEM = "Batería U min (mV):";
+const char INTL_BATTERY_U_MAX[] PROGMEM = "Batería U max (mV):";
+const char INTL_ADC_DIVIDER_U_MAX[] PROGMEM = "Divisor CAD U max (mV):";
#include "./airrohr-logo-common.h"
diff --git a/airrohr-firmware/intl_fi.h b/airrohr-firmware/intl_fi.h
index 3efa03b2..ab5f3517 100644
--- a/airrohr-firmware/intl_fi.h
+++ b/airrohr-firmware/intl_fi.h
@@ -125,5 +125,10 @@ const char INTL_SIGNAL_QUALITY[] PROGMEM = "signaalin laatu";
#define INTL_SENSOR "Anturi"
#define INTL_PARAMETER "Parametri"
#define INTL_VALUE "Arvo"
+const char INTL_ENABLE_BATTERY_MONITOR[] PROGMEM = "Ota akkumonitori käyttöön";
+const char INTL_BATTERY_CHARGE[] PROGMEM = "Akun varaus";
+const char INTL_BATTERY_U_MIN[] PROGMEM = "Akku U min (mV)";
+const char INTL_BATTERY_U_MAX[] PROGMEM = "Akku U max (mV)";
+const char INTL_ADC_DIVIDER_U_MAX[] PROGMEM = "ADC-jakaja U max (mV)";
#include "./airrohr-logo-common.h"
diff --git a/airrohr-firmware/intl_fr.h b/airrohr-firmware/intl_fr.h
index bcb22c2a..f7dae8ab 100644
--- a/airrohr-firmware/intl_fr.h
+++ b/airrohr-firmware/intl_fr.h
@@ -124,5 +124,10 @@ const char INTL_SIGNAL_QUALITY[] PROGMEM = "Qualité du signal";
#define INTL_SENSOR "Capteur"
#define INTL_PARAMETER "Paramètres"
#define INTL_VALUE "Valeur"
+const char INTL_ENABLE_BATTERY_MONITOR[] PROGMEM = "Activer le moniteur de batterie";
+const char INTL_BATTERY_CHARGE[] PROGMEM = "Charge de la batterie";
+const char INTL_BATTERY_U_MIN[] PROGMEM = "Batterie U min (mV):";
+const char INTL_BATTERY_U_MAX[] PROGMEM = "Batterie U max (mV):";
+const char INTL_ADC_DIVIDER_U_MAX[] PROGMEM = "Diviseur de CAN U max (mV):";
#include "./airrohr-logo-common.h"
diff --git a/airrohr-firmware/intl_gr.h b/airrohr-firmware/intl_gr.h
index e064a779..c55d3264 100644
--- a/airrohr-firmware/intl_gr.h
+++ b/airrohr-firmware/intl_gr.h
@@ -125,5 +125,10 @@ const char INTL_SIGNAL_QUALITY[] PROGMEM = "ποιότητα σήματος";
#define INTL_SENSOR "Αισθητήρας"
#define INTL_PARAMETER "Παράμετρος"
#define INTL_VALUE "Αξία"
+const char INTL_ENABLE_BATTERY_MONITOR[] PROGMEM = "Ενεργοποίηση οθόνης μπαταρίας";
+const char INTL_BATTERY_CHARGE[] PROGMEM = "Φόρτιση μπαταρίας";
+const char INTL_BATTERY_U_MIN[] PROGMEM = "Μπαταρία U min (mV)";
+const char INTL_BATTERY_U_MAX[] PROGMEM = "Μπαταρία U max (mV)";
+const char INTL_ADC_DIVIDER_U_MAX[] PROGMEM = "Διαχωριστικό ADC U max (mV)";
#include "./airrohr-logo-common.h"
diff --git a/airrohr-firmware/intl_hu.h b/airrohr-firmware/intl_hu.h
index 126a30f8..f5a17bde 100644
--- a/airrohr-firmware/intl_hu.h
+++ b/airrohr-firmware/intl_hu.h
@@ -125,5 +125,10 @@ const char INTL_SIGNAL_QUALITY[] PROGMEM = "Jelminőség";
#define INTL_SENSOR "Szenzor"
#define INTL_PARAMETER "Paraméter"
#define INTL_VALUE "Érték"
+const char INTL_ENABLE_BATTERY_MONITOR[] PROGMEM = "Engedélyezze az akkumulátorfigyelőt";
+const char INTL_BATTERY_CHARGE[] PROGMEM = "Akkumulátortöltő";
+const char INTL_BATTERY_U_MIN[] PROGMEM = "Akkumulátor U min (mV):";
+const char INTL_BATTERY_U_MAX[] PROGMEM = "Akkumulátor U max (mV):";
+const char INTL_ADC_DIVIDER_U_MAX[] PROGMEM = "ADA elválasztó U max (mV):";
#include "./airrohr-logo-common.h"
diff --git a/airrohr-firmware/intl_it.h b/airrohr-firmware/intl_it.h
index f5fdb2de..2c96d97f 100644
--- a/airrohr-firmware/intl_it.h
+++ b/airrohr-firmware/intl_it.h
@@ -124,5 +124,10 @@ const char INTL_SIGNAL_QUALITY[] PROGMEM = "Qualità del segnale";
#define INTL_SENSOR "Sensore"
#define INTL_PARAMETER "Parametro"
#define INTL_VALUE "Valore"
+const char INTL_ENABLE_BATTERY_MONITOR[] PROGMEM = "Abilita il monitoraggio della batteria";
+const char INTL_BATTERY_CHARGE[] PROGMEM = "Carica batterie";
+const char INTL_BATTERY_U_MIN[] PROGMEM = "Batteria U min (mV):";
+const char INTL_BATTERY_U_MAX[] PROGMEM = "Batteria U max (mV):";
+const char INTL_ADC_DIVIDER_U_MAX[] PROGMEM = "ADC divisore U max (mV):";
#include "./airrohr-logo-common.h"
diff --git a/airrohr-firmware/intl_jp.h b/airrohr-firmware/intl_jp.h
index 4399814a..9c522f81 100644
--- a/airrohr-firmware/intl_jp.h
+++ b/airrohr-firmware/intl_jp.h
@@ -125,5 +125,10 @@ const char INTL_SIGNAL_QUALITY[] PROGMEM = "信号品質";
#define INTL_SENSOR "センサー"
#define INTL_PARAMETER "パラメータ"
#define INTL_VALUE "価値"
+const char INTL_ENABLE_BATTERY_MONITOR[] PROGMEM = "バッテリーモニターを有効にする";
+const char INTL_BATTERY_CHARGE[] PROGMEM = "充電";
+const char INTL_BATTERY_U_MIN[] PROGMEM = "電池 U min (mV)";
+const char INTL_BATTERY_U_MAX[] PROGMEM = "電池 U max (mV)";
+const char INTL_ADC_DIVIDER_U_MAX[] PROGMEM = "ADC分周器 U max (mV)";
#include "./airrohr-logo-common.h"
diff --git a/airrohr-firmware/intl_lt.h b/airrohr-firmware/intl_lt.h
index ccb27bac..20a09e7b 100644
--- a/airrohr-firmware/intl_lt.h
+++ b/airrohr-firmware/intl_lt.h
@@ -125,5 +125,10 @@ const char INTL_SIGNAL_QUALITY[] PROGMEM = "signalo kokybė";
#define INTL_SENSOR "Jutiklis"
#define INTL_PARAMETER "Parametras"
#define INTL_VALUE "Vertė"
+const char INTL_ENABLE_BATTERY_MONITOR[] PROGMEM = "Įgalinti akumuliatoriaus monitorių";
+const char INTL_BATTERY_CHARGE[] PROGMEM = "Baterijos įkrovimas";
+const char INTL_BATTERY_U_MIN[] PROGMEM = "Baterija U min (mV)";
+const char INTL_BATTERY_U_MAX[] PROGMEM = "Baterija U max (mV)";
+const char INTL_ADC_DIVIDER_U_MAX[] PROGMEM = "ADC daliklis U max (mV)";
#include "./airrohr-logo-common.h"
diff --git a/airrohr-firmware/intl_lu.h b/airrohr-firmware/intl_lu.h
index ff4757a9..403a0484 100644
--- a/airrohr-firmware/intl_lu.h
+++ b/airrohr-firmware/intl_lu.h
@@ -125,5 +125,10 @@ const char INTL_SIGNAL_QUALITY[] PROGMEM = "Qualitéit";
#define INTL_SENSOR "Sensor"
#define INTL_PARAMETER "Parameter"
#define INTL_VALUE "Wäert"
+const char INTL_ENABLE_BATTERY_MONITOR[] PROGMEM = "Aktivéiert Batterie Monitor";
+const char INTL_BATTERY_CHARGE[] PROGMEM = "Batterieladung";
+const char INTL_BATTERY_U_MIN[] PROGMEM = "Batterie U min (mV):";
+const char INTL_BATTERY_U_MAX[] PROGMEM = "Batterie U max (mV):";
+const char INTL_ADC_DIVIDER_U_MAX[] PROGMEM = "ADC divider U max (mV):";
#include "./airrohr-logo-common.h"
diff --git a/airrohr-firmware/intl_lv.h b/airrohr-firmware/intl_lv.h
index 9b72665e..2137a76f 100644
--- a/airrohr-firmware/intl_lv.h
+++ b/airrohr-firmware/intl_lv.h
@@ -125,5 +125,10 @@ const char INTL_SIGNAL_QUALITY[] PROGMEM = "signāla kvalitāte";
#define INTL_SENSOR "Sensors"
#define INTL_PARAMETER "Parametrs"
#define INTL_VALUE "Vērtība"
+const char INTL_ENABLE_BATTERY_MONITOR[] PROGMEM = "Iespējot akumulatora monitoru";
+const char INTL_BATTERY_CHARGE[] PROGMEM = "Akumulatora uzlāde";
+const char INTL_BATTERY_U_MIN[] PROGMEM = "Akumulators U min (mV)";
+const char INTL_BATTERY_U_MAX[] PROGMEM = "Akumulators U max (mV)";
+const char INTL_ADC_DIVIDER_U_MAX[] PROGMEM = "ADC dalītājs U max (mV)";
#include "./airrohr-logo-common.h"
diff --git a/airrohr-firmware/intl_nl.h b/airrohr-firmware/intl_nl.h
index 2dd67eb3..70f31103 100644
--- a/airrohr-firmware/intl_nl.h
+++ b/airrohr-firmware/intl_nl.h
@@ -125,5 +125,10 @@ const char INTL_SIGNAL_QUALITY[] PROGMEM = "Signaalkwaliteit";
#define INTL_SENSOR "Sensor"
#define INTL_PARAMETER "Parameter"
#define INTL_VALUE "Waarde"
+const char INTL_ENABLE_BATTERY_MONITOR[] PROGMEM = "Schakel de batterijmonitor in";
+const char INTL_BATTERY_CHARGE[] PROGMEM = "Batterijlading";
+const char INTL_BATTERY_U_MIN[] PROGMEM = "batterij U min (mV):";
+const char INTL_BATTERY_U_MAX[] PROGMEM = "batterij U max (mV):";
+const char INTL_ADC_DIVIDER_U_MAX[] PROGMEM = "ADO divider U max (mV):";
#include "./airrohr-logo-common.h"
diff --git a/airrohr-firmware/intl_pl.h b/airrohr-firmware/intl_pl.h
index 52601e88..42030d98 100644
--- a/airrohr-firmware/intl_pl.h
+++ b/airrohr-firmware/intl_pl.h
@@ -125,5 +125,10 @@ const char INTL_SIGNAL_QUALITY[] PROGMEM = "Jakość sygnału";
#define INTL_SENSOR "Czujnik"
#define INTL_PARAMETER "Parametr"
#define INTL_VALUE "Wartość"
+const char INTL_ENABLE_BATTERY_MONITOR[] PROGMEM = "Włącz monitor baterii";
+const char INTL_BATTERY_CHARGE[] PROGMEM = "Ładowanie baterii";
+const char INTL_BATTERY_U_MIN[] PROGMEM = "Bateria U min (mV):";
+const char INTL_BATTERY_U_MAX[] PROGMEM = "Bateria U max (mV):";
+const char INTL_ADC_DIVIDER_U_MAX[] PROGMEM = "ACP dzielnik U max (mV):";
#include "./airrohr-logo-common.h"
diff --git a/airrohr-firmware/intl_pt.h b/airrohr-firmware/intl_pt.h
index 38a6dc58..0dff7d74 100644
--- a/airrohr-firmware/intl_pt.h
+++ b/airrohr-firmware/intl_pt.h
@@ -124,5 +124,10 @@ const char INTL_SIGNAL_QUALITY[] PROGMEM = "Qualidade do Sinal";
#define INTL_SENSOR "Sensor"
#define INTL_PARAMETER "Parâmetro"
#define INTL_VALUE "Valor"
+const char INTL_ENABLE_BATTERY_MONITOR[] PROGMEM = "Habilitar monitor de bateria";
+const char INTL_BATTERY_CHARGE[] PROGMEM = "Carga da bateria";
+const char INTL_BATTERY_U_MIN[] PROGMEM = "Bateria U min (mV):";
+const char INTL_BATTERY_U_MAX[] PROGMEM = "Bateria U max (mV):";
+const char INTL_ADC_DIVIDER_U_MAX[] PROGMEM = "ADC divisor U max (mV):";
#include "./airrohr-logo-common.h"
diff --git a/airrohr-firmware/intl_ro.h b/airrohr-firmware/intl_ro.h
index 4214041b..aa2c409e 100644
--- a/airrohr-firmware/intl_ro.h
+++ b/airrohr-firmware/intl_ro.h
@@ -125,5 +125,10 @@ const char INTL_SIGNAL_QUALITY[] PROGMEM = "calitatea semnalului";
#define INTL_SENSOR "Senzor"
#define INTL_PARAMETER "Parametru"
#define INTL_VALUE "Valoare"
+const char INTL_ENABLE_BATTERY_MONITOR[] PROGMEM = "Iespējot akumulatora monitoru";
+const char INTL_BATTERY_CHARGE[] PROGMEM = "Akumulatora uzlāde";
+const char INTL_BATTERY_U_MIN[] PROGMEM = "Akumulators U min (mV)";
+const char INTL_BATTERY_U_MAX[] PROGMEM = "Akumulators U max (mV)";
+const char INTL_ADC_DIVIDER_U_MAX[] PROGMEM = "ADC dalītājs U max (mV)";
#include "./airrohr-logo-common.h"
diff --git a/airrohr-firmware/intl_rs.h b/airrohr-firmware/intl_rs.h
index 2daad10b..8fcbfbd9 100644
--- a/airrohr-firmware/intl_rs.h
+++ b/airrohr-firmware/intl_rs.h
@@ -125,5 +125,10 @@ const char INTL_SIGNAL_QUALITY[] PROGMEM = "kvalitet signala";
#define INTL_SENSOR "Senzor"
#define INTL_PARAMETER "Parametar"
#define INTL_VALUE "Vrednost"
+const char INTL_ENABLE_BATTERY_MONITOR[] PROGMEM = "Активирајте монитор батерије";
+const char INTL_BATTERY_CHARGE[] PROGMEM = "Пуњење батерије";
+const char INTL_BATTERY_U_MIN[] PROGMEM = "U min на батерије (mV):";
+const char INTL_BATTERY_U_MAX[] PROGMEM = "U max на батерије (mV):";
+const char INTL_ADC_DIVIDER_U_MAX[] PROGMEM = "АДП разделник U max (mV):";
#include "./airrohr-logo-common.h"
diff --git a/airrohr-firmware/intl_ru.h b/airrohr-firmware/intl_ru.h
index a89a9129..cbbe256b 100644
--- a/airrohr-firmware/intl_ru.h
+++ b/airrohr-firmware/intl_ru.h
@@ -125,5 +125,10 @@ const char INTL_SIGNAL_QUALITY[] PROGMEM = "Качество";
#define INTL_SENSOR "Датчик"
#define INTL_PARAMETER "Параметр"
#define INTL_VALUE "Значение"
+const char INTL_ENABLE_BATTERY_MONITOR[] PROGMEM = "Активируйте монитор батареи";
+const char INTL_BATTERY_CHARGE[] PROGMEM = "Заряд батареи";
+const char INTL_BATTERY_U_MIN[] PROGMEM = "U min на батареи (mV):";
+const char INTL_BATTERY_U_MAX[] PROGMEM = "U max на батареи (mV):";
+const char INTL_ADC_DIVIDER_U_MAX[] PROGMEM = "U max при делителя на АЦП (mV):";
#include "./airrohr-logo-common.h"
diff --git a/airrohr-firmware/intl_se.h b/airrohr-firmware/intl_se.h
index 573e0dfe..2b6499b7 100644
--- a/airrohr-firmware/intl_se.h
+++ b/airrohr-firmware/intl_se.h
@@ -125,5 +125,10 @@ const char INTL_SIGNAL_QUALITY[] PROGMEM = "Kvalitet";
#define INTL_SENSOR "Sensor"
#define INTL_PARAMETER "Parameter"
#define INTL_VALUE "Värde"
+const char INTL_ENABLE_BATTERY_MONITOR[] PROGMEM = "Aktivera batteriövervakare";
+const char INTL_BATTERY_CHARGE[] PROGMEM = "Batteriladdning";
+const char INTL_BATTERY_U_MIN[] PROGMEM = "Batteri U min (mV):";
+const char INTL_BATTERY_U_MAX[] PROGMEM = "Batteri U max (mV):";
+const char INTL_ADC_DIVIDER_U_MAX[] PROGMEM = "ADО divider U max (mV):";
#include "./airrohr-logo-common.h"
diff --git a/airrohr-firmware/intl_si.h b/airrohr-firmware/intl_si.h
index 2f1828a4..f34dbb79 100644
--- a/airrohr-firmware/intl_si.h
+++ b/airrohr-firmware/intl_si.h
@@ -125,5 +125,10 @@ const char INTL_SIGNAL_QUALITY[] PROGMEM = "kakovost signala";
#define INTL_SENSOR "Senzor"
#define INTL_PARAMETER "Parameter"
#define INTL_VALUE "Vrednost"
+const char INTL_ENABLE_BATTERY_MONITOR[] PROGMEM = "Omogoči nadzor baterije";
+const char INTL_BATTERY_CHARGE[] PROGMEM = "Polnjenje baterije";
+const char INTL_BATTERY_U_MIN[] PROGMEM = "Baterija U min (mV)";
+const char INTL_BATTERY_U_MAX[] PROGMEM = "Baterija U max (mV)";
+const char INTL_ADC_DIVIDER_U_MAX[] PROGMEM = "ADC delilnik U max (mV)";
#include "./airrohr-logo-common.h"
diff --git a/airrohr-firmware/intl_sk.h b/airrohr-firmware/intl_sk.h
index 80126168..136810d1 100644
--- a/airrohr-firmware/intl_sk.h
+++ b/airrohr-firmware/intl_sk.h
@@ -124,5 +124,10 @@ const char INTL_SIGNAL_QUALITY[] PROGMEM = "kvalita signálu";
#define INTL_SENSOR "Senzor"
#define INTL_PARAMETER "Parameter"
#define INTL_VALUE "Hodnota"
+const char INTL_ENABLE_BATTERY_MONITOR[] PROGMEM = "Povoliť sledovanie batérie";
+const char INTL_BATTERY_CHARGE[] PROGMEM = "Nabitie batérie";
+const char INTL_BATTERY_U_MIN[] PROGMEM = "Batéria U min (mV):";
+const char INTL_BATTERY_U_MAX[] PROGMEM = "Batéria U max (mV):";
+const char INTL_ADC_DIVIDER_U_MAX[] PROGMEM = "ADP rozdeľovač U max (mV):";
#include "./airrohr-logo-common.h"
diff --git a/airrohr-firmware/intl_template.h b/airrohr-firmware/intl_template.h
index 9c0e32a4..9bcc70e3 100644
--- a/airrohr-firmware/intl_template.h
+++ b/airrohr-firmware/intl_template.h
@@ -125,5 +125,10 @@ const char INTL_SIGNAL_QUALITY[] PROGMEM = "";
#define INTL_SENSOR ""
#define INTL_PARAMETER ""
#define INTL_VALUE ""
+const char INTL_ENABLE_BATTERY_MONITOR[] PROGMEM = "Enable battery monitor";
+const char INTL_BATTERY_CHARGE[] PROGMEM = "Battery charge";
+const char INTL_BATTERY_U_MIN[] PROGMEM = "Battery U min (mV)";
+const char INTL_BATTERY_U_MAX[] PROGMEM = "Battery U max (mV)";
+const char INTL_ADC_DIVIDER_U_MAX[] PROGMEM = "ADC divider U max (mV)";
#include "./airrohr-logo-common.h"
diff --git a/airrohr-firmware/intl_tr.h b/airrohr-firmware/intl_tr.h
index 69954597..f2ccbd7d 100644
--- a/airrohr-firmware/intl_tr.h
+++ b/airrohr-firmware/intl_tr.h
@@ -125,5 +125,10 @@ const char INTL_SIGNAL_QUALITY[] PROGMEM = "sinyal kalitesi";
#define INTL_SENSOR "algılayıcı(Sensör)"
#define INTL_PARAMETER "Parametre"
#define INTL_VALUE "değer"
+const char INTL_ENABLE_BATTERY_MONITOR[] PROGMEM = "Pil monitörünü etkinleştir";
+const char INTL_BATTERY_CHARGE[] PROGMEM = "Pil şarjı";
+const char INTL_BATTERY_U_MIN[] PROGMEM = "Pil U min (mV):";
+const char INTL_BATTERY_U_MAX[] PROGMEM = "Pil U max (mV):";
+const char INTL_ADC_DIVIDER_U_MAX[] PROGMEM = "ADD bölücü U max (mV):";
#include "./airrohr-logo-common.h"
diff --git a/airrohr-firmware/intl_ua.h b/airrohr-firmware/intl_ua.h
index eb1703cd..3fbd935b 100644
--- a/airrohr-firmware/intl_ua.h
+++ b/airrohr-firmware/intl_ua.h
@@ -125,5 +125,10 @@ const char INTL_SIGNAL_QUALITY[] PROGMEM = "якість сигналу";
#define INTL_SENSOR "Сенсор"
#define INTL_PARAMETER "Параметр"
#define INTL_VALUE "Значення"
+const char INTL_ENABLE_BATTERY_MONITOR[] PROGMEM = "Активуйте монітор батареї";
+const char INTL_BATTERY_CHARGE[] PROGMEM = "Заряд акумулятора";
+const char INTL_BATTERY_U_MIN[] PROGMEM = "U min на батареї (mV):";
+const char INTL_BATTERY_U_MAX[] PROGMEM = "U max на батареї (mV):";
+const char INTL_ADC_DIVIDER_U_MAX[] PROGMEM = "U max при подільника на АЦП (mV):";
#include "./airrohr-logo-common.h"