sensor reading extended; persistent lorawan frame counter
This commit is contained in:
parent
88b017c299
commit
a1b9324ecc
@ -24,7 +24,7 @@ static uint8_t app_key[] = LORAWAN_APP_KEY;
|
|||||||
static uint8_t join_eui[] = LORAWAN_APP_EUI;
|
static uint8_t join_eui[] = LORAWAN_APP_EUI;
|
||||||
|
|
||||||
/* ABP keys and address */
|
/* ABP keys and address */
|
||||||
static uint32_t dev_addr = LORAWAN_DEV_ADDR;
|
static uint8_t dev_addr[] = LORAWAN_DEV_ADDR;
|
||||||
static uint8_t nwks_key[] = LORAWAN_NWKS_KEY;
|
static uint8_t nwks_key[] = LORAWAN_NWKS_KEY;
|
||||||
static uint8_t apps_key[] = LORAWAN_APPS_KEY;
|
static uint8_t apps_key[] = LORAWAN_APPS_KEY;
|
||||||
|
|
||||||
@ -308,14 +308,14 @@ void join_network_otaa()
|
|||||||
void join_network_abp()
|
void join_network_abp()
|
||||||
{
|
{
|
||||||
LOG_INF("Starting ABP activation...");
|
LOG_INF("Starting ABP activation...");
|
||||||
LOG_INF("DevAddr: 0x%08X", dev_addr);
|
LOG_INF("DevAddr: 0x%02X%02X%02X%02X", dev_addr[0], dev_addr[1], dev_addr[2], dev_addr[3]);
|
||||||
LOG_HEXDUMP_INF(nwks_key, 16, "NwkSKey: ");
|
LOG_HEXDUMP_INF(nwks_key, 16, "NwkSKey: ");
|
||||||
LOG_HEXDUMP_INF(apps_key, 16, "AppSKey: ");
|
LOG_HEXDUMP_INF(apps_key, 16, "AppSKey: ");
|
||||||
|
|
||||||
/* Configure ABP parameters */
|
/* Configure ABP parameters */
|
||||||
join_cfg.mode = LORAWAN_ACT_ABP;
|
join_cfg.mode = LORAWAN_ACT_ABP;
|
||||||
join_cfg.dev_eui = dev_eui;
|
join_cfg.dev_eui = dev_eui;
|
||||||
join_cfg.abp.dev_addr = dev_addr;
|
join_cfg.abp.dev_addr = (dev_addr[0] << 24) | (dev_addr[1] << 16) | (dev_addr[2] << 8) | dev_addr[3];
|
||||||
join_cfg.abp.nwk_skey = nwks_key;
|
join_cfg.abp.nwk_skey = nwks_key;
|
||||||
join_cfg.abp.app_skey = apps_key;
|
join_cfg.abp.app_skey = apps_key;
|
||||||
|
|
||||||
@ -327,7 +327,7 @@ void join_network_abp()
|
|||||||
}
|
}
|
||||||
|
|
||||||
LOG_INF("✓ Successfully activated LoRaWAN network via ABP");
|
LOG_INF("✓ Successfully activated LoRaWAN network via ABP");
|
||||||
printk("Device 0x%08X activated via ABP\n", dev_addr);
|
printk("Device 0x%02X%02X%02X%02X activated via ABP\n", dev_addr[0], dev_addr[1], dev_addr[2], dev_addr[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void send_data_packet(char *data, uint8_t data_len)
|
void send_data_packet(char *data, uint8_t data_len)
|
||||||
@ -354,7 +354,7 @@ void send_data_packet(char *data, uint8_t data_len)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
LOG_INF("✓ Data packet sent successfully!");
|
LOG_INF("✓ Data packet sent successfully!");
|
||||||
LOG_INF("DevAddr: 0x%08X, Port: %d, Length: %d bytes", dev_addr, LORAWAN_PORT, data_len);
|
LOG_INF("DevAddr: 0x%02X%02X%02X%02X, Port: %d, Length: %d bytes", dev_addr[0], dev_addr[1], dev_addr[2], dev_addr[3], LORAWAN_PORT, data_len);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -4,13 +4,13 @@
|
|||||||
#define LORAWAN_PORT 2
|
#define LORAWAN_PORT 2
|
||||||
|
|
||||||
/* ABP Configuration */
|
/* ABP Configuration */
|
||||||
#define LORAWAN_DEV_ADDR {0x01, 0x94, 0xC6, 0x5F}
|
#define LORAWAN_DEV_ADDR {0x01, 0x9D, 0x28, 0xDF}
|
||||||
#define LORAWAN_NWKS_KEY {0x26, 0x8F, 0xDA, 0x93, 0x3F, 0x4C, \
|
#define LORAWAN_NWKS_KEY {0x4C, 0xF3, 0xD2, 0xF5, 0x6C, 0x5C, \
|
||||||
0xAE, 0xBF, 0x96, 0xA3, 0x0F, 0xE7, \
|
0x45, 0xA6, 0x78, 0x81, 0xD7, 0xBA, \
|
||||||
0x60, 0x27, 0xA4, 0x1E}
|
0x91, 0x61, 0x65, 0x11}
|
||||||
#define LORAWAN_APPS_KEY {0x40, 0x80, 0x09, 0xCA, 0x1D, 0x9F, \
|
#define LORAWAN_APPS_KEY {0x41, 0x5F, 0x07, 0xCF, 0x5B, 0xA6, \
|
||||||
0xE2, 0xB8, 0x22, 0xF4, 0x68, 0x4D, \
|
0xE6, 0x30, 0xC4, 0xC3, 0xEB, 0x9C, \
|
||||||
0x76, 0x33, 0x13, 0x00}
|
0x7E, 0x71, 0x8C, 0x5D}
|
||||||
|
|
||||||
/* OTAA Configuration (backup) */
|
/* OTAA Configuration (backup) */
|
||||||
#define LORAWAN_APP_KEY {0x71, 0x5A, 0x39, 0xB2, 0x86, 0xC3, \
|
#define LORAWAN_APP_KEY {0x71, 0x5A, 0x39, 0xB2, 0x86, 0xC3, \
|
||||||
|
|||||||
14
src/main.c
14
src/main.c
@ -42,8 +42,20 @@ int main(void)
|
|||||||
temp = get_stable_value_sht4x(SENSOR_CHAN_AMBIENT_TEMP);
|
temp = get_stable_value_sht4x(SENSOR_CHAN_AMBIENT_TEMP);
|
||||||
printk("hum: %d.%02d%%\n", (int)humidity, (int)(humidity * 100) % 100);
|
printk("hum: %d.%02d%%\n", (int)humidity, (int)(humidity * 100) % 100);
|
||||||
printk("temp: %d.%02d °C\n", (int)temp, (int)(temp * 100) % 100);
|
printk("temp: %d.%02d °C\n", (int)temp, (int)(temp * 100) % 100);
|
||||||
|
/* Try MLX sensor with stable measurement (10 samples) */
|
||||||
floor_temp = get_stable_value_mlx90614(MLX90614_IR_TEMP_ADDR);
|
floor_temp = get_stable_value_mlx90614(MLX90614_IR_TEMP_ADDR);
|
||||||
printk("floor_temp: %d.%02d °C\n", (int)floor_temp, (int)(floor_temp * 100) % 100);
|
if (mlx90614_sensor_available)
|
||||||
|
{
|
||||||
|
LOG_INF("MLX stable measurement: %d.%02d °C", (int)floor_temp, (int)(floor_temp * 100) % 100);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOG_WRN("MLX sensor not available");
|
||||||
|
}
|
||||||
|
|
||||||
|
printk("floor_temp: %d.%02d °C (available: %s)\n",
|
||||||
|
(int)floor_temp, (int)(floor_temp * 100) % 100,
|
||||||
|
mlx90614_sensor_available ? "YES" : "NO");
|
||||||
|
|
||||||
/* Set relais based on temperature if not manually overridden */
|
/* Set relais based on temperature if not manually overridden */
|
||||||
if (!relais_manual_override)
|
if (!relais_manual_override)
|
||||||
|
|||||||
@ -76,9 +76,10 @@ static float read_mlx_object_temp(void)
|
|||||||
|
|
||||||
float get_stable_value_mlx90614(uint8_t target_addr)
|
float get_stable_value_mlx90614(uint8_t target_addr)
|
||||||
{
|
{
|
||||||
// Früher Ausstieg wenn Sensor nicht verfügbar
|
// Test ob Sensor verfügbar ist
|
||||||
|
request_sensor_data_mlx90614(target_addr);
|
||||||
if (!mlx90614_sensor_available) {
|
if (!mlx90614_sensor_available) {
|
||||||
LOG_DBG("MLX90614 not available, returning 0.0");
|
LOG_INF("MLX90614 not available, returning 0.0");
|
||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -7,12 +7,12 @@ LOG_MODULE_REGISTER(sensor_utils);
|
|||||||
|
|
||||||
float get_stable_sensor_value(sensor_read_func_t read_func, float outlier_threshold)
|
float get_stable_sensor_value(sensor_read_func_t read_func, float outlier_threshold)
|
||||||
{
|
{
|
||||||
const int MAX_SAMPLES = 5;
|
const int MAX_SAMPLES = 10;
|
||||||
float measurements[MAX_SAMPLES];
|
float measurements[MAX_SAMPLES];
|
||||||
int valid_count = 0;
|
int valid_count = 0;
|
||||||
|
|
||||||
// Sammle bis zu 5 Messungen
|
// Sammle bis zu 10 Messungen
|
||||||
for (int i = 0; i < MAX_SAMPLES && valid_count < 3; i++) {
|
for (int i = 0; i < MAX_SAMPLES && valid_count < 7; i++) {
|
||||||
if (i > 0) {
|
if (i > 0) {
|
||||||
k_sleep(K_MSEC(500)); // Pause gegen Selbsterhitzung
|
k_sleep(K_MSEC(500)); // Pause gegen Selbsterhitzung
|
||||||
}
|
}
|
||||||
@ -66,8 +66,8 @@ float get_stable_sensor_value(sensor_read_func_t read_func, float outlier_thresh
|
|||||||
|
|
||||||
if (filtered_count > 0) {
|
if (filtered_count > 0) {
|
||||||
float result = sum / filtered_count;
|
float result = sum / filtered_count;
|
||||||
LOG_INF("Stable sensor value: %.2f (filtered %d/%d samples)",
|
LOG_INF("Stable sensor value: %d.%02d (filtered %d/%d samples)",
|
||||||
result, filtered_count, valid_count);
|
(int)result, (int)(result * 100) % 100, filtered_count, valid_count);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -50,7 +50,7 @@ float get_value_from_current_sample_sht4x(enum sensor_channel sensor)
|
|||||||
if (sensor_channel_get(sht, sensor, &value) == 0) {
|
if (sensor_channel_get(sht, sensor, &value) == 0) {
|
||||||
result = sensor_value_to_double(&value);
|
result = sensor_value_to_double(&value);
|
||||||
const char* sensor_name = (sensor == SENSOR_CHAN_AMBIENT_TEMP) ? "temperature" : "humidity";
|
const char* sensor_name = (sensor == SENSOR_CHAN_AMBIENT_TEMP) ? "temperature" : "humidity";
|
||||||
LOG_DBG("SHT4X %s value: %.2f", sensor_name, result);
|
LOG_DBG("SHT4X %s value: %d.%02d", sensor_name, (int)result, (int)(result * 100) % 100);
|
||||||
} else {
|
} else {
|
||||||
const char* sensor_name = (sensor == SENSOR_CHAN_AMBIENT_TEMP) ? "temperature" : "humidity";
|
const char* sensor_name = (sensor == SENSOR_CHAN_AMBIENT_TEMP) ? "temperature" : "humidity";
|
||||||
LOG_ERR("Can't read SHT4X %s from sample!", sensor_name);
|
LOG_ERR("Can't read SHT4X %s from sample!", sensor_name);
|
||||||
|
|||||||
@ -10,6 +10,9 @@ CONFIG_SHT4X=y
|
|||||||
CONFIG_LORA=y
|
CONFIG_LORA=y
|
||||||
CONFIG_LORAWAN=y
|
CONFIG_LORAWAN=y
|
||||||
CONFIG_LORAMAC_REGION_EU868=y
|
CONFIG_LORAMAC_REGION_EU868=y
|
||||||
|
|
||||||
|
# LoRaWAN Frame Counter persistence
|
||||||
|
CONFIG_LORAWAN_NVM_SETTINGS=y
|
||||||
CONFIG_MAIN_STACK_SIZE=4096
|
CONFIG_MAIN_STACK_SIZE=4096
|
||||||
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=4096
|
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=4096
|
||||||
CONFIG_LOG_DEFAULT_LEVEL=3
|
CONFIG_LOG_DEFAULT_LEVEL=3
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user