diff --git a/lib/obp60task/OBP60Hardware.h b/lib/obp60task/OBP60Hardware.h index c0319ca..293c4ae 100644 --- a/lib/obp60task/OBP60Hardware.h +++ b/lib/obp60task/OBP60Hardware.h @@ -54,7 +54,7 @@ #define TONE4 4000 // 4000Hz // Analog Input #define OBP_ANALOG0 4 // Voltage power supplay - #define MIN_VOLTAGE 9.0 // Min voltage for under voltage detection (then goto deep sleep) + #define MIN_VOLTAGE 10.0 // Min voltage for under voltage detection (then goto deep sleep) #define POWER_FAIL_TIME 2 // in [ms] Accept min voltage until 2 x 1ms (for under voltage gaps by engine start) // Touch buttons #define TOUCHTHRESHOLD 50000// Touch sensitivity, lower values more sensitiv diff --git a/lib/obp60task/OBPSensorTask.cpp b/lib/obp60task/OBPSensorTask.cpp index 70d19d9..d807136 100644 --- a/lib/obp60task/OBPSensorTask.cpp +++ b/lib/obp60task/OBPSensorTask.cpp @@ -19,47 +19,7 @@ #include "movingAvg.h" // Lib for moving average building // Timer Interrupts for hardware functions -void underVoltageDetection(); -Ticker Timer1(underVoltageDetection, 1); // Start Timer1 with maximum speed with 1ms -Ticker Timer2(blinkingFlashLED, 500); // Satrt Timer2 for flash LED all 500ms - -// Undervoltage function for shutdown display -void underVoltageDetection(){ - float actVoltage = (float(analogRead(OBP_ANALOG0)) * 3.3 / 4096 + 0.17) * 20; // V = 1/20 * Vin - long starttime = 0; - static bool undervoltage = false; - - if(actVoltage < MIN_VOLTAGE){ - if(undervoltage == false){ - starttime = millis(); - undervoltage = true; - } - if(millis() > starttime + POWER_FAIL_TIME){ - Timer1.stop(); // Stop Timer1 -/* - setPortPin(OBP_BACKLIGHT_LED, false); // Backlight Off - setFlashLED(false); // Flash LED Off -*/ - buzzer(TONE4, 20); // Buzzer tone 4kHz 20ms - setPortPin(OBP_POWER_50, false); // Power rail 5.0V Off - // Shutdown EInk display - /* - display.setPartialWindow(0, 0, display.width(), display.height()); // Set partial update - display.fillScreen(GxEPD_WHITE); // Draw white sreen - display.nextPage(); // Partial update - display.powerOff(); // Power off - */ - - // Stop system - while(true){ - esp_deep_sleep_start(); // Deep Sleep without weakup. Weakup only after power cycle (restart). - } - } - } - else{ - undervoltage = false; - } -} +Ticker Timer1(blinkingFlashLED, 500); // Satrt Timer2 for flash LED all 500ms // Initialization for all sensors (RS232, I2C, 1Wire, IOs) //#################################################################################### @@ -112,7 +72,7 @@ void sensorTask(void *param){ if(uvoltage == true){ Timer1.start(); // Start Timer1 for undervoltage detection } - Timer2.start(); // Start Timer2 for blinking LED + Timer1.start(); // Start Timer2 for blinking LED // Direction settings for NMEA0183 String nmea0183Mode = api->getConfig()->getConfigItem(api->getConfig()->serialDirection, true)->asString(); @@ -387,8 +347,7 @@ void sensorTask(void *param){ while (true){ delay(100); // Loop time 100ms - Timer1.update(); // Update for Timer1 - Timer2.update(); // Update for Timer2 + Timer1.update(); // Update for Timer2 if (millis() > starttime0 + 100) { starttime0 = millis(); diff --git a/lib/obp60task/obp60task.cpp b/lib/obp60task/obp60task.cpp index 0cee921..a4423ed 100644 --- a/lib/obp60task/obp60task.cpp +++ b/lib/obp60task/obp60task.cpp @@ -221,6 +221,48 @@ void registerAllPages(PageList &list){ list.add(®isterPageGenerator); } +// Undervoltage detection for shutdown display +void underVoltageDetection(GwApi *api){ + int textcolor = GxEPD_BLACK; + int pixelcolor = GxEPD_BLACK; + int bgcolor = GxEPD_WHITE; + // Read settings + String displaycolor = api->getConfig()->getConfigItem(api->getConfig()->displaycolor,true)->asString(); + float vslope = uint(api->getConfig()->getConfigItem(api->getConfig()->vSlope,true)->asFloat()); + float voffset = uint(api->getConfig()->getConfigItem(api->getConfig()->vOffset,true)->asFloat()); + // Read supplay voltage + float actVoltage = (float(analogRead(OBP_ANALOG0)) * 3.3 / 4096 + 0.17) * 20; // V = 1/20 * Vin + actVoltage = actVoltage * vslope + voffset; + if(actVoltage < MIN_VOLTAGE){ + // Switch off all power lines + setPortPin(OBP_BACKLIGHT_LED, false); // Backlight Off + setFlashLED(false); // Flash LED Off + buzzer(TONE4, 20); // Buzzer tone 4kHz 20ms + setPortPin(OBP_POWER_50, false); // Power rail 5.0V Off + // Shutdown EInk display + if(displaycolor == "Normal"){ + textcolor = GxEPD_BLACK; + bgcolor = GxEPD_WHITE; + } + else{ + textcolor = GxEPD_WHITE; + bgcolor = GxEPD_BLACK; + } + getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update + getdisplay().fillScreen(bgcolor); // Clear screen + getdisplay().setTextColor(textcolor); + getdisplay().setFont(&Ubuntu_Bold20pt7b); + getdisplay().setCursor(65, 150); + getdisplay().print("Undervoltage"); + getdisplay().nextPage(); // Partial update + getdisplay().powerOff(); // Display power off + // Stop system + while(true){ + esp_deep_sleep_start(); // Deep Sleep without weakup. Weakup only after power cycle (restart). + } + } +} + // OBP60 Task //#################################################################################### void OBP60Task(GwApi *api){ @@ -355,6 +397,7 @@ void OBP60Task(GwApi *api){ String backlightColor = api->getConfig()->getConfigItem(api->getConfig()->blColor,true)->asString(); CHSV color = colorMapping(backlightColor); uint brightness = 2.55 * uint(api->getConfig()->getConfigItem(api->getConfig()->blBrightness,true)->asInt()); + bool uvoltage = api->getConfig()->getConfigItem(api->getConfig()->underVoltage,true)->asBoolean(); // refreshmode defined in init section // displaycolor defined in init section @@ -391,6 +434,12 @@ void OBP60Task(GwApi *api){ while (true){ delay(100); // Delay 100ms (loop time) + + // Undervoltage detection + if(uvoltage == true){ + underVoltageDetection(api); + } + if(millis() > starttime0 + 100){ starttime0 = millis(); commonData.data=shared->getSensorData();