GPS to Pulga

Dependencies:   Si1133 BME280

Revision:
23:7f1c9c1a4c57
Parent:
22:2c6161c96a76
Child:
24:595155aa83c3
--- a/source/main.cpp	Thu Jul 18 13:42:17 2019 +0000
+++ b/source/main.cpp	Mon Dec 30 18:38:40 2019 +0000
@@ -1,678 +1,183 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2017 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- 
-#include <events/mbed_events.h>
-#include <stdio.h>
-#include "mbed.h"
-
-#include "platform/Callback.h"
-#include "events/EventQueue.h"
-#include "platform/NonCopyable.h"
-
-#include "ble/BLE.h"
-#include "ble/Gap.h"
-#include "ble/GattClient.h"
-#include "ble/GapAdvertisingParams.h"
-#include "ble/GapAdvertisingData.h"
-#include "ble/GattServer.h"
-#include "BLEProcess.h"
-#include "Si1133.h"
-#include "BME280.h"
-
-/* defines the axis for acc */
-#define ACC_NOOF_AXIS       3
-#define GYR_NOOF_AXIS       2
- 
-/* bmi160 slave address */
-#define BMI160_ADDR         ((0x69)<<1)
- 
-#define RAD_DEG           57.29577951
- 
-using mbed::callback;
-
-Si1133 sensor_light(P0_13, P0_15);
-BME280 sensor_amb(P0_13, P0_15, 0x77 << 1) ;
-
-I2C i2c(p13, p15);
-
-        int msg;
-        int sens;
-        uint32_t lux = 0;
-        uint32_t amb = 0;
-        uint32_t imux = 0;
-        uint32_t imuy = 0;
-        uint32_t imuz = 0;
-        float  sensor_get = 0;
-
-int16_t acc_sample_buffer[ACC_NOOF_AXIS] = {0x5555, 0x5555, 0x5555};
-int16_t gyr_sample_buffer[GYR_NOOF_AXIS] = {0x5555, 0x5555};
- 
-double acc_result_buffer[ACC_NOOF_AXIS] = {0x5555, 0x5555, 0x5555};
-double gyr_result_buffer[GYR_NOOF_AXIS] = {0x5555, 0x5555};
- 
-double accel_ang_x, accel_ang_y;
-double tiltx, tilty;
-double tiltx_prev, tilty_prev;
- 
-char i2c_reg_buffer[2] = {0};
-
-
-/**
- * A My service that demonstrate the GattServer features.
- *
- * The My service host three characteristics that model the current amb,
- * led and lux of the My. The value of the lux characteristic is
- * incremented automatically by the system.
- *
- * A client can subscribe to updates of the My characteristics and get
- * notified when one of the value is changed. Clients can also change value of
- * the lux, led and amb characteristric.
- */
-class MyService {
-    typedef MyService Self;
-
-public:
-    MyService() :
-        _amb_char("00000000-000a-000a-a000-a0a000aa00aa", 0),
-        _lux_char("11111111-111b-111b-b111-b1b111bb11bb", 0),
-        _imux_char("22222222-222c-222c-c222-c2c222cc22cc", 0),
-        _imuy_char("33333333-333d-333d-d333-d3d333dd33dd", 0),
-       // _imuz_char("44444444-444e-444e-e444-e4e444ee44ee", 0), 
-        _led_char("55555555-555f-555f-f555-f5f555ff55ff", 0),       
-        _My_service(
-            /* uuid */ "51311102-030e-485f-b122-f8f381aa84ed",
-            /* characteristics */ _My_characteristics,
-            /* numCharacteristics */ sizeof(_My_characteristics) /
-                                     sizeof(_My_characteristics[0])
-        ),
-        _server(NULL),
-        _event_queue(NULL),
-        _alive_led(P1_13, 1),
-        _actuated_led(P1_14,0)
-        
-    {
-        // update internal pointers (value, descriptors and characteristics array)
-        _My_characteristics[4] = &_led_char;
-      //  _My_characteristics[4] = &_imuz_char;
-        _My_characteristics[3] = &_imuy_char;
-        _My_characteristics[2] = &_imux_char;
-        _My_characteristics[1] = &_amb_char;
-        _My_characteristics[0] = &_lux_char;
-
-        // setup authorization handlers
-        _amb_char.setWriteAuthorizationCallback(this, &Self::authorize_client_write);
-        _imux_char.setWriteAuthorizationCallback(this, &Self::authorize_client_write);
-        _imuy_char.setWriteAuthorizationCallback(this, &Self::authorize_client_write);
-      //  _imuz_char.setWriteAuthorizationCallback(this, &Self::authorize_client_write);
-        _lux_char.setWriteAuthorizationCallback(this, &Self::authorize_client_write);
-        _led_char.setWriteAuthorizationCallback(this, &Self::authorize_client_write);
-    }
-
-
-
-    void start(BLE &ble_interface, events::EventQueue &event_queue)
-    {
-         if (_event_queue) {
-            return;
-        }
-
-        _server = &ble_interface.gattServer();
-        _event_queue = &event_queue;
-
-
-        // register the service
-        printf("Adding demo service\r\n");
-        ble_error_t err = _server->addService(_My_service);
-
-        if (err) {
-            printf("Error %u during demo service registration.\r\n", err);
-            return;
-        }
-
-        // read write handler
-        _server->onDataSent(as_cb(&Self::when_data_sent));
-        _server->onDataWritten(as_cb(&Self::when_data_written));
-        _server->onDataRead(as_cb(&Self::when_data_read));
-
-        // updates subscribtion handlers
-        _server->onUpdatesEnabled(as_cb(&Self::when_update_enabled));
-        _server->onUpdatesDisabled(as_cb(&Self::when_update_disabled));
-        _server->onConfirmationReceived(as_cb(&Self::when_confirmation_received));
-
-        // print the handles
-        printf("My service registered\r\n");
-        printf("service handle: %u\r\n", _My_service.getHandle());
-        printf("\tamb characteristic value handle %u\r\n", _amb_char.getValueHandle());
-        printf("\timu characteristic value handle %u\r\n", _imux_char.getValueHandle());
-        printf("\timu characteristic value handle %u\r\n", _imuy_char.getValueHandle());
-       // printf("\timu characteristic value handle %u\r\n", _imuz_char.getValueHandle());
-        printf("\tlux characteristic value handle %u\r\n", _lux_char.getValueHandle());
-        printf("\tled characteristic value handle %u\r\n", _led_char.getValueHandle());
-
-        _event_queue->call_every(1741 /* ms */, callback(this, &Self::update_char));
-        _event_queue->call_every(1621 /* ms */, callback(this, &Self::read_sensors));
-        _event_queue->call_every(503 /* ms */, callback(this, &Self::blink));
-        
-    }
-
-private:
-
-    /**
-     * Handler called when a notification or an indication has been sent.
-     */
-    void when_data_sent(unsigned count)
-    {
-        printf("sent %u updates\r\n", count);
-    }
-
-    /**
-     * Handler called after an attribute has been written.
-     */
-    void when_data_written(const GattWriteCallbackParams *e)
-    {
-        printf("data written:\r\n");
-        printf("\tconnection handle: %u\r\n", e->connHandle);
-        printf("\tattribute handle: %u", e->handle);
-        if (e->handle == _amb_char.getValueHandle()) {
-            printf(" (amb characteristic)\r\n");
-        } else if (e->handle == _led_char.getValueHandle()) {
-            printf(" (led characteristic)\r\n");
-            _actuated_led = *(e->data);
-        } else if (e->handle == _lux_char.getValueHandle()) {
-            printf(" (lux characteristic)\r\n");
-        } else if (e->handle == _imux_char.getValueHandle()) {
-            printf(" (imu_x characteristic)\r\n");
-        }   else if (e->handle == _imuy_char.getValueHandle()) {
-            printf(" (imu_y characteristic)\r\n");
-       // }   else if (e->handle == _imuz_char.getValueHandle()) {
-      //      printf(" (imu_z characteristic)\r\n");
-        } else {
-            printf("\r\n");
-        }
-        printf("\twrite operation: %u\r\n", e->writeOp);
-        printf("\toffset: %u\r\n", e->offset);
-        printf("\tlength: %u\r\n", e->len);
-        printf("\t data: ");
-
-        for (size_t i = 0; i < e->len; ++i) {
-            printf("%02X", e->data[i]);
-        }
-
-        printf("\r\n");
-    }
-
-    /**
-     * Handler called after an attribute has been read.
-     */
-    void when_data_read(const GattReadCallbackParams *e)
-    {
-        printf("data read:\r\n");
-        printf("\tconnection handle: %u\r\n", e->connHandle);
-        printf("\tattribute handle: %u", e->handle);
-        if (e->handle == _amb_char.getValueHandle()) {
-            printf(" (amb characteristic)\r\n");
-        } else if (e->handle == _led_char.getValueHandle()) {
-            printf(" (led characteristic)\r\n");
-        } else if (e->handle == _lux_char.getValueHandle()) {
-            printf(" (lux characteristic)\r\n");
-        } else if (e->handle == _imux_char.getValueHandle()) {
-            printf(" (imu_x characteristic)\r\n");
-        } else if (e->handle == _imuy_char.getValueHandle()) {
-            printf(" (imu_y characteristic)\r\n");
-      //  } else if (e->handle == _imuz_char.getValueHandle()) {
-      //      printf(" (imu_z characteristic)\r\n");        
-        } else {
-            printf("\r\n");
-        }
-    }
-
-    /**
-     * Handler called after a client has subscribed to notification or indication.
-     *
-     * @param handle Handle of the characteristic value affected by the change.
-     */
-    void when_update_enabled(GattAttribute::Handle_t handle)
-    {
-        printf("update enabled on handle %d\r\n", handle);
-    }
-
-    /**
-     * Handler called after a client has cancelled his subscription from
-     * notification or indication.
-     *
-     * @param handle Handle of the characteristic value affected by the change.
-     */
-    void when_update_disabled(GattAttribute::Handle_t handle)
-    {
-        printf("update disabled on handle %d\r\n", handle);
-    }
-
-    /**
-     * Handler called when an indication confirmation has been received.
-     *
-     * @param handle Handle of the characteristic value that has emitted the
-     * indication.
-     */
-    void when_confirmation_received(GattAttribute::Handle_t handle)
-    {
-        printf("confirmation received on handle %d\r\n", handle);
-    }
-
-    /**
-     * Handler called when a write request is received.
-     *
-     * This handler verify that the value submitted by the client is valid before
-     * authorizing the operation.
-     */
-    void authorize_client_write(GattWriteAuthCallbackParams *e)
-    {
-        printf("characteristic %u write authorization\r\n", e->handle);
-
-        if (e->offset != 0) {
-            printf("Error invalid offset\r\n");
-            e->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_INVALID_OFFSET;
-            return;
-        }
-
-        if (e->len != 1) {
-            printf("Error invalid len\r\n");
-            e->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_INVALID_ATT_VAL_LENGTH;
-            return;
-        }
-
-
-        e->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS;
-    }
-
-    /**
-     * Increment the lux luxer.
-     */
-    
-    void read_sensors (void)
-    {
-        int32_t float_to_32;
-        
-        
-        
-       if (sensor_light.open() && sens==0) {
-             float_to_32=0;
-             sensor_get = sensor_light.get_light_level();
-             float_to_32 = sensor_get/10;
-             //float_to_32 = __rev( float_to_32 );
-             float_to_32 = (float_to_32 < 0 ? 0 : float_to_32); 
-             lux = (float_to_32 > 255 ? 255 : float_to_32); 
-             sens=1;
-             printf("Lux = %f\n", sensor_get);
-           
-            }   
-       if (sens==1) {
-             float_to_32=0;
-             sensor_amb.initialize();
-             sensor_get =  sensor_amb.getTemperature();
-             float_to_32 = sensor_get*10 -103 ;            
-             float_to_32 = (float_to_32 < 0 ? 0 : float_to_32); 
-             amb = (float_to_32 > 255 ? 255 : float_to_32); 
-             sens=2;
-             printf("Amb = %f\n", sensor_get);
-            }  
-       if (sens==2) {    
-            
-            i2c.frequency(20000);
-      
-            /*Le os Registradores do Acelerometro*/
-            i2c_reg_buffer[0] = 0x12;
-            i2c.write(BMI160_ADDR, i2c_reg_buffer, 1, true);
-            i2c.read(BMI160_ADDR, (char *)&acc_sample_buffer, sizeof(acc_sample_buffer), false);
-        
-            /*Le os Registradores do Giroscopio*/
-            i2c_reg_buffer[0] = 0x0C;
-            i2c.write(BMI160_ADDR, i2c_reg_buffer, 1, true);
-            i2c.read(BMI160_ADDR, (char *)&gyr_sample_buffer, sizeof(gyr_sample_buffer), false);
-        
-            /*Ajusta dados brutos Acelerometro em unidades de g */
-            acc_result_buffer[0] = (acc_sample_buffer[0]/16384.0);
-            acc_result_buffer[1] = (acc_sample_buffer[1]/16384.0);
-            acc_result_buffer[2] = (acc_sample_buffer[2]/16384.0);
-        
-            /*Ajusta dados Brutos do Giroscopio em unidades de deg/s */
-            gyr_result_buffer[0] = (gyr_sample_buffer[0]/131.2);
-            gyr_result_buffer[1] = (gyr_sample_buffer[1]/131.2);
-                
-            /*Calcula os Angulos de Inclinacao com valor do Acelerometro*/
-            accel_ang_x=atan(acc_result_buffer[0]/sqrt(pow(acc_result_buffer[1],2) + pow(acc_result_buffer[2],2)))*RAD_DEG;
-            accel_ang_y=atan(acc_result_buffer[1]/sqrt(pow(acc_result_buffer[0],2) + pow(acc_result_buffer[2],2)))*RAD_DEG;
-        
-            /*Calcula os Angulos de Rotacao com valor do Giroscopio e aplica filtro complementar realizando a fusao*/
-            tiltx = (0.98*(tiltx_prev+(gyr_result_buffer[0]*0.001)))+(0.02*(accel_ang_x));
-            tilty = (0.98*(tilty_prev+(gyr_result_buffer[1]*0.001)))+(0.02*(accel_ang_y));
-        
-
-            float_to_32 = tiltx * 100 + 127;
-            float_to_32 = (float_to_32 < 0 ? 0 : float_to_32); 
-            imux = (float_to_32 > 255 ? 255 : float_to_32);
-            
-            float_to_32 = 0;
-            
-            float_to_32 = tilty * 100 + 127;
-            float_to_32 = (float_to_32 < 0 ? 0 : float_to_32); 
-            imuy = (float_to_32 > 255 ? 255 : float_to_32);
-            //imuz = acc_result_buffer[2];
-            
-  
-            
-            
-                                        
-        
-            /*Imprime os dados ACC pre-formatados*/
-            printf("%.3f,%.3f\n\r",tiltx, tilty);  
-        
-            sens=0;
-            
-           // update_char();
-            
-            } 
-            
-            //update_char(); 
-          
-    }
-    
-   
-    void update_char(void)
-    {   
-        if (msg==0) {ble_error_t err = _lux_char.set(*_server, lux);
-        printf ("lux sensor value: %d\n", lux);
-        if (err) {
-            printf("write of the lux value returned error %u\r\n", err);
-            return;
-        } 
-        wait(0.1);
-        msg=1; }
-            
-        if (msg==1) {ble_error_t err = _amb_char.set(*_server, amb);
-        printf ("amb sensor value: %d\n", amb);
-        if (err) {
-            printf("write of the amb value returned error %u\r\n", err);
-            return;
-        }
-        wait(0.1); 
-        msg=2;}
-             
-        if (msg==2) {ble_error_t err = _imux_char.set(*_server, imux);
-        printf ("imu_x sensor value: %d\n", imux);
-        if (err) {
-            printf("write of the imu_x value returned error %u\r\n", err);
-            return;    
-        }
-        wait(0.1); 
-        msg=3;}
-             
-        if (msg==3) {ble_error_t err = _imuy_char.set(*_server, imuy);
-        printf ("imu_y sensor value: %d\n", imuy);
-        if (err) {
-            printf("write of the imu_y value returned error %u\r\n", err);
-            return;
-        }  
-        wait(0.1);
-        msg=0;}      
-      
-      //  err = _imuz_char.set(*_server, imuz);
-      //  printf ("imu_z sensor value: %d\n", imuz);
-      //  if (err) {
-      //      printf("write of the imu_z value returned error %u\r\n", err);
-      //      return;
-      //  }
-        
-        
-    }
-        
-    
-    void blink() {
-        _alive_led = !_alive_led;
-    }
-
-    /**
-     * Change led status.
-     */
-    void change_led(void)
-    {
-        uint8_t led = 0;
-        ble_error_t err = _led_char.get(*_server, led);
-        if (err) {
-            printf("read of the led value returned error %u\r\n", err);
-            return;
-        }
-    }
-
-
-
-private:
-    /**
-     * Helper that construct an event handler from a member function of this
-     * instance.
-     */
-    template<typename Arg>
-    FunctionPointerWithContext<Arg> as_cb(void (Self::*member)(Arg))
-    {
-        return makeFunctionPointer(this, member);
-    }
-
-    /**
-     * Read, Write, Notify, Indicate  Characteristic declaration helper.
-     *
-     * @tparam T type of data held by the characteristic.
-     */
-    template<typename T>
-    class ReadWriteNotifyIndicateCharacteristic : public GattCharacteristic {
-    public:
-        /**
-         * Construct a characteristic that can be read or written and emit
-         * notification or indication.
-         *
-         * @param[in] uuid The UUID of the characteristic.
-         * @param[in] initial_value Initial value contained by the characteristic.
-         */
-        ReadWriteNotifyIndicateCharacteristic(const UUID & uuid, const T& initial_value) :
-            GattCharacteristic(
-                /* UUID */ uuid,
-                /* Initial value */ (uint8_t *) &_value,
-                /* Value size */ sizeof(_value),
-                /* Value capacity */ sizeof(_value),
-                /* Properties */ GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ |
-                                GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE |
-                                GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY |
-                                GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE,
-                /* Descriptors */ NULL,
-                /* Num descriptors */ 0,
-                /* variable len */ false
-            ),
-            _value(initial_value) {
-        }
-
-        /**
-         * Get the value of this characteristic. 
-         *
-         * @param[in] server GattServer instance that contain the characteristic
-         * value.
-         * @param[in] dst Variable that will receive the characteristic value.
-         *
-         * @return BLE_ERROR_NONE in case of success or an appropriate error code.
-         */
-        ble_error_t get(GattServer &server, T& dst) const
-        {
-            uint16_t value_length = sizeof(dst);
-            return server.read(getValueHandle(), (uint8_t *) &dst, &value_length);
-        }
-
-        /**
-         * Assign a new value to this characteristic.
-         *
-         * @param[in] server GattServer instance that will receive the new value.
-         * @param[in] value The new value to set.
-         * @param[in] local_only Flag that determine if the change should be kept
-         * locally or forwarded to subscribed clients.
-         */
-          ble_error_t set(
-               GattServer &server,  const uint8_t &value, bool local_only = false
-        ) const {
-            return server.write(getValueHandle(), (uint8_t *) &value, sizeof(value), local_only);
-        }
-
-    private:
-        uint32_t _value;
-    };
-    
-    template<typename T>
-    class ReadWriteCharacteristic : public GattCharacteristic {
-    public:
-        /**
-         * Construct a characteristic that can be read or written and emit
-         * notification or indication.
-         *
-         * @param[in] uuid The UUID of the characteristic.
-         * @param[in] initial_value Initial value contained by the characteristic.
-         */
-        ReadWriteCharacteristic(const UUID & uuid, const T& initial_value) :
-            GattCharacteristic(
-                /* UUID */ uuid,
-                /* Initial value */ (uint8_t *) &_value,
-                /* Value size */ sizeof(_value),
-                /* Value capacity */ sizeof(_value),
-                /* Properties */ GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ |
-                                GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE ,
-                /* Descriptors */ NULL,
-                /* Num descriptors */ 0,
-                /* variable len */ false
-            ),
-            _value(initial_value) {
-        }
-
-        /**
-         * Get the value of this characteristic. 
-         *
-         * @param[in] server GattServer instance that contain the characteristic
-         * value.
-         * @param[in] dst Variable that will receive the characteristic value.
-         *
-         * @return BLE_ERROR_NONE in case of success or an appropriate error code.
-         */
-        ble_error_t get(GattServer &server, T& dst) const
-        {
-            uint16_t value_length = sizeof(dst);
-            return server.read(getValueHandle(), (uint8_t *) &dst, &value_length);
-        }
-
-        /**
-         * Assign a new value to this characteristic.
-         *
-         * @param[in] server GattServer instance that will receive the new value.
-         * @param[in] value The new value to set.
-         * @param[in] local_only Flag that determine if the change should be kept
-         * locally or forwarded to subscribed clients.
-         */
-          ble_error_t set(
-               GattServer &server,  const uint8_t &value, bool local_only = false
-        ) const {
-            return server.write(getValueHandle(), (uint8_t *) &value, sizeof(value), local_only);
-        }
-
-    private:
-        uint8_t _value;
-    };
-
-    ReadWriteNotifyIndicateCharacteristic<uint32_t> _amb_char;
-    ReadWriteCharacteristic<uint8_t> _led_char;
-    ReadWriteNotifyIndicateCharacteristic<uint32_t> _lux_char;
-    ReadWriteNotifyIndicateCharacteristic<uint32_t> _imux_char;
-    ReadWriteNotifyIndicateCharacteristic<uint32_t> _imuy_char;
-   // ReadWriteNotifyIndicateCharacteristic<uint32_t> _imuz_char;        
-    // list of the characteristics of the My service
-    GattCharacteristic* _My_characteristics[5];
-
-    // demo service
-    GattService _My_service;
-
-    GattServer* _server;
-    events::EventQueue *_event_queue;
-    
-   DigitalOut _alive_led;
-   DigitalOut _actuated_led;
-};
-
-int main() {
-    
-    
-    printf("ambient sensor initialized");
-    wait(1) ;
-    BLE &ble_interface = BLE::Instance();
-    events::EventQueue event_queue;
-    MyService demo_service;
-    BLEProcess ble_process(event_queue, ble_interface);
-    
-     i2c.frequency(20000);
-    
-     /*Reset BMI160*/
-        i2c_reg_buffer[0] = 0x7E;
-        i2c_reg_buffer[1] = 0xB6;    
-        i2c.write(BMI160_ADDR, i2c_reg_buffer, sizeof(i2c_reg_buffer), false);
-        wait_ms(200);
-        printf("BMI160 Resetado\n\r");
-    
-        /*Habilita o Acelerometro*/
-        i2c_reg_buffer[0] = 0x7E;
-        i2c_reg_buffer[1] = 0x11; //PMU Normal   
-        i2c.write(BMI160_ADDR, i2c_reg_buffer, sizeof(i2c_reg_buffer), false);
-        printf("Acc Habilitado\n\r");
-    
-        /*Habilita o Giroscopio*/
-        i2c_reg_buffer[0] = 0x7E;
-        i2c_reg_buffer[1] = 0x15;  //PMU Normal 
-        i2c.write(BMI160_ADDR, i2c_reg_buffer, sizeof(i2c_reg_buffer), false);
-        printf("Gyr Habilitado\n\r");
-    
-        /*Config o Data Rate ACC em 1600Hz*/
-        i2c_reg_buffer[0] = 0x40;
-        i2c_reg_buffer[1] = 0x2C;    
-        i2c.write(BMI160_ADDR, i2c_reg_buffer, sizeof(i2c_reg_buffer), false);
-        printf("Data Rate ACC Selecionado a 1600Hz\n\r");
-    
-        /*Config o Data Rate GYR em 1600Hz*/
-        i2c_reg_buffer[0] = 0x42;
-        i2c_reg_buffer[1] = 0x2C;    
-        i2c.write(BMI160_ADDR, i2c_reg_buffer, sizeof(i2c_reg_buffer), false);
-        printf("Data Rate GYR Selecionado a 1600Hz\n\r");
-    
-        /*Config o Range GYR em 250º/s*/
-        i2c_reg_buffer[0] = 0x43;
-        i2c_reg_buffer[1] = 0x03;    
-        i2c.write(BMI160_ADDR, i2c_reg_buffer, sizeof(i2c_reg_buffer), false);
-        printf("Range GYR Selecionado a 250deg/s\n\r");
-    
-        wait(0.1);
-        
-        printf("BMI160 Configurado\n\r");
-
-    ble_process.on_init(callback(&demo_service, &MyService::start));
-
-
-    // bind the event queue to the ble interface, initialize the interface
-    // and start advertising
-    ble_process.start();
-
-    // Process the event queue.
-    event_queue.dispatch_forever();
-
-    return 0;
-}
+/***GENERAL INCLUDES***/
+
+//MBed Includes
+
+#include <events/mbed_events.h>
+#include <stdio.h>
+#include "mbed.h"
+/***Definições do Arquétipo***/
+
+int comm=1; // Selecionar: 0 para nenhum, 1 para BLE, 2 para Lora ou 3 para Lorawan
+int sensors=0; // Selecionar: 0 para nenhum, 1 para sensor ambiental, 2 para sensor de luz, 3 para sensor de movimento.
+int peripherals=0; // Selecionar: 0 para nenhum, 1 para GPS
+
+/***Global Variables***/
+
+float  sensor_get = 0;
+uint32_t sens00 = 0;
+uint32_t sens01 = 0;
+uint32_t sens02 = 0;
+int cont=0;
+int read_sens=0;
+
+
+
+
+/***SPECIFIC INCLUDES***/
+
+//BLE Includes
+
+#include "platform/Callback.h"
+#include "events/EventQueue.h"
+#include "platform/NonCopyable.h"
+
+#include "ble/BLE.h"
+#include "ble/Gap.h"
+#include "ble/GattClient.h"
+#include "ble/GapAdvertisingParams.h"
+#include "ble/GapAdvertisingData.h"
+#include "ble/GattServer.h"
+#include "BLEProcess.h"
+
+//Sensors Includes
+
+
+#include "BME280.h"
+#include "Si1133.h"
+#include "BMX160.txt"
+
+/***DEFINES***/
+
+//Sensors and Peripherals
+DigitalOut led1(P1_13);
+InterruptIn button1(P1_11);
+BME280 sensor_amb(P0_13, P0_15, 0x77 << 1) ;
+Si1133 sensor_light(P0_13, P0_15);
+
+
+
+
+/***Functions***/
+
+
+
+void Sensor_Read(int sens){
+       
+         if (sens==1) {
+             sensor_amb.initialize();
+             sensor_get =  sensor_amb.getTemperature();
+             
+             if (comm==1){
+                 sens00 = sensor_get;
+                 sens00 = (sens00 < 0 ? 0 : sens00); 
+                 sens00 = (sens00 > 255 ? 255 : sens00);
+                 printf("Temp = %u\n", sens00);
+                 }
+
+             printf("Temp = %f\n", sensor_get);             
+
+              
+             sensor_get =  sensor_amb.getPressure();
+
+             if (comm==1){
+                 sens01 = sensor_get/10;
+                 sens01 = (sens01 < 0 ? 0 : sens01); 
+                 sens01 = (sens01 > 255 ? 255 : sens01);
+                 printf("Pres = %u\n", sens01); 
+                 }
+                 
+             printf("Pres = %f\n", sensor_get);              
+            
+             
+             sensor_get =  sensor_amb.getHumidity();
+             
+             
+             if (comm==1){
+                 sens02 = sensor_get;
+                 sens02 = (sens02 < 0 ? 0 : sens02); 
+                 sens02 = (sens02 > 255 ? 255 : sens02);
+                 printf("Hum = %u\n", sens02);
+                 }
+                 
+             printf("Hum = %f\n", sensor_get); 
+             }
+             
+        if (sens==2) {
+            if(sensor_light.open()){
+                sensor_get =  sensor_light.get_light_level();
+                if (comm==1){
+                 sens00 = sensor_get;
+                 sens00 = (sens00 < 0 ? 0 : sens00); 
+                 sens00 = (sens00 > 255 ? 255 : sens00);
+                 printf("Light Level = %u\n", sens00);
+                 }
+
+            printf("Light Level = %f\n", sensor_get);             
+            }
+        }
+            
+        if (sens==3) {
+            if(sensor_light.open()){              
+                sensor_get =  sensor_light.get_uv_index();
+                if (comm==1){
+                    sens01 = sensor_get/10;
+                    sens01 = (sens01 < 0 ? 0 : sens01); 
+                    sens01 = (sens01 > 255 ? 255 : sens01);
+                    printf("UV Index = %u\n", sens01); 
+                    }
+                printf("Uv Index = %f\n", sensor_get);
+                }              
+            } 
+            
+        if (sens==4) {
+            
+            BMX160_print();
+            
+            }
+    }
+    
+
+     
+#include "BLE.txt"
+
+int Communication(int comm){
+     
+        if(comm==1){
+            
+            BLE &ble_interface = BLE::Instance();
+            events::EventQueue event_queue;
+            MyService demo_service;
+            BLEProcess ble_process(event_queue, ble_interface);     
+            ble_process.on_init(callback(&demo_service, &MyService::start));
+            ble_process.start();
+            event_queue.dispatch_forever();            
+            }
+     return 0;
+     }
+void button1_pressed()
+{
+    printf("Teste dos Periféricos\n");
+    Sensor_Read(1);
+    wait(0.5);
+    Sensor_Read(2);
+    wait(0.5);
+    Sensor_Read(3);
+    wait(0.5);
+    }
+
+void button1_released()
+{
+  led1=1;
+  wait(3);
+  led1=0;
+  
+}
+
+int main() {
+    
+    BMX160_config();
+    //button1.fall(&button1_pressed);
+    //button1.rise(&button1_released);
+    Communication (comm);        
+    
+    }
\ No newline at end of file