diff options
Diffstat (limited to 'nrfdemo/src/main.c')
| -rw-r--r-- | nrfdemo/src/main.c | 105 |
1 files changed, 89 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"); |
