added lorawan example in IAR, and added support for LIS3MDL and LPS22HB sensors

1. modified the HTS221: removed magic numbers, added a sensor_tempnhumi_t struct to accommodate temperature and humidity data
2. added .h and .c files for LIS3MDL magnetic sensor
3. added .h and .c files for LPS22HB pressure sensor
3. added IAR (EWARM) project for lorawan example
4. added bsp.c and bsp.h to manager the sensors
This commit is contained in:
Winfred LIN
2020-03-31 17:48:27 +11:00
parent a3078ac232
commit da5884920a
19 changed files with 8101 additions and 1494 deletions

View File

@@ -1,6 +1,7 @@
#include "lora_demo.h"
#include "HTS221.h"
#include "RHF76.h"
#include <Math.h>
#include "bsp.h"
/*
==================================================================================
@@ -54,9 +55,18 @@
uint16_t report_period = 10;
typedef struct device_data_st {
uint8_t temperature;
uint8_t humidity;
uint8_t magn_fullscale; // fullscale of magnetometer
uint8_t temp_sensitivity;
uint16_t humi_sensitivity;
uint16_t press_sensitivity;
uint16_t magn_sensitivity; // sensitivity per fullscale
int16_t temperature;
int16_t humidity;
int16_t magn_x; // X-magnetic value in LSB
int16_t magn_y; // Y-magnetic value in LSB
int16_t magn_z; // Z-magnetic value in LSB
uint16_t period;
uint32_t pressure;
} __PACKED__ dev_data_t;
typedef struct device_data_wrapper_st {
@@ -86,29 +96,103 @@ void recv_callback(uint8_t *data, uint8_t len)
printf("report_period: %d\n", report_period);
}
void print_to_screen(sensor_data_t sensor_data)
{
float pressure = sensor_data.sensor_press.pressure*1.0/sensor_data.sensor_press.sensitivity;
float altitude = (pow(1013.25/pressure,1.0/5.257) - 1)*((int16_t)sensor_data.sensor_tempnhumi.temperature/10.0+273.15)/0.0065;
printf("temperature: %2.2f\n", (int16_t)sensor_data.sensor_tempnhumi.temperature / 10.0);
printf("humidity : %2.2f\n", sensor_data.sensor_tempnhumi.humidity / 10.0);
printf("pressure : %2.2f,\t altitude: %2.2f\n", pressure, altitude);
printf("magn : %2.3f, %2.3f, %2.3f\n",
(int16_t)sensor_data.sensor_magn.magn_x*1.0/sensor_data.sensor_magn.sensitivity,
(int16_t)sensor_data.sensor_magn.magn_y*1.0/sensor_data.sensor_magn.sensitivity,
(int16_t)sensor_data.sensor_magn.magn_z*1.0/sensor_data.sensor_magn.sensitivity);
}
/**
* @brief application entry
* @modified by jieranzhi 2020/03/31
* @note following javascript code snippet demonstrate how to correctly
* decode the data passed to Tencent cloud
****************************** CODE START *****************************
function RawToProtocol(fPort, bytes)
{
var data ={
"method": "report",
"clientToken": new Date(),
"params": {}
}
var magnFullscale = bytes[0];
switch(magnFullscale)
{
case 0:
data.params.magnFullscale = 4;
break;
case 1:
data.params.magnFullscale = 8;
break;
case 2:
data.params.magnFullscale = 12;
break;
case 3:
data.params.magnFullscale = 16;
break;
}
var tempSensitivity = bytes[1];
var humiSensitivity = bytes[2] | (bytes[3]<<8);
var presSensitivity = bytes[4] | (bytes[5]<<8);
var magnSensitivity = bytes[6] | (bytes[7]<<8);
data.params.temperature = (convertToInt16(bytes[8] | (bytes[9]<<8))*1.0/10).toFixed(2);
data.params.humidity = ((bytes[10] | (bytes[11]<<8))*1.0/10).toFixed(2);
data.params.magnX = (convertToInt16(bytes[12] | (bytes[13]<<8))*1.0/magnSensitivity).toFixed(2);
data.params.magnY = (convertToInt16(bytes[14] | (bytes[15]<<8))*1.0/magnSensitivity).toFixed(2);
data.params.magnZ = (convertToInt16(bytes[16] | (bytes[17]<<8))*1.0/magnSensitivity).toFixed(2);
data.params.period = bytes[18] | (bytes[19]<<8);
data.params.pressure = ((bytes[20] | (bytes[21]<<8) | (bytes[22]<<16) | (bytes[23]<<24))*1.0/presSensitivity).toFixed(2);
data.params.altitude = ((Math.pow(1017.92/data.params.pressure,1.0/5.257) - 1)*(data.params.temperature/10.0+273.15)/0.0065).toFixed(2);
data.params.fPort = fPort;
return data;
}
function convertToInt16(num)
{
var intNum = num;
if ((num & 0x8000) > 0) {
intNum = num - 0x10000;
}
return intNum;
}
****************************** CODE END *****************************
*/
void application_entry(void *arg)
{
int16_t temperature;
int16_t humidity;
sensor_data_t sensor_data;
HTS221_Init();
// initialization of sensors
BSP_Sensor_Init();
rhf76_lora_init(HAL_UART_PORT_1);
tos_lora_module_recvcb_register(recv_callback);
tos_lora_module_join_otaa("8cf957200000fa57", "8cf957200000fa572059aaaaad204a72");
tos_lora_module_join_otaa("8cf957200000f53c", "8cf957200000f52c6d09aaaaad205a72");
while (1) {
HTS221_Get_Temperature(&temperature);
HTS221_Get_Humidity(&humidity);
printf("temperature: %2.1f\n", temperature / 10.0);
printf("humidity : %2.1f\n", humidity / 10.0);
dev_data_wrapper.u.dev_data.temperature = temperature / 10;
dev_data_wrapper.u.dev_data.humidity = humidity / 10;
dev_data_wrapper.u.dev_data.period = report_period;
BSP_Sensor_Read(&sensor_data);
print_to_screen(sensor_data);
// generate data frame
dev_data_wrapper.u.dev_data.magn_fullscale = (uint8_t)(sensor_data.sensor_magn.fullscale);
dev_data_wrapper.u.dev_data.temp_sensitivity = (uint8_t)(sensor_data.sensor_tempnhumi.temp_sensitivity);
dev_data_wrapper.u.dev_data.humi_sensitivity = (uint16_t)(sensor_data.sensor_tempnhumi.humi_sensitivity);
dev_data_wrapper.u.dev_data.press_sensitivity = (uint16_t)(sensor_data.sensor_press.sensitivity);
dev_data_wrapper.u.dev_data.magn_sensitivity = (uint16_t)(sensor_data.sensor_magn.sensitivity);
dev_data_wrapper.u.dev_data.temperature = (int16_t)(sensor_data.sensor_tempnhumi.temperature);
dev_data_wrapper.u.dev_data.humidity = (int16_t)(sensor_data.sensor_tempnhumi.humidity);
dev_data_wrapper.u.dev_data.magn_x = (int16_t)(sensor_data.sensor_magn.magn_x);
dev_data_wrapper.u.dev_data.magn_y = (int16_t)(sensor_data.sensor_magn.magn_y);
dev_data_wrapper.u.dev_data.magn_z = (int16_t)(sensor_data.sensor_magn.magn_z);
dev_data_wrapper.u.dev_data.pressure = (uint32_t)(sensor_data.sensor_press.pressure);
dev_data_wrapper.u.dev_data.period = report_period;
// send data to the server (via gateway)
tos_lora_module_send(dev_data_wrapper.u.serialize, sizeof(dev_data_t));
tos_task_delay(report_period * 1000);
}