From 6f9e4bd79f3eba5425020a824270d056eae326a1 Mon Sep 17 00:00:00 2001 From: Mario Pesch Date: Wed, 19 Jan 2022 11:39:58 +0100 Subject: [PATCH] add DPS310 Sensor closes #137 --- .../Blockly/blocks/sensebox-sensors.js | 51 +++++++++++++++++++ .../Blockly/generator/sensebox-sensors.js | 39 ++++++++++++++ .../Blockly/msg/de/sensebox-sensors.js | 13 ++++- .../Blockly/msg/en/sensebox-sensors.js | 9 +++- src/components/Blockly/toolbox/Toolbox.js | 1 + 5 files changed, 110 insertions(+), 3 deletions(-) diff --git a/src/components/Blockly/blocks/sensebox-sensors.js b/src/components/Blockly/blocks/sensebox-sensors.js index f0f34e5..3ba2b97 100644 --- a/src/components/Blockly/blocks/sensebox-sensors.js +++ b/src/components/Blockly/blocks/sensebox-sensors.js @@ -514,3 +514,54 @@ Blockly.Blocks["sensebox_soundsensor_dfrobot"] = { this.setHelpUrl(Blockly.Msg.senseBox_soundsensor_dfrobot_helpurl); }, }; + +/** + * Infineon DPS310 Pressure Sensor + * + */ + +Blockly.Blocks["sensebox_sensor_dps310"] = { + init: function () { + var dropdownOptions = [ + [Blockly.Msg.senseBox_pressure, "Pressure"], + [Blockly.Msg.senseBox_temp, "Temperature"], + [Blockly.Msg.senseBox_gps_alt, "Altitude"], + ]; + var dropdown = new Blockly.FieldDropdown(dropdownOptions, function ( + option + ) { + var input = + option === "Pressure" || + option === "Temperature" || + option === "Altitude"; + this.sourceBlock_.updateShape_(input); + }); + this.appendDummyInput().appendField(Blockly.Msg.senseBox_sensor_dps310); + this.appendDummyInput() + .setAlign(Blockly.ALIGN_RIGHT) + .appendField(Blockly.Msg.senseBox_value) + .appendField(dropdown, "NAME"); + this.setColour(getColour().sensebox); + this.setOutput(true, Types.DECIMAL.typeName); + this.setTooltip(Blockly.Msg.senseBox_sensor_dps310_tooltip); + this.setHelpUrl(Blockly.Msg.senseBox_sensor_dps310_helpurl); + this.getField("NAME").setValidator( + function (val) { + this.updateShape_(val === "Altitude"); + }.bind(this) + ); + }, + updateShape_(isAltitude) { + if (isAltitude) { + if (this.getInput("extraField") == null) { + this.appendDummyInput("extraField") + .setAlign(Blockly.ALIGN_RIGHT) + .appendField(Blockly.Msg.senseBox_pressure_referencePressure) + .appendField(new Blockly.FieldTextInput("1013"), "referencePressure") + .appendField(Blockly.Msg.senseBox_pressure_referencePressure_dim); + } + } else { + this.removeInput("extraField", true); + } + }, +}; diff --git a/src/components/Blockly/generator/sensebox-sensors.js b/src/components/Blockly/generator/sensebox-sensors.js index 07eb0c4..425653e 100644 --- a/src/components/Blockly/generator/sensebox-sensors.js +++ b/src/components/Blockly/generator/sensebox-sensors.js @@ -644,3 +644,42 @@ float getSoundValue(){ var code = "getSoundValue()"; return [code, Blockly.Arduino.ORDER_ATOMIC]; }; + +/** + * Infineon DPS310 Pressure Sensor + * + */ + +Blockly.Arduino.sensebox_sensor_dps310 = function () { + var dropdown_name = this.getFieldValue("NAME"); + var code = ""; + var referencePressure = this.getFieldValue("referencePressure"); + Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include "; + Blockly.Arduino.libraries_[ + "adafruit_dps310" + ] = `#include `; + Blockly.Arduino.definitions_["define_dps"] = "Adafruit_DPS310 dps;"; + Blockly.Arduino.setupCode_["dps_begin"] = "dps.begin_I2C(0x76);"; + Blockly.Arduino.setupCode_["dps_configuration"] = ` + dps.configurePressure(DPS310_64HZ, DPS310_64SAMPLES); + dps.configureTemperature(DPS310_64HZ, DPS310_64SAMPLES); + `; + Blockly.Arduino.loopCodeOnce_["dps_events"] = + "sensors_event_t temp_event, pressure_event;"; + Blockly.Arduino.loopCodeOnce_["dps_getEvents"] = + "dps.getEvents(&temp_event, &pressure_event);"; + switch (dropdown_name) { + case "Temperature": + code = "temp_event.temperature"; + break; + case "Pressure": + code = "pressure_event.pressure"; + break; + case "Altitude": + code = "dps.readAltitude(" + referencePressure + ")"; + break; + default: + code = ""; + } + return [code, Blockly.Arduino.ORDER_ATOMIC]; +}; diff --git a/src/components/Blockly/msg/de/sensebox-sensors.js b/src/components/Blockly/msg/de/sensebox-sensors.js index bfce430..64d0baa 100644 --- a/src/components/Blockly/msg/de/sensebox-sensors.js +++ b/src/components/Blockly/msg/de/sensebox-sensors.js @@ -11,11 +11,20 @@ export const SENSORS = { senseBox_pressure_sensor: "Luftdruck-/Temperatursensor (BMP280)", senseBox_pressure: "Luftdruck in hPa", senseBox_pressure_dimension: "Luftdruck in hPa", - senseBox_pressure_tip: + senseBox_pressure_tooltip: "Schließe den Sensor an einen der 5 **I2C-Anschlüsse** an. Der Sensor gibt dir den Messwert für den Luftdruck in hPa. Um die korrekte Höhe über NN zu berechnen benötigt der Sensor einen aktuellen Referenzwert.", senseBox_pressure_referencePressure: "Luftdruck auf NN", senseBox_pressure_referencePressure_dim: "hPa", - senseBox_pressure_helpurl: "", + senseBox_pressure_helpurl: + "https://docs.sensebox.de/hardware/sensoren-luftdruck-temperatur/", + + /** + * DPS310 + */ + senseBox_sensor_dps310: "Luftdruck-/Temperatursensor (DPS310)", + senseBox_sensor_dps310_tooltip: + "Schließe den Sensor an einen der 5 **I2C-Anschlüsse** an. Der Sensor gibt dir den Messwert für den Luftdruck in hPa. Um die korrekte Höhe über NN zu berechnen benötigt der Sensor einen aktuellen Referenzwert.", + senseBox_sensor_dps310_helpurl: "", /** * Mikro diff --git a/src/components/Blockly/msg/en/sensebox-sensors.js b/src/components/Blockly/msg/en/sensebox-sensors.js index 3e86ca2..94f698a 100644 --- a/src/components/Blockly/msg/en/sensebox-sensors.js +++ b/src/components/Blockly/msg/en/sensebox-sensors.js @@ -11,12 +11,19 @@ export const SENSORS = { senseBox_pressure_sensor: "Airpressure/Temperature Sensor (BMP280)", senseBox_pressure: "Airpressure in hPa", senseBox_pressure_dimension: "Airpressure in hPa", - senseBox_pressure_tip: + senseBox_pressure_tooltip: "Connect the sensor to one of the 5 **I2C ports**. The sensor gives you the measured value for the air pressure in hPa. To calculate the correct altitude above sea level the sensor needs a current reference value.", senseBox_pressure_referencePressure: "Pressure at Sea Level", senseBox_pressure_referencePressure_dim: "hPa", senseBox_pressure_helpurl: "", + /** + * DPS310 + */ + senseBox_sensor_dps310: "Airpressure/Temperature Sensor (DPS310)", + senseBox_sensor_dps310_tooltip: + "Connect the sensor to one of the 5 **I2C ports**. The sensor gives you the measured value for the air pressure in hPa. To calculate the correct altitude above sea level the sensor needs a current reference value.", + /** * Mikro */ diff --git a/src/components/Blockly/toolbox/Toolbox.js b/src/components/Blockly/toolbox/Toolbox.js index 2162019..91962e1 100644 --- a/src/components/Blockly/toolbox/Toolbox.js +++ b/src/components/Blockly/toolbox/Toolbox.js @@ -65,6 +65,7 @@ class Toolbox extends React.Component { +