From 44c35350f8131e9998274ce4b3194d116250d379 Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Thu, 2 Jul 2015 19:59:55 +0200 Subject: o Adding a temperature characteristic. Reading values from the nrf8001. --- trygvisio_soil_moisture.ino | 59 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 10 deletions(-) (limited to 'trygvisio_soil_moisture.ino') 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 #include #include +#include // 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) { -- cgit v1.2.3