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:871447da961d
- Parent:
- 34:a5724eeaaf9d
- Child:
- 37:b7acef59086c
--- a/main.cpp Wed Mar 27 19:05:34 2019 +0000 +++ b/main.cpp Wed Nov 11 17:32:22 2020 +0000 @@ -21,6 +21,24 @@ #include "simple-mbed-cloud-client.h" #include "LittleFileSystem.h" +#include "stdbool.h" //for stepper motor function + +#define STEPPER_PIN_1 PA_15 //ARD.D9-PWM PA15 +#define STEPPER_PIN_2 PA_2 //ARD.D10-PWM PA2 +#define STEPPER_PIN_3 PA_7 //ARD.D11-PWM PA7 +#define STEPPER_PIN_4 PA_6 //ARD.D12-PWM PA6 + +DigitalOut steeperOne(STEPPER_PIN_1); +DigitalOut steeperTwo(STEPPER_PIN_2); +DigitalOut steeperThree(STEPPER_PIN_3); +DigitalOut steeperFour(STEPPER_PIN_4); + +DigitalOut myIOs(PB_14); // review the results on PB_14 +DigitalOut myIOs2(PA_5); // review the results on PA_5 +int step_number=0; +int open_flag=0; +int close_flag=0; + // Default network interface object. Don't forget to change the WiFi SSID/password in mbed_app.json if you're using WiFi. NetworkInterface *net; @@ -48,19 +66,15 @@ #define SEND_ALL_SENSORS // Sensors related includes and initialization -#include "HTS221Sensor.h" -#include "LPS22HBSensor.h" -#include "LSM6DSLSensor.h" -#include "lis3mdl_class.h" -#include "VL53L0X.h" +#include "HTS221Sensor.h" //humidity and temperature +#include "LPS22HBSensor.h" //Barometer 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 VL53L0X sen_distance(&devI2c, &shutdown_pin, PC_7); + // Temperature reading from microcontroller AnalogIn adc_temp(ADC_TEMP); // Voltage reference reading from microcontroller @@ -73,21 +87,8 @@ // 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 */ // An event queue is a very useful structure to debounce information between contexts (e.g. ISR and normal threads) @@ -121,16 +122,87 @@ } printf("\n"); } +//Serial port define for uart1 usb +//pb7 rx +//pb6 tx +//Serial device(USBTX, USBRX); +Serial device(PB_6, PB_7); // tx, rx + /** * Button function triggered by the physical button press. */ + + + + + void Tx_interrupt(); +void Rx_interrupt(); +void send_line(); +void read_line(); + + +// Circular buffers for serial TX and RX data - used by interrupt routines +const int buffer_size = 255; +// might need to increase buffer size for high baud rates +char tx_buffer[buffer_size+1]; +char rx_buffer[buffer_size+1]; +// Circular buffer pointers +// volatile makes read-modify-write atomic +volatile int tx_in=0; +volatile int tx_out=0; +volatile int rx_in=0; +volatile int rx_out=0; +// Line buffers for sprintf and sscanf +char tx_line[80]; +char rx_line[80]; + + int i=0; + int rx_i=0; + device.baud(115200); + +// Setup a serial interrupt function to receive data + device.attach(&Rx_interrupt, Serial::RxIrq); +// Setup a serial interrupt function to transmit data + device.attach(&Tx_interrupt, Serial::TxIrq); + + void button_press() { int v = res_button->get_value_int() + 1; res_button->set_value(v); printf("*** Button clicked %d times \n", v); } - + +// Called everytime a new character goes into +// the RX buffer. Test that character for \n +// Note, rxGetLastChar() gets the last char that +// we received but it does NOT remove it from +// the RX buffer. +void read_line() { + int i; + i = 0; +// Start Critical Section - don't interrupt while changing global buffer variables + NVIC_DisableIRQ(UART1_IRQn); +// Loop reading rx buffer characters until end of line character + while ((i==0) || (rx_line[i-1] != '\r')) { +// Wait if buffer empty + if (rx_in == rx_out) { +// End Critical Section - need to allow rx interrupt to get new characters for buffer + NVIC_EnableIRQ(UART1_IRQn); + while (rx_in == rx_out) { + } +// Start Critical Section - don't interrupt while changing global buffer variables + NVIC_DisableIRQ(UART1_IRQn); + } + rx_line[i] = rx_buffer[rx_out]; + i++; + rx_out = (rx_out + 1) % buffer_size; + } +// End Critical Section + NVIC_EnableIRQ(UART1_IRQn); + rx_line[i-1] = 0; + return; +} /** * Notification callback handler * @param resource The resource that triggered the callback @@ -149,35 +221,96 @@ endpointInfo = endpoint; } +/* + for one rotation when passed true or false in function OneStep(bool) +*/ +void OneStep(bool dir){ +if(dir) +{ + switch(step_number){ + case 0: + steeperOne =1; + steeperTwo =0; + steeperThree =0; + steeperFour =0; + break; + case 1: + steeperOne =0; + steeperTwo =1; + steeperThree =0; + steeperFour =0; + break; + case 2: + steeperOne =0; + steeperTwo =0; + steeperThree =1; + steeperFour =0; + break; + case 3: + steeperOne =0; + steeperTwo =0; + steeperThree =0; + steeperFour =1; + break; + }// end of switch +}// end of if + +else +{ + switch(step_number){ + case 0: + steeperOne =0; + steeperTwo =0; + steeperThree =0; + steeperFour =1; + break; + case 1: + steeperOne =0; + steeperTwo =0; + steeperThree =1; + steeperFour =0; + break; + case 2: + steeperOne =0; + steeperTwo =1; + steeperThree =0; + steeperFour =0; + break; + case 3: + steeperOne =1; + steeperTwo =0; + steeperThree =0; + steeperFour =0; + break; + + + }// end of switch + }// end of else +step_number++; + if(step_number > 3){ + step_number = 0; + } +} // end of OneStep() function /** * 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,64 +320,61 @@ * 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]; - uint32_t distance_value, distance_reading; + float temp3_value, humid_value, pressure_value = 0.0; 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("%2.0f^%2.0f^%3.0f",temp3_value,humid_value,pressure_value); + printf("\n"); + + // printf ("%02d : %02d : %02d\n", temp3_value, hummitly, pressure); + +// added a new code for stepper motor +// if temperature reading is higher, open motor + if(temp3_value > 30) + { + open_flag = 0; + while(open_flag==0){ + OneStep(false); + wait(0.01); + bool btn_pressed = (button.read() == MBED_CONF_APP_BUTTON_PRESSED_STATE); + if (btn_pressed) { + printf("Door Opened...\n"); + open_flag=1; + close_flag=0; + }//end of if(btn_pressed) + }// end of while + }// end of if(temp3_value>20) + // now we expect to close + + if(temp3_value < 20)//door has to close + { + close_flag = 0; + while(close_flag==0){ + OneStep(true); + wait(0.01); + bool btn_pressed = (button.read() == MBED_CONF_APP_BUTTON_PRESSED_STATE); + if (btn_pressed) { + printf("Door Closed...\n"); + open_flag=0; + close_flag=1; + }//end of if(btn_pressed) + }// end of while } - printf("\r\033[8A"); - if (endpointInfo) { #ifdef SEND_ALL_SENSORS 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); - 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 */ } } -int main(void) { +int main(void) +{ printf("\nStarting Simple Pelion Device Management Client example\n"); int storage_status = fs.mount(&sd); @@ -314,85 +444,26 @@ #ifdef SEND_ALL_SENSORS // Sensor resources - res_temperature = client.create_resource("3303/0/5700", "Temperature HTS221 (C)"); +/* res_temperature = client.create_resource("3303/0/5700", "Temperature HTS221 (C)"); res_temperature->set_value(0); res_temperature->methods(M2MMethod::GET); - res_temperature->observable(true); + res_temperature->observable(true);*/ res_humidity = client.create_resource("3304/0/5700", "Humidity"); res_humidity->set_value(0); res_humidity->methods(M2MMethod::GET); res_humidity->observable(true); - res_temperature2 = client.create_resource("3303/1/5700", "Temperature LPS22HB (C)"); - res_temperature2->set_value(0); - 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); res_pressure->observable(true); - res_distance = client.create_resource("3330/0/5700", "Distance"); - 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");