From 38e7db7deea939ac582739adc4a0cfa233b1bd13 Mon Sep 17 00:00:00 2001 From: Alexander Klein Date: Wed, 27 Sep 2023 11:11:39 +0200 Subject: [PATCH] - added batteryCalibration - start with default Menus for DriveModes --- doc/TODO allgemein.txt | 6 +- include/config.h | 2 +- include/networkConfig.h | 2 +- lib/Battery/battery.cpp | 52 +++++++++++++++- lib/Battery/battery.h | 31 ++++++++-- platformio.ini | 4 +- .../CalibrateBattery/menuCalibrateBattery.cpp | 59 +++++++++++++++++++ .../CalibrateBattery/menuCalibrateBattery.h | 33 +++++++++++ src/SpecialMenus/Speed/menuSpeed.cpp | 13 ++++ src/SpecialMenus/Speed/menuSpeed.h | 21 +++++++ .../menuSysteminformatio.cpp | 1 + src/SpecialMenus/driveModi/menuDriveMode.h | 5 ++ src/main.cpp | 5 +- 13 files changed, 221 insertions(+), 13 deletions(-) create mode 100644 src/SpecialMenus/CalibrateBattery/menuCalibrateBattery.cpp create mode 100644 src/SpecialMenus/CalibrateBattery/menuCalibrateBattery.h create mode 100644 src/SpecialMenus/Speed/menuSpeed.cpp create mode 100644 src/SpecialMenus/Speed/menuSpeed.h diff --git a/doc/TODO allgemein.txt b/doc/TODO allgemein.txt index cd314ed..89e0b07 100644 --- a/doc/TODO allgemein.txt +++ b/doc/TODO allgemein.txt @@ -45,12 +45,16 @@ Code: sensor data gnss daten aktualisieren Menübaum korrigieren, Verlinkung Sensor in Mode etc. esp und sensoren in den deepsleep + battery Prozent ausgabe wirkt komisch Latex: Anhang: Liste mit allen Komponenten und Kurzbeschreibung Unterschied funktionale und nicht funktionale Anforderungen Strom nicht über Zeit sondern Rampe + Formel für Zeit anfahrrampe Einheiten + Überall den Durchmesser der Räder auf 12cm und Pulse auf 384 / 3 = 128 3D: - +Rover: + Spannungsteiler neu kalibrieren. diff --git a/include/config.h b/include/config.h index 0a205f9..d8e60c1 100644 --- a/include/config.h +++ b/include/config.h @@ -21,7 +21,7 @@ namespace PinNumbers { constexpr uint8_t dir1 = 27; constexpr uint8_t dir2 = 12; constexpr uint8_t pwm = 13; - constexpr uint8_t encoder = 26; + constexpr uint8_t encoder = 32; constexpr uint8_t pmwChannel = 0; } diff --git a/include/networkConfig.h b/include/networkConfig.h index 4dafd0e..e5b0bc3 100644 --- a/include/networkConfig.h +++ b/include/networkConfig.h @@ -14,7 +14,7 @@ #include -#define RHEDE +#define HOTSPOT #ifdef HOTSPOT namespace NetworkConfig { diff --git a/lib/Battery/battery.cpp b/lib/Battery/battery.cpp index 1038698..054d5ae 100644 --- a/lib/Battery/battery.cpp +++ b/lib/Battery/battery.cpp @@ -27,10 +27,15 @@ Battery::Battery(uint8_t pin) { } void Battery::run() { + if (this->calibrationState != CalibrationState::None) { + this->runCalibration(); + return; + } + this->readAdcToBuf(); this->loopCounter++; - if (this->loopCounter == this->calulationDelayMultiplier) { + if (this->loopCounter >= this->calulationDelayMultiplier) { this->calculateBatteryVoltage(); this->calculateBatteryPercent(); this->loopCounter = 0; @@ -40,6 +45,28 @@ void Battery::run() { return; } +void Battery::runCalibration() { + if (this->calibrationState != CalibrationState::Reading) + return; + + this->readAdcToBuf(); + if (this->bufferPos == 0) { + uint16_t res = this->getBufAvg(); + this->newRawAdcVoltages[this->currentCalibrationVoltage] = res; + std::cout << "Index: " + << (int) this->currentCalibrationVoltage + << " Value: " + << (int) res + << std::endl; + this->currentCalibrationVoltage++; + this->calibrationState = CalibrationState::Waiting; + + if (this->currentCalibrationVoltage == 60) { + this->calibrationState = CalibrationState::Finished; + } + } +} + double Battery::getBatteryVoltage() const { double res = this->batteryVoltage; return (int)(res*100+0.5)/100.0; @@ -59,6 +86,29 @@ bool Battery::isNewValue() { return true; } +void Battery::nextVoltageIsReady() { + if (this->calibrationState == CalibrationState::Waiting) { + this->calibrationState = CalibrationState::Reading; + } +} + +void Battery::startCalibration() { + this->calibrationState = CalibrationState::Waiting; + this->currentCalibrationVoltage = 0; + this->bufferPos = 0; + this->loopDelay = 50; + this->newRawAdcVoltages = new uint16_t[60]; +} + +void Battery::finishCalibration() { + if (this->calibrationState != CalibrationState::None) + return; + + delete[] this->newRawAdcVoltages; + this->calibrationState = CalibrationState::None; + this->loopDelay = 100; +} + double Battery::calculateInputVoltage() { // Reference voltage is 3v3 so maximum reading is 3v3 = 4095 in range 0 to 4095 double reading = this->getBufAvg(); diff --git a/lib/Battery/battery.h b/lib/Battery/battery.h index e0b9f38..f6707ba 100644 --- a/lib/Battery/battery.h +++ b/lib/Battery/battery.h @@ -29,6 +29,13 @@ */ class Battery : public Component { public: + enum CalibrationState { + None, + Reading, + Waiting, + Finished + }; + /** * @brief Construct a new Battery object * @@ -72,8 +79,16 @@ class Battery : public Component { bool isNewValue(); + //Calibration + CalibrationState getCalibrationState() const { return this->calibrationState; } + uint8_t getCurrentCalibrationVoltage() const { return this->currentCalibrationVoltage; } + void nextVoltageIsReady(); + void startCalibration(); + void finishCalibration(); + private: void run() override; + void runCalibration(); double calculateInputVoltage(); void calculateBatteryVoltage(); void calculateBatteryPercent(); @@ -83,6 +98,8 @@ class Battery : public Component { static const uint8_t bufferSize = 30; + CalibrationState calibrationState = CalibrationState::None; + uint8_t absurdLowVoltage = 5; uint8_t pin; uint8_t batteryPercent = 0; @@ -90,7 +107,9 @@ class Battery : public Component { uint8_t bufferPos = 0; uint8_t calulationDelayMultiplier = 5; uint8_t loopCounter = 0; + uint8_t currentCalibrationVoltage = 0; // *0.1 + 7 uint16_t adcBuffer[bufferSize]; + uint16_t* newRawAdcVoltages; uint32_t r1 = 0; uint32_t r2 = 0; bool calculatetNewValues = false; @@ -108,12 +127,12 @@ class Battery : public Component { const double startVoltage = 7; const double stepVoltage = 0.1; const uint16_t rawAdcVoltages[60] = // from 7.0V to 12.9V in 0.1V steps - {1820, 1851, 1880, 1910, 1937, 1967, 1992, 2020, 2048, 2080, - 2109, 2136, 2163, 2189, 2218, 2244, 2273, 2302, 2334, 2363, - 2391, 2415, 2441, 2471, 2499, 2531, 2557, 2587, 2617, 2646, - 2674, 2699, 2730, 2761, 2791, 2816, 2843, 2872, 2900, 2930, - 2958, 2991, 3017, 3049, 3080, 3115, 3144, 3178, 3208, 3242, - 3276, 3313, 3346, 3389, 3433, 3470, 3509, 3548, 3590, 3636}; + {1992, 2021, 2056, 2090, 2118, 2145, 2177, 2208, 2241, 2272, + 2298, 2331, 2362, 2387, 2420, 2453, 2482, 2514, 2543, 2577, + 2607, 2640, 2670, 2703, 2736, 2763, 2794, 2826, 2858, 2890, + 2920, 2956, 2983, 3019, 3054, 3088, 3121, 3158, 3189, 3226, + 3264, 3300, 3339, 3379, 3414, 3453, 3500, 3544, 3598, 3636, + 3682, 3730, 3781, 3837, 3887, 3943, 3997, 4054, 4093, 4095}; }; #endif // BATTERY_H diff --git a/platformio.ini b/platformio.ini index 802f7b1..c5bc22d 100644 --- a/platformio.ini +++ b/platformio.ini @@ -15,7 +15,7 @@ board_build.partitions = no_ota.csv framework = arduino monitor_speed = 115200 upload_speed = 921600 -monitor_port = COM3 +monitor_port = COM6 lib_deps = https://git.kleiax.de/PlatformIO-Libs/SparkFunGNSS.git knolleary/PubSubClient@^2.8 @@ -26,7 +26,7 @@ lib_deps = https://git.kleiax.de/PlatformIO-Libs/Menu.git nrf24/RF24@^1.4.5 jrowberg/I2Cdevlib-MPU6050@^1.0.0 -upload_port = COM3 +upload_port = COM6 test_ignore = test_desktop build_type = debug monitor_filters = esp32_exception_decoder diff --git a/src/SpecialMenus/CalibrateBattery/menuCalibrateBattery.cpp b/src/SpecialMenus/CalibrateBattery/menuCalibrateBattery.cpp new file mode 100644 index 0000000..b9ded0a --- /dev/null +++ b/src/SpecialMenus/CalibrateBattery/menuCalibrateBattery.cpp @@ -0,0 +1,59 @@ +/** + * @file menuCalibrateBattery.cpp + * @author Alexander Klein (alex@kleiax.de) + * @brief + * @version 0.1 + * @date 2023-09-26 + * + * @copyright Copyright (c) 2023 + * + */ + +#include "menuCalibrateBattery.h" + +MenuCalibrateBattery::MenuCalibrateBattery(Battery* battery) { + this->setUpdateDelay(400); + this->battery = battery; +} + +void MenuCalibrateBattery::printMenu() { + if (this->battery->getCalibrationState() == Battery::CalibrationState::None) + this->battery->startCalibration(); + + String lineOne = ""; + String lineTwo = ""; + + switch (this->battery->getCalibrationState()) { + case Battery::CalibrationState::Waiting: + lineOne = "Target Voltage:"; + lineTwo = "7 + "; + lineTwo.concat(this->battery->getCurrentCalibrationVoltage()); + lineTwo.concat(" / 10"); + break; + + case Battery::CalibrationState::Reading: + lineOne = "Reading..."; + break; + + case Battery::CalibrationState::Finished: + lineOne = "Finished!"; + break; + + default: + break; + } + + this->print(lineOne, lineTwo); +} + +void MenuCalibrateBattery::left() { + this->battery->finishCalibration(); + + if (parentMenu) + this->parentMenu->printMenu(); +} + +void MenuCalibrateBattery::right() { + if (this->battery->getCalibrationState() == Battery::CalibrationState::Waiting) + this->battery->nextVoltageIsReady(); +} diff --git a/src/SpecialMenus/CalibrateBattery/menuCalibrateBattery.h b/src/SpecialMenus/CalibrateBattery/menuCalibrateBattery.h new file mode 100644 index 0000000..89758eb --- /dev/null +++ b/src/SpecialMenus/CalibrateBattery/menuCalibrateBattery.h @@ -0,0 +1,33 @@ +/** + * @file menuCalibrateBattery.h + * @author Alexander Klein (alex@kleiax.de) + * @brief + * @version 0.1 + * @date 2023-09-26 + * + * @copyright Copyright (c) 2023 + * + */ + +#ifndef MENU_CALIBRATE_BATTERY_H +#define MENU_CALIBRATE_BATTERY_H + +#include "menuControl.h" +#include "battery.h" + +class MenuCalibrateBattery : public MenuControl { + public: + MenuCalibrateBattery(Battery* battery); + + void printMenu() override; + + void left() override; + void no() override { this->left(); } + void right() override; + void yes() override { this->right(); } + + private: + Battery* battery; +}; + +#endif //MENU_CALIBRATE_BATTERY_H diff --git a/src/SpecialMenus/Speed/menuSpeed.cpp b/src/SpecialMenus/Speed/menuSpeed.cpp new file mode 100644 index 0000000..e267bc2 --- /dev/null +++ b/src/SpecialMenus/Speed/menuSpeed.cpp @@ -0,0 +1,13 @@ +/** + * @file menuSpeed.cpp + * @author Alexander Klein (alex@kleiax.de) + * @brief + * @version 0.1 + * @date 2023-09-26 + * + * @copyright Copyright (c) 2023 + * + */ + +#include "menuSpeed.h" + diff --git a/src/SpecialMenus/Speed/menuSpeed.h b/src/SpecialMenus/Speed/menuSpeed.h new file mode 100644 index 0000000..9acba68 --- /dev/null +++ b/src/SpecialMenus/Speed/menuSpeed.h @@ -0,0 +1,21 @@ +/** + * @file menuSpeed.h + * @author Alexander Klein (alex@kleiax.de) + * @brief + * @version 0.1 + * @date 2023-09-26 + * + * @copyright Copyright (c) 2023 + * + */ + +#ifndef MENU_SPEED_H +#define MENU_SPEED_H + +#include + +class MenuSpeed : MenuIntInput { + +}; + +#endif // MENU_SPEED_H diff --git a/src/SpecialMenus/Systeminformation/menuSysteminformatio.cpp b/src/SpecialMenus/Systeminformation/menuSysteminformatio.cpp index 743dc74..6706ae7 100644 --- a/src/SpecialMenus/Systeminformation/menuSysteminformatio.cpp +++ b/src/SpecialMenus/Systeminformation/menuSysteminformatio.cpp @@ -14,6 +14,7 @@ MenuSysteminformation::MenuSysteminformation(Battery* mainBattery) : MenuInformationSites(8) { this->mainBattery = mainBattery; + this->noEqualLeft = true; } void MenuSysteminformation::printPage() const { diff --git a/src/SpecialMenus/driveModi/menuDriveMode.h b/src/SpecialMenus/driveModi/menuDriveMode.h index ae94233..cff4ea3 100644 --- a/src/SpecialMenus/driveModi/menuDriveMode.h +++ b/src/SpecialMenus/driveModi/menuDriveMode.h @@ -13,6 +13,8 @@ #include "menuInformationSites.h" #include "driveModi/driveManager.h" +#include "SpecialMenus/SensorData/menuSensorData.h" +#include "SpecialMenus/Speed/menuSpeed.h" /** * @brief A base class for Menus about DriveModi @@ -36,6 +38,9 @@ class MenuDriveMode : public MenuInformationSites { void configureOnLeave() {} DriveManager* driveManager; + MenuSensorData* menuSensor; + MenuSpeed* menuSpeed; + bool firstPrint = true; }; diff --git a/src/main.cpp b/src/main.cpp index 9f7f5ab..25ec03d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -47,6 +47,7 @@ #include "SpecialMenus/PID/menuPidSettings.h" #include "SpecialMenus/Route/menuRoute.h" #include "SpecialMenus/SensorData/menuSensorData.h" +#include "SpecialMenus/CalibrateBattery/menuCalibrateBattery.h" MoveControl moveController; Network* network; @@ -142,7 +143,7 @@ void loop() { lcdWrapper->loop(); mainBattery->loop(); - // new Value ervery 0.5s + // new Value ervery 0.5s if (mainBattery->isNewValue()) { static uint8_t batteryLowCounter = 0; if (mainBattery->isBatteryLow(10)) @@ -216,6 +217,7 @@ void makeMenu() { MenuSensorData* sen_m = new MenuSensorData(sensorData); //TODO: Wie bekommt jeder die dumme Route? MenuRoute* rout_m = new MenuRoute(new Route()); + MenuCalibrateBattery* bat_m = new MenuCalibrateBattery(mainBattery); auto_m->setUpdateDelay(1000); sys_m->setUpdateDelay(1500); @@ -242,6 +244,7 @@ void makeMenu() { set_m->addEntry(new MenuAction("Speed", dummy)); set_m->addEntry(new MenuAction("Distance", dummy)); set_m->addEntry(new MenuAction("WiFi", dummy)); + set_m->addEntry(new MenuAction("Battery", bat_m)); // Entry for the PID Menu pid_m->addEntry(new MenuAction("Left", pidl_m));