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:
- 35:cbbafa9c3e15
- Parent:
- 34:a5724eeaaf9d
- Child:
- 37:ec1124e5ec1f
--- a/main.cpp Wed Mar 27 19:05:34 2019 +0000
+++ b/main.cpp Wed Nov 27 00:10:21 2019 +0000
@@ -39,57 +39,44 @@
// Default User button for GET example and for resetting the storage
InterruptIn button(BUTTON1);
// Default LED to use for PUT/POST example
-DigitalOut led(LED1, 1);
+DigitalOut DoorActivate(PD_3, 0);
// How often to fetch sensor data (in seconds)
-#define SENSORS_POLL_INTERVAL 3.0
-
-// Send all sensor data or just limited (useful for when running out of memory)
-#define SEND_ALL_SENSORS
-
+#define SENSORS_POLL_INTERVAL 15.0
+int dflag = 1;
// Sensors related includes and initialization
#include "HTS221Sensor.h"
#include "LPS22HBSensor.h"
-#include "LSM6DSLSensor.h"
-#include "lis3mdl_class.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);
-// Temperature reading from microcontroller
-AnalogIn adc_temp(ADC_TEMP);
-// Voltage reference reading from microcontroller
-AnalogIn adc_vref(ADC_VREF);
// Declaring pointers for access to Pelion Client resources outside of main()
MbedCloudClientResource *res_button;
-MbedCloudClientResource *res_led;
+MbedCloudClientResource *DoorControl;
+
// Additional resources for sensor readings
-#ifdef SEND_ALL_SENSORS
+
MbedCloudClientResource *res_humidity;
MbedCloudClientResource *res_temperature;
MbedCloudClientResource *res_pressure;
-MbedCloudClientResource *res_temperature2;
-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 */
+
+// define your personal password
+#define DoorPassword "MyPassword"
+ char DoorCode[32];
+ DigitalOut ConnectTrue(LED1);
+ DigitalOut CodeError(LED2);
+ int ErrorCount = 0;
+ int ErrorLockoutTime = 0;
+
// 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
EventQueue eventQueue;
@@ -103,24 +90,36 @@
* @param newValue Updated value for the resource
*/
void put_callback(MbedCloudClientResource *resource, m2m::String newValue) {
+
+ if(ErrorLockoutTime != 0) { /* Ignore password attempts while locked */
+ printf("Password Lockout!\r\n");
+ return;
+ }
printf("*** PUT received, new value: %s \n", newValue.c_str());
- led = atoi(newValue.c_str());
+ strcpy(DoorCode, newValue.c_str());
+ printf("%s\r\n", DoorCode);
+ if(!strcmp(DoorCode, DoorPassword )) {
+ DoorActivate = 1; * Activate relay for 1500ms */
+ wait_ms(1500);
+ DoorActivate = 0;
+ DoorCode[0] = NULL;
+ // clear password error data
+ ErrorCount = 0;
+ ErrorLockoutTime = 0;
+ } else { /* bad password attempt */
+ DoorCode[0] = NULL;
+ ErrorCount++;
+ if(ErrorCount >= 3) { /* If password submitted is wring lockout the remote control on the third error */
+ ErrorLockoutTime = (ErrorCount - 2) * 2; /* Double the lockout time after every failed password */
+ CodeError = 1; /* Indicate lockout on LED */
+ printf("PasswordLocked %d Minutes\r\n", ErrorLockoutTime);
+ }
+ }
+
+
}
-/**
- * POST handler
- * @param resource The resource that triggered the callback
- * @param buffer If a body was passed to the POST function, this contains the data.
- * Note that the buffer is deallocated after leaving this function, so copy it if you need it longer.
- * @param size Size of the body
- */
-void post_callback(MbedCloudClientResource *resource, const uint8_t *buffer, uint16_t size) {
- printf("*** POST received (length %u). Payload: ", size);
- for (size_t ix = 0; ix < size; ix++) {
- printf("%02x ", buffer[ix]);
- }
- printf("\n");
-}
+
/**
* Button function triggered by the physical button press.
@@ -153,31 +152,24 @@
* Initialize sensors
*/
void sensors_init() {
- uint8_t id1, id2, id3, id4;
+ uint8_t id1, id2;
printf ("\nSensors configuration:\n");
// Initialize sensors
sen_hum_temp.init(NULL);
sen_press_temp.init(NULL);
- sen_acc_gyro.init(NULL);
- sen_mag.init(NULL);
sen_distance.init_sensor(VL53L0X_DEFAULT_ADDRESS);
/// Call sensors enable routines
sen_hum_temp.enable();
sen_press_temp.enable();
- sen_acc_gyro.enable_x();
- sen_acc_gyro.enable_g();
+
sen_hum_temp.read_id(&id1);
sen_press_temp.read_id(&id2);
- sen_mag.read_id(&id3);
- sen_acc_gyro.read_id(&id4);
printf("HTS221 humidity & temperature = 0x%X\n", id1);
printf("LPS22HB pressure & temperature = 0x%X\n", id2);
- printf("LIS3MDL magnetometer = 0x%X\n", id3);
- printf("LSM6DSL accelerometer & gyroscope = 0x%X\n", id4);
printf("\n"); ;
}
@@ -187,66 +179,45 @@
* This function is called periodically.
*/
void sensors_update() {
- float temp1_value, temp2_value, temp3_value, humid_value, pressure_value, volt_value = 0.0;
- int32_t m_axes[3], a_axes[3], g_axes[3];
+ float temp1_value, temp2_value, humid_value, pressure_value;
uint32_t distance_value, distance_reading;
- sen_hum_temp.get_humidity(&humid_value);
- sen_hum_temp.get_temperature(&temp1_value);
- sen_press_temp.get_pressure(&pressure_value);
- sen_press_temp.get_temperature(&temp2_value);
- sen_mag.get_m_axes(m_axes);
- sen_acc_gyro.get_x_axes(a_axes);
- sen_acc_gyro.get_g_axes(g_axes);
- distance_reading = sen_distance.get_distance(&distance_value);
- temp3_value = adc_temp.read()*100;
- volt_value = adc_vref.read();
-
- float mag_x = (double)m_axes[0] / 1000.0, mag_y = (double)m_axes[1] / 1000.0, mag_z = (double)m_axes[2] / 1000.0;
- float acc_x = (double)a_axes[0] / 1000.0, acc_y = (double)a_axes[1] / 1000.0, acc_z = (double)a_axes[2] / 1000.0;
- float gyro_x = (double)g_axes[0] / 1000.0, gyro_y = (double)g_axes[1] / 1000.0, gyro_z = (double)g_axes[2] / 1000.0;
-
- printf(" \n");
- printf("ADC temp: %5.4f C, vref: %5.4f V \n", temp3_value, volt_value);
- printf("HTS221 temp: %7.3f C, humidity: %7.2f %% \n", temp1_value, humid_value);
- printf("LPS22HB temp: %7.3f C, pressure: %7.2f mbar \n", temp2_value, pressure_value);
- printf("LIS3MDL mag: %7.3f x, %7.3f y, %7.3f z [gauss] \n", mag_x, mag_y, mag_z);
- printf("LSM6DSL acc: %7.3f x, %7.3f y, %7.3f z [g] \n", acc_x, acc_y, acc_z);
- printf("LSM6DSL gyro: %7.3f x, %7.3f y, %7.3f z [dps] \n", gyro_x, gyro_y, gyro_z);
- if (distance_reading == VL53L0X_ERROR_NONE) {
- printf("VL53L0X dist: %7ld mm\n", distance_value);
- } else {
- printf("VL53L0X dist: -- \n");
- distance_value = 999;
- }
-
- printf("\r\033[8A");
-
- if (endpointInfo) {
-#ifdef SEND_ALL_SENSORS
+ if(!dflag++) { /* Only update the sensors once a minute */
+ sen_hum_temp.get_humidity(&humid_value);
+ sen_hum_temp.get_temperature(&temp1_value);
+ sen_press_temp.get_pressure(&pressure_value);
+ sen_press_temp.get_temperature(&temp2_value);
res_humidity->set_value(humid_value);
res_temperature->set_value(temp1_value);
res_pressure->set_value(pressure_value);
res_temperature2->set_value(temp2_value);
- res_magnometer_x->set_value(mag_x);
- res_magnometer_y->set_value(mag_y);
- res_magnometer_z->set_value(mag_z);
- res_accelerometer_x->set_value(acc_x);
- res_accelerometer_y->set_value(acc_y);
- res_accelerometer_z->set_value(acc_z);
- res_gyroscope_x->set_value(gyro_x);
- res_gyroscope_y->set_value(gyro_y);
- res_gyroscope_z->set_value(gyro_z);
+ if(ErrorLockoutTime != 0) {
+ ErrorLockoutTime--;
+ if(ErrorLockoutTime == 0) {
+ printf("Unlocked\r\n");
+ CodeError = 0;
+ }
+ }
+ }
+ if(dflag > 3) dflag = 0;
+ distance_reading = sen_distance.get_distance(&distance_value);
+
+
+ if (distance_reading == VL53L0X_ERROR_NONE) {
+// printf("VL53L0X dist: %7ld mm\n", distance_value);
res_distance->set_value((int)distance_value);
- res_adc_temp->set_value(temp3_value);
- res_adc_voltage->set_value(volt_value);
-#endif /* SEND_ALL_SENSORS */
+ } else {
+// printf("VL53L0X dist: -- \n");
+ distance_value = 1999;
+ res_distance->set_value((int)distance_value);
}
}
int main(void) {
printf("\nStarting Simple Pelion Device Management Client example\n");
-
+ ConnectTrue = 0;
+ CodeError = 0;
+ DoorActivate = 0;
int storage_status = fs.mount(&sd);
if (storage_status != 0) {
printf("Storage mounting failed.\n");
@@ -305,14 +276,14 @@
res_button->set_value(0);
res_button->methods(M2MMethod::GET);
res_button->observable(true);
+ //res_button->max_age(6000);
res_button->attach_notification_callback(button_callback);
- res_led = client.create_resource("3201/0/5853", "LED State");
- res_led->set_value(1);
- res_led->methods(M2MMethod::GET | M2MMethod::PUT);
- res_led->attach_put_callback(put_callback);
+ DoorControl = client.create_resource("3201/0/5853", "Door Control");
+ DoorControl->set_value(1);
+ DoorControl->methods(M2MMethod::GET | M2MMethod::PUT);
+ DoorControl->attach_put_callback(put_callback);
-#ifdef SEND_ALL_SENSORS
// Sensor resources
res_temperature = client.create_resource("3303/0/5700", "Temperature HTS221 (C)");
res_temperature->set_value(0);
@@ -329,61 +300,6 @@
res_temperature2->methods(M2MMethod::GET);
res_temperature2->observable(true);
- res_adc_temp = client.create_resource("3303/2/5700", "Temperature ADC (C)");
- 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/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/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);
@@ -393,7 +309,6 @@
res_distance->set_value((float)999.9);
res_distance->methods(M2MMethod::GET);
res_distance->observable(true);
-#endif /* SEND_ALL_SENSORS */
printf("Initialized Pelion Client. Registering...\n");
@@ -403,13 +318,14 @@
// Register with Pelion DM
client.register_and_connect();
- int i = 600; // wait up 60 seconds before attaching sensors and button events
+ int i = 6000; // wait up 600 seconds before attaching sensors and button events
while (i-- > 0 && !client.is_client_registered()) {
wait_ms(100);
}
-
+ ConnectTrue = 1;
button.fall(eventQueue.event(&button_press));
-
+ res_button->set_value(0);
+ sensors_update();
// The timer fires on an interrupt context, but debounces it to the eventqueue, so it's safe to do network operations
Ticker timer;
timer.attach(eventQueue.event(&sensors_update), SENSORS_POLL_INTERVAL);