Skip to content

Commit 08d2f0c

Browse files
0x64cjniebuhr
andauthored
Add Feature: customize pressure sensor scaling (#225)
* feat: Try out Nimrod PID library * Fix for acaia pearl s scale * quick hack for 12 bar pressure sensor * Revert "feat: Try out Nimrod PID library" This reverts commit b539c89. * Revert "quick hack for 12 bar pressure sensor" This reverts commit f4b5a6e. * Added a setting for 12/16 bar pressure sensor; change to this setting requires reboot. * changed to manual entry on web page, fixed value not being saved, value is still not being properly set. * Changed data type from byte array to string representation of float value when sending pressureScaling between client/server; byte array data seemed to be distorted for certain values. Controller.cpp: moved setPressureScale into function * oops, fixed function call * Revert "Fix for acaia pearl s scale" This reverts commit 8673645. * Fix for acaia pearl s scale --------- Co-authored-by: Jochen Ullrich <[email protected]>
1 parent 4801f41 commit 08d2f0c

10 files changed

Lines changed: 51 additions & 10 deletions

File tree

lib/NimBLEComm/src/NimBLEClientController.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -140,10 +140,7 @@ void NimBLEClientController::sendPidSettings(const String &pid) {
140140

141141
void NimBLEClientController::setPressureScale(float scale) {
142142
if (client->isConnected() && pressureScaleChar != nullptr) {
143-
constexpr size_t bufferSize = sizeof(float);
144-
char buffer[bufferSize];
145-
std::memcpy(buffer + 0, &scale, sizeof(scale));
146-
pressureScaleChar->writeValue(buffer);
143+
pressureScaleChar->writeValue(String(scale));
147144
}
148145
}
149146

lib/NimBLEComm/src/NimBLEServerController.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -187,13 +187,12 @@ void NimBLEServerController::onWrite(NimBLECharacteristic *pCharacteristic) {
187187
pidControlCallback(Kp, Ki, Kd);
188188
}
189189
} else if (pCharacteristic->getUUID().equals(NimBLEUUID(PRESSURE_SCALE_UUID))) {
190-
const uint8_t *data = pCharacteristic->getValue().data();
191-
float scale;
192-
std::memcpy(&scale, data + 0, sizeof(scale));
190+
String scale_string = pCharacteristic->getValue().c_str();
191+
float scale_value = scale_string.toFloat();
193192

194-
ESP_LOGI(LOG_TAG, "Received pressure scale: %.1f", scale);
193+
ESP_LOGV(LOG_TAG, "Received pressure scale: %.2f", scale_value);
195194
if (pressureScaleCallback != nullptr) {
196-
pressureScaleCallback(scale);
195+
pressureScaleCallback(scale_value);
197196
}
198197
}
199198
}

platformio.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ lib_deps =
6060
mathieucarbou/ESPAsyncWebServer @ 3.3.22
6161
bblanchon/ArduinoJson@^7.2.1
6262
256dpi/MQTT@^2.5.2
63-
https://github.com/gaggimate/esp-arduino-ble-scales
63+
https://github.com/0x64c/esp-arduino-ble-scales
6464

6565
[env:controller]
6666
extends = env:base

src/display/core/Controller.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,10 @@ void Controller::loop() {
165165
loaded = true;
166166
if (settings.getStartupMode() == MODE_STANDBY)
167167
activateStandby();
168+
169+
ESP_LOGI("Controller","setting pressure scale to %.2f\n",settings.getPressureScaling());
170+
setPressureScale();
171+
168172
pluginManager->trigger("controller:ready");
169173
}
170174
}
@@ -279,6 +283,12 @@ void Controller::setTargetTemp(int temperature) {
279283
updateLastAction();
280284
}
281285

286+
void Controller::setPressureScale(void){
287+
if(systemInfo.capabilities.pressure){
288+
clientController.setPressureScale(settings.getPressureScaling());
289+
}
290+
}
291+
282292
int Controller::getTargetDuration() const { return settings.getTargetDuration(); }
283293

284294
void Controller::setTargetDuration(int duration) {

src/display/core/Controller.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ class Controller {
3232

3333
void setTargetTemp(int temperature);
3434

35+
void setPressureScale();
36+
3537
int getTargetDuration() const;
3638

3739
void setTargetDuration(int duration);

src/display/core/Settings.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ Settings::Settings() {
1616
grindDelay = preferences.getDouble("del_gd", 1000.0);
1717
delayAdjust = preferences.getBool("del_ad", true);
1818
temperatureOffset = preferences.getInt("to", DEFAULT_TEMPERATURE_OFFSET);
19+
pressureScaling = preferences.getFloat("ps", DEFAULT_PRESSURE_SCALING);
1920
pid = preferences.getString("pid", DEFAULT_PID);
2021
wifiSsid = preferences.getString("ws", "");
2122
wifiPassword = preferences.getString("wp", "");
@@ -80,6 +81,11 @@ void Settings::setTemperatureOffset(const int temperature_offset) {
8081
save();
8182
}
8283

84+
void Settings::setPressureScaling(const float pressure_scaling){
85+
pressureScaling = pressure_scaling;
86+
save();
87+
}
88+
8389
void Settings::setTargetDuration(const int target_duration) {
8490
targetDuration = target_duration;
8591
save();
@@ -262,6 +268,7 @@ void Settings::doSave() {
262268
preferences.putDouble("del_gd", grindDelay);
263269
preferences.putBool("del_ad", delayAdjust);
264270
preferences.putInt("to", temperatureOffset);
271+
preferences.putFloat("ps", pressureScaling);
265272
preferences.putString("pid", pid);
266273
preferences.putString("ws", wifiSsid);
267274
preferences.putString("wp", wifiPassword);

src/display/core/Settings.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class Settings {
2323
int getTargetSteamTemp() const { return targetSteamTemp; }
2424
int getTargetWaterTemp() const { return targetWaterTemp; }
2525
int getTemperatureOffset() const { return temperatureOffset; }
26+
float getPressureScaling() const { return pressureScaling; }
2627
int getTargetDuration() const { return targetDuration; }
2728
int getTargetVolume() const { return targetVolume; }
2829
int getTargetGrindVolume() const { return targetGrindVolume; }
@@ -60,6 +61,7 @@ class Settings {
6061
void setTargetSteamTemp(int target_steam_temp);
6162
void setTargetWaterTemp(int target_water_temp);
6263
void setTemperatureOffset(int temperature_offset);
64+
void setPressureScaling(float pressure_scaling);
6365
void setTargetDuration(int target_duration);
6466
void setTargetVolume(int target_volume);
6567
void setTargetGrindVolume(int target_grind_volume);
@@ -102,6 +104,7 @@ class Settings {
102104
int targetSteamTemp = 155;
103105
int targetWaterTemp = 80;
104106
int temperatureOffset = DEFAULT_TEMPERATURE_OFFSET;
107+
float pressureScaling = DEFAULT_PRESSURE_SCALING;
105108
int targetDuration = 25000;
106109
int targetVolume = 36;
107110
int targetGrindVolume = 18;

src/display/core/constants.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#define MIN_TEMP 0
1616
#define MAX_TEMP 160
1717
#define DEFAULT_TEMPERATURE_OFFSET 0
18+
#define DEFAULT_PRESSURE_SCALING 16.0f
1819
#define DEFAULT_PID "24,0.2,700"
1920
#define DEFAULT_MDNS_NAME "gaggimate"
2021
#define DEFAULT_OTA_CHANNEL "latest"

src/display/plugins/WebUIPlugin.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,8 @@ void WebUIPlugin::handleSettings(AsyncWebServerRequest *request) const {
184184
settings->setTargetDuration(request->arg("targetDuration").toInt() * 1000);
185185
if (request->hasArg("temperatureOffset"))
186186
settings->setTemperatureOffset(request->arg("temperatureOffset").toInt());
187+
if (request->hasArg("pressureScaling"))
188+
settings->setPressureScaling(request->arg("pressureScaling").toFloat());
187189
if (request->hasArg("infusePumpTime"))
188190
settings->setInfusePumpTime(request->arg("infusePumpTime").toInt() * 1000);
189191
if (request->hasArg("infuseBloomTime"))
@@ -255,6 +257,7 @@ void WebUIPlugin::handleSettings(AsyncWebServerRequest *request) const {
255257
doc["wifiPassword"] = settings.getWifiPassword();
256258
doc["mdnsName"] = settings.getMdnsName();
257259
doc["temperatureOffset"] = String(settings.getTemperatureOffset());
260+
doc["pressureScaling"] = String(settings.getPressureScaling());
258261
doc["boilerFillActive"] = settings.isBoilerFillActive();
259262
doc["startupFillTime"] = settings.getStartupFillTime() / 1000;
260263
doc["steamFillTime"] = settings.getSteamFillTime() / 1000;

web/src/pages/Settings/index.jsx

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,25 @@ export function Settings() {
152152
/>
153153
</div>
154154
</Card>
155+
<Card xs={12} lg={6} title="Pressure settings">
156+
<div>
157+
<label htmlFor="pressureScaling" className="block font-medium text-gray-700 dark:text-gray-400">
158+
Pressure scaling factor
159+
</label>
160+
<input
161+
id="pressureScaling"
162+
name="pressureScaling"
163+
type="number"
164+
inputmode="decimal"
165+
placeholder="0.0"
166+
className="input-field"
167+
min="0"
168+
step="any"
169+
value={formData.pressureScaling}
170+
onChange={onChange('pressureScaling')}
171+
/>
172+
</div>
173+
</Card>
155174
<Card xs={12} lg={6} title="Brew phases">
156175
<div>
157176
<label htmlFor="targetDuration" className="block font-medium text-gray-700 dark:text-gray-400">

0 commit comments

Comments
 (0)