Quality Factors unified across different kinds of sensors

pull/2/head
Mateusz Lubecki 2020-07-25 21:49:24 +02:00
rodzic 1581920fe1
commit 13ea140060
12 zmienionych plików z 200 dodań i 33 usunięć

Wyświetl plik

@ -1 +0,0 @@
,mateusz,mateusz-Latitude-E5510,21.07.2020 00:45,file:///home/mateusz/.config/libreoffice/4;

Plik binarny nie jest wyświetlany.

Wyświetl plik

@ -4,8 +4,8 @@
#include "aprs/ax25.h"
#include "drivers/serial.h"
#define SW_VER "DF04"
#define SW_DATE "12072020"
#define SW_VER "DF05"
#define SW_DATE "24072020"
#define SYSTICK_TICKS_PER_SECONDS 100
#define SYSTICK_TICKS_PERIOD 10

Wyświetl plik

@ -9,6 +9,7 @@
#include "drivers/dallas.h"
#include "drivers/ms5611.h"
#include "drivers/bme280.h"
#include "drivers/analog_anemometer.h"
#include "../umb_master/umb_master.h"
#include "../umb_master/umb_qf_t.h"
@ -52,6 +53,7 @@ extern dallas_qf_t rte_wx_current_dallas_qf, rte_wx_error_dallas_qf;
extern dallas_average_t rte_wx_dallas_average;
extern ms5611_qf_t rte_wx_ms5611_qf;
extern bme280_qf_t rte_wx_bme280_qf;
extern analog_wind_qf_t rte_wx_analog_wind_qf;
#ifdef _UMB_MASTER

Wyświetl plik

@ -38,6 +38,10 @@ uint8_t packet_tx_telemetry_descr_counter = 145;
void packet_tx_handler(void) {
dallas_qf_t dallas_qf = DALLAS_QF_UNKNOWN;
pressure_qf_t pressure_qf = PRESSURE_QF_UNKNOWN;
humidity_qf_t humidity_qf = HUMIDITY_QF_UNKNOWN;
wind_qf_t wind_qf = WIND_QF_UNKNOWN;
int ln = 0;
packet_tx_beacon_counter++;
@ -135,6 +139,65 @@ void packet_tx_handler(void) {
rte_wx_current_dallas_qf = DALLAS_QF_UNKNOWN;
}
// pressure sensors quality factors
if (rte_wx_ms5611_qf == MS5611_QF_UNKNOWN) {
// use BME280 is used instead
switch (rte_wx_bme280_qf) {
case BME280_QF_FULL:
case BME280_QF_HUMIDITY_DEGRADED: pressure_qf = PRESSURE_QF_FULL; break;
case BME280_QF_UKNOWN:
case BME280_QF_NOT_AVAILABLE: pressure_qf = PRESSURE_QF_NOT_AVALIABLE; break;
case BME280_QF_PRESSURE_DEGRADED:
case BME280_QF_GEN_DEGRADED: pressure_qf = PRESSURE_QF_DEGRADATED; break;
}
}
else {
// if not use MS5611
switch (rte_wx_ms5611_qf) {
case MS5611_QF_FULL: pressure_qf = PRESSURE_QF_FULL; break;
case MS5611_QF_NOT_AVALIABLE: pressure_qf = PRESSURE_QF_NOT_AVALIABLE; break;
case MS5611_QF_DEGRADATED: pressure_qf = PRESSURE_QF_DEGRADATED; break;
case MS5611_QF_UNKNOWN: pressure_qf = PRESSURE_QF_UNKNOWN; break;
}
}
// humidity sensors quality factors
if (rte_wx_bme280_qf == BME280_QF_UKNOWN) {
// use DHT22
switch(rte_wx_dht_valid.qf) {
case DHT22_QF_UNKNOWN: humidity_qf = HUMIDITY_QF_UNKNOWN; break;
case DHT22_QF_FULL: humidity_qf = HUMIDITY_QF_FULL; break;
case DHT22_QF_DEGRADATED: humidity_qf = HUMIDITY_QF_DEGRADATED; break;
case DHT22_QF_UNAVALIABLE: humidity_qf = HUMIDITY_QF_NOT_AVALIABLE; break;
}
}
else {
// use BME280
switch (rte_wx_bme280_qf) {
case BME280_QF_FULL:
case BME280_QF_PRESSURE_DEGRADED: humidity_qf = HUMIDITY_QF_FULL; break;
case BME280_QF_UKNOWN:
case BME280_QF_NOT_AVAILABLE: humidity_qf = HUMIDITY_QF_NOT_AVALIABLE; break;
case BME280_QF_HUMIDITY_DEGRADED:
case BME280_QF_GEN_DEGRADED: humidity_qf = HUMIDITY_QF_DEGRADATED; break;
}
}
// wind quality factor
if (rte_wx_analog_wind_qf == AN_WIND_QF_UNKNOWN) {
}
else {
switch (rte_wx_analog_wind_qf) {
case AN_WIND_QF_FULL: wind_qf = WIND_QF_FULL; break;
case AN_WIND_QF_DEGRADED_DEBOUNCE:
case AN_WIND_QF_DEGRADED_SLEW:
case AN_WIND_QF_DEGRADED: wind_qf = WIND_QF_DEGRADATED; break;
case AN_WIND_QF_NOT_AVALIABLE:
case AN_WIND_QF_UNKNOWN: wind_qf = WIND_QF_NOT_AVALIABLE; break;
}
}
#ifdef _VICTRON
//
telemetry_send_values_pv(rx10m, digi10m, rte_pv_battery_current, rte_pv_battery_voltage, rte_pv_cell_voltage, dallas_qf, rte_wx_ms5611_qf, rte_wx_dht_valid.qf);
@ -147,7 +210,7 @@ void packet_tx_handler(void) {
#elif defined _METEO
// if _METEO will be enabled, but without _DALLAS_AS_TELEM the fifth channel will be used to transmit temperature from MS5611
// which may be treated then as 'rack/cabinet internal temperature'. Dallas DS12B10 will be used for ragular WX frames
telemetry_send_values(rx10m, tx10m, digi10m, kiss10m, rte_wx_temperature_ms_valid, dallas_qf, rte_wx_ms5611_qf, rte_wx_dht.qf, rte_wx_umb_qf);
telemetry_send_values(rx10m, tx10m, digi10m, kiss10m, rte_wx_temperature_ms_valid, dallas_qf, pressure_qf, humidity_qf, wind_qf);
#else
// if user will disable both _METEO and _DALLAS_AS_TELEM value will be zeroed internally anyway
telemetry_send_values(rx10m, tx10m, digi10m, kiss10m, 0.0f, dallas_qf, rte_wx_ms5611_qf, rte_wx_dht.qf, rte_wx_umb_qf);

Wyświetl plik

@ -36,8 +36,9 @@ uint8_t rte_wx_tx20_excessive_slew_rate = 0;
dht22Values rte_wx_dht, rte_wx_dht_valid; // quality factor inside this structure
dallas_qf_t rte_wx_current_dallas_qf, rte_wx_error_dallas_qf = DALLAS_QF_UNKNOWN;
dallas_average_t rte_wx_dallas_average;
ms5611_qf_t rte_wx_ms5611_qf;
bme280_qf_t rte_wx_bme280_qf;
ms5611_qf_t rte_wx_ms5611_qf = MS5611_QF_UNKNOWN;
bme280_qf_t rte_wx_bme280_qf = BME280_QF_UKNOWN;
analog_wind_qf_t rte_wx_analog_wind_qf = AN_WIND_QF_UNKNOWN;
#ifdef _UMB_MASTER
umb_frame_t rte_wx_umb;

Wyświetl plik

@ -105,6 +105,10 @@ void wx_get_all_measurements(void) {
rte_wx_pressure_valid = pressure_average_sum / (float)j;
}
}
else {
// set the quality factor is sensor is not responding on the i2c bus
rte_wx_bme280_qf = BME280_QF_NOT_AVAILABLE;
}
#endif
#if defined _METEO || defined _DALLAS_AS_TELEM
@ -355,6 +359,8 @@ void wx_pool_anemometer(void) {
if (rte_wx_average_winddirection < 0)
rte_wx_average_winddirection += 360;
rte_wx_analog_wind_qf = analog_anemometer_get_qf();
#endif
}

Wyświetl plik

@ -24,6 +24,27 @@
#include "stdint.h"
typedef enum pressure_qf {
PRESSURE_QF_UNKNOWN = 0,
PRESSURE_QF_FULL = 1,
PRESSURE_QF_NOT_AVALIABLE = 2,
PRESSURE_QF_DEGRADATED = 3
}pressure_qf_t;
typedef enum humidity_qf {
HUMIDITY_QF_UNKNOWN = 0,
HUMIDITY_QF_FULL = 1,
HUMIDITY_QF_NOT_AVALIABLE = 2,
HUMIDITY_QF_DEGRADATED = 3
}humidity_qf_t;
typedef enum wind_qf {
WIND_QF_UNKNOWN = 0,
WIND_QF_FULL = 1,
WIND_QF_NOT_AVALIABLE = 2,
WIND_QF_DEGRADATED = 3
}wind_qf_t;
#ifdef __cplusplus
extern "C"
{
@ -48,9 +69,9 @@ void telemetry_send_values( uint8_t rx_pkts,
uint8_t kiss_pkts,
float temperature,
dallas_qf_t dallas_qf,
ms5611_qf_t ms_qf,
dht22QF ds_qf,
umb_qf_t anemometer_qf);
pressure_qf_t press_qf,
humidity_qf_t humid_qf,
wind_qf_t anemometer_qf);
void telemetry_send_chns_description(void);
void telemetry_send_status(void);

Wyświetl plik

@ -14,6 +14,14 @@
#ifdef _ANEMOMETER_ANALOGUE
typedef enum analog_wind_qf {
AN_WIND_QF_FULL,
AN_WIND_QF_DEGRADED_DEBOUNCE,
AN_WIND_QF_DEGRADED_SLEW,
AN_WIND_QF_DEGRADED,
AN_WIND_QF_NOT_AVALIABLE,
AN_WIND_QF_UNKNOWN
} analog_wind_qf_t;
extern uint16_t analog_anemometer_windspeed_pulses_time[ANALOG_ANEMOMETER_SPEED_PULSES_N];
extern uint16_t analog_anemometer_time_between_pulses[ANALOG_ANEMOMETER_SPEED_PULSES_N];
@ -32,6 +40,7 @@ void analog_anemometer_dma_irq(void);
uint32_t analog_anemometer_get_ms_from_pulse(uint16_t inter_pulse_time);
int16_t analog_anemometer_direction_handler(void);
void analog_anemometer_direction_reset(void);
analog_wind_qf_t analog_anemometer_get_qf(void);
#endif

Wyświetl plik

@ -24,7 +24,8 @@ typedef enum bme280_qf {
BME280_QF_NOT_AVAILABLE,
BME280_QF_HUMIDITY_DEGRADED,
BME280_QF_PRESSURE_DEGRADED,
BME280_QF_GEN_DEGRADED
BME280_QF_GEN_DEGRADED,
BME280_QF_UKNOWN
}bme280_qf_t;
extern uint8_t bme280_data_buffer[BME280_LN_RAW_DATA + 1];

Wyświetl plik

@ -179,13 +179,13 @@ void telemetry_send_chns_description(void) {
memset(main_own_aprs_msg, 0x00, sizeof(main_own_aprs_msg));
#if (_SSID == 0)
main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%s :PARM.Rx10min,Tx10min,Digi10min,HostTx10m,Tempre,DS_QF_FULL,DS_QF_DEGRAD,DS_QF_NAVBLE,MS_QF_NAVBLE,DHT_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB", _CALL);
main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%s :PARM.Rx10min,Tx10min,Digi10min,HostTx10m,Tempre,DS_QF_FULL,DS_QF_DEGRAD,DS_QF_NAVBLE,QNH_QF_NAVBLE,HUM_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB", _CALL);
#endif
#if (_SSID > 0 && _SSID <= 9)
main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%s-%d :PARM.Rx10min,Tx10min,Digi10min,HostTx10m,Tempre,DS_QF_FULL,DS_QF_DEGRAD,DS_QF_NAVBLE,MS_QF_NAVBLE,DHT_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB", _CALL, _SSID);
main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%s-%d :PARM.Rx10min,Tx10min,Digi10min,HostTx10m,Tempre,DS_QF_FULL,DS_QF_DEGRAD,DS_QF_NAVBLE,QNH_QF_NAVBLE,HUM_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB", _CALL, _SSID);
#endif
#if (_SSID > 9 && _SSID <= 15)
main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%s-%d:PARM.Rx10min,Tx10min,Digi10min,HostTx10m,Tempre,DS_QF_FULL,DS_QF_DEGRADA,DS_QF_NAVBLE,MS_QF_NAVBLE,DHT_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB", _CALL, _SSID);
main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ":%s-%d:PARM.Rx10min,Tx10min,Digi10min,HostTx10m,Tempre,DS_QF_FULL,DS_QF_DEGRAD,DS_QF_NAVBLE,QNH_QF_NAVBLE,HUM_QF_NAVBLE,WIND_QF_DEGR,WIND_QF_NAVB", _CALL, _SSID);
#endif
main_own_aprs_msg[main_own_aprs_msg_len] = 0;
ax25_sendVia(&main_ax25, main_own_path, main_own_path_ln, main_own_aprs_msg, main_own_aprs_msg_len);
@ -238,29 +238,29 @@ void telemetry_send_values( uint8_t rx_pkts,
uint8_t kiss_pkts,
float temperature,
dallas_qf_t dallas_qf,
ms5611_qf_t ms_qf,
dht22QF ds_qf,
umb_qf_t anemometer_qf) {
pressure_qf_t press_qf,
humidity_qf_t humid_qf,
wind_qf_t anemometer_qf) {
// local variables with characters to be inserted to APRS telemetry frame
char qf = '0', degr = '0', nav = '0';
char ms_qf_navaliable = '0';
char dht_qf_navaliable = '0';
char pressure_qf_navaliable = '0';
char humidity_qf_navaliable = '0';
char anemometer_degradated = '0';
char anemometer_navble = '0';
uint8_t scaled_temperature = 0;
if (anemometer_qf == UMB_QF_DEGRADED) {
if (anemometer_qf == WIND_QF_DEGRADATED) {
anemometer_degradated = '1';
anemometer_navble = '0';
}
else if (anemometer_qf == UMB_QF_NOT_AVALIABLE) {
else if (anemometer_qf == WIND_QF_NOT_AVALIABLE) {
anemometer_degradated = '0';
anemometer_navble = '1';
}
else if (anemometer_qf == UMB_QF_UNITIALIZED || anemometer_qf == UMB_QF_UNKNOWN) {
else if (anemometer_qf == WIND_QF_UNKNOWN) {
anemometer_degradated = '1';
anemometer_navble = '1';
}
@ -292,31 +292,31 @@ void telemetry_send_values( uint8_t rx_pkts,
break;
}
switch (ms_qf) {
case MS5611_QF_NOT_AVALIABLE:
case MS5611_QF_UNKNOWN:
ms_qf_navaliable = '1';
switch (press_qf) {
case PRESSURE_QF_NOT_AVALIABLE:
case PRESSURE_QF_UNKNOWN:
pressure_qf_navaliable = '1';
break;
default:
ms_qf_navaliable = '0';
pressure_qf_navaliable = '0';
break;
}
switch (ds_qf) {
case DHT22_QF_UNAVALIABLE:
case DHT22_QF_UNKNOWN:
dht_qf_navaliable = '1';
switch (humid_qf) {
case HUMIDITY_QF_UNKNOWN:
case HUMIDITY_QF_NOT_AVALIABLE:
humidity_qf_navaliable = '1';
break;
default:
dht_qf_navaliable = '0';
humidity_qf_navaliable = '0';
}
memset(main_own_aprs_msg, 0x00, sizeof(main_own_aprs_msg));
#ifdef _DALLAS_AS_TELEM
main_own_aprs_msg_len = sprintf(main_own_aprs_msg, "T#%03d,%03d,%03d,%03d,%03d,%03d,%c%c%c%c%c%c%c0", telemetry_counter++, rx_pkts, tx_pkts, digi_pkts, kiss_pkts, scaled_temperature, qf, degr, nav, ms_qf_navaliable, dht_qf_navaliable, anemometer_degradated, anemometer_navble);
main_own_aprs_msg_len = sprintf(main_own_aprs_msg, "T#%03d,%03d,%03d,%03d,%03d,%03d,%c%c%c%c%c%c%c0", telemetry_counter++, rx_pkts, tx_pkts, digi_pkts, kiss_pkts, scaled_temperature, qf, degr, nav, pressure_qf_navaliable, humidity_qf_navaliable, anemometer_degradated, anemometer_navble);
#else
main_own_aprs_msg_len = sprintf(main_own_aprs_msg, "T#%03d,%03d,%03d,%03d,%03d,%03d,%c%c%c%c%c%c%c0", telemetry_counter++, rx_pkts, tx_pkts, digi_pkts, kiss_pkts, scaled_temperature, qf, degr, nav, ms_qf_navaliable, dht_qf_navaliable, anemometer_degradated, anemometer_navble);
main_own_aprs_msg_len = sprintf(main_own_aprs_msg, "T#%03d,%03d,%03d,%03d,%03d,%03d,%c%c%c%c%c%c%c0", telemetry_counter++, rx_pkts, tx_pkts, digi_pkts, kiss_pkts, scaled_temperature, qf, degr, nav, pressure_qf_navaliable, humidity_qf_navaliable, anemometer_degradated, anemometer_navble);
#endif
if (telemetry_counter > 999)

Wyświetl plik

@ -56,6 +56,8 @@ uint8_t analog_anemometer_slew_limit_fired = 0;
uint8_t analog_anemometer_deboucing_fired = 0;
uint8_t analog_anemometer_direction_doesnt_work = 0;
DMA_InitTypeDef DMA_InitStruct;
// direction recalculated from v/f
@ -383,6 +385,8 @@ int16_t analog_anemometer_direction_handler(void) {
TIM_Cmd(TIM3, ENABLE);
analog_anemometer_direction_doesnt_work = 1;
return rte_wx_winddirection_last;
}
@ -455,4 +459,65 @@ void analog_anemometer_direction_reset(void) {
TIM_Cmd(TIM3, ENABLE);
}
analog_wind_qf_t analog_anemometer_get_qf(void) {
analog_wind_qf_t out;
if (
analog_anemometer_slew_limit_fired == 0 &&
analog_anemometer_deboucing_fired == 0 &&
analog_anemometer_direction_doesnt_work == 0
)
{
out = AN_WIND_QF_FULL;
}
else if (
analog_anemometer_slew_limit_fired == 1 &&
analog_anemometer_deboucing_fired == 0 &&
analog_anemometer_direction_doesnt_work == 0
)
{
out = AN_WIND_QF_DEGRADED_SLEW;
}
else if (
analog_anemometer_slew_limit_fired == 0 &&
analog_anemometer_deboucing_fired == 1 &&
analog_anemometer_direction_doesnt_work == 0
)
{
out = AN_WIND_QF_DEGRADED_DEBOUNCE;
}
else if (
analog_anemometer_slew_limit_fired == 1 &&
analog_anemometer_deboucing_fired == 1 &&
analog_anemometer_direction_doesnt_work == 0
)
{
out = AN_WIND_QF_DEGRADED;
}
else if (
analog_anemometer_slew_limit_fired == 0 &&
analog_anemometer_deboucing_fired == 0 &&
analog_anemometer_direction_doesnt_work == 1
)
{
out = AN_WIND_QF_NOT_AVALIABLE;
}
else {
out = AN_WIND_QF_UNKNOWN;
}
// reseting flags
analog_anemometer_slew_limit_fired = 0;
analog_anemometer_deboucing_fired = 0;
analog_anemometer_direction_doesnt_work = 0;
return out;
}
#endif