Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: X_NUCLEO_COMMON ST_INTERFACES
Diff: main.cpp
- Revision:
- 28:0e774865873d
- Parent:
- 20:a9aab92d378b
- Child:
- 29:6ff737b67e7d
--- a/main.cpp Tue Dec 18 23:51:31 2018 +0000
+++ b/main.cpp Mon Mar 04 22:11:02 2019 +0000
@@ -15,7 +15,9 @@
// See the License for the specific language governing permissions and
// limitations under the License.
// ----------------------------------------------------------------------------
+
#ifndef MBED_TEST_MODE
+
#include "mbed.h"
#include "simple-mbed-cloud-client.h"
#include "LittleFileSystem.h"
@@ -23,18 +25,18 @@
#include "LPS22HBSensor.h"
#include "LSM6DSLSensor.h"
#include "lis3mdl_class.h"
-// #include "VL53L0X.h"
+#include "VL53L0X.h"
static DevI2C devI2c(PB_11,PB_10);
static HTS221Sensor sen_hum_temp(&devI2c);
static LPS22HBSensor sen_press_temp(&devI2c);
static LSM6DSLSensor sen_acc_gyro(&devI2c,LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW,PD_11); // low address
static LIS3MDL sen_mag(&devI2c);
-// static DigitalOut shutdown_pin(PC_6);
-// static VL53L0X sen_distance(&devI2c, &shutdown_pin, PC_7);
+static DigitalOut shutdown_pin(PC_6);
+static VL53L0X sen_distance(&devI2c, &shutdown_pin, PC_7);
#define SENSORS_POLL_INTERVAL 1.0
-//#define SEND_ALL_SENSORS
+#define SEND_ALL_SENSORS
// An event queue is a very useful structure to debounce information between contexts (e.g. ISR and normal threads)
// This is great because things such as network operations are illegal in ISR, so updating a resource in a button's fall() function is not allowed
@@ -57,18 +59,31 @@
MbedCloudClientResource *res_button;
MbedCloudClientResource *res_led;
+#ifdef SEND_ALL_SENSORS
+// Temperature reading from microcontroller
+AnalogIn adc_temp(ADC_TEMP);
+// Voltage reference reading from microcontroller
+AnalogIn adc_vref(ADC_VREF);
+#endif
+
// Additional resources for sensor readings
MbedCloudClientResource *res_humidity;
MbedCloudClientResource *res_temperature;
#ifdef SEND_ALL_SENSORS
MbedCloudClientResource *res_pressure;
MbedCloudClientResource *res_temperature2;
-MbedCloudClientResource *res_magnometer;
-MbedCloudClientResource *res_accelerometer;
+MbedCloudClientResource *res_magnometer_x;
+MbedCloudClientResource *res_magnometer_y;
+MbedCloudClientResource *res_magnometer_z;
+MbedCloudClientResource *res_accelerometer_x;
+MbedCloudClientResource *res_accelerometer_y;
+MbedCloudClientResource *res_accelerometer_z;
MbedCloudClientResource *res_gyroscope_x;
MbedCloudClientResource *res_gyroscope_y;
MbedCloudClientResource *res_gyroscope_z;
MbedCloudClientResource *res_distance;
+MbedCloudClientResource *res_adc_temp;
+MbedCloudClientResource *res_adc_voltage;
#endif /* SEND_ALL_SENSORS */
// When the device is registered, this variable will be used to access various useful information, like device ID etc.
@@ -102,7 +117,7 @@
void button_press() {
int v = res_button->get_value_int() + 1;
res_button->set_value(v);
- printf("Button clicked %d times\n", v);
+ printf("Button clicked %d times \n", v);
}
/**
@@ -134,7 +149,7 @@
sen_press_temp.init(NULL);
sen_acc_gyro.init(NULL);
sen_mag.init(NULL);
- // sen_distance.init_sensor(VL53L0X_DEFAULT_ADDRESS);
+ sen_distance.init_sensor(VL53L0X_DEFAULT_ADDRESS);
/// Call sensors enable routines
sen_hum_temp.enable();
@@ -163,76 +178,66 @@
* This function is called periodically.
*/
void sensors_update() {
- float fval1, fval2;
- int32_t axes[3];
- uint32_t uval;
+ float t1_val, t2_val, t3_val, h_val, p_val, v_val = 0.0;
+ int32_t m_axes[3], a_axes[3], g_axes[3];
+ uint32_t d_val, vl_res;
- printf("\n");
+ printf(" \n");
- fval1 = fval2 = 0.0;
- sen_hum_temp.get_humidity(&fval1);
- sen_hum_temp.get_temperature(&fval2);
- printf("HTS221 temp: %7.2f C, humidity: %7.2f %%\n", fval1, fval2);
- if (endpointInfo) {
- res_humidity->set_value(fval1);
- res_temperature->set_value(fval2);
+ sen_hum_temp.get_humidity(&h_val);
+ sen_hum_temp.get_temperature(&t1_val);
+ sen_press_temp.get_pressure(&p_val);
+ sen_press_temp.get_temperature(&t2_val);
+ sen_mag.get_m_axes(m_axes);
+ sen_acc_gyro.get_x_axes(a_axes);
+ sen_acc_gyro.get_g_axes(g_axes);
+ vl_res = sen_distance.get_distance(&d_val);
+ t3_val = adc_temp.read()*100;
+ v_val = adc_vref.read();
+
+ printf("ADC temp: %5.4f C, vref: %5.4f V \n", t3_val, v_val);
+ printf("HTS221 temp: %7.2f C, humidity: %7.2f %% \n", t1_val, h_val);
+ printf("LPS22HB temp: %7.2f C, pressure: %7.2f mbar \n", t2_val, p_val);
+ printf("LIS3MDL mag: %7ld x, %7ld y, %7ld z [mgauss] \n", m_axes[0], m_axes[1], m_axes[2]);
+ printf("LSM6DSL acc: %7ld x, %7ld y, %7ld z [mg] \n", a_axes[0], a_axes[1], a_axes[2]);
+ printf("LSM6DSL gyro: %7ld x, %7ld y, %7ld z [mdps] \n", g_axes[0], g_axes[1], g_axes[2]);
+ if (vl_res == VL53L0X_ERROR_NONE) {
+ printf("VL53L0X dist: %7ld [mm]\n", d_val);
+ } else {
+ printf("VL53L0X dist: -- \n");
}
- fval1 = fval2 = 0.0;
- sen_press_temp.get_pressure(&fval1);
- sen_press_temp.get_temperature(&fval2);
- printf("LPS22HB temp: %7.2f C, pressure: %7.2f mbar \n", fval1, fval2);
-#ifdef SEND_ALL_SENSORS
+ printf("\r\033[8A");
+
if (endpointInfo) {
- res_pressure->set_value(fval1);
- res_temperature2->set_value(fval2);
- }
-#endif /* SEND_ALL_SENSORS */
-
- sen_mag.get_m_axes(axes);
- printf("LIS3MDL mag: %7ld x, %7ld y, %7ld z [mgauss] \n", axes[0], axes[1], axes[2]);
-
- sen_acc_gyro.get_x_axes(axes);
- printf("LSM6DSL acc: %7ld x, %7ld y, %7ld z [mg] \n", axes[0], axes[1], axes[2]);
-
- sen_acc_gyro.get_g_axes(axes);
- printf("LSM6DSL gyro: %7ld x, %7ld y, %7ld z [mdps] \n", axes[0], axes[1], axes[2]);
+ res_humidity->set_value(h_val);
+ res_temperature->set_value(t1_val);
#ifdef SEND_ALL_SENSORS
- if (endpointInfo) {
- res_gyroscope_x->set_value((float)axes[0]);
- res_gyroscope_y->set_value((float)axes[1]);
- res_gyroscope_z->set_value((float)axes[2]);
- }
+ res_pressure->set_value(p_val);
+ res_temperature2->set_value(t2_val);
+ res_magnometer_x->set_value((float)m_axes[0]);
+ res_magnometer_y->set_value((float)m_axes[1]);
+ res_magnometer_z->set_value((float)m_axes[2]);
+ res_accelerometer_x->set_value((float)a_axes[0]);
+ res_accelerometer_y->set_value((float)a_axes[1]);
+ res_accelerometer_z->set_value((float)a_axes[2]);
+ res_gyroscope_x->set_value((float)g_axes[0]);
+ res_gyroscope_y->set_value((float)g_axes[1]);
+ res_gyroscope_z->set_value((float)g_axes[2]);
+ res_distance->set_value((float)d_val);
+ res_adc_temp->set_value(t3_val);
+ res_adc_voltage->set_value(v_val);
#endif /* SEND_ALL_SENSORS */
-
-// if (sen_distance.get_distance(&uval) == VL53L0X_ERROR_NONE) {
-// printf("VL53L0X [mm]: %6ld\n", uval);
-// #ifdef SEND_ALL_SENSORS
-// if (endpointInfo) res_distance->set_value((float)uval);
-// #endif /* SEND_ALL_SENSORS */
-// } else {
-// printf("VL53L0X [mm]: --\n");
-// #ifdef SEND_ALL_SENSORS
-// if (endpointInfo) res_distance->set_value(99999.9);
-// #endif /* SEND_ALL_SENSORS */
-// }
-
- printf("\033[6A");
+ }
}
int main(void) {
printf("\nStarting Simple Pelion Device Management Client example\n");
// If the User button is pressed ons start, then format storage.
- DigitalIn *user_button = new DigitalIn(BUTTON1);
-#if TARGET_DISCO_L475VG_IOT01A
- // The user button on DISCO_L475VG_IOT01A works the other way around
- const int PRESSED = 0;
-#else
- const int PRESSED = 1;
-#endif
- if (user_button->read() == PRESSED) {
+ if (button.read() == MBED_CONF_APP_BUTTON_PRESSED_STATE) {
printf("User button is pushed on start. Formatting the storage...\n");
+ bd->erase(0, bd->size());
int storage_status = fs.reformat(&sd);
if (storage_status != 0) {
if (sd.erase(0, sd.size()) == 0) {
@@ -245,6 +250,8 @@
if (storage_status != 0) {
printf("ERROR: Failed to reformat the storage (%d).\n", storage_status);
}
+ } else {
+ printf("You can hold the user button during boot to format the storage and change the device identity.\n");
}
sensors_init();
@@ -299,33 +306,73 @@
res_humidity->observable(true);
#ifdef SEND_ALL_SENSORS
- res_pressure = client.create_resource("3323/1/5700", "pressure");
- res_pressure->set_value(0);
- res_pressure->methods(M2MMethod::GET);
- res_pressure->observable(true);
-
res_temperature2 = client.create_resource("3303/1/5700", "temperature");
res_temperature2->set_value(0);
res_temperature2->methods(M2MMethod::GET);
res_temperature2->observable(true);
- res_gyroscope_x = client.create_resource("3334/1/5702", "gyroscope_x");
+ res_adc_temp = client.create_resource("3303/2/5700", "temperature");
+ res_adc_temp->set_value(0);
+ res_adc_temp->methods(M2MMethod::GET);
+ res_adc_temp->observable(true);
+
+ res_accelerometer_x = client.create_resource("3313/0/5702", "accelerometer_x");
+ res_accelerometer_x->set_value(0);
+ res_accelerometer_x->methods(M2MMethod::GET);
+ res_accelerometer_x->observable(true);
+
+ res_accelerometer_y = client.create_resource("3313/0/5703", "accelerometer_y");
+ res_accelerometer_y->set_value(0);
+ res_accelerometer_y->methods(M2MMethod::GET);
+ res_accelerometer_y->observable(true);
+
+ res_accelerometer_z = client.create_resource("3313/0/5704", "accelerometer_z");
+ res_accelerometer_z->set_value(0);
+ res_accelerometer_z->methods(M2MMethod::GET);
+ res_accelerometer_z->observable(true);
+
+ res_magnometer_x = client.create_resource("3314/0/5702", "magnometer_x");
+ res_magnometer_x->set_value(0);
+ res_magnometer_x->methods(M2MMethod::GET);
+ res_magnometer_x->observable(true);
+
+ res_magnometer_y = client.create_resource("3314/0/5703", "magnometer_y");
+ res_magnometer_y->set_value(0);
+ res_magnometer_y->methods(M2MMethod::GET);
+ res_magnometer_y->observable(true);
+
+ res_magnometer_z = client.create_resource("3314/0/5704", "magnometer_z");
+ res_magnometer_z->set_value(0);
+ res_magnometer_z->methods(M2MMethod::GET);
+ res_magnometer_z->observable(true);
+
+ res_gyroscope_x = client.create_resource("3334/0/5702", "gyroscope_x");
res_gyroscope_x->set_value(0);
res_gyroscope_x->methods(M2MMethod::GET);
res_gyroscope_x->observable(true);
- res_gyroscope_y = client.create_resource("3334/1/5703", "gyroscope_y");
+ res_gyroscope_y = client.create_resource("3334/0/5703", "gyroscope_y");
res_gyroscope_y->set_value(0);
res_gyroscope_y->methods(M2MMethod::GET);
res_gyroscope_y->observable(true);
- res_gyroscope_z = client.create_resource("3334/1/5704", "gyroscope_z");
+ res_gyroscope_z = client.create_resource("3334/0/5704", "gyroscope_z");
res_gyroscope_z->set_value(0);
res_gyroscope_z->methods(M2MMethod::GET);
res_gyroscope_z->observable(true);
+ res_adc_voltage = client.create_resource("3316/0/5700", "voltage");
+ res_adc_voltage->set_value(0);
+ res_adc_voltage->methods(M2MMethod::GET);
+ res_adc_voltage->observable(true);
+
+ res_pressure = client.create_resource("3323/0/5700", "pressure");
+ res_pressure->set_value(0);
+ res_pressure->methods(M2MMethod::GET);
+ res_pressure->observable(true);
+
res_distance = client.create_resource("3330/0/5700", "distance");
- res_distance->set_value(0);
+ res_distance->set_value((float)999.9);
res_distance->methods(M2MMethod::GET);
res_distance->observable(true);
@@ -357,4 +404,5 @@
// You can easily run the eventQueue in a separate thread if required
eventQueue.dispatch_forever();
}
+
#endif