Hi there!
I have recently managed to combine sht85 with light lightness server code. J-link is able to produce 2 values (Temperature and Humidity) whenever I key in the number 3 .
I want to be able to send these data to the client side. I have taken a look at similar posts regarding this topic but cannot seem to solve it.
As far as I know, the Client code is able to control the light lightness of the server (network is provisioned using NRF mesh app) and receive the server's present lightness level.
Hence, I want to be able to control the lightness of the server from client and be able to receive both Lightness level as well as Temperature
Below are the codes that I have edited to allow only temperature to be sent over for now for testing purposes. (will eventually send over humidity)
light_lightness_client to allow temperature reading from server side
/* Light lightness client model interface: Process the received status message in this callback */
static void app_light_lightness_client_status_cb(const light_lightness_client_t *p_self,
const access_message_rx_meta_t *p_meta,
const light_lightness_status_params_t *p_in)
{
if (p_in->remaining_time_ms > 0)
{
__LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Lightness client: 0x%04x, Present Lightness: %d, Target Lightness: %d, Remaining Time: %d ms\n",
p_meta->src.value, p_in->present_lightness, p_in->target_lightness, p_in->remaining_time_ms);
}
else
{
__LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Lightness client: 0x%04x, Present lightness: %d, Temperature: %d\n",
p_meta->src.value, p_in->present_lightness, p_in->temp_read); //just added temp_read to read temperature values from server
}
}
light_lightness_server (temperature and humidity reading). In this file, temp_read is the actual value of temperature
if(button_number == 3)
{
int32_t temperature, humidity;
int32_t temp_read, hum_read;
//Output of measurement is multiplied by a thousand, hence, there is a need to divide the values by 1000
int16_t ret = sht3x_measure_blocking_read(SHT3X_I2C_ADDR_DFLT,
&temperature, &humidity);
if (ret == STATUS_OK)
{
temp_read = temperature / 1000;
hum_read = humidity / 1000;
__LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Temperature (in degree celsius): %d\n", temp_read);
__LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Humidity (in relative humidity): %d\n", hum_read);
} else {
__LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "sht3x_measure_blocking_read() failed. Error: %d\n", ret);
}
}
app_light_lightness.c to publish temp_read
static void light_lightness_state_set_cb(const light_lightness_setup_server_t * p_self,
const access_message_rx_meta_t * p_meta,
const light_lightness_set_params_t * p_in,
const model_transition_t * p_in_transition,
light_lightness_status_params_t * p_out)
{
app_light_lightness_setup_server_t * p_app;
uint16_t present_lightness;
uint32_t transition_time_ms;
light_lightness_range_status_params_t range;
p_app = PARENT_BY_FIELD_GET(app_light_lightness_setup_server_t,
light_lightness_setup_server,
p_self);
NRF_MESH_ASSERT(p_app && p_in);
app_transition_params_t * p_params = app_transition_requested_get(&p_app->state.transition);
/* Notify anyone interested that we just got a command to set the lightness */
if (p_app->app_add_notify.app_notify_set_cb != NULL)
{
p_app->app_add_notify.app_notify_set_cb(p_app->app_add_notify.p_app_notify_v, p_in->lightness);
}
p_app->app_light_lightness_get_cb(p_app, &present_lightness);
/* If delta is too large, target value should get clipped to range limits */
range_get(p_self->state.handle, &range);
/* There is a special case for lightness value of `0`. If requested lightness is zero, and
* present value is also zero, target should be zero */
p_app->state.target_snapshot = p_in->lightness > range.range_max ? range.range_max :
p_in->lightness < range.range_min && p_in->lightness != 0 ? range.range_min :
p_in->lightness;
p_app->state.init_present_snapshot = p_app->state.present_lightness;
ERROR_CHECK(light_lightness_mc_actual_state_set(p_self->state.handle, p_app->state.target_snapshot));
if (p_app->state.target_snapshot >= LIGHT_LIGHTNESS_LAST_MIN)
{
ERROR_CHECK(light_lightness_mc_last_state_set(p_self->state.handle, p_app->state.target_snapshot,
LIGHT_LIGHTNESS_MC_WRITE_DESTINATION_FLASH_ONLY));
}
if (!p_self->state.initialized || (present_lightness != p_in->lightness))
{
(void) transition_parameters_set(p_app,
(int32_t)p_app->state.target_snapshot - (int32_t)present_lightness,
p_in_transition,
APP_TRANSITION_TYPE_SET);
transition_time_ms = p_params->transition_time_ms;
__LOG(LOG_SRC_APP, LOG_LEVEL_INFO,
"SET: target lightness: %d delay: %d tt: %d req-delta: %d \n",
p_app->state.target_snapshot,
p_app->state.transition.delay_ms,
p_params->transition_time_ms,
p_params->required_delta);
app_transition_trigger(&p_app->state.transition);
}
else
{
transition_time_ms = 0;
}
/* Prepare response */
if (p_out != NULL)
{
p_out->present_lightness = p_app->state.present_lightness;
p_out->target_lightness = p_app->state.target_snapshot;
p_out->remaining_time_ms = transition_time_ms;
p_out->temp_read = p_app->state.temp_read; //just added
}
}
I have also added temp_read in the necessary files such as in light_lightness_common.h
/** Parameters for the light_lightness Status message. */
typedef struct
{
uint16_t present_lightness; /**< The present value of the Lightness state */
uint16_t target_lightness; /**< The target value of the Lightness state (optional) */
uint32_t remaining_time_ms; /**< Remaining time value in milliseconds */
int32_t temp_read; // just added
} light_lightness_status_params_t;
as well as
typedef struct
{
/** Present value of the lightness state */
uint16_t present_lightness;
/** Target value of the lightness state, as received from the model interface. */
uint16_t target_lightness;
/** Initial present lightness required for handling Set/Delta Set message. */
uint16_t initial_present_lightness;
int32_t temp_read;// just added
/** Present value when message was received */
uint16_t init_present_snapshot;
/** Requested target */
uint16_t target_snapshot;
/** To detect if TID is new while processing delta transition */
bool new_tid;
/* Elapsed time at last publication. */
uint32_t published_ms;
/** Structure for using transition module functionality */
app_transition_t transition;
} app_light_lightness_state_t;
These are all the modifications I have made thus far. I am not too sure if I am doing this correctly as I am pretty new to this. If there is anything wrong or anything else to add, I would greatly appreciate guidance in this matter as I have not been able to get this to work.
Thanks in advance!