From c1c325a2bc13700e1b9d175c379a3374cf45028e Mon Sep 17 00:00:00 2001 From: Magnus Date: Sun, 11 Apr 2021 11:12:46 +0200 Subject: [PATCH] Bug fixes gravitycorr + option to use gyro temp --- .gitignore | 3 ++- README.md | 49 +++++++++++++++++++++++---------------------- img/config1.png | Bin 20029 -> 13295 bytes img/config2.png | Bin 10313 -> 19034 bytes platformio.ini | 1 + src/calc.cpp | 9 +++++---- src/calc.h | 2 +- src/config.h | 8 ++++---- src/gyro.h | 2 +- src/helper.cpp | 3 +++ src/main.cpp | 2 +- src/tempsensor.cpp | 29 ++++++++++++++++++++++----- src/webserver.cpp | 30 ++++++++++++++++----------- 13 files changed, 85 insertions(+), 53 deletions(-) diff --git a/.gitignore b/.gitignore index bdbabf6..4aa2f51 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,8 @@ .pio/* .vscode/* *.map +docs/* test/*.md test/env/* test/*.py -TODO.md \ No newline at end of file +TODO.md diff --git a/README.md b/README.md index f4fd0aa..5865c1c 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ I started this project out of curiosity for how a motion sensor is working and since I like to brew beer this was the result. This software can be used with iSpindle hardware and utilizes the same hardware configuration. No code has been reused from the iSpindle project. -### TODO +## TODO * Add support for Plato in device (today it assumes that formula is in SG). * Add support for converting between SG/Plato in device. @@ -11,25 +11,25 @@ I started this project out of curiosity for how a motion sensor is working and s * Add support for https web server (will require certificates to be created as part of build process) * Add iSpindle 3D print cradle + small PCB (what I use for my builds) * Validate max sleep time to 70 min (max time for ESP) -* Check how much movement there is during fermentack (check run time) if we should go into sleep mode for a shorter time... +* Validate the power consumption of the device using amp meter (integrated and/or separate) +* Add option to use temperature readings from motion sensor (longer battery life) +* Testing, Testing and more testing...... # Functionallity -I have made a few differnt design decision compared to the standard iSpindle software. +I have made a few different design decision compared to the standard iSpindle software. -* All configuration options have been moved to a web gui and is accesible without using the double reset function. You only need to use this for changing the WIFI configuration. The web gui can be accessed when either the device is laying flat on a surface (90 degress) or it's beeing charged. The benefits is that it's easier to change settings and also read the angle/tilt when doing calibration. You can also change the forumla and directly see the new calculated result. +* The device operate in two modes, __always-on__ or __deep-sleep__. Always on can be triggered in two ways: Connected to charger and the power is over 4.1V or the device is lying flat (angle is approx 90 degrees). -* The software also has built in OTA support so new versions can be downloaded from a local webserver (when connected to power) +* Configuration options have been moved to a web gui and is accesible when the device is in __always-on__ mode. The Wifi portal only need to be used for changing WIFI network. -* Temperature calibration of DS18B20 sensor so you can adjust the temperature sensor readings. +* The software also has built in OTA support so new versions can be downloaded from a local webserver and checks are done during startup and the device is in __always-on__ mode. -* Automatic temperature gravity calculation to adjust for a lower temperature in the fermentation vessels. Useful if you are fermenting at lower temperatures. It's possible to build this into the normal gravity formula but this is an easier option. Just make sure that the calibration is done at 20°C. +* Temperature calibration has been added for the DS18B20 sensor so you can adjust the temperature sensor readings if there is a need. When the device is in __always-on__ mode the temperature will rise in the container so the value will increase and not reflect the temperature for the surronding the container. -* The software will read the motion sensor 50 times and use the average to calculate the angle. If the readings show that the device is moving it will wait a few seconds and retry the operation again to make sure that no invalid angles should be reported. The downside is that the device will remain running if it's moving and draw more power. For normal fermentation this should not be an issue. +* There is an option to automatically correct the gravity calculation based on the temperature. Useful if you are fermenting at lower temperatures. It's possible to build this into the normal gravity formula but this is an easier option. Just make sure that the calibration is done at 20°C. -## Integrations / Sending data - -In this version the software supports sending data to standad HTTP endpoint and Brewfather. These are the ones I use so more can be added on request. +* The software will read the motion sensor 50 times and use the average to calculate the angle. If the readings show that the device is moving it will wait a few seconds and retry the operation again to make sure that no invalid angles should be reported. If the device is unsuccesful to get a valid angle within 10s it will go to sleep for 60s and then retry again (TODO: This will be adjusted after more testing). ## Configuration @@ -39,7 +39,7 @@ Configuration is accessed by entering the URL for the device, this will be the m http://gravmon.local/ -The main page shows the device readings; gravity, angle, temperature and battery charge. If the checkbox is active then the device will never go into sleep mode. This is useful if you are collecting angle/tilt for calibration. If this is unchecked the device will go into sleep mode and the web UI is no longer accesible. +The main page shows the device readings; gravity, angle, temperature and battery charge. If the checkbox is active then the device will never go into sleep mode. This is useful if you are collecting angle/tilt for calibration. If this is unchecked the device will change mode as explained before. ![Status](img/index.png) @@ -55,15 +55,13 @@ The device page shows the device settings and software versions. http://gravmon.local/config.htm -This page is divided into several categories of settings. The first one contains device settings, mDNS name, temperature format, and gyro calibration data. The interval setting is the amount of time the device will be in sleep mode between readings (interval is in seconds). +* This page is divided into several categories of settings. The first one contains device settings, mDNS name, temperature format, sleep interval and gyro calibration data. The interval setting is the amount of time the device will be in sleep mode between readings (interval is in seconds). To simplify this you can also see the conversion to minutes / seconds next to the input field. -Calibration needs to be done or the device will not work correctly. Place the device flat on a surface with gyro up and press the calibrate button when it's stable. - -__TODO: Update image for config settings.__ +* Calibration needs to be done or the device will not work correctly. Place the device flat on a surface with gyro up and press the calibrate button when it's stable. If no calibration data exist the device will not enter sleep-mode. ![Config - Device](img/config1.png) -The second section contains the push settings, two URL's for http posts, Brewfather and settings for InfluxDB v2. +* The second section contains the push settings, two URL's for http posts, Brewfather and settings for InfluxDB v2. ### This is the format used for standard http posts. ``` @@ -100,18 +98,19 @@ The second section contains the push settings, two URL's for http posts, Brewfat ``` measurement,host=,device=,temp-format=,gravity-format=SG gravity=1.0004,angle=45.45,temp=20.1,battery=3.96,rssi=-18 ``` - -__TODO: Update image for push settings.__ - ![Config - Push](img/config2.png) -The third section contains the gravity options, formlua and option for temperature correcting gravity. +* The third section contains the gravity formula and also option for doing temperature compensation. The calibration formula uses two keywords, temp and tilt. Temperature is in the selected device format. * Gravity formula is compatible with standard iSpindle formulas so any existing calculation option can be used. I use the tool fermentrack for controlling my fermentation and I use this tool for calculating gravity. The formula can handle two keywords, __tilt__ and __temp__. This is an example of a formula; __0.00145*tilt^3+0.1445*tilt^2+0.00179*tilt+0.9436__ -![Config - Gravity](img/config3.png) +* This is the formula used for temperature calibration (temp is in F). Cal = 20C. +``` +gravity*((1.00130346-0.000134722124*temp+0.00000204052596*temp^2-0.00000000232820948*temp^3)/(1.00130346-0.000134722124*cal+0.00000204052596*cal^2-0.00000000232820948*cal^3)) +``` +![Config - gravity](img/config3.png) -The fouth section contains the hardware options, voltage factor for calculating the battery charge, temperature sensor adjustment and OTA base URL. +* Hardware settings contain settings for temperature sensor adjustment, voltage factor (to calulate the battery level) and OTA URL. * For the OTA to work, place the following files (version.json + firmware.bin) at the location that you pointed out in OTA URL. If the version number in the json file is newer than in the code the update will be done during startup. @@ -129,7 +128,7 @@ Contents version.json # Building a device -Not yet complete. +See the iSpindle documentation for building a device. # Compiling the software @@ -142,3 +141,5 @@ You can set the SSID and PWD as presets through platformio.ini by adding the set -D USER_SSID=\""\"" // =\""myssid\"" -D USER_SSID_PWD=\""\"" // =\""mypwd\"" ``` + +There are more options in teh platform.ini file that enable/disable additional functions for logging level, pushing performance data to InfluxDB and more. If i get the time I will add some documentation around these. \ No newline at end of file diff --git a/img/config1.png b/img/config1.png index 28988f46e420c40e2dc07a031a87f1d8f159eefb..f10c5a20ad797a61f8a914693db30da176583113 100644 GIT binary patch literal 13295 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 Vgs<=}#^f85sgc>0GJ`w#e*kIj+#&z~ diff --git a/img/config2.png b/img/config2.png index 9d13b2e833a9bd8b4eec43e1fe848122332a2113..720bffef26d099ee09e435a20b2be0bf42432317 100644 GIT binary patch literal 19034 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

QYuL9n90*@uzsbAs;k0 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 diff --git a/platformio.ini b/platformio.ini index 315be10..23fe807 100644 --- a/platformio.ini +++ b/platformio.ini @@ -22,6 +22,7 @@ build_unflags = build_flags = #-O0 -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 diff --git a/src/calc.cpp b/src/calc.cpp index 3c88220..e919d7b 100644 --- a/src/calc.cpp +++ b/src/calc.cpp @@ -64,17 +64,18 @@ double calculateGravity( double angle, double temp ) { // // Do a standard gravity temperature correction. This is a simple way to adjust for differnt worth temperatures // -double gravityTemperatureCorrection( double gravity, double temp, double calTemp) { +double gravityTemperatureCorrection( double gravity, double temp, char tempFormat, double calTemp) { #if LOG_LEVEL==6 Log.verbose(F("CALC: Adjusting gravity based on temperature, gravity %F, temp %F, calTemp %F." CR), gravity, temp, calTemp); #endif - double tempF = convertCtoF( temp ); - double calTempF = convertCtoF(calTemp); + if( tempFormat == 'C') + temp = convertCtoF( temp ); + double calTempF = convertCtoF(calTemp); // calTemp is in C const char* formula = "gravity*((1.00130346-0.000134722124*temp+0.00000204052596*temp^2-0.00000000232820948*temp^3)/(1.00130346-0.000134722124*cal+0.00000204052596*cal^2-0.00000000232820948*cal^3))"; // Store variable names and pointers. - te_variable vars[] = {{"gravity", &gravity}, {"temp", &tempF}, {"cal", &calTempF}}; + te_variable vars[] = {{"gravity", &gravity}, {"temp", &temp}, {"cal", &calTempF}}; int err; // Compile the expression with variables. diff --git a/src/calc.h b/src/calc.h index ae21be1..8b07562 100644 --- a/src/calc.h +++ b/src/calc.h @@ -29,7 +29,7 @@ SOFTWARE. // Functions double calculateGravity( double angle, double temp ); -double gravityTemperatureCorrection( double gravity, double temp, double calTemp = 20 ); +double gravityTemperatureCorrection( double gravity, double temp, char tempFormat, double calTemp = 20 ); #endif // _CALC_H diff --git a/src/config.h b/src/config.h index cc9dd18..cf3e8a7 100644 --- a/src/config.h +++ b/src/config.h @@ -48,10 +48,10 @@ SOFTWARE. #define CFG_PARAM_PUSH_BREWFATHER "brewfather-push" // URL (brewfather format) #define CFG_PARAM_PUSH_HTTP "http-push" // URL (iSpindle format) #define CFG_PARAM_PUSH_HTTP2 "http-push2" // URL (iSpindle format) -#define CFG_PARAM_PUSH_INFLUXDB2 "influxdb2-push" // URL (iSpindle format) -#define CFG_PARAM_PUSH_INFLUXDB2_ORG "influxdb2-org" // URL (iSpindle format) -#define CFG_PARAM_PUSH_INFLUXDB2_BUCKET "influxdb2-bucket" // URL (iSpindle format) -#define CFG_PARAM_PUSH_INFLUXDB2_AUTH "influxdb2-auth" // URL (iSpindle format) +#define CFG_PARAM_PUSH_INFLUXDB2 "influxdb2-push" // URL +#define CFG_PARAM_PUSH_INFLUXDB2_ORG "influxdb2-org" // URL +#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 // TODO: @deprecated setting #define CFG_PARAM_PUSH_INTERVAL "push-interval" // Time between push diff --git a/src/gyro.h b/src/gyro.h index b6a9eac..97d9be5 100644 --- a/src/gyro.h +++ b/src/gyro.h @@ -67,7 +67,7 @@ class GyroSensor { void calibrateSensor(); double getAngle() { return angle; }; - double getSensorTempC() { return sensorTemp; }; + float getSensorTempC() { return sensorTemp; }; bool isConnected() { return sensorConnected; }; bool hasValue() { return validValue; }; void enterSleep(); diff --git a/src/helper.cpp b/src/helper.cpp index 88b7625..4cba0da 100644 --- a/src/helper.cpp +++ b/src/helper.cpp @@ -52,6 +52,9 @@ void printBuildOptions() { #ifdef SKIP_SLEEPMODE "SKIP_SLEEP " #endif +#ifdef USE_GYRO_TEMP + "GYRO_TEMP " +#endif #ifdef EMBED_HTML "EMBED_HTML " #endif diff --git a/src/main.cpp b/src/main.cpp index e9c618e..f033d1a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -197,7 +197,7 @@ void loop() { #endif if( myConfig.isGravityTempAdj() ) { LOG_PERF_START("loop-gravity-corr"); - gravity = gravityTemperatureCorrection( gravity, temp); // Use default correction temperature of 20C + gravity = gravityTemperatureCorrection( gravity, temp, myConfig.getTempFormat() ); // Use default correction temperature of 20C LOG_PERF_STOP("loop-gravity-corr"); #if LOG_LEVEL==6 Log.verbose(F("Main: Temp adjusted gravity=%F." CR), gravity ); diff --git a/src/tempsensor.cpp b/src/tempsensor.cpp index 6194699..546749b 100644 --- a/src/tempsensor.cpp +++ b/src/tempsensor.cpp @@ -24,6 +24,7 @@ SOFTWARE. #include "tempsensor.h" #include "helper.h" #include "config.h" +#include "gyro.h" #include #include #include @@ -35,11 +36,13 @@ float convertCtoF( float t ) { return (t * 1.8 ) + 32.0; } +#if !defined( USE_GYRO_TEMP ) OneWire myOneWire(D6); DallasTemperature mySensors(&myOneWire); -TempSensor myTempSensor; - #define TEMPERATURE_PRECISION 9 +#endif + +TempSensor myTempSensor; // // Setup temp sensors @@ -51,6 +54,10 @@ void TempSensor::setup() { return; #endif +#if defined( USE_GYRO_TEMP ) + Log.notice(F("TSEN: Using temperature from gyro." CR)); +#else + // This code is used to read the DS18 temp sensor if( mySensors.getDS18Count() ) return; @@ -63,6 +70,7 @@ void TempSensor::setup() { Log.notice(F("TSEN: Found %d sensors." CR), mySensors.getDS18Count()); mySensors.setResolution(TEMPERATURE_PRECISION); } +#endif float t = myConfig.getTempSensorAdj(); @@ -81,20 +89,30 @@ void TempSensor::setup() { } // -// Retrieving value from sensor +// Retrieving value from sensor, value is in Celcius // float TempSensor::getValue() { - float c = 0; - #if defined( SIMULATE_TEMP ) return 21; #endif +#if defined( USE_GYRO_TEMP ) + //LOG_PERF_START("temp-get"); + float c = myGyro.getSensorTempC(); + //LOG_PERF_STOP("temp-get"); + hasSensor = true; + return c; +#if LOG_LEVEL==6 + Log.verbose(F("TSEN: Reciving temp value for gyro sensor %F C." CR), c); +#endif +#else // Read the sensors //LOG_PERF_START("temp-request"); mySensors.requestTemperatures(); //LOG_PERF_STOP("temp-request"); + float c = 0; + if( mySensors.getDS18Count() >= 1) { //LOG_PERF_START("temp-get"); c = mySensors.getTempCByIndex(0); @@ -107,6 +125,7 @@ float TempSensor::getValue() { } return c; +#endif } // EOF \ No newline at end of file diff --git a/src/webserver.cpp b/src/webserver.cpp index d08e561..a17deac 100644 --- a/src/webserver.cpp +++ b/src/webserver.cpp @@ -88,9 +88,12 @@ void webHandleConfig() { double temp = myTempSensor.getValueCelcius(); double gravity = calculateGravity( angle, temp ); - doc[ CFG_PARAM_ANGLE ] = reduceFloatPrecision( angle); - doc[ CFG_PARAM_GRAVITY ] = reduceFloatPrecision( gravityTemperatureCorrection( gravity, temp ), 4); - doc[ CFG_PARAM_BATTERY ] = reduceFloatPrecision( myBatteryVoltage.getVoltage()); + doc[ CFG_PARAM_ANGLE ] = reduceFloatPrecision( angle); + if( myConfig.isGravityTempAdj() ) + doc[ CFG_PARAM_GRAVITY ] = reduceFloatPrecision( gravityTemperatureCorrection( gravity, temp, myConfig.getTempFormat() ), 4); + else + doc[ CFG_PARAM_GRAVITY ] = reduceFloatPrecision( gravity, 4); + doc[ CFG_PARAM_BATTERY ] = reduceFloatPrecision( myBatteryVoltage.getVoltage()); #if LOG_LEVEL==6 serializeJson(doc, Serial); @@ -224,15 +227,18 @@ void webHandleStatus() { double temp = myTempSensor.getValueCelcius(); double gravity = calculateGravity( angle, temp ); - doc[ CFG_PARAM_ID ] = myConfig.getID(); - doc[ CFG_PARAM_ANGLE ] = reduceFloatPrecision( angle); - doc[ CFG_PARAM_GRAVITY ] = reduceFloatPrecision( gravityTemperatureCorrection( gravity, temp ), 4); - doc[ CFG_PARAM_TEMP_C ] = reduceFloatPrecision( temp, 1); - doc[ CFG_PARAM_TEMP_F ] = reduceFloatPrecision( myTempSensor.getValueFarenheight(), 1); - doc[ CFG_PARAM_BATTERY ] = reduceFloatPrecision( myBatteryVoltage.getVoltage()); - doc[ CFG_PARAM_TEMPFORMAT ] = String( myConfig.getTempFormat() ); - doc[ CFG_PARAM_SLEEP_MODE ] = sleepModeAlwaysSkip; - doc[ CFG_PARAM_RSSI ] = WiFi.RSSI(); + doc[ CFG_PARAM_ID ] = myConfig.getID(); + doc[ CFG_PARAM_ANGLE ] = reduceFloatPrecision( angle); + if( myConfig.isGravityTempAdj() ) + doc[ CFG_PARAM_GRAVITY ] = reduceFloatPrecision( gravityTemperatureCorrection( gravity, temp, myConfig.getTempFormat() ), 4); + else + doc[ CFG_PARAM_GRAVITY ] = reduceFloatPrecision( gravity, 4); + doc[ CFG_PARAM_TEMP_C ] = reduceFloatPrecision( temp, 1); + doc[ CFG_PARAM_TEMP_F ] = reduceFloatPrecision( myTempSensor.getValueFarenheight(), 1); + doc[ CFG_PARAM_BATTERY ] = reduceFloatPrecision( myBatteryVoltage.getVoltage()); + doc[ CFG_PARAM_TEMPFORMAT ] = String( myConfig.getTempFormat() ); + doc[ CFG_PARAM_SLEEP_MODE ] = sleepModeAlwaysSkip; + doc[ CFG_PARAM_RSSI ] = WiFi.RSSI(); #if LOG_LEVEL==6 serializeJson(doc, Serial); Serial.print( CR );