LoRaWAN_FAE_Training

Dependencies:   X_NUCLEO_IKS01A2

Revision:
48:b02d43b5e90c
Parent:
45:96fe99f19cd0
Child:
49:2453a6404fbe
--- a/main.cpp	Tue Mar 12 09:08:43 2019 +0000
+++ b/main.cpp	Tue Mar 12 17:18:08 2019 +0000
@@ -25,12 +25,19 @@
 #include "trace_helper.h"
 #include "lora_radio_helper.h"
 
-// Sensors
-#include "Grove_temperature.h"
-#include "MMA7660.h"
+// sensor boards IKS01A2
+#include "XNucleoIKS01A2.h"
+
+
+/* Instantiate the expansion board */
+static XNucleoIKS01A2 *mems_expansion_board = XNucleoIKS01A2::instance(D14, D15, D4, D5);
 
-Grove_temperature temp(A1);
-MMA7660 accelemeter;
+/* Retrieve the composing elements of the expansion board */
+static LSM303AGRMagSensor *magnetometer = mems_expansion_board->magnetometer;
+static HTS221Sensor *hum_temp = mems_expansion_board->ht_sensor;
+static LPS22HBSensor *press_temp = mems_expansion_board->pt_sensor;
+static LSM6DSLSensor *acc_gyro = mems_expansion_board->acc_gyro;
+static LSM303AGRAccSensor *accelerometer = mems_expansion_board->accelerometer;
 
 using namespace events;
 
@@ -99,14 +106,35 @@
  */
 int main (void)
 {
+    uint8_t id;
+      
     // setup tracing
     setup_trace();
+    
+    // Init IKS01A2 Board
+    printf("\r\n--- IKS01A2 conf start ---\r\n");
+  
+    /* Enable all sensors */
+    hum_temp->enable();
+    press_temp->enable();
+    magnetometer->enable();
+    accelerometer->enable();
+    acc_gyro->enable_x();
+    acc_gyro->enable_g();
 
+    hum_temp->read_id(&id);
+    printf("HTS221  humidity & temperature    = 0x%X\r\n", id);
+    press_temp->read_id(&id);
+    printf("LPS22HB  pressure & temperature   = 0x%X\r\n", id);
+    magnetometer->read_id(&id);
+    printf("LSM303AGR magnetometer            = 0x%X\r\n", id);
+    accelerometer->read_id(&id);
+    printf("LSM303AGR accelerometer           = 0x%X\r\n", id);
+    acc_gyro->read_id(&id);
+    printf("LSM6DSL accelerometer & gyroscope = 0x%X\r\n", id);
+    
     // stores the status of a call to LoRaWAN protocol
     lorawan_status_t retcode;
-    
-    //Initialise accelerometer (if plugged)
-    accelemeter.init(); 
 
     // Initialize LoRaWAN stack
     if (lorawan.initialize(&ev_queue) != LORAWAN_STATUS_OK) {
@@ -160,49 +188,105 @@
  */
 static void send_message()
 {
-    uint16_t packet_len, Temperature, axConverted, ayConverted, azConverted;
+    uint16_t packet_len, Temperature, Index=1;
+    uint32_t Pressure, Humidity;
     int16_t retcode;
     float sensor_value;
-    float ax,ay,az;
+    
+    float value1, value2;
+    char buffer1[32], buffer2[32];
+    int32_t axes[3];
 
-    if (ds1820.begin()) {
-        ds1820.startConversion();
-        sensor_value = ds1820.read();
-        printf("\r\n Dummy Sensor Value = %3.1f \r\n", sensor_value);
-        ds1820.startConversion();
-    } else {
-        printf("\r\n No sensor found \r\n");
-        return;
-    }
+//    if (ds1820.begin()) {
+//        ds1820.startConversion();
+//        sensor_value = ds1820.read();
+//        printf("\r\n Dummy Sensor Value = %3.1f \r\n", sensor_value);
+//        ds1820.startConversion();
+//    } else {
+//        printf("\r\n No sensor found \r\n");
+//        return;
+//    }
+    
+//    packet_len = sprintf((char*) tx_buffer, "Dummy Sensor Value is %3.1f",
+//                    sensor_value);
+    
+    hum_temp->get_temperature(&value1);
+    hum_temp->get_humidity(&value2);
+    printf("HTS221: [temp] %2.2f C,   [hum] %2.2f \r\n", value1, value2);
+    Humidity = value2 * 100;
 
-    packet_len = sprintf((char*) tx_buffer, "Dummy Sensor Value is %3.1f",
-                    sensor_value);
-   
-    /*  Grove Temperature Sensor */
-//    sensor_value = temp.getTemperature();                 
-//    printf("temperature = %2.2f\n", sensor_value);
-//    Temperature = (uint16_t)sensor_value * 100;
-//    tx_buffer[0]=0x01; //Temperature
-//    tx_buffer[1]=0x02; // Len
-//    tx_buffer[2]=Temperature & 0xFF; // Temp LSB
-//    tx_buffer[3]=(Temperature >> 16) & 0xFF; // Temp MSB 
-//    packet_len = 4; 
+    /*Add Humidity*/
+    tx_buffer[0]+=1;                                            // Add 1 Nbelment 
+    tx_buffer[Index]=0x03;                                      // Humidity
+    tx_buffer[Index+1]=0x03;                                    // Len
+    tx_buffer[Index+2]=(uint8_t)(Humidity & 0xFF);              // Press LSB
+    tx_buffer[Index+3]=(uint8_t)((Humidity >> 8) & 0xFF);       // Press MID
+    tx_buffer[Index+4]=(uint8_t)((Humidity >> 16) & 0xFF);      // Press MSB
+    Index+=5; 
+    
+    press_temp->get_temperature(&value1);
+    press_temp->get_pressure(&value2);
+    printf("LPS22HB: [temp] %2.2f C, [press] %4.2f mbar\r\n", value1, value2);
+    
+    
+    Temperature = value1 * 100; // Convert for transmit
+    Pressure = value2 * 100; // Convert for transmit
+    
+    /*Add Tempertaure*/
+    tx_buffer[0]+=1;                                            // Add 1 Nbelment 
+    tx_buffer[Index]=0x01;                                      // Temperature
+    tx_buffer[Index+1]=0x02;                                    // Len
+    tx_buffer[Index+2]=(uint8_t)(Temperature & 0xFF);           // Temp LSB
+    tx_buffer[Index+3]=(uint8_t)((Temperature >> 8) & 0xFF);    // Temp MSB 
+    Index+=4;                                                   // Update the Index
     
-    /* Grove Accelerometer Sensor */    
-//    accelemeter.getAcceleration(&ax,&ay,&az);
-//    printf("Accleration of X=%2.2fg, Y=%2.2fg, Z=%2.2fg\n\r",ax,ay,az);
-//    tx_buffer[0]=0x02; //Acceleration
-//    tx_buffer[1]=0x06; // Len
-//    axConverted = ax * 100;
-//    tx_buffer[2]=(axConverted & 0xFF);          // x axe LSB
-//    tx_buffer[3]=((axConverted >> 16) & 0xFF);  // x axe MSB     
-//    ayConverted = ay * 100;
-//    tx_buffer[4]=(ayConverted & 0xFF);          // y axe LSB
-//    tx_buffer[5]=((ayConverted >> 16) & 0xFF);  // y axe MSB     
-//    azConverted = az * 100;
-//    tx_buffer[6]=(azConverted & 0xFF);          // x axe LSB
-//    tx_buffer[7]=((azConverted >> 16) & 0xFF);  // x axe MSB   
-//    packet_len = 8; 
+    /*Add Pressure*/
+    tx_buffer[0]+=1;
+    tx_buffer[Index]=0x02;                                      // Pressure
+    tx_buffer[Index+1]=0x03;                                    // Len
+    tx_buffer[Index+2]=(uint8_t)(Pressure & 0xFF);              // Press LSB
+    tx_buffer[Index+3]=(uint8_t)((Pressure >> 8) & 0xFF);       // Press MID
+    tx_buffer[Index+4]=(uint8_t)((Pressure >> 16) & 0xFF);      // Press MSB
+    Index+=5; 
+
+    printf("---\r\n");
+
+//    magnetometer->get_m_axes(axes);
+//    printf("LSM303AGR [mag/mgauss]:  %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
+//    
+    accelerometer->get_x_axes(axes);
+    printf("LSM303AGR [acc/mg]:  %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
+    
+    /*Add Accelerometer*/
+    tx_buffer[0]+=1;
+    tx_buffer[Index]=0x04;                                      // Accelerometer
+    tx_buffer[Index+1]=0x03;                                    // Len
+    /* x */
+    tx_buffer[Index+2]=(uint8_t)(axes[0] & 0xFF);               // Press LSB
+    tx_buffer[Index+3]=(uint8_t)((axes[0] >> 8) & 0xFF);        // Press MID
+    tx_buffer[Index+4]=(uint8_t)((axes[0] >> 16) & 0xFF);       // Press MID
+    tx_buffer[Index+5]=(uint8_t)((axes[0] >> 24) & 0xFF);       // Press MSB
+    
+    /* y */
+    tx_buffer[Index+6]=(uint8_t)(axes[1] & 0xFF);               // Press LSB
+    tx_buffer[Index+7]=(uint8_t)((axes[1] >> 8) & 0xFF);        // Press MID
+    tx_buffer[Index+8]=(uint8_t)((axes[1] >> 16) & 0xFF);       // Press MID
+    tx_buffer[Index+9]=(uint8_t)((axes[1] >> 24) & 0xFF);       // Press MSB
+    
+    /* z */
+    tx_buffer[Index+10]=(uint8_t)(axes[2] & 0xFF);               // Press LSB
+    tx_buffer[Index+11]=(uint8_t)((axes[2] >> 8) & 0xFF);        // Press MID
+    tx_buffer[Index+12]=(uint8_t)((axes[2] >> 16) & 0xFF);       // Press MID
+    tx_buffer[Index+13]=(uint8_t)((axes[2] >> 24) & 0xFF);       // Press MSB
+    Index+=14; 
+//
+//    acc_gyro->get_x_axes(axes);
+//    printf("LSM6DSL [acc/mg]:      %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
+//
+//    acc_gyro->get_g_axes(axes);
+//    printf("LSM6DSL [gyro/mdps]:   %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]); 
+    
+    packet_len = Index + 1; // Compute the final payload size  
 
     retcode = lorawan.send(MBED_CONF_LORA_APP_PORT, tx_buffer, packet_len,
                            MSG_UNCONFIRMED_FLAG);
@@ -246,6 +330,19 @@
     }
 
     printf("\r\n Data Length: %d\r\n", retcode);
+    
+    if(rx_buffer[0] & 0x01 == 1)
+    {
+        printf("\r\n Board is in Wrong side !!!!! \r\n\r\n");    
+    }
+    if(((rx_buffer[0] & 0x02) >> 1) == 1)
+    {
+        printf("\r\n It's hot here !!!!! \r\n\r\n");    
+    }
+    if(((rx_buffer[0] & 0x04) >> 2) == 1)
+    {
+        printf("\r\n It's humid here !!!!! \r\n\r\n");   
+    }
 
     memset(rx_buffer, 0, sizeof(rx_buffer));
 }