diff options
Diffstat (limited to 'nrfdemo/src')
| -rw-r--r-- | nrfdemo/src/main.c | 105 | ||||
| -rw-r--r-- | nrfdemo/src/mqtt_connection.c | 30 | ||||
| -rw-r--r-- | nrfdemo/src/mqtt_connection.h | 2 |
3 files changed, 121 insertions, 16 deletions
diff --git a/nrfdemo/src/main.c b/nrfdemo/src/main.c index 770b178..e998d45 100644 --- a/nrfdemo/src/main.c +++ b/nrfdemo/src/main.c @@ -9,6 +9,8 @@ #include <ncs_version.h> #include <zephyr/kernel.h> #include <zephyr/net/socket.h> +#include <zephyr/device.h> +#include <zephyr/drivers/sensor.h> #include <zephyr/logging/log.h> #include <dk_buttons_and_leds.h> @@ -19,7 +21,6 @@ #include <nrf_modem_gnss.h> #include "mqtt_connection.h" -#include "bme680/bme680.h" /* The mqtt client struct */ static struct mqtt_client client; @@ -33,10 +34,15 @@ static struct nrf_modem_gnss_pvt_data_frame pvt_data; static int64_t gnss_start_time; static bool first_fix = false; +const struct device *const bme = DEVICE_DT_GET_ONE(bosch_bme680); +struct sensor_value temp, press, humidity, gas_res; + + static void gnss_event_handler(int event); static void print_fix_data(struct nrf_modem_gnss_pvt_data_frame *pvt_data); static K_SEM_DEFINE(lte_connected, 0, 1); +static K_SEM_DEFINE(gnss_fixed, 0, 1); LOG_MODULE_REGISTER(mqtt_app, LOG_LEVEL_INF); @@ -66,7 +72,6 @@ static int modem_configure(void) { int err; - LOG_INF("Initializing modem library"); err = nrf_modem_lib_init(); if (err) { LOG_ERR("Failed to initialize the modem library, error: %d", err); @@ -98,17 +103,50 @@ static void button_handler(uint32_t button_state, uint32_t has_changed) case DK_BTN1_MSK: /* When button 1/Mode is pressed, call data_publish() to publish a message */ if (button_state & DK_BTN1_MSK){ - int err = data_publish(&client, MQTT_QOS_1_AT_LEAST_ONCE, - CONFIG_BUTTON_EVENT_PUBLISH_MSG, sizeof(CONFIG_BUTTON_EVENT_PUBLISH_MSG)-1); + int err = data_publish(&client, MQTT_QOS_1_AT_LEAST_ONCE, CONFIG_BUTTON_EVENT_PUBLISH_MSG, sizeof(CONFIG_BUTTON_EVENT_PUBLISH_MSG)-1); + + err |= publish_all(); + if (err) { LOG_INF("Failed to send message, %d", err); return; } - } - break; + + } } } +uint16_t mqtt_cylcle = 0; + +int publish_all() +{ + int err; + err = data_publish(&client, MQTT_QOS_1_AT_LEAST_ONCE, CONFIG_BUTTON_EVENT_PUBLISH_MSG, sizeof(CONFIG_BUTTON_EVENT_PUBLISH_MSG)-1); + if (err) { + LOG_INF("Failed to send message, %d", err); + return; + } + + sensor_sample_fetch(bme); + sensor_channel_get(bme, SENSOR_CHAN_AMBIENT_TEMP, &temp); + sensor_channel_get(bme, SENSOR_CHAN_PRESS, &press); + sensor_channel_get(bme, SENSOR_CHAN_HUMIDITY, &humidity); + sensor_channel_get(bme, SENSOR_CHAN_GAS_RES, &gas_res); + + err |= publish_sensor(&client, "nrf/dk/temp", temp.val1, temp.val2); + err |= publish_sensor(&client, "nrf/dk/pres", press.val1, press.val2); + err |= publish_sensor(&client, "nrf/dk/humi", humidity.val1, humidity.val2); + err |= publish_sensor(&client, "nrf/dk/gas", gas_res.val1, gas_res.val2); + + + printf("Temp: %d.%02d degC; Press: %d.%02d kPa; RH: %d.%02d %%; G: %d.%02d Ohm\n", + temp.val1, temp.val2, + press.val1, press.val2, + humidity.val1, humidity.val2, + gas_res.val1, gas_res.val2); + return err; +} + #if 1 /* Define a function to log fix data in a readable format */ static void print_fix_data(struct nrf_modem_gnss_pvt_data_frame *pvt_data) @@ -131,16 +169,14 @@ static void gnss_event_handler(int event) switch (event) { /* On a PVT event, confirm if PVT data is a valid fix */ case NRF_MODEM_GNSS_EVT_PVT: - LOG_INF("Searching..."); /* Print satellite information */ int num_satellites = 0; for (int i = 0; i < 12 ; i++) { if (pvt_data.sv[i].signal != 0) { - LOG_INF("sv: %d, cn0: %d", pvt_data.sv[i].sv, pvt_data.sv[i].cn0); num_satellites++; } } - LOG_INF("Number of current satellites: %d", num_satellites); + LOG_INF("%d", num_satellites); err = nrf_modem_gnss_read(&pvt_data, sizeof(pvt_data), NRF_MODEM_GNSS_DATA_PVT); if (err) { LOG_ERR("nrf_modem_gnss_read failed, err %d", err); @@ -150,6 +186,7 @@ static void gnss_event_handler(int event) dk_set_led_on(DK_LED1); print_fix_data(&pvt_data); /* Print the time to first fix */ + k_sem_give(&gnss_fixed); if (!first_fix) { LOG_INF("Time to first fix: %2.1lld s", (k_uptime_get() - gnss_start_time)/1000); first_fix = true; @@ -177,21 +214,24 @@ int main(void) LOG_INF("Starting MQTT sample on %s\n", CONFIG_BOARD); + if (!device_is_ready(bme)) { + LOG_ERR("sensor: device not ready.\n"); + return 0; + } + LOG_INF("BME680 %p name is %s\n", bme, bme->name); + if (dk_leds_init() != 0) { LOG_ERR("Failed to initialize the LED library"); } + LOG_INF("Initializing modem library"); err = modem_configure(); + if (err) { LOG_ERR("Failed to configure the modem"); return 0; } - if (dk_buttons_init(button_handler) != 0) { - LOG_ERR("Failed to initialize the buttons library"); - } - - /* Activate only the GNSS stack */ if (lte_lc_func_mode_set(LTE_LC_FUNC_MODE_ACTIVATE_GNSS) != 0) { LOG_ERR("Failed to activate GNSS functional mode"); @@ -210,11 +250,14 @@ int main(void) return 0; } - if (nrf_modem_gnss_fix_retry_set(60) != 0) { + if (nrf_modem_gnss_fix_retry_set(900) != 0) { LOG_ERR("Failed to set GNSS fix retry"); return 0; } + nrf_modem_gnss_power_mode_set(NRF_MODEM_GNSS_PSM_DISABLED); + nrf_modem_gnss_prio_mode_disable(); + /* Start the GNSS receiver */ LOG_INF("Starting GNSS"); if (nrf_modem_gnss_start() != 0) { @@ -222,6 +265,14 @@ int main(void) return 0; } + + + + if (dk_buttons_init(button_handler) != 0) { + LOG_ERR("Failed to initialize the buttons library"); + } + + err = client_init(&client); if (err) { LOG_ERR("Failed to initialize MQTT client: %d", err); @@ -251,7 +302,28 @@ do_connect: return 0; } - while (1) { + while (1) + { + err = lte_lc_func_mode_set(LTE_LC_FUNC_MODE_DEACTIVATE_LTE); + if (err != 0){ + LOG_ERR("Failed to decativate LTE and enable GNSS functional mode"); + break; + } + + k_sem_take(&gnss_fixed, K_FOREVER); + + err = lte_lc_func_mode_set(LTE_LC_FUNC_MODE_ACTIVATE_LTE); + if (err != 0){ + LOG_ERR("Failed to activate LTE"); + break; + } + + k_sem_take(<e_connected, K_FOREVER); + + for (int i = 0; i < 1000; i++) + { + k_msleep(10); + err = poll(&fds, 1, mqtt_keepalive_time_left(&client)); if (err < 0) { LOG_ERR("Error in poll(): %d", errno); @@ -281,6 +353,7 @@ do_connect: LOG_ERR("POLLNVAL"); break; } + } } LOG_INF("Disconnecting MQTT client"); diff --git a/nrfdemo/src/mqtt_connection.c b/nrfdemo/src/mqtt_connection.c index ef4e69f..1d884b7 100644 --- a/nrfdemo/src/mqtt_connection.c +++ b/nrfdemo/src/mqtt_connection.c @@ -98,6 +98,36 @@ static void data_print(uint8_t *prefix, uint8_t *data, size_t len) LOG_INF("%s%s", (char *)prefix, (char *)buf); } +int publish_sensor(struct mqtt_client *c, uint8_t* topic, int32_t val1, int32_t val2) +{ + uint8_t buf[20], sgn = (val1 < 0 && val2 < 0) ? '-' : '+'; + snprintf(buf, 20, "%c%i.%03i", labs(val1), labs(val2)/1000); + publish_wrap(c, topic, buf, strlen(buf)); +} + +uint16_t mqtt_cycle = 0; + +int publish_wrap(struct mqtt_client *c, uint8_t* topic, uint8_t *data, size_t len) +{ + struct mqtt_publish_param param; + + param.message.topic.qos = MQTT_QOS_1_AT_LEAST_ONCE; + param.message.topic.topic.utf8 = topic; + param.message.topic.topic.size = strlen(topic); + param.message.payload.data = data; + param.message.payload.len = len; + param.message_id = mqtt_cycle++; + param.dup_flag = 0; + param.retain_flag = 0; + + data_print("Publishing: ", data, len); + LOG_INF("to topic: %s len: %u", + topic, + (unsigned int)strlen(topic)); + + return mqtt_publish(c, ¶m); +} + /**@brief Function to publish data on the configured topic */ /* Define the function data_publish() to publish data */ diff --git a/nrfdemo/src/mqtt_connection.h b/nrfdemo/src/mqtt_connection.h index 51765e8..8fa3b45 100644 --- a/nrfdemo/src/mqtt_connection.h +++ b/nrfdemo/src/mqtt_connection.h @@ -18,4 +18,6 @@ int fds_init(struct mqtt_client *c, struct pollfd *fds); int data_publish(struct mqtt_client *c, enum mqtt_qos qos, uint8_t *data, size_t len); +int publish_wrap(struct mqtt_client *c, uint8_t* topic, uint8_t *data, size_t len); + #endif /* _CONNECTION_H_ */ |
