Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Battery monitor feature #847

Open
wants to merge 14 commits into
base: beta
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions airrohr-firmware/airrohr-cfg.h
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -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 },
Expand Down Expand Up @@ -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 },
};
4 changes: 4 additions & 0 deletions airrohr-firmware/airrohr-cfg.h.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
115 changes: 112 additions & 3 deletions airrohr-firmware/airrohr-firmware.ino
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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 {
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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("<table id='battery_monitor_table'>");
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("<script type='text/javascript'>"
" var $ = function (e) { "
" return document.getElementById(e); "
" }; "
" function updateBatteryMonitor() { "
" $('battery_u_min').disabled = $('battery_u_max').disabled = $('adc_divider_u_max').disabled = !$('enable_battery_monitor').checked; "
" if($('enable_battery_monitor').checked){ "
" $('battery_monitor_table').style.display = 'block'; "
" } else { "
" $('battery_monitor_table').style.display = 'none'; "
" } "
" }; "
" updateBatteryMonitor(); "
" $('enable_battery_monitor').onchange = updateBatteryMonitor; "
"</script>");

server.sendContent(page_content);
page_content = FPSTR(WEB_BR_LF_B);
page_content += F(INTL_FIRMWARE "</b>&nbsp;");
Expand Down Expand Up @@ -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");
Expand All @@ -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("<tr><td colspan='2'><b>" INTL_ERROR "</b></td></tr>");
String wifiStatus(WiFi_error_count);
Expand Down Expand Up @@ -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<float>(battery_val_count);
float ratio = cfg::adc_divider_u_max / static_cast<float>(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
*****************************************************************/
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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;
}

/*****************************************************************
Expand All @@ -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;

Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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);
}
Expand Down
2 changes: 2 additions & 0 deletions airrohr-firmware/defines.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
17 changes: 16 additions & 1 deletion airrohr-firmware/ext_def.h
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down Expand Up @@ -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 ===================================
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
2 changes: 2 additions & 0 deletions airrohr-firmware/html-content.h
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
5 changes: 5 additions & 0 deletions airrohr-firmware/intl_bg.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"128\" height=\"128\" viewBox=\"0 0 128 128\"><path fill=\"#009A93\" d=\"M123.58 77.76c0-6.22-3.2-11.66-7.96-14.66 2.36-3.87 3.73-8.42 3.73-13.3 0-14.1-11.44-25.52-25.53-25.52-4 0-7.8.93-11.17 2.57C80.63 19.6 74 14.3 66.1 14.3c-7.7 0-14.22 5.07-16.4 12.07-3.05-1.2-6.4-1.87-9.88-1.87-14.94 0-27.06 12.07-27.16 27-5.43 4.47-8.9 11.3-8.9 18.95 0 13.5 10.8 24.45 24.1 24.45h79.32c9.07-.06 16.4-7.7 16.4-17.14z\"/><path fill=\"#fff\" d=\"M55.5 49.92v19.05c0 9.37-7.64 17-17.1 17-9.36 0-17-7.63-17-17 0-9.38 7.64-17.02 17-17.02h.7V56h-.7c-7.1 0-12.88 5.84-12.88 12.96 0 7.13 5.77 12.97 12.9 12.97 7.2 0 12.96-5.85 12.96-12.97V49.92c0-7.2-5.77-12.97-12.97-12.97-7.1 0-12.8 5.78-12.8 12.9v.75h-4.2v-.75c0-9.37 7.7-17.02 17-17.02 9.5 0 17.1 7.65 17.1 17.1zm-5.47 0v19.05c0 6.37-5.17 11.54-11.62 11.54-6.3 0-11.5-5.1-11.5-11.5 0-6.3 5.2-11.5 11.6-11.5h.7v4.1h-.7c-4.1 0-7.5 3.4-7.5 7.5s3.4 7.5 7.5 7.5c4.2 0 7.6-3.4 7.6-7.5V49.9c0-4.2-3.3-7.57-7.5-7.57-4.1 0-7.5 3.38-7.5 7.5v.75H27v-.75c0-6.37 5.17-11.55 11.54-11.55 6.46 0 11.63 5.18 11.63 11.62zm-5.47 0v19.05c0 3.37-2.7 6.14-6.15 6.14-3.3 0-6-2.7-6-6.1 0-3.4 2.7-6.1 6.1-6.1h.7V67h-.7c-1.1 0-2 .9-2 2.02 0 1.1.9 2 2 2 1.2 0 2.1-.9 2.1-2V49.9c0-1.2-.9-2.1-2.1-2.1-1.1 0-2 .9-2 2.03v.75h-4.1v-.75c0-3.38 2.7-6.08 6.1-6.08 3.5 0 6.2 2.7 6.2 6.15zm13.94-2.17v-15h4.05v15H58.5zm4.05 38.16H58.5V49.2h4.05v36.7zm1.42-38.1v-15h4.05v15h-4.05zm0 38.2V49.2h4.05v36.7h-4.05zm5.48-38.1v-15h4.04v15h-4.1zm0 38.2V49.2h4.04v36.7h-4.1zM93.43 33c9.38 0 17.02 7.56 17.02 17 0 9.37-7.64 17-17 17h-.7v-4.1h.68c7.13 0 12.9-5.76 12.9-12.9 0-7.2-5.77-12.95-12.9-12.95-7.2 0-12.96 5.78-12.96 12.98v36h-4.05V49.9c0-9.45 7.57-17.02 17.02-17.02zm0 5.4c6.38 0 11.55 5.16 11.55 11.6 0 6.37-5.17 11.54-11.54 11.54h-.68v-4.1h.67c4.13 0 7.5-3.37 7.5-7.5 0-4.2-3.37-7.5-7.5-7.5-4.2 0-7.5 3.3-7.5 7.5V86h-4.1V49.9c-.03-6.46 5.17-11.6 11.6-11.6zM91.33 86H87.3V49.9c0-3.37 2.76-6.14 6.14-6.14s6.07 2.8 6.07 6.17-2.7 6.06-6 6.06h-.7v-4.1h.7c1.2 0 2.1-.9 2.1-2.1s-.9-2.1-2-2.1-2.1.9-2.1 2.1v36.1zm8.18 0h-4V68.24c1.4-.2 2.7-.5 4-.9.1.6.2 1.16.2 1.68v17zm5.5 0h-4V69c0-.76-.1-1.44-.3-2.1 1.3-.6 2.5-1.28 3.6-2.1.5 1.5.8 2.62.8 4.2v17zm1.4-17c0-1.8-.3-3.38-.9-5.03 1.1-1.04 2-2.1 3-3.22 1.4 2.8 2.1 5.1 2.1 8.27v17h-4.1V69zm-79.8 39.1c1.3.4 1.8 1.27 1.8 2.7 0 2.1-1.2 3-3.9 3h-3.4c-.2 0-.4-.12-.4-.4v-10.45c0-.26.2-.4.4-.4h3.2c2.7 0 4 .9 4 2.96 0 1.3-.5 2.1-1.5 2.6v.1zm-2.4-.86c1.3 0 1.9-.46 1.9-1.46s-.5-1.46-1.9-1.46h-1.5v2.94h1.5zm.3 4.8c1.3 0 1.9-.48 1.9-1.53s-.6-1.5-1.9-1.5h-1.8v3.1h1.8zm16.2-1.96c0 2.55-1.4 3.94-3.9 3.94s-3.9-1.37-3.9-3.92v-7.13c0-.26.1-.4.4-.4h1.3c.2 0 .4.14.4.4v6.98c0 1.58.6 2.32 1.9 2.32 1.3 0 1.9-.74 1.9-2.32v-6.98c0-.26.1-.4.4-.4h1.2c.2 0 .4.14.4.4v7.13zm12 3.34c0 .28-.1.4-.4.4h-6.2c-.2 0-.4-.12-.4-.4v-10.45c0-.26.2-.4.4-.4h1.3c.3 0 .4.14.4.4v9.1h4.5c.3 0 .4.14.4.4v.97zm11.9-3.54c0 2.7-1.4 4.16-4 4.16s-4.1-1.43-4.1-4.06v-3.52c0-2.63 1.4-4.07 4.1-4.07 1.7 0 3 .6 3.7 1.9.1.2.1.4-.1.5l-.9.5c-.2.1-.4 0-.5-.2-.5-.8-1.2-1.1-2.2-1.1-1.3 0-2 .8-2 2.5v3.1c0 1.7.7 2.5 2.1 2.5 1.4 0 2.1-.9 2.1-2.6v-.4H61c-.25 0-.4-.2-.4-.4v-1c0-.3.15-.4.4-.4h3.27c.28 0 .4.1.4.4v1.9zm12.9 3.5c.1.28 0 .45-.3.45h-1.4c-.2 0-.3-.1-.4-.3l-.5-1.77h-4l-.5 1.76c-.02.2-.2.3-.4.3h-1.3c-.3 0-.4-.16-.3-.43l3.4-10.5c.08-.2.2-.3.45-.3h1.5c.2 0 .35.1.4.3l3.4 10.5zm-4.6-8.4L71.2 110h3l-1.5-5.06zm11.1 8.46c0 .27-.1.4-.4.4h-1.2c-.2 0-.4-.13-.4-.4v-10.46c0-.26.2-.4.4-.4h3.1c2.8 0 4.1 1.15 4.1 3.5 0 1.75-.7 2.85-2.2 3.3l2.3 4c.2.26.1.46-.2.46H88c-.2 0-.37-.08-.47-.27l-2.1-3.96H84v3.9zm1.5-5.6c1.4 0 2.1-.55 2.1-1.72 0-1.2-.6-1.77-2-1.77H84v3.5h1.46zm10.9 5.6c0 .27-.1.4-.4.4h-1.2c-.2 0-.4-.13-.4-.4v-10.46c0-.26.2-.4.4-.4H96c.26 0 .4.14.4.4v10.47zm13.6-.04c.1.27 0 .44-.3.44h-1.3c-.2 0-.4-.1-.4-.32l-.5-1.76h-4l-.52 1.76c-.1.22-.2.32-.45.32H101c-.3 0-.4-.17-.33-.44l3.4-10.5c.08-.2.2-.3.45-.3h1.5c.2 0 .34.1.4.3l3.4 10.5zm-4.6-8.42l-1.4 5.05h3l-1.42-5.05h-.02z\"/></svg>";

Expand Down
6 changes: 6 additions & 0 deletions airrohr-firmware/intl_cn.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"
5 changes: 5 additions & 0 deletions airrohr-firmware/intl_cz.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"
5 changes: 5 additions & 0 deletions airrohr-firmware/intl_de.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"
5 changes: 5 additions & 0 deletions airrohr-firmware/intl_dk.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"
5 changes: 5 additions & 0 deletions airrohr-firmware/intl_ee.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Loading