- added batteryCalibration

- start with default Menus for DriveModes
This commit is contained in:
2023-09-27 11:11:39 +02:00
parent e48f680fec
commit 38e7db7dee
13 changed files with 221 additions and 13 deletions
+5 -1
View File
@@ -45,12 +45,16 @@ Code:
sensor data gnss daten aktualisieren sensor data gnss daten aktualisieren
Menübaum korrigieren, Verlinkung Sensor in Mode etc. Menübaum korrigieren, Verlinkung Sensor in Mode etc.
esp und sensoren in den deepsleep esp und sensoren in den deepsleep
battery Prozent ausgabe wirkt komisch
Latex: Latex:
Anhang: Liste mit allen Komponenten und Kurzbeschreibung Anhang: Liste mit allen Komponenten und Kurzbeschreibung
Unterschied funktionale und nicht funktionale Anforderungen Unterschied funktionale und nicht funktionale Anforderungen
Strom nicht über Zeit sondern Rampe 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: 3D:
Rover:
Spannungsteiler neu kalibrieren.
+1 -1
View File
@@ -21,7 +21,7 @@ namespace PinNumbers {
constexpr uint8_t dir1 = 27; constexpr uint8_t dir1 = 27;
constexpr uint8_t dir2 = 12; constexpr uint8_t dir2 = 12;
constexpr uint8_t pwm = 13; constexpr uint8_t pwm = 13;
constexpr uint8_t encoder = 26; constexpr uint8_t encoder = 32;
constexpr uint8_t pmwChannel = 0; constexpr uint8_t pmwChannel = 0;
} }
+1 -1
View File
@@ -14,7 +14,7 @@
#include <stdint.h> #include <stdint.h>
#define RHEDE #define HOTSPOT
#ifdef HOTSPOT #ifdef HOTSPOT
namespace NetworkConfig { namespace NetworkConfig {
+51 -1
View File
@@ -27,10 +27,15 @@ Battery::Battery(uint8_t pin) {
} }
void Battery::run() { void Battery::run() {
if (this->calibrationState != CalibrationState::None) {
this->runCalibration();
return;
}
this->readAdcToBuf(); this->readAdcToBuf();
this->loopCounter++; this->loopCounter++;
if (this->loopCounter == this->calulationDelayMultiplier) { if (this->loopCounter >= this->calulationDelayMultiplier) {
this->calculateBatteryVoltage(); this->calculateBatteryVoltage();
this->calculateBatteryPercent(); this->calculateBatteryPercent();
this->loopCounter = 0; this->loopCounter = 0;
@@ -40,6 +45,28 @@ void Battery::run() {
return; 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 Battery::getBatteryVoltage() const {
double res = this->batteryVoltage; double res = this->batteryVoltage;
return (int)(res*100+0.5)/100.0; return (int)(res*100+0.5)/100.0;
@@ -59,6 +86,29 @@ bool Battery::isNewValue() {
return true; 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() { double Battery::calculateInputVoltage() {
// Reference voltage is 3v3 so maximum reading is 3v3 = 4095 in range 0 to 4095 // Reference voltage is 3v3 so maximum reading is 3v3 = 4095 in range 0 to 4095
double reading = this->getBufAvg(); double reading = this->getBufAvg();
+25 -6
View File
@@ -29,6 +29,13 @@
*/ */
class Battery : public Component { class Battery : public Component {
public: public:
enum CalibrationState {
None,
Reading,
Waiting,
Finished
};
/** /**
* @brief Construct a new Battery object * @brief Construct a new Battery object
* *
@@ -72,8 +79,16 @@ class Battery : public Component {
bool isNewValue(); bool isNewValue();
//Calibration
CalibrationState getCalibrationState() const { return this->calibrationState; }
uint8_t getCurrentCalibrationVoltage() const { return this->currentCalibrationVoltage; }
void nextVoltageIsReady();
void startCalibration();
void finishCalibration();
private: private:
void run() override; void run() override;
void runCalibration();
double calculateInputVoltage(); double calculateInputVoltage();
void calculateBatteryVoltage(); void calculateBatteryVoltage();
void calculateBatteryPercent(); void calculateBatteryPercent();
@@ -83,6 +98,8 @@ class Battery : public Component {
static const uint8_t bufferSize = 30; static const uint8_t bufferSize = 30;
CalibrationState calibrationState = CalibrationState::None;
uint8_t absurdLowVoltage = 5; uint8_t absurdLowVoltage = 5;
uint8_t pin; uint8_t pin;
uint8_t batteryPercent = 0; uint8_t batteryPercent = 0;
@@ -90,7 +107,9 @@ class Battery : public Component {
uint8_t bufferPos = 0; uint8_t bufferPos = 0;
uint8_t calulationDelayMultiplier = 5; uint8_t calulationDelayMultiplier = 5;
uint8_t loopCounter = 0; uint8_t loopCounter = 0;
uint8_t currentCalibrationVoltage = 0; // *0.1 + 7
uint16_t adcBuffer[bufferSize]; uint16_t adcBuffer[bufferSize];
uint16_t* newRawAdcVoltages;
uint32_t r1 = 0; uint32_t r1 = 0;
uint32_t r2 = 0; uint32_t r2 = 0;
bool calculatetNewValues = false; bool calculatetNewValues = false;
@@ -108,12 +127,12 @@ class Battery : public Component {
const double startVoltage = 7; const double startVoltage = 7;
const double stepVoltage = 0.1; const double stepVoltage = 0.1;
const uint16_t rawAdcVoltages[60] = // from 7.0V to 12.9V in 0.1V steps 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, {1992, 2021, 2056, 2090, 2118, 2145, 2177, 2208, 2241, 2272,
2109, 2136, 2163, 2189, 2218, 2244, 2273, 2302, 2334, 2363, 2298, 2331, 2362, 2387, 2420, 2453, 2482, 2514, 2543, 2577,
2391, 2415, 2441, 2471, 2499, 2531, 2557, 2587, 2617, 2646, 2607, 2640, 2670, 2703, 2736, 2763, 2794, 2826, 2858, 2890,
2674, 2699, 2730, 2761, 2791, 2816, 2843, 2872, 2900, 2930, 2920, 2956, 2983, 3019, 3054, 3088, 3121, 3158, 3189, 3226,
2958, 2991, 3017, 3049, 3080, 3115, 3144, 3178, 3208, 3242, 3264, 3300, 3339, 3379, 3414, 3453, 3500, 3544, 3598, 3636,
3276, 3313, 3346, 3389, 3433, 3470, 3509, 3548, 3590, 3636}; 3682, 3730, 3781, 3837, 3887, 3943, 3997, 4054, 4093, 4095};
}; };
#endif // BATTERY_H #endif // BATTERY_H
+2 -2
View File
@@ -15,7 +15,7 @@ board_build.partitions = no_ota.csv
framework = arduino framework = arduino
monitor_speed = 115200 monitor_speed = 115200
upload_speed = 921600 upload_speed = 921600
monitor_port = COM3 monitor_port = COM6
lib_deps = lib_deps =
https://git.kleiax.de/PlatformIO-Libs/SparkFunGNSS.git https://git.kleiax.de/PlatformIO-Libs/SparkFunGNSS.git
knolleary/PubSubClient@^2.8 knolleary/PubSubClient@^2.8
@@ -26,7 +26,7 @@ lib_deps =
https://git.kleiax.de/PlatformIO-Libs/Menu.git https://git.kleiax.de/PlatformIO-Libs/Menu.git
nrf24/RF24@^1.4.5 nrf24/RF24@^1.4.5
jrowberg/I2Cdevlib-MPU6050@^1.0.0 jrowberg/I2Cdevlib-MPU6050@^1.0.0
upload_port = COM3 upload_port = COM6
test_ignore = test_desktop test_ignore = test_desktop
build_type = debug build_type = debug
monitor_filters = esp32_exception_decoder monitor_filters = esp32_exception_decoder
@@ -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();
}
@@ -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
+13
View File
@@ -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"
+21
View File
@@ -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 <menuIntInput.h>
class MenuSpeed : MenuIntInput {
};
#endif // MENU_SPEED_H
@@ -14,6 +14,7 @@
MenuSysteminformation::MenuSysteminformation(Battery* mainBattery) MenuSysteminformation::MenuSysteminformation(Battery* mainBattery)
: MenuInformationSites(8) { : MenuInformationSites(8) {
this->mainBattery = mainBattery; this->mainBattery = mainBattery;
this->noEqualLeft = true;
} }
void MenuSysteminformation::printPage() const { void MenuSysteminformation::printPage() const {
@@ -13,6 +13,8 @@
#include "menuInformationSites.h" #include "menuInformationSites.h"
#include "driveModi/driveManager.h" #include "driveModi/driveManager.h"
#include "SpecialMenus/SensorData/menuSensorData.h"
#include "SpecialMenus/Speed/menuSpeed.h"
/** /**
* @brief A base class for Menus about DriveModi * @brief A base class for Menus about DriveModi
@@ -36,6 +38,9 @@ class MenuDriveMode : public MenuInformationSites {
void configureOnLeave() {} void configureOnLeave() {}
DriveManager* driveManager; DriveManager* driveManager;
MenuSensorData* menuSensor;
MenuSpeed* menuSpeed;
bool firstPrint = true; bool firstPrint = true;
}; };
+3
View File
@@ -47,6 +47,7 @@
#include "SpecialMenus/PID/menuPidSettings.h" #include "SpecialMenus/PID/menuPidSettings.h"
#include "SpecialMenus/Route/menuRoute.h" #include "SpecialMenus/Route/menuRoute.h"
#include "SpecialMenus/SensorData/menuSensorData.h" #include "SpecialMenus/SensorData/menuSensorData.h"
#include "SpecialMenus/CalibrateBattery/menuCalibrateBattery.h"
MoveControl moveController; MoveControl moveController;
Network* network; Network* network;
@@ -216,6 +217,7 @@ void makeMenu() {
MenuSensorData* sen_m = new MenuSensorData(sensorData); MenuSensorData* sen_m = new MenuSensorData(sensorData);
//TODO: Wie bekommt jeder die dumme Route? //TODO: Wie bekommt jeder die dumme Route?
MenuRoute* rout_m = new MenuRoute(new Route()); MenuRoute* rout_m = new MenuRoute(new Route());
MenuCalibrateBattery* bat_m = new MenuCalibrateBattery(mainBattery);
auto_m->setUpdateDelay(1000); auto_m->setUpdateDelay(1000);
sys_m->setUpdateDelay(1500); sys_m->setUpdateDelay(1500);
@@ -242,6 +244,7 @@ void makeMenu() {
set_m->addEntry(new MenuAction("Speed", dummy)); set_m->addEntry(new MenuAction("Speed", dummy));
set_m->addEntry(new MenuAction("Distance", dummy)); set_m->addEntry(new MenuAction("Distance", dummy));
set_m->addEntry(new MenuAction("WiFi", dummy)); set_m->addEntry(new MenuAction("WiFi", dummy));
set_m->addEntry(new MenuAction("Battery", bat_m));
// Entry for the PID Menu // Entry for the PID Menu
pid_m->addEntry(new MenuAction("Left", pidl_m)); pid_m->addEntry(new MenuAction("Left", pidl_m));