Enabled gyro temp

This commit is contained in:
Magnus Persson 2022-01-11 09:04:09 +01:00
parent df1981e3dd
commit 57f5816f63
15 changed files with 89 additions and 50 deletions

View File

@ -283,6 +283,14 @@
<input type="number" step=".1" class="form-control" name="temp-adjustment-value" id="temp-adjustment-value">
</div>
</div>
<div class="form-group row">
<label class="col-sm-4 form-check-label" for="gyro-temp">
Use gyro temperature (Experimental)
</label>
<div class="col-sm-8 form-check">
<input class="col-sm-1 form-check-input" type="checkbox" name="gyro-temp" id="gyro-temp">
</div>
</div>
<div class="form-group row">
<label for="ota-url" class="col-sm-4 col-form-label">OTA base URL:</label>
<div class="col-sm-8">
@ -332,7 +340,7 @@
var i = $("#sleep-interval").val()
$("#sleep-interval-info").text( Math.floor(i/60) + " m " + (i%60) + " s" )
if(i<300)
if(i>0 && i<300)
showWarning("A sleep-interval of <300s will reduce battery life, consider using 900s");
else
hideWarning();
@ -380,6 +388,7 @@
$("#gravity-formula").val(cfg["gravity-formula"]);
$("#temp-adjustment-value").val(cfg["temp-adjustment-value"]);
$("#gravity-temp-adjustment").prop( "checked", cfg["gravity-temp-adjustment"] );
$("#gyro-temp").prop( "checked", cfg["gyro-temp"] );
$("#gyro-calibration-data").text( cfg["gyro-calibration-data"]["ax"] + "," + cfg["gyro-calibration-data"]["ay"] + "," + cfg["gyro-calibration-data"]["az"] + "," + cfg["gyro-calibration-data"]["gx"] + "," + cfg["gyro-calibration-data"]["gy"] + "," + cfg["gyro-calibration-data"]["gz"] );
$("#battery").text(cfg["battery"] + " V");
$("#angle").text(cfg["angle"]);

File diff suppressed because one or more lines are too long

View File

@ -23,7 +23,6 @@ build_flags =
-Wl,-Map,output.map
-D BAUD=${common_env_data.monitor_speed}
-D ACTIVATE_OTA
#-D USE_GYRO_TEMP # If this is enabled the DS18 will not be used, temp is read from the gyro.
#-D DEBUG_ESP_HTTP_CLIENT
#-D DEBUG_ESP_HTTP_SERVER
#-D DEBUG_ESP_PORT=Serial
@ -66,9 +65,10 @@ extra_scripts =
build_unflags =
${common_env_data.build_unflags}
-D MAIN_DISABLE_LOGGING
-D WEB_DISABLE_LOGGING
build_flags =
${common_env_data.build_flags}
#-D PIO_FRAMEWORK_ARDUINO_ENABLE_EXCEPTIONS
-D PIO_FRAMEWORK_ARDUINO_ENABLE_EXCEPTIONS
#-D SKIP_SLEEPMODE
-D DOUBLERESETDETECTOR_DEBUG=true
-D COLLECT_PERFDATA # This option will collect runtime data for a few defined methods to measure time, dumped to serial and/or influxdb

View File

@ -52,6 +52,7 @@ Config::Config() {
setGravityTempAdj(false);
gyroCalibration = {0, 0, 0, 0, 0, 0};
formulaData = {{0, 0, 0, 0, 0}, {1, 1, 1, 1, 1}};
gyroTemp = false;
saveNeeded = false;
}
@ -79,6 +80,7 @@ void Config::createJson(DynamicJsonDocument& doc) {
doc[CFG_PARAM_GRAVITY_FORMAT] = String(getGravityFormat());
doc[CFG_PARAM_TEMP_ADJ] = getTempSensorAdj();
doc[CFG_PARAM_GRAVITY_TEMP_ADJ] = isGravityTempAdj();
doc[CFG_PARAM_GYRO_TEMP] = isGyroTemp();
JsonObject cal = doc.createNestedObject(CFG_PARAM_GYRO_CALIBRATION);
cal["ax"] = gyroCalibration.ax;
@ -213,6 +215,8 @@ bool Config::loadFile() {
setGravityFormula(doc[CFG_PARAM_GRAVITY_FORMULA]);
if (!doc[CFG_PARAM_GRAVITY_TEMP_ADJ].isNull())
setGravityTempAdj(doc[CFG_PARAM_GRAVITY_TEMP_ADJ].as<bool>());
if (!doc[CFG_PARAM_GYRO_TEMP].isNull())
setGyroTemp(doc[CFG_PARAM_GYRO_TEMP].as<bool>());
if (!doc[CFG_PARAM_GRAVITY_FORMAT].isNull()) {
String s = doc[CFG_PARAM_GRAVITY_FORMAT];
setGravityFormat(s.charAt(0));
@ -253,7 +257,7 @@ bool Config::loadFile() {
if (!doc[CFG_PARAM_FORMULA_DATA]["g4"].isNull())
formulaData.g[3] = doc[CFG_PARAM_FORMULA_DATA]["g4"].as<double>();
if (!doc[CFG_PARAM_FORMULA_DATA]["g5"].isNull())
formulaData.g[4] = doc[CFG_PARAM_FORMULA_DATA]["g5"];
formulaData.g[4] = doc[CFG_PARAM_FORMULA_DATA]["g5"].as<double>();
myConfig.debug();
saveNeeded = false; // Reset save flag
@ -303,6 +307,7 @@ void Config::debug() {
Log.verbose(F("CFG : Gravity format; '%c'." CR), getGravityFormat());
Log.verbose(F("CFG : Gravity temp adj; %s." CR),
isGravityTempAdj() ? "true" : "false");
Log.verbose(F("CFG : Gyro temp; %s." CR), isGyroTemp() ? "true" : "false");
Log.verbose(F("CFG : Push brewfather; '%s'." CR), getBrewfatherPushUrl());
Log.verbose(F("CFG : Push http; '%s'." CR), getHttpPushUrl());
Log.verbose(F("CFG : Push http2; '%s'." CR), getHttpPushUrl2());

View File

@ -58,7 +58,7 @@ SOFTWARE.
#define CFG_PARAM_PUSH_INFLUXDB2_BUCKET "influxdb2-bucket" // URL
#define CFG_PARAM_PUSH_INFLUXDB2_AUTH "influxdb2-auth" // URL
#define CFG_PARAM_SLEEP_INTERVAL "sleep-interval" // Sleep interval
#define CFG_PARAM_TEMPFORMAT "temp-format" // C or F
#define CFG_PARAM_TEMPFORMAT "temp-format" // C or F
#define CFG_PARAM_VOLTAGEFACTOR \
"voltage-factor" // Factor to calculate the battery voltage
#define CFG_PARAM_GRAVITY_FORMULA \
@ -69,6 +69,8 @@ SOFTWARE.
#define CFG_PARAM_TEMP_ADJ \
"temp-adjustment-value" // Correction value for temp sensor
#define CFG_PARAM_GYRO_CALIBRATION "gyro-calibration-data" // READ ONLY
#define CFG_PARAM_GYRO_TEMP \
"gyro-temp" // True/False. Use temp sensor in gyro (only in gravity mode)
#define CFG_PARAM_FORMULA_DATA \
"formula-calculation-data" // Raw data for the formula calculation
@ -116,6 +118,7 @@ class Config {
float voltageFactor;
float tempSensorAdj; // This value will be added to the read sensor value
int sleepInterval;
bool gyroTemp; // Experimental feature
// Wifi Config
String wifiSSID;
@ -155,6 +158,12 @@ class Config {
saveNeeded = true;
}
const bool isGyroTemp() { return gyroTemp; }
void setGyroTemp(bool b) {
gyroTemp = b;
saveNeeded = true;
}
const char* getOtaURL() { return otaURL.c_str(); }
void setOtaURL(String s) {
otaURL = s;

View File

@ -220,7 +220,7 @@ void PerfLogging::pushInflux() {
"angle=%.4f,gyro-ax=%d,gyro-ay=%d,gyro-az=%d,gyro-temp=%.2f,ds-temp=%.2f",
myGyro.getAngle(), myGyro.getLastGyroData().ax,
myGyro.getLastGyroData().ay, myGyro.getLastGyroData().az,
myGyro.getSensorTempC(), myTempSensor.getTempC());
myGyro.getSensorTempC(), myTempSensor.getTempC(myConfig.isGyroTemp()));
body += &buf[0];
// Log.notice(F("PERF: data %s." CR), body.c_str() );

View File

@ -102,7 +102,7 @@ void setup() {
#if LOG_LEVEL == 6 && !defined(MAIN_DISABLE_LOGGING)
// Add a delay so that serial is started.
// delay(3000);
// delay(3000);
Log.verbose(F("Main: Reset reason %s." CR), ESP.getResetInfo().c_str());
#endif
// Main startup
@ -207,12 +207,12 @@ bool loopReadGravity() {
stableGyroMillis = millis(); // Reset timer
LOG_PERF_START("loop-temp-read");
float temp = myTempSensor.getTempC();
float temp = myTempSensor.getTempC(myConfig.isGyroTemp());
LOG_PERF_STOP("loop-temp-read");
float gravity = calculateGravity(angle, temp);
float corrGravity = gravityTemperatureCorrection(
gravity, temp, myConfig.getTempFormat());
float gravity = calculateGravity(angle, temp);
float corrGravity =
gravityTemperatureCorrection(gravity, temp, myConfig.getTempFormat());
#if LOG_LEVEL == 6 && !defined(MAIN_DISABLE_LOGGING)
Log.verbose(F("Main: Sensor values gyro angle=%F, temp=%F, gravity=%F, "
@ -249,6 +249,7 @@ void loopGravityOnInterval() {
LOG_PERF_START("loop-gyro-read");
myGyro.read();
LOG_PERF_STOP("loop-gyro-read");
myBatteryVoltage.read();
checkSleepMode(myGyro.getAngle(), myBatteryVoltage.getVoltage());
LOG_PERF_PUSH();
}
@ -263,7 +264,7 @@ void goToSleep(int sleepInterval) {
Log.notice(F("MAIN: Entering deep sleep for %ds, run time %Fs, "
"battery=%FV." CR),
sleepInterval, reduceFloatPrecision(runtime/1000, 2), volt);
sleepInterval, reduceFloatPrecision(runtime / 1000, 2), volt);
LittleFS.end();
myGyro.enterSleep();
LOG_PERF_STOP("run-time");
@ -281,7 +282,6 @@ void loop() {
myWebServer.loop();
myWifi.loop();
loopGravityOnInterval();
myBatteryVoltage.read();
break;
case RunMode::gravityMode:

View File

@ -22,8 +22,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
#include <DallasTemperature.h>
#include <Wire.h>
#include <OneWire.h>
#include <Wire.h>
#include <config.hpp>
#include <gyro.hpp>
@ -35,16 +35,14 @@ SOFTWARE.
//
float convertCtoF(float t) { return (t * 1.8) + 32.0; }
#if !defined(USE_GYRO_TEMP)
OneWire myOneWire(D6);
DallasTemperature mySensors(&myOneWire);
#define TEMPERATURE_PRECISION 9
#endif
TempSensor myTempSensor;
//
// Setup temp sensors
// Setup DS18B20 temp sensor. Doing setup is not that time consuming.
//
void TempSensor::setup() {
#if defined(SIMULATE_TEMP)
@ -52,9 +50,6 @@ void TempSensor::setup() {
return;
#endif
#if defined(USE_GYRO_TEMP)
Log.notice(F("TSEN: Using temperature from gyro." CR));
#else
#if LOG_LEVEL == 6 && !defined(TSEN_DISABLE_LOGGING)
Log.verbose(F("TSEN: Looking for temp sensors." CR));
#endif
@ -67,7 +62,6 @@ void TempSensor::setup() {
#endif
mySensors.setResolution(TEMPERATURE_PRECISION);
}
#endif
float t = myConfig.getTempSensorAdj();
@ -89,21 +83,22 @@ void TempSensor::setup() {
//
// Retrieving value from sensor, value is in Celcius
//
float TempSensor::getValue() {
float TempSensor::getValue(bool useGyro) {
#if defined(SIMULATE_TEMP)
return 21;
#endif
#if defined(USE_GYRO_TEMP)
// When using the gyro temperature only the first read value will be accurate
// so we will use this for processing.
float c = myGyro.getInitialSensorTempC();
hasSensor = true;
return c;
if (useGyro) {
// When using the gyro temperature only the first read value will be
// accurate so we will use this for processing.
float c = myGyro.getInitialSensorTempC();
#if LOG_LEVEL == 6 && !defined(TSEN_DISABLE_LOGGING)
Log.verbose(F("TSEN: Reciving temp value for gyro sensor %F C." CR), c);
Log.verbose(F("TSEN: Reciving temp value for gyro sensor %F C." CR), c);
#endif
#else
hasSensor = true;
return c;
}
// If we dont have sensors just return 0
if (!mySensors.getDS18Count()) {
Log.error(F("TSEN: No temperature sensors found. Skipping read." CR));
@ -119,12 +114,11 @@ float TempSensor::getValue() {
c = mySensors.getTempCByIndex(0);
#if LOG_LEVEL == 6 && !defined(TSEN_DISABLE_LOGGING)
Log.verbose(F("TSEN: Reciving temp value for sensor %F C." CR), c);
Log.verbose(F("TSEN: Reciving temp value for DS18B20 sensor %F C." CR), c);
#endif
hasSensor = true;
}
return c;
#endif
}
// EOF

View File

@ -33,13 +33,17 @@ class TempSensor {
bool hasSensor = false;
float tempSensorAdjF = 0;
float tempSensorAdjC = 0;
float getValue();
float getValue(bool useGyro);
public:
void setup();
bool isSensorAttached() { return hasSensor; }
float getTempC() { return getValue() + tempSensorAdjC; }
float getTempF() { return convertCtoF(getValue()) + tempSensorAdjF; }
float getTempC(bool useGyro = false) {
return getValue(useGyro) + tempSensorAdjC;
}
float getTempF(bool useGyro = false) {
return convertCtoF(getValue(useGyro)) + tempSensorAdjF;
}
};
// Global instance created

View File

@ -41,7 +41,7 @@ extern bool sleepModeAlwaysSkip;
void WebServer::webHandleDevice() {
LOG_PERF_START("webserver-api-device");
#if LOG_LEVEL == 6 && !defined(WEB_DISABLE_LOGGING)
Log.verbose(F("WEB : webServer callback for /api/config." CR));
Log.verbose(F("WEB : webServer callback for /api/device." CR));
#endif
DynamicJsonDocument doc(100);
@ -69,8 +69,10 @@ void WebServer::webHandleConfig() {
DynamicJsonDocument doc(CFG_JSON_BUFSIZE);
myConfig.createJson(doc);
doc[CFG_PARAM_PASS] = ""; // dont show the wifi password
double angle = myGyro.getAngle();
double temp = myTempSensor.getTempC();
double temp = myTempSensor.getTempC(myConfig.isGyroTemp());
double gravity = calculateGravity(angle, temp);
doc[CFG_PARAM_ANGLE] = reduceFloatPrecision(angle);
@ -137,9 +139,9 @@ void WebServer::webHandleUploadFile() {
}
#if LOG_LEVEL == 6 && !defined(WEB_DISABLE_LOGGING)
Log.debug(F("WEB : webServer callback for /api/upload, receiving file %s, "
"valid=%s." CR),
f.c_str(), validFilename ? "yes" : "no");
Log.verbose(F("WEB : webServer callback for /api/upload, receiving file %s, "
"valid=%s." CR),
f.c_str(), validFilename ? "yes" : "no");
#endif
if (upload.status == UPLOAD_FILE_START) {
@ -213,7 +215,7 @@ void WebServer::webHandleStatus() {
DynamicJsonDocument doc(256);
double angle = myGyro.getAngle();
double temp = myTempSensor.getTempC();
double temp = myTempSensor.getTempC(myConfig.isGyroTemp());
double gravity = calculateGravity(angle, temp);
doc[CFG_PARAM_ID] = myConfig.getID();
@ -225,7 +227,8 @@ void WebServer::webHandleStatus() {
else
doc[CFG_PARAM_GRAVITY] = reduceFloatPrecision(gravity, 4);
doc[CFG_PARAM_TEMP_C] = reduceFloatPrecision(temp, 1);
doc[CFG_PARAM_TEMP_F] = reduceFloatPrecision(myTempSensor.getTempF(), 1);
doc[CFG_PARAM_TEMP_F] =
reduceFloatPrecision(myTempSensor.getTempF(myConfig.isGyroTemp()), 1);
doc[CFG_PARAM_BATTERY] = reduceFloatPrecision(myBatteryVoltage.getVoltage());
doc[CFG_PARAM_TEMPFORMAT] = String(myConfig.getTempFormat());
doc[CFG_PARAM_SLEEP_MODE] = sleepModeAlwaysSkip;
@ -411,15 +414,18 @@ void WebServer::webHandleConfigHardware() {
}
#if LOG_LEVEL == 6 && !defined(WEB_DISABLE_LOGGING)
Log.verbose(F("WEB : vf=%s, tempadj=%s, ota=%s." CR),
Log.verbose(F("WEB : vf=%s, tempadj=%s, ota=%s gyrotemp=%s." CR),
server->arg(CFG_PARAM_VOLTAGEFACTOR).c_str(),
server->arg(CFG_PARAM_TEMP_ADJ).c_str(),
server->arg(CFG_PARAM_OTA).c_str());
server->arg(CFG_PARAM_OTA).c_str(),
server->arg(CFG_PARAM_GYRO_TEMP).c_str());
#endif
myConfig.setVoltageFactor(server->arg(CFG_PARAM_VOLTAGEFACTOR).toFloat());
myConfig.setTempSensorAdj(server->arg(CFG_PARAM_TEMP_ADJ).toFloat());
myConfig.setOtaURL(server->arg(CFG_PARAM_OTA).c_str());
myConfig.setGyroTemp(
server->arg(CFG_PARAM_GYRO_TEMP).equalsIgnoreCase("on") ? true : false);
myConfig.saveFile();
server->sendHeader("Location", "/config.htm#collapseFour", true);
server->send(302, "text/plain", "Hardware config updated");
@ -559,6 +565,7 @@ void WebServer::webHandleFormulaWrite() {
server->send(302, "text/plain", "Formula updated");
LOG_PERF_STOP("webserver-api-formula-write");
}
//
// Helper function to check if files exist on file system.
//

View File

@ -82,8 +82,6 @@ This is a list of C++ defines that is used to enable/disable functions in the co
- description
* - ACTIVATE_OTA
- Enables the OTA functionallity in the code
* - USE_GYRO_TEMP
- Uses temperature from gyro instead of DS18B20 (experimental)
* - SKIP_SLEEPMODE
- THe device never goes into sleep mode, useful when developing.
* - CFG_DISABLE_LOGGING

View File

@ -165,7 +165,13 @@ Hardware Settings
* **Temperature correction:**
This value will be added to the temperature reading (negative value will reduce temperature reading).
This value will be added to the temperature reading (negative value will reduce temperature reading). This is applied
when the device starts. So changing this will not take affect until the device is restarted.
* **Gyro Temperature:**
Enable this feature will use the temp sensor i the gyro instead of the DS18B20, the benefit is shorter run time and
longer battery life (this is an experimental feature).
* **OTA URL:**
@ -235,6 +241,7 @@ Other parameters are the same as in the configuration guide.
"gravity-format": "G",
"temp-adjustment-value": 0,
"gravity-temp-adjustment": false,
"gyro-temp": true,
"gyro-calibration-data": {
"ax": -330,
"ay": -2249,
@ -367,8 +374,8 @@ Used to update gravity settings via an HTTP POST command. Payload is in JSON for
}
POST: /api/config/gravity
=========================
POST: /api/config/hardware
==========================
Used to update hardware settings via an HTTP POST command. Payload is in JSON format.
@ -378,6 +385,7 @@ Used to update hardware settings via an HTTP POST command. Payload is in JSON fo
"id": "ee1bfc",
"voltage-factor": 1.59,
"temp-adjustment": 0,
"gyro-temp": "off",
"ota-url": "http://192.168.1.50/firmware/gravmon/"
}
@ -461,6 +469,7 @@ present or the API call will fail.
json = { "id": id,
"voltage-factor": 1.59, # Default value for voltage calculation
"temp-adjustment": 0, # If temp sensor needs to be corrected
"gyro-temp": true, # Use the temp sensor in the gyro instead
"ota-url": "" # if the device should seach for a new update when active
}
set_config( url, json )

View File

@ -13,6 +13,8 @@ This is features for the next release.
* Refactored main.cpp to make it easier to read
* Tested runtime performance
* Improved documentation
* Added warning on config page when sleep is <300
* Enabled selection of gyro temperature sensor under Hardware settings.
v0.5.0
------

View File

@ -16,6 +16,7 @@
"gravity-format": "G",
"temp-adjustment-value": 0,
"gravity-temp-adjustment": false,
"gyro-temp": true,
"gyro-calibration-data": {
"ax": -330,
"ay": -2249,

View File

@ -58,6 +58,7 @@ url = "http://" + host + "/api/config/hardware"
json = { "id": id,
"voltage-factor": 1.59, # Default value for voltage calculation
"temp-adjustment": 0, # If temp sensor needs to be corrected
"gyro-temp": "off", # Use the temp sensor in the gyro
"ota-url": "" # if the device should seach for a new update when active
}
set_config( url, json )