aboutsummaryrefslogtreecommitdiff
path: root/trygvisio_soil_moisture.ino
diff options
context:
space:
mode:
authorTrygve Laugstøl <trygvis@inamo.no>2015-07-02 19:59:55 +0200
committerTrygve Laugstøl <trygvis@inamo.no>2015-07-23 15:38:50 +0200
commit44c35350f8131e9998274ce4b3194d116250d379 (patch)
treea93152b7b4f7772e861d8d7f330d8d1b5c0d26ee /trygvisio_soil_moisture.ino
parentdea9cb49271631d4def70d21db42a85d1d58f269 (diff)
downloadtrygvisio_soil_moisture-44c35350f8131e9998274ce4b3194d116250d379.tar.gz
trygvisio_soil_moisture-44c35350f8131e9998274ce4b3194d116250d379.tar.bz2
trygvisio_soil_moisture-44c35350f8131e9998274ce4b3194d116250d379.tar.xz
trygvisio_soil_moisture-44c35350f8131e9998274ce4b3194d116250d379.zip
o Adding a temperature characteristic. Reading values from the nrf8001.
Diffstat (limited to 'trygvisio_soil_moisture.ino')
-rw-r--r--trygvisio_soil_moisture.ino59
1 files changed, 49 insertions, 10 deletions
diff --git a/trygvisio_soil_moisture.ino b/trygvisio_soil_moisture.ino
index 729f5da..4d5bc9c 100644
--- a/trygvisio_soil_moisture.ino
+++ b/trygvisio_soil_moisture.ino
@@ -3,6 +3,7 @@
#include <SPI.h>
#include <lib_aci.h>
#include <aci_setup.h>
+#include <aci_evts.h>
// See config.h on how to configure the sketch
#include "config.h"
@@ -15,10 +16,9 @@ static void show_pipes();
static services_pipe_type_mapping_t services_pipe_type_mapping[NUMBER_OF_PIPES] = SERVICES_PIPE_TYPE_MAPPING_CONTENT;
static const hal_aci_data_t setup_msgs[NB_SETUP_MESSAGES] PROGMEM = SETUP_MESSAGES_CONTENT;
-static const uint8_t pipe_set = PIPE_SOIL_MOISTURE_SOIL_MOISTURE_CONTROL_SET;
-static const uint8_t pipe_tx = PIPE_SOIL_MOISTURE_SOIL_MOISTURE_CONTROL_TX;
-static const uint8_t pipe_rx = PIPE_SOIL_MOISTURE_SOIL_MOISTURE_CONTROL_RX_ACK_AUTO;
-static const uint8_t pipe_rx_max_size = PIPE_SOIL_MOISTURE_SOIL_MOISTURE_CONTROL_RX_ACK_AUTO_MAX_SIZE;
+static const uint8_t sm_pipe_set = PIPE_SOIL_MOISTURE_SOIL_MOISTURE_CONTROL_SET;
+static const uint8_t sm_pipe_tx = PIPE_SOIL_MOISTURE_SOIL_MOISTURE_CONTROL_TX;
+static const uint8_t sm_pipe_rx = PIPE_SOIL_MOISTURE_SOIL_MOISTURE_CONTROL_RX_ACK_AUTO;
static struct aci_state_t aci_state;
static hal_aci_evt_t aci_data;
@@ -117,8 +117,8 @@ static void setup_rf() {
Serial.println(F("lib_aci_init done"));
}
-static boolean rf_started = false;
-static boolean setup_required = false;
+static bool rf_started = false;
+static bool setup_required = false;
static void aci_loop() {
uint8_t pipe_number;
@@ -188,6 +188,43 @@ static void aci_loop() {
// (uint8_t *)&(aci_evt->params.cmd_rsp.params.get_device_version),
// sizeof(aci_evt_cmd_rsp_params_get_device_version_t));
}
+ if (aci_evt->params.cmd_rsp.cmd_opcode == ACI_CMD_GET_TEMPERATURE) {
+ Serial.print("aci_evt->params.cmd_rsp.params.get_temperature=");
+ Serial.print(aci_evt->params.cmd_rsp.params.get_temperature.temperature_value, DEC);
+ Serial.println();
+
+ int32_t t = aci_evt->params.cmd_rsp.params.get_temperature.temperature_value;
+
+ // t is in 1/4 degrees celcius parts.
+
+ // Multiply t by 25 without having to include float support
+ t = t * 16 + t * 8 + t;
+
+ uint32_t exponent = 2 << 24;
+
+ // example. reading=111. real temperature = 111 / 4 = 27.75 dec C
+ // Calculation: t = 2775, exp = 2. formula: 10^exp * 0.t => 10^2 * 0.2775 = 27.75
+
+ // The value of flags
+ // bit 0: 0=Celcius, 1=Farenheight
+ // bit 1: 0=time stamp field not present, 1=present
+ // bit 2: 0=temperature type field not present, 1=present
+ // bit 3-7: reserved
+ // Reference: https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.temperature_measurement.xml
+ struct {
+ uint8_t flags;
+ uint32_t value;
+ // time stamp
+ // temperature type
+ } temperature_measurement = {
+ 0,
+ exponent | (t & 0x00FFFFFF)
+ };
+
+ lib_aci_set_local_data(&aci_state, PIPE_SOIL_MOISTURE_INTERMEDIATE_TEMPERATURE_SET,
+ (uint8_t *) &temperature_measurement,
+ sizeof(temperature_measurement));
+ }
break;
case ACI_EVT_CONNECTED:
@@ -201,6 +238,8 @@ static void aci_loop() {
// This will trigger a ACI_CMD_GET_DEVICE_VERSION.
lib_aci_device_version();
+ lib_aci_get_temperature();
+
sm_on_connect();
break;
@@ -228,7 +267,7 @@ static void aci_loop() {
// Serial.print(F("ACI_EVT_DATA_RECEIVED: pipe_number="));
// Serial.println(pipe_number, DEC);
- if (pipe_number == pipe_rx) {
+ if (pipe_number == sm_pipe_rx) {
on_soil_moisture_ctrl(aci_evt->params.data_received.rx_data.aci_data, aci_evt->len);
}
break;
@@ -326,7 +365,7 @@ void loop() {
if (!rf_started) {
static int count = 0;
- static boolean reset_attempted = false;
+ static bool reset_attempted = false;
count++;
if (!reset_attempted) {
@@ -420,12 +459,12 @@ void notify_soil_moisture(const struct sm_res& res, uint8_t body_len) {
// Serial.print(F("aci_state.data_credit_available="));
// Serial.println(aci_state.data_credit_available, DEC);
- boolean available = lib_aci_is_pipe_available(&aci_state, pipe_tx);
+ bool available = lib_aci_is_pipe_available(&aci_state, sm_pipe_tx);
// Serial.print(F("pipe available="));
// Serial.println(available, DEC);
// This should probably be an explicit part of the API, but for now it makes it easier to implement a synchronous interface.
- lib_aci_set_local_data(&aci_state, pipe_set, (uint8_t *)&res, len);
+ lib_aci_set_local_data(&aci_state, sm_pipe_set, (uint8_t *)&res, len);
// There is no need to lod messages that won't be sent.
if (!available) {